#!/usr/local/bin/perl # bco.pl ciscobgpfile $infname=$ARGV[0]; open(infile,"$infname") || die("Cannot open input file $infname"); while() { ($t,$t1,$t,$t2,$t,$t3)=unpack("a3a7a10a8a12a25",$_); if(($t1 eq "Network")&&($t2 eq "Next Hop")&&($t3 =~ "Metric")){last;} } while(){ $t3=""; ($t1,$t2,$t,$t3)=unpack("a1a1a1a6",$_); if($t3 =~ '\.'){ ($flags,$net,$hop,$weight,@r)=split(' ',$_); # printf"$net\n"; $pfxcnt++; } else { ($flags,$hop,$weight,@r)=split(' ',$_); } while($v=pop(@r)){ if($v > 0){ $asa{$v}++; if($lastas != 0){ # printf"$lastas:$v\n"; if((!$asparray{$lastas,$v})&&(!$asparray{$v,$lastas})){ $aspcnt++; $asparray{$lastas,$v}++; $ascarray{$lastas}=join(':',$ascarray{$lastas},$v); $asccnt{$lastas}++; } if(!$aspiarray{$v,$lastas}){ $aspiarray{$v,$lastas}++; $ascarray{$v}=join(':',$ascarray{$v},$lastas); $asccnt{$v}++; } } $lastas=$v; } } $lastas=0; } foreach $key ( keys %asa) { $ascnt++; } ($t,$id,$is)=split('\.',$infname); $fname=join('.',$id,$is); open(O,">ASconnsummary.$fname") || die("Cannot open output file ASconnlist"); printf O "%d net/mask prefixes, %d AS numbers, %d AS interconnections\n", $pfxcnt,$ascnt,$aspcnt; printf O "\nSorted by interconnections:\nAS\tCount\n======= ========\n"; foreach $key ( sort cnumerically ( keys %asccnt)) { printf O "%d\t%d\n",$key,$asccnt{$key}; } open(O,">ASconnlist.$fname") || die("Cannot open output file ASconnlist"); foreach $key ( sort numerically ( keys %ascarray)) { printf O "%d\t->\t%d\t%s\n",$key,$asccnt{$key},$ascarray{$key}; } open(O,">ASconnpairs.$fname") || die("Cannot open output file ASconnlist"); foreach $key ( sort numerically ( keys %asparray)) { ($src, $dst) = split( $;, $key ) ; printf O "$src <-> $dst \n",$src,$dst; } sub numerically { $a <=> $b ;} sub cnumerically { $asccnt{$b} <=> $asccnt{$a};}