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

网络

开发平台:

Unix_Linux

  1. #! /usr/local/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. #$mail_address = "toshio@iri.co.jp";
  11. $mail_address = "kunihiro@zebra.org";
  12. $mailer = "/usr/sbin/sendmail -oi";
  13. #$logfile = "/usr/local/sbin/logfile"
  14. $logfile = "logfile";
  15. $lookuplog = "lookuplog";
  16. ## mail routine
  17. {
  18.     local ($prefix, $origin);
  19.     open (LOG, $logfile) || die "can't open $logfile";
  20.     open (LOOKUP, ">$lookuplog") || die "can't open $lookuplog";
  21.     
  22.     for (;;) {
  23.     while (<LOG>) {
  24.         if (/UpdateS+ ([d./]+) .* (d+) [ie?]/) {
  25.             $prefix = $1;
  26.             $origin = $2;
  27.             $ret = &whois_check ($prefix, $origin);
  28.             if ($ret) {
  29.                 print LOOKUP "$prefix AS$origin : Check OKn";
  30.             } else {
  31.                 print LOOKUP "$prefix AS$origin : Errorn";
  32.             }
  33. #        fflush (LOOKUP);
  34.         }
  35.     }
  36.     sleep (3);
  37.     }
  38. }
  39. sub whois_check
  40. {
  41.     local ($prefix, $origin) = @_;
  42.     local ($rr_prefix, $rr_origin) = ();
  43.     local (@result);
  44.     $origin = "AS" . $origin;
  45. #    print "$prefix $originn";
  46.     @result = &whois ($prefix);
  47.     foreach (@result) {
  48.         if (/^route:.*s([d./]+)$/) {
  49.             $rr_prefix = $1;
  50.         }
  51.         if (/^origin:.*s(AS[d]+)$/) {
  52.             $rr_origin = $1;
  53.             if ($prefix eq $rr_prefix and $origin eq $rr_origin) {
  54.                 return 1;
  55.             }
  56.         }
  57.     }
  58.     alarm_mail ($prefix, $origin, @result);
  59.     return 0;
  60. }
  61. ## get port of whois
  62. sub get_whois_port 
  63. {
  64.     local ($name, $aliases, $port, $proto) = getservbyname ("whois", "tcp");
  65.     return ($port, $proto);
  66. }
  67. ## whois lookup
  68. sub whois 
  69. {
  70.     local ($query) = @_;
  71.     local ($port, $proto) = &get_whois_port;
  72.     local (@result);
  73.     if ($whois_host=~ /^s*d+.d+.d+.d+s*$/) {
  74.        $address = pack ("C4",split(/./,$host));
  75.     } else {
  76.        $address = (gethostbyname ($whois_host))[4];
  77.     }
  78.     socket (SOCKET, PF_INET, SOCK_STREAM, $proto);
  79.     if (connect (SOCKET, sockaddr_in ($port, $address))) {
  80.         local ($oldhandle) = select (SOCKET);
  81.         $| = 1;
  82.         select($oldhandle);
  83.         print SOCKET "$queryrn";
  84.         @result = <SOCKET>;
  85.         return @result;
  86.     }
  87. }
  88. ##
  89. sub alarm_mail 
  90. {
  91.     local ($prefix, $origin, @result) = @_;
  92.     open (MAIL, "|$mailer -t $mail_address") || die "can't open $mailer";
  93.     
  94.     print MAIL "From: root@rr1.jpix.ad.jpn";
  95.     print MAIL "Subject: RR $origin $prefixn";
  96.     print MAIL "MIME-Version: 1.0n";
  97.     print MAIL "Content-Type: text/plain; charset=us-ascii nn";
  98.     print MAIL "RR Lookup Error Reportn";
  99.     print MAIL "======================n";
  100.     print MAIL "Announced route : $prefix from $originnn";
  101.     print MAIL "@result";
  102.     close MAIL;
  103. }