Return to rrcheck.pl CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / tools |
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: }