一:主要功能:从Overall Report里每五分钟的排名中的数据存入Oracle数据库中(当前,这些数据是保存在93的机器上).然后,再用Php查询数据库中的数据,按所需输出数据,显示在Web页面上.
二:项目意义:在此工作完成好之后,我们可以从页面上自主选择一时间段,然后查看在此时间段内,经常出现在Top排名前N名的IP的信息.包括:IP地址,平均值,上榜次数等等.这些数据对于学校网络管理工作有很大的参考价值..
三:项目具体实施:
第一阶段主要完成对Top排名中的数导入数据库:
编程语言:Perl
使用工具:UltraEdit编缉程序,Source insight程序分析工具.
实施细节:具体编码如下:(在中CUFlow.pm中的sub writeAggScoreboard ()函数中加入以下语句).
#open a csv file
open(TOP_CSV, ">$CUFlow::topCsvPath") ||
die "Cannot open $CUFlow::topCsvPath for write ($!)/n";
my $FACTOR;
if ($key=="byte") {
$FACTOR=8;
}
else {
$FACTOR=1;
}
my %type;
%type = ("bytesin"=>1,"pktsin"=>2,"flowsin"=>3,"bytesout"=>4,"pktsout"=>5,"flowsout"=>6);
my $topData = sprintf("%.2f", $data{$ip}->{"$key$dir"}*$FACTOR/$div);
my $topType = $type{"$key$dir"};
print TOP_CSV "$ip,$topData,$topType/n";
}
close TOP_CSV;
需要说明的是对于路径的处理利用了Perl语言的巧妙性:
open(TOP_CSV, ">$CUFlow::topCsvPath")
其中,对于对于$CUFlow::topCsvPath的定义在CUFlow.cf文件里:
# The path of top.csv
TopCsvPath /usr/netflow/database/top.csv
然后在CUFlow.pm文件中的Sub parseConfig()函数里通过Perl语言对
CUFlow.cf里的内容读取进行模式匹配,将读出的路径内容传递给变量
elseif (/^/s*TopCsvPath/s+(/S+)/s*$/) {
$CUFlow::topCsvPath = $1;
}.
最后将得到的IP地址,数据量以及数据类型一起导入到top.csv文件中.(这其
中对于数据类型的导入用到了Perl的一强大功能之一:散列.将&key 与&value一一对应起来,这可以为将来查询数据库节省了时间).
这里,我们的数据仍然存在于93机器上,还未导入数据库.要完成这点需要用到
的是一条叫sqlldr的命令(止命令在importdata文件中)
`sqlldr userid=username/password control=${flowfiledatabasedir}/top.ctl log=/var/log/importdata`
其中:userid= username/password分别为用户名和密码.control是关键要素,与上面讲的一样${flowfiledatabasedir}变量也代表着一完整路径,我们依然可以在importdata文件中很快找到其完整内容.top.ctl其内容是:
load data
infile '/usr/netflow/database/top.csv'
append into table top
(IP terminated by ',',
DATA terminated by ',',
TYPE terminated by whitespace)
说明: infile:指数据源文件;append 表示以追加的方式式将数据加入表top;
后面的就是追加的列属性. terminated by ','指用逗号分隔terminated by whitespace
结尾以空白分隔.
Log是用来记录日志文件的.
执行此语句只需在sqlldr语句加上’’即可.
我们己将93机器上的top.csv中的数据导入Oracle数据库中的一个top名的表格中,此表共有三个列属性:IP地址,数据值及数据类型.另有一个自带的属性,系统时间(为下面的第二阶段作准备). 至此,第一阶段工作告一段落.
附加知识:我们在将数据存入top.csv 后,可以查看来具体工作过程:而且是在Linux下.需要用到的是putty(PuTTY是免费的Win32平台的Telnet和SSH客户端程序).