Annotation of embedaddon/quagga/tools/rrcheck.pl, revision 1.1.1.2

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>