1. #!/usr/bin/perl 
  2. sub get_ip_array{ 
  3. $filename="$_[0]"
  4. open "file","$filename"
  5. my @nets; 
  6. foreach $file_line (<file>){ 
  7.     if ($file_line=~ /href=\'ip_(.*).htm/){ 
  8.         $file_line_net = $1; 
  9.         push (@nets,$file_line_net); 
  10.     } 
  11.     else
  12.         next
  13.     } 
  14. return @nets; 
  15.  
  16. # 函数,让数组 清楚一些 
  17. sub let_array_clear{ 
  18.     my @array = @_; 
  19.     my @new_array; 
  20.     my @new_array_numbers; 
  21.     my $ifsame = 0; 
  22.     foreach $array (@array) { 
  23.         #默认将 老数组中的每个值跟 新数组中的任一个值都不一样 
  24.         $ifsame=0; 
  25.         # 查询新数组序列中的每个值 
  26.         foreach $new_array (@new_array){ 
  27.             #将新数组中的一个值 按照 小数点进行 分隔成4块 
  28.             @new_array_numbers = split("\\.",$new_array); 
  29.             #将老数组中的一个值 按照 小数点进行 分隔成4块 
  30.             @array_numbers = split("\\.",$array); 
  31.             #判断数组4块中的前三块儿是否相同 
  32.             if ( $new_array_numbers[0] eq $array_numbers[0] and $new_array_numbers[1] eq $array_numbers[1] and $new_array_numbers[2] eq $array_numbers[2]){ 
  33.                 #如果相同,那么就将是否相同 设置为1 
  34.                 #print "发现相同!"
  35.                 $ifsame = 1; 
  36.             } 
  37.         } 
  38.         # 比对完成后,对结果 ifsame 进行判断,如果相同,就进行下次循环,否则, 进行push操作 
  39.         if ($ifsame == 1) { 
  40.             next
  41.         } 
  42.  
  43.         elsif ($ifsame == 0) { 
  44.             $new_array = $array; 
  45.             push (@new_array,$new_array); 
  46.         } 
  47.     } 
  48.     return @new_array; 
  49.  
  50. use DBI; 
  51. use DBD::mysql; 
  52. my $dbh = DBI -> connect("DBI:mysql:db_iplocate;host=127.0.0.1""admin","admin",{RaiseError=>1}); 
  53. my $sth = $dbh->prepare( q{select city_cn,city_en from `gps`}) or die("Cannot prepare statement:", $dbh->errstr(),"\n"); 
  54. my $rc = $sth->execute() or die("Cannot execute statement:", $sth->errstr(), "\n"); 
  55.  
  56. my @city_cn; 
  57. my @city_en; 
  58. # 将从mysql得到的city_cn和city_en放到相应的数组中 
  59. while (my @row = $sth -> fetchrow_array()){ 
  60.     push @city_cn,$row[0]; 
  61.     push @city_en,$row[1]; 
  62.  
  63. my @isps_cn = ("移动","联通","电信"); 
  64. my @isps_en = ("ChinaMobile","ChinaUnicom","ChinaTelecom"); 
  65. foreach $i(0..(@city_cn-1)){ 
  66.     # 打印smokeping第一栏 
  67.     print "+ $city_en[$i]\n"
  68.     print "menu = $city_en[$i]\n"
  69.     print "title = $city_en[$i]\n"
  70.     # 对运营商进行循环 
  71.     foreach $j(0..2) { 
  72.         # 组合出文件名称        
  73.         $file_name = "$city_en[$i]" . "_" . "$isps_en[$j]"
  74.         #print "正在处理 $file_name\n"
  75.         # 打开 snmp 扫描的结果  
  76.         open "file_nmap_result","./result_nmap/$file_name"
  77.         # 初始化数组 file_nmap_result_usageips 
  78.         my @file_nmap_result_usageips=""
  79.         # 处理文件的每一行,处理完成后吐出一个有效ip的数组 
  80.         foreach $file_nmap_result_line (<file_nmap_result>){ 
  81.            # 如果开头是Host,那么就是我们要找的行 
  82.            if ( $file_nmap_result_line =~ m/^Host/ ){ 
  83.                # 将行进行 分隔 按照 空格 
  84.                @file_nmap_result_line_columns = split(" ","$file_nmap_result_line"); 
  85.                # ip地址在 第二列,对 ip地址按照小数点进行分隔 
  86.                @file_nmap_result_usageips_numbers = split("\\.",$file_nmap_result_line_columns[1]); 
  87.                # 对 ip地址的 小数点最后一个数字进行判断, 如果是0 或者255 就不再对此行进行处理 
  88.                if ($file_nmap_result_usageips_numbers[3] eq 0 || $file_nmap_result_usgaeips_number[3] eq 255 ){ 
  89.                    next
  90.                } 
  91.                else
  92.                    push(@file_nmap_result_usageips,$file_nmap_result_line_columns[1]); 
  93.                } 
  94.            } 
  95.            else
  96.                next
  97.            } 
  98.         }  
  99.         # 对 得到的数组进行清洗, 按照小数点分隔, 前三位相同的话,只保留一个 
  100.         @file_nmap_result_usageips_clear = &let_array_clear(@file_nmap_result_usageips); 
  101.         # 对得出的有效ip数组进行处理,得出sokeping可以使用的配置文件; 
  102.         my $usage_ip_number = 0; 
  103.         foreach $file_nmap_result_usageip (@file_nmap_result_usageips_clear){ 
  104.             if ($usage_ip_number eq 0){ 
  105.                 $usage_ip_number++; 
  106.                 next
  107.             } 
  108.             print "++ $isps_en[$j]_$usage_ip_number\n"
  109.             print "menu = $isps_en[$j]$usage_ip_number\n"
  110.             print "title = $isps_en[$j]$usage_ip_number\n"
  111.             print "host = $file_nmap_result_usageip\n"
  112.             $usage_ip_number++; 
  113.         } 
  114.         close("file_nmap_result"); 
  115.         #print "处理$file_name......Complete!\n"
  116.     } 
  117.  
  118. warn($DBI::errstr) if $DBI::err; 
  119. $dbh->disconnect(); 
  120. $sth->finish();