在与师兄商量后,开始决定用python写(师兄可能认为我不会python,想通过这种工作需要的方式来迫使的学习它.当然,我不能枉费他一番心意了).可看了两天后,还是对python有了个更加模糊的了解,有点不知所云的感觉(现在极其讨厌那些辟如Java.python之类的面向对象语言了.太烦琐.啰嗦了,一个简单的"HelloWorld"程序竟然要写个十行左右.还是喜欢Perl.VB了,简捷,明了.规则约束不多.很适合我性格哦!).可后来发现python竟然没有提供对Oracle数据库连接的模块.前面的工作算是白费了.最后还是决定就在江大Netflow流量监测系统主页面上加入一个新的功能块就行了.由于上次的Top查询系统用的就是php,所以这次进展还是比较顺利.
一:主要功能
按冯老师提出的要求,要实现对于对于某一特定区段IP地址的流量的查询.
二:意义
此功能完成后,可以在'数据中心'这一模块页面上选择一时间(以天为单位),指定一定的IP段,对流经此区间的IP的流量信息获取,最后以csv格式保存并供查询者下载到本机上.
三:实现
具体如现如下:由于江苏大学由Cisco6509采集的所有信息都己保存到93的机器上.我们所要求查询的数据来源就是Oracle中flow_data'yearmonthday'的表格中.其中的yearmonthday对应为要求查询的具体的某日.
1.接收由主页面传来的数据信息.与top排名查询里的方法类似,这里就不再重 复了.
2.将查询出的符合要求的数据导入一个叫test.csv的表中
$f_sip = format_ip($_REQUEST[sip]);
$f_eip = format_ip($_REQUEST[eip]);
$testFile = "/tmp/test.csv";
$fp = fopen($testFile, "w");
fputs($fp, "IP地址,流量/n");
while(ora_fetch($cursor)){
$ipaddr = ora_getcolumn($cursor, 0);
$sum = convertOctets(ora_getcolumn($cursor, 1));
$f_ip = format_ip($ipaddr);
if ( $f_ip >= $f_sip and
$f_ip <= $f_eip ) {
fputs($fp, "$ipaddr,$sum/n");
}
}
fclose($fp);
php有固定的对文件操作的函数fopen(),fputs().....
这里需要说明的是format_ip()这个函数.开始并没有用到这个函数.从而导至了很多不符合要求的IP地址进
入了csv文件里.这是因为IP地址有16位,4段数据,对它进行比较操作不能像对纯数据这样简单.举个例子吧:如果我们要进询的是从'10.0.0.0'到 '10.0.0.3'的地址.但查询结果中我们发现'10.0.0.18''10.0.0.27'.....这样的IP地址也在文件中.这是因为3与18比较时,先比较的是最高位,也就是拿3与1相比,于是就产生了上述错误.
于是,我们要采用一种正确的IP地址比较方法.由于IP地址这个数据的特殊性.我们采用了一个format_ip()函数.
function format_ip($ip){
$ipa = explode('.', $ip);
for ($i = 0; $i <4 ; $i++) {
$s = $ipa[$i];
if ($s < 10) {
$ipa[$i] = '00'.$s;
}
else if ($s < 100) {
$ipa[$i] = '0'.$s;
}
}
return join($ipa, '.');
}
说明:将IP地址打碎,分成4片.每片中若数据不足3位(因为IP地址最大为3位)则在前面补齐0.如:上面讲的那个例子3与18比较时,3先format为003,而18为018.这样比较就不会出现上面的错误了.
3.在php中做一个下载页面.
echo "<center><a href=./download.php>下载到本机</a></center>";
download.php中内容为:
<?
$file_name = "test.csv";
$file_dir = "/tmp/";
if (!file_exists($file_dir . $file_name)) { //检查文件是否存在
echo "文件找不到";
exit;
} else {
$file = fopen($file_dir . $file_name,"r"); // 打开文件
// 输入文件标签
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length: ".filesize($file_dir . $file_name));
Header("Content-Disposition: attachment; filename=" . $file_name);
// 输出文件内容
echo fread($file,filesize($file_dir . $file_name));
fclose($file);
exit;
}
?>
这是个专门提供给php页面安全下载的方法,具体细节我也看不太懂,只是修改了些参数就行.