#! /usr/bin/perl #use Math::BigInt; @errRoute=(); @asArray=(); @peerArray=(); @outdegree=(); $DATAPRE="/var/DATA/STATICS/"; # $DATAPRE="./data/"; $AVERAGE_PATH_LEN=$DATAPRE."average_path.data"; $Ave_path=0; $MAX_PATH_LEN=$DATAPRE."max_path.data"; $Max_apth=0; $AVERAGE_OUTDEGREE=$DATAPRE."average_out.data"; $Ave_out=0; $MAX_OUTDEGREE=$DATAPRE."max_out.data"; $Max_out=0; $ROUTE_NUM=$DATAPRE."route_num.data"; $RouteN=0; $AS_PEER_NUM=$DATAPRE."as_peer_num.data"; $AsPeer=0; $AS_NUM=$DATAPRE."as_num.data"; $AsN=0; $ADDR_PREFIX_LEN=$DATAPRE."prefix_len.data"; for($i=1;$i<=128;$i++) { $Addr[$i]=0; } $AVERAGE_PREFIX_LEN=$DATAPRE."average_prefix_len.data"; $Ave_addr_len=0; $MIN_PREFIX_LEN=$DATAPRE."min_prefix_len.data"; $Min_addr_len=33; $MAX_PREFIX_LEN=$DATAPRE."max_prefix_len.data"; $Aax_addr_len=0; $AVERAGE_ADDRESS=$DATAPRE."average_address.data"; $Ave_addr=0; #$Ave_addr=Math::BigInt->new("0"); $STATICS_HTML="/www/htdocs/bgp-view/statics.html"; $ARGV = shift; open(INFILE,$ARGV); $filename=$ARGV.".path"; #$ARGV = shift; open(OUTFILE, ">$filename"); #@header=("status", "protocol", "preference", "time", "destination", "next hop", "interface", "path"); @header=("status", "destination", "preference", "path"); while($line = ){ $firstchar=substr($line, 0, 1); if(index("s*>iax",$firstchar,0)!=-1) { #print $line; @data=split(/\s+/,$line,0); $pathbegin = 0; $flag = 0; for($i=0;($i<=$#data) && ($flag == 0);$i++) { if( ( $data[$i] == 4789 ) || ( $data[$i] == 4538 ) ) { $pathbegin = $i; $flag = 1; break; } } if( $data[$pathbegin] == 4538 ) { @path = @data[$pathbegin..$#data]; if($Max_path<$#path) { $Max_path=$#path; } $Ave_path+=$#path; for($i=0;$i<=$#path;$i++) { print OUTFILE $path[$i]; print OUTFILE " "; } print OUTFILE "\n"; processpath(@path); %param=($header[0]=>$data[0], $header[1]=>$data[1], $header[2]=>$data[2],); $prelen = substr($data[1],rindex($data[1],'/')+1); if($Min_addr_len>$prelen) { $Min_addr_len=$prelen; } if($Max_addr_len<$prelen) { $Max_addr_len=$prelen; } $Addr[$prelen]++; $Ave_addr_len+=$prelen; if($prelen>=64) { $errMsg="AS".$path[$#path-1]." ".$data[1]." "; for($i=0;$i<$#path;$i++) { $errMsg=$errMsg.$path[$i]."-"; } $errMsg.=$path[$i]; $errRoute[$#errRoute+1] = $errMsg; } $Ave_addr=pow2(128-$prelen); $RouteN++; } } } close(OUTFILE); close(INFILE); print "\nRoute : ".$RouteN."\n"; $Ave_path=$Ave_path/$RouteN; $Ave_addr_len=$Ave_addr_len/$RouteN; $Ave_addr=128-log2($Ave_addr/$RouteN); #$backup=$ARGV.".".$count; #print $backup; #copyfile($backup,$ARGV); #system("/bin/rm $ARGV"); for($mini=0;$mini<($#peerArray-1)/2;$mini++) { for($searchi=$mini+1;$searchi<=($#peerArray-1)/2;$searchi++) { if($peerArray[2*$mini] > $peerArray[2*$searchi]) { @peerArray[2*$mini, 2*$searchi]=@peerArray[2*$searchi,2*$mini]; @peerArray[2*$mini+1,2*$searchi+1]=@peerArray[2*$searchi+1,2*$mini+1]; } } } #$ARGV = shift; $filename=$ARGV.".peer"; open(OUTFILE,">$filename"); for($i=0;$i<($#peerArray+1)/2;$i++) { print OUTFILE $i; print OUTFILE " "; print OUTFILE $peerArray[2*$i]; print OUTFILE ":"; print OUTFILE $peerArray[2*$i+1]; print OUTFILE "\n"; } $As_peer=$i; close(OUTFILE); #$backup=$ARGV.".".($#peerArray+1)/2; #print $backup; #copyfile($backup,$ARGV); #$ARGV = shift; for($i=0;$i<=$#peerArray;$i++) { $flag=0; for($j=0;$j<=$#asArray;$j++) { if($asArray[$j] == $peerArray[$i]) { $flag=1; break; } } if($flag==0) { $asArray[$#asArray+1]=$peerArray[$i]; } } for($i=0;$i<$#asArray;$i++) { for($j=$i+1;$j<=$#asArray;$j++) { if($asArray[$i]>$asArray[$j]) { @asArray[$i,$j]=@asArray[$j,$i]; } } } $filename=$ARGV.".aslist"; open(OUTFILE,">$filename"); for($i=0;$i<=$#asArray;$i++) { print OUTFILE $asArray[$i]; print OUTFILE "\n"; } close(OUTFILE); $AsN=$#asArray+1; $preAS = -1; $asser = -1; for($i=0;$i<($#peerArray+1)/2;$i++) { if(($preAS==-1) || (($preAS!=-1)&&($preAS!=$peerArray[2*$i]))) { my(@myas) = (); $asser++; $outdegree[$asser] = \@myas; ${outdegree[$asser]}[$#{$outdegree[$asser]}+1]=$peerArray[2*$i]; ${outdegree[$asser]}[$#{$outdegree[$asser]}+1]=$peerArray[2*$i+1]; }else { ${outdegree[$asser]}[$#{$outdegree[$asser]}+1]=$peerArray[2*$i+1]; } $preAS=$peerArray[2*$i]; } #$ARGV = shift; $filename=$ARGV.".as"; open(OUTFILE, ">$filename"); for($i=0;$i<=$#outdegree;$i++) { if($Max_out<$#{$outdegree[$i]}) { $Max_out=$#{$outdegree[$i]}; } $Ave_out+=$#{$outdegree[$i]}; for($ii=0;$ii<=$#{$outdegree[$i]};$ii++) { print OUTFILE ${outdegree[$i]}[$ii]; print OUTFILE " "; } print OUTFILE "\n"; } close(OUTFILE); $Ave_out=$Ave_out/($AsN); #$backup=$ARGV.".".($#outdegree+1); #print $backup; #copyfile($backup,$ARGV); $ARGV=substr($ARGV,rindex($ARGV,"/")+1); $time =time(); $timestring = localtime($time); open(HTMLFILE, ">$STATICS_HTML"); print HTMLFILE "BGP Table STATICS\n"; print HTMLFILE "

Global IPv6 BGP Table Statistics

\n"; print HTMLFILE "Update: $timestring
\n"; print HTMLFILE "
\n"; print HTMLFILE "\n"; print HTMLFILE ""; writefile($AVERAGE_PATH_LEN,"$ARGV: $Ave_path\n"); print HTMLFILE "\n"; print HTMLFILE ""; writefile($MAX_PATH_LEN,"$ARGV: $Max_path\n"); print HTMLFILE "\n"; print HTMLFILE ""; writefile($AVERAGE_OUTDEGREE,"$ARGV: $Ave_out\n"); print HTMLFILE "\n"; print HTMLFILE ""; writefile($MAX_OUTDEGREE,"$ARGV: $Max_out\n"); print HTMLFILE "\n"; print HTMLFILE ""; writefile($ROUTE_NUM,"$ARGV: $RouteN\n"); print HTMLFILE "\n"; print HTMLFILE ""; writefile($AS_NUM,"$ARGV: $AsN\n"); print HTMLFILE "\n"; print HTMLFILE ""; writefile($AS_PEER_NUM,"$ARGV: $As_peer\n"); print HTMLFILE "\n"; print HTMLFILE ""; writefile($AVERAGE_PREFIX_LEN,"$ARGV: $Ave_addr_len\n"); print HTMLFILE "\n"; print HTMLFILE ""; writefile($MAX_PREFIX_LEN,"$ARGV: $Max_addr_len\n"); print HTMLFILE "\n"; print HTMLFILE ""; writefile($MIN_PREFIX_LEN,"$ARGV: $Min_addr_len\n"); print HTMLFILE "\n"; print HTMLFILE ""; writefile($AVERAGE_ADDRESS,"$ARGV: $Ave_addr\n"); print HTMLFILE "\n"; #print $Addr[24]; $addr_len=""; for($i=1;$i<=128;$i++) { $addr_len.=" "; $addr_len.=$Addr[$i] ; if($Addr[$i] != 0) { print HTMLFILE "\n"; } } writefile($ADDR_PREFIX_LEN,"$ARGV: $addr_len\n"); print HTMLFILE "\n"; print HTMLFILE "\n"; print HTMLFILE "
AVERAGE_PATH_LEN:".$Ave_path."
MAX_PATH_LEN:".$Max_path."
AVERAGE_OUTDEGREE:".$Ave_out."
MAX_OUTDEGREE: ".$Max_out."
Route Number:".$RouteN."
As Number:".$AsN."
As Peering Number:".$As_peer."
AVERAGE_PREFIX_LEN:".$Ave_addr_len."
MAX_PREFIX_LEN:".$Max_addr_len."
MIN_PREFIX_LEN:".$Min_addr_len."
AVERAGE_ADDRESS:".$Ave_addr."
PREFIX NUMBER:
\/$i".$Addr[$i]."
PROBLEM ROUTE ENTRY:
\n"; for($i=0;$i<=$#errRoute; $i++) { @errMsg=split(' ', $errRoute[$i], 0); print HTMLFILE "\n"; } print HTMLFILE "
".$errMsg[0]."".$errMsg[1]."".$errMsg[2]."

"; print HTMLFILE "This page is last updated at $timestring."; print HTMLFILE ""; close(HTMLFILE); sub processpath(@) { my(@mypath) = @_; $origin="ie?a"; for($ppi=0; $ppi<$#mypath; $ppi++) { if(index($origin,$mypath[$ppi],0)==-1 && ($ppi+1<=$#mypath && index($origin,$mypath[$ppi+1],0)==-1)&&($mypath[$ppi]!=$mypath[$ppi+1])) { $flag=0; for($hpi=0;$hpi<($#peerArray+1)/2;$hpi++) { if(($peerArray[2*$hpi] eq $mypath[$ppi])&&($peerArray[2*$hpi+1] eq $mypath[$ppi+1])) { $flag=1; break; } } if($flag==0) { $peerArray[$#peerArray+1]=$mypath[$ppi]; $peerArray[$#peerArray+1]=$mypath[$ppi+1]; } } } } sub copyfile(@) { my(@myfile)=@_; print "Read form $myfile[1], copy to $myfile[0]\n"; open(FROMSRC,$myfile[1]); open(TODEST,">$myfile[0]"); while($line=) { print TODEST $line; } close(FROMSRC); close(TODEST); } sub getascountry(@) { my(@asnum) = @_; open(COUNTRYFILE,"as2country.txt"); while($line=) { @ascn=split(/\s+/,$line,0); if($ascn[1] == $asnum[0]) { $CODE = $ascn[2]; } } close(COUNTRYFILE); return $CODE; } sub getasdescr(@) { my(@asnu) = @_; $asno="AS".$asnu[0]; open(DESCFILE,"asdesc.txt"); while() { @desc=split(' ', $_); if($desc[0] eq $asno) { for($desci=1;$desci<=$#desc-7;$i++) { $descrip.=$desc[$i]; $secript.=" "; } } } close(DESCFILE); chop($descrip); return $descrip; } sub pow(@) { my(@end)=@_; $endnum=Math::BigInt->new("1"); for($iii=0;$iii<@end[0];$iii++) { $endnum=$endnum*2; } return $endnum; } sub log2{ my $n = shift; return log($n)/log(2); } sub pow2{ my $n = shift; return exp($n*log(2)); } sub writefile(@) { my @param=@_; if(-e $param[0]) { open(DATAFILE,">>$param[0]"); }else { open(DATAFILE,">$param[0]"); } print DATAFILE $param[1]; close(DATAFILE); }