#!/usr/local/bin/perl # # nnorg.pl ciscobgpfile {+} # net number originating AS number # if optional "+" is given, only print those with inconsistent orgAS#s # $infname=$ARGV[0]; $flag=$ARGV[1]; ($t,$id,$is)=split('\.',$infname); $fname=join('.',$id,$is); open(O,">ASnnorg.$fname") || die("Cannot open output file ASnnorg.$fname"); 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 =~ '\.'){ undef %orgas; if($outtxt){ $outtxt=join('',$outtxt,"\n"); if($flag eq "\+"){ if($outtxt =~ '\+'){printf O "$outtxt";} }else{ printf O "$outtxt"; } } ($flags,$net,$hop,$weight,@r)=split(' ',$_); ($netnum,$mask)=split('/',$net); ($a1,$a2,$a3,$a4)=split('\.',$netnum); if(!$mask){ $mask=24; if($a1 < 192){$mask=16;} if($a1 < 128){$mask=8;} } $netbin=($a1<<24)+($a2<<16)+($a2<<8)+$a4; $ccnt=2**(24-$mask); # count of Class-C numbers while($v=pop(@r)){if($v > 0){$orgas{0}=$v; last;}} # $outtxt=sprintf"%.8x %2d %6d %18s %d",$netbin,$mask,$ccnt,$net,$orgas{0}; $outtxt=sprintf"%15s %2d %6d %d",$netnum,$mask,$ccnt,$orgas{0}; $orgasc=1; }else{ ($flags,$hop,$weight,@r)=split(' ',$_); while($v=pop(@r)){if($v > 0){$orgasv=$v; last;}} for ($i = 0; $i <= $orgasc; $i++) { if($orgasv == $orgas{$i}){ $pflag++; } } if($pflag == 0){ $outtxt=join('+',$outtxt,sprintf"$orgasv"); } $pflag=0; $orgas{$orgasc}=$orgasv; $orgasc++; } }