diff options
author | paul <paul> | 2002-12-13 21:15:29 +0100 |
---|---|---|
committer | paul <paul> | 2002-12-13 21:15:29 +0100 |
commit | 718e3744195351130f4ce7dbe0613f4b3e23df93 (patch) | |
tree | bac2ad39971cd43f31241ef123bd4e470f695ac9 /tools/rrcheck.pl | |
download | frr-718e3744195351130f4ce7dbe0613f4b3e23df93.tar.xz frr-718e3744195351130f4ce7dbe0613f4b3e23df93.zip |
Initial revision
Diffstat (limited to 'tools/rrcheck.pl')
-rw-r--r-- | tools/rrcheck.pl | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/tools/rrcheck.pl b/tools/rrcheck.pl new file mode 100644 index 000000000..5e5a983c2 --- /dev/null +++ b/tools/rrcheck.pl @@ -0,0 +1,135 @@ +#! /bin/perl +## +## Read BGPd logfile and lookup RR's whois database. +## +## Copyright (c) 1997 Kunihiro Ishiguro +## +use Socket; + +## Configuration variables +$whois_host = "whois.jpix.ad.jp"; + +#$logfile = "/usr/local/sbin/logfile" +$logfile = shift || die "Please specify filename"; + +## mail routine +{ + local ($prefix, $origin); + + open (LOG, $logfile) || die "can't open $logfile"; + + $index = ''; + while ($index) { + $index = <LOG>; + if ($index =~ /[bgpd]/) { + break; + } + } + + while (<LOG>) { + if (/([\d\.\/]+)\s+([\d\.]+)\s+(\d+)\s+(\d+)\s+([\d ]+)\s+[ie\?]/) { + $prefix = $1; + $nexthop = $2; + $med = $3; + $dummy = $4; + $aspath = $5; + ($origin) = ($aspath =~ /([\d]+)$/); + + print "$nexthop [$origin] $prefix $aspath "; + + $ret = &whois_check ($prefix, $origin); + if ($ret == 0) { + print "Check OK\n"; + } elsif ($ret == 1){ + print "AS orgin mismatch\n"; + } else { + print "prefix doesn't exist \n"; + } + } + } +} + +sub whois_check +{ + local ($prefix, $origin) = @_; + local ($rr_prefix, $rr_origin) = (); + local (@result); + + $origin = "AS" . $origin; + + @result = &whois ($prefix); + + $prefix_match = 0; + foreach (@result) { + if (/^route:.*\s([\d\.\/]+)$/) { + $rr_prefix = $1; + } + if (/^origin:.*\s(AS[\d]+)$/) { + $rr_origin = $1; + + if ($prefix eq $rr_prefix and $origin eq $rr_origin) { + return 0; + } elsif ($prefix eq $rr_prefix) { + $prefix_match = 1; + } + } + } +# alarm_mail ($prefix, $origin, @result); + if ($prefix_match) { + return 1; + } else { + return 2; + } +} + +## get port of whois +sub get_whois_port +{ + local ($name, $aliases, $port, $proto) = getservbyname ("whois", "tcp"); + return ($port, $proto); +} + +## whois lookup +sub whois +{ + local ($query) = @_; + local ($port, $proto) = &get_whois_port; + local (@result); + + if ($whois_host=~ /^\s*\d+\.\d+\.\d+\.\d+\s*$/) { + $address = pack ("C4",split(/\./,$host)); + } else { + $address = (gethostbyname ($whois_host))[4]; + } + + socket (SOCKET, PF_INET, SOCK_STREAM, $proto); + + if (connect (SOCKET, sockaddr_in ($port, $address))) { + local ($oldhandle) = select (SOCKET); + $| = 1; + select($oldhandle); + + print SOCKET "$query\r\n"; + + @result = <SOCKET>; + return @result; + } +} + +## +sub alarm_mail +{ + local ($prefix, $origin, @result) = @_; + + open (MAIL, "|$mailer -t $mail_address") || die "can't open $mailer"; + + print MAIL "From: root\@rr1.jpix.ad.jp\n"; + print MAIL "Subject: RR $origin $prefix\n"; + print MAIL "MIME-Version: 1.0\n"; + print MAIL "Content-Type: text/plain; charset=us-ascii \n\n"; + print MAIL "RR Lookup Error Report\n"; + print MAIL "======================\n"; + print MAIL "Announced route : $prefix from $origin\n\n"; + print MAIL "@result"; + close MAIL; +} |