rrcheck.pl
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:3k
源码类别:

网络

开发平台:

Unix_Linux

  1. #! /bin/perl
  2. ##
  3. ## Read BGPd logfile and lookup RR's whois database.
  4. ##
  5. ##   Copyright (c) 1997 Kunihiro Ishiguro
  6. ##
  7. use Socket;
  8. ## Configuration variables
  9. $whois_host = "whois.jpix.ad.jp";
  10. #$logfile = "/usr/local/sbin/logfile"
  11. $logfile = shift || die "Please specify filename";
  12. ## mail routine
  13. {
  14.     local ($prefix, $origin);
  15.     open (LOG, $logfile) || die "can't open $logfile";
  16.     
  17.     $index = '';
  18.     while ($index) {
  19. $index = <LOG>;
  20. if ($index =~ /[bgpd]/) {
  21.     break;
  22. }
  23.     }
  24.     while (<LOG>) {
  25. if (/([d./]+)s+([d.]+)s+(d+)s+(d+)s+([d ]+)s+[ie?]/) {
  26.     $prefix = $1;
  27.     $nexthop = $2;
  28.     $med = $3;
  29.     $dummy = $4;
  30.     $aspath = $5;
  31.     ($origin) = ($aspath =~ /([d]+)$/);
  32.     print "$nexthop [$origin] $prefix $aspath ";
  33.     $ret = &whois_check ($prefix, $origin);
  34.     if ($ret == 0) {
  35. print "Check OKn";
  36.     } elsif ($ret == 1){
  37. print "AS orgin mismatchn";
  38.     } else {
  39. print "prefix doesn't exist n";
  40.     }
  41. }
  42.     }
  43. }
  44. sub whois_check
  45. {
  46.     local ($prefix, $origin) = @_;
  47.     local ($rr_prefix, $rr_origin) = ();
  48.     local (@result);
  49.     $origin = "AS" . $origin;
  50.     @result = &whois ($prefix);
  51.     $prefix_match = 0;
  52.     foreach (@result) {
  53.         if (/^route:.*s([d./]+)$/) {
  54.             $rr_prefix = $1;
  55.         }
  56.         if (/^origin:.*s(AS[d]+)$/) {
  57.             $rr_origin = $1;
  58.             if ($prefix eq $rr_prefix and $origin eq $rr_origin) {
  59.                 return 0;
  60.             } elsif ($prefix eq $rr_prefix) {
  61. $prefix_match = 1;
  62.     }
  63.         }
  64.     }
  65. #    alarm_mail ($prefix, $origin, @result);
  66.     if ($prefix_match) {
  67. return 1;
  68.     } else {
  69. return 2;
  70.     }
  71. }
  72. ## get port of whois
  73. sub get_whois_port 
  74. {
  75.     local ($name, $aliases, $port, $proto) = getservbyname ("whois", "tcp");
  76.     return ($port, $proto);
  77. }
  78. ## whois lookup
  79. sub whois 
  80. {
  81.     local ($query) = @_;
  82.     local ($port, $proto) = &get_whois_port;
  83.     local (@result);
  84.     if ($whois_host=~ /^s*d+.d+.d+.d+s*$/) {
  85.        $address = pack ("C4",split(/./,$host));
  86.     } else {
  87.        $address = (gethostbyname ($whois_host))[4];
  88.     }
  89.     socket (SOCKET, PF_INET, SOCK_STREAM, $proto);
  90.     if (connect (SOCKET, sockaddr_in ($port, $address))) {
  91.         local ($oldhandle) = select (SOCKET);
  92.         $| = 1;
  93.         select($oldhandle);
  94.         print SOCKET "$queryrn";
  95.         @result = <SOCKET>;
  96.         return @result;
  97.     }
  98. }
  99. ##
  100. sub alarm_mail 
  101. {
  102.     local ($prefix, $origin, @result) = @_;
  103.     open (MAIL, "|$mailer -t $mail_address") || die "can't open $mailer";
  104.     
  105.     print MAIL "From: root@rr1.jpix.ad.jpn";
  106.     print MAIL "Subject: RR $origin $prefixn";
  107.     print MAIL "MIME-Version: 1.0n";
  108.     print MAIL "Content-Type: text/plain; charset=us-ascii nn";
  109.     print MAIL "RR Lookup Error Reportn";
  110.     print MAIL "======================n";
  111.     print MAIL "Announced route : $prefix from $originnn";
  112.     print MAIL "@result";
  113.     close MAIL;
  114. }