我一直在寻找将半径记帐记录的平面文件导入到单独的MYSQL服务器(不在同一半径服务器中托管)的答案。
我们有数月的时间需要从4个不同的服务器导入答复详细日志,身份验证详细日志和详细日志。
典型的回复数据包如下所示-我出于演示目的使用了虚拟ip。
2015年7月23日星期四00:00:13
数据包类型=访问请求
框架协议= PPP
用户名=“ [email protected]”
CHAP密码= 0x0111d9dr56ve5c417e42962f0d58f0c89
NAS端口类型=以太网
NAS端口= 4587858
NAS-Port-Id =“ 1/0/0/531”
服务类型=框架用户
NAS-IP地址= 1.1.1.1
Acct-Session-Id =“ 00460152”
CHAP挑战= 0x03298b01bef9dc99e7d33e4038462a8e
邮件身份验证器= 0x321aaa0d3eac236f771a4caf4ad84874
代理状态= 0x313239
2015年7月23日星期四00:00:14
数据包类型=访问请求
框架协议= PPP
用户名=“ [email protected]”
CHAP密码= 0x02b0764233ba26c11994d61cfe663668b0
NAS端口= 655324
NAS-Port-Id =“ Uniq-Sess-ID869”
Connect-Info =“ 1000000000”
NAS端口类型=虚拟
服务类型=框架用户
NAS-IP地址= 1.1.1.1
Acct-Session-Id =“ 0009FFDC”
CHAP挑战= 0xb2627204f7c8982beaf12f59cd1e8620
邮件身份验证器= 0x3f1dba6b5d8b9ee0a0963ce76233086b
代理状态= 0x3638
我需要一个可以将平面文件解析为这样的脚本。我目前正忙于使用perl脚本来实现此目的,但是如果有现有脚本可以更好地做到这一点。
标头字段:
日期;分组类型; PPP;成帧协议;用户名; CHAP密码; NAS端口; NAS端口类型; NAS端口;连接信息; NAS端口ID;服务类型; NAS IP地址; Acct-Session-Id; CHAP-挑战;消息验证者;代理状态
2015年7月23日星期四00:00:13;访问请求; PPP; “ [email protected]”; 0x0111d9dr56ve5c417e42962f0d58f0c89;以太网; 4587858 ;;“ 1/0/0/531”;成帧的用户; 1.1.1.1; “ 00460152”; 0x03298b01bef9dc99e7d33e4038462a8e; 0x321aaa0d3eac236f771a4caf4ad84874; 0x313239
2015年7月23日星期四00:00:14;访问请求; PPP;“ [email protected]”; 0x02b0764233ba26c11994d61cfe663668b0; 655324; “ Uniq-Sess-ID869”;“ 1000000000”;成帧用户; 1.1.1.1; “ 0009FFDC”; 0xb2627204f7c8982beaf12f59cd1e8620; 0x3f1dba6b5d8b9ee0a0963ce76233086b; 0x3638
最佳答案
过去,我做了很多RADIUS的工作,包括编写FreeRADIUS数据库维护模块,所以我想我会写点东西来帮助您入门。您只需要研究如何从文件读取而不是<DATA>
文件句柄。
#!/usr/bin/perl
use warnings;
use strict;
my %entries;
while (<DATA>){
next if /^$/;
my ($date, $rest) = split /(?<=\d{2}:\d{2}:\d{2} \d{4}) /;
$date =~ s/\s+$//;
$rest =~ s/\s+=\s+/=/g;
my @packet = split /\s+/, $rest;
my @headers;
my $data;
for (@packet){
push @headers, (split /=/)[0];
$data .= '; ' . (split /=/)[1];
}
$entries{header} = "Header fields: " . join('; ', @headers);
push @{$entries{data}}, "$date$data";
}
print "\n$entries{header}\n\n";
for (@{$entries{data}}){
print "$_\n\n";
}
__DATA__
Thu Jul 23 00:00:13 2015 Packet-Type = Access-Request Framed-Protocol = PPP User-Name = "[email protected]" CHAP-Password = 0x0111d9dr56ve5c417e42962f0d58f0c89 NAS-Port-Type = Ethernet NAS-Port = 4587858 NAS-Port-Id = "1/0/0/531" Service-Type = Framed-User NAS-IP-Address = 1.1.1.1 Acct-Session-Id = "00460152" CHAP-Challenge = 0x03298b01bef9dc99e7d33e4038462a8e Message-Authenticator = 0x321aaa0d3eac236f771a4caf4ad84874 Proxy-State = 0x313239
Thu Jul 23 00:00:14 2015 Packet-Type = Access-Request Framed-Protocol = PPP User-Name = "[email protected]" CHAP-Password = 0x02b0764233ba26c11994d61cfe663668b0 NAS-Port = 655324 NAS-Port-Id = "Uniq-Sess-ID869" Connect-Info = "1000000000" NAS-Port-Type = Virtual Service-Type = Framed-User NAS-IP-Address = 1.1.1.1 Acct-Session-Id = "0009FFDC" CHAP-Challenge = 0xb2627204f7c8982beaf12f59cd1e8620 Message-Authenticator = 0x3f1dba6b5d8b9ee0a0963ce76233086b Proxy-State = 0x3638