#! /usr/bin/perl # # # use GDBM_File; use Socket; $genesis_dir='/home/jasper/wireless-leiden/svn/genesis/nodes'; $svn='/usr/bin/svn'; if ($ARGV[0] eq 'DEBUG') {shift(@ARGV);$DEBUG=1;} else {$DEBUG=0;} $revision=`$svn info $genesis_dir|grep 'Last Changed Rev:'`; $revision=~s/Last Changed Rev:\s+(\d+)\D*/$1/s; $revision_file='last_cfgmaker_revision'; $last_revision=`cat $revision_file`; $last_revision=~s/\D*(\d+)\D*/$1/s; if ($revision <= $last_revision) {#if ($DEBUG) {print "Nothing to do: $last_revision=$revision [$ARGV[0]\n";} if ($ARGV[0] eq '') {exit;} } elsif ($DEBUG) {print "Last revision= [$last_revision] <> [$revision]\n";} #chdir($genesis_dir) || die "Could not cd to $genesis_dir"; foreach $file (glob("$genesis_dir/*/wleiden.conf")) { $file=~s/^$genesis_dir\///; $file=~s/\/wleiden\.conf//gi; #print "FILE: $file\n"; if (! grep(/^$file$/,@NODES)) { push(@NODES,$file); # if ($DEBUG) {print STDERR "Adding node $file\n";} } } open (NODES,">nodes") || die; print NODES "$revision\n"; foreach $node (@NODES) { if ($node=~/(demo|test|vuilnis|vpn)/) {next;} if ($node eq 'CNodeMarten') {next;} $nodez++; if ($DEBUG) {print STDERR "Doing node $node\n";} make_cfg($node); } close(NODES); open (FILE,">${revision_file}"); print FILE "$revision\n"; close(FILE); sub make_cfg { local($node)=@_; local($r,$if,$main,$wireless)=''; local($X,$Y,$Real_X,$RealY,$AGGREGATE,$master_ip); local(%config,%DESC,%SDESC,%ANTENNA,%BEAMWIDTH,%CABLE,%CHANNEL,%DHCP,%DHCP_STATIC); local(%DIRECTION,%ESSID,%GAIN,%IP,%MODE,%NAT,%OSPF_AREA,%OSPF_BROADCAST); local(%OSPF_NEIGHBORS,%POINT_TO_POINT,%POLAR,%ROUTE,%SENS,%SPEED,%TXPOWER,%TYPE); local(%OSPF_COST); local($labelpos,$neighbors,$link_file,$int_file); local(%ptp_done); do "$genesis_dir/${node}/wleiden.conf" || return; parse_config(); $XY{"$node-XY"}="$X:$Y"; if ($Real_X) {$XY{"$node-RXY"}="$Real_X:$Real_Y";} $XY{"$node-labelpos"}=$labelpos; if ($AGGREGATE) {$agg=$AGGREGATE;} else {$agg=21;} ($mip,$netmask,$broadcast,$network,$width)=calc_ip($master_ip); ($master_ip,$junk)=split(/\//,$master_ip); if ($agg eq 32) {$nm=0xffffffff;} else {$nm=0xffffffff-1<<(31-$agg);} if ($nodetype=~/CNode/i) { if ($node=~/cnode(evert|rene|kaag2|mlk|bdboon|henk|lmdorp)/i) {next;} print NODES "$node|$master_ip/$agg=10|"; foreach $if (sort keys %config) { if (($node=~/cope/i) && ($if=~/wi2/)) {next;} # interface niet gebruiken. if (($node=~/IMI/i) && ($if=~/wi3/)) {next;} # interface niet gebruiken. if (($node=~/ruben/i) && ($if=~/wi2/)) {next;} # interface niet gebruiken. # if (($node=~/ajsoft/i) && ($if=~/wi2/)) {next;} # interface niet gebruiken. if (($node=~/broekplein/i) && ($if=~/wi3/)) {next;} # interface niet gebruiken. if (($node=~/zijloever/i) && ($if=~/wi2/)) {next;} # interface niet gebruiken. if (($node=~/hmkerk1/i) && ($if=~/wi1/)) {next;} # interface niet gebruiken. if (($node=~/hmkerk2/i) && ($if=~/wi1/)) {next;} # interface niet gebruiken. if (($node=~/lijtweg1/i) && ($if=~/wi1/)) {next;} # interface niet gebruiken. $IP=$IP{$if};$IP=~s/\s+//gi; ($ii,$netmask,$broadcast,$network,$width)=calc_ip($IP); # printf "$ii & %x = %i $mip & %x = %i\n",$nm,($ii & $nm),$nm,($mip & $nm); if (($ii & $nm) eq ($mip & $nm)) {next;} $COST=$OSPF_COST{$if}; if (! $COST) {$COST=10;} # if (($node=~/graficall/i) && ($if=~/wi2/)) {$COST=1000;} # interface niet gebruiken. # if (($node=~/cetim[23]/i) && ($if=~/(wi0|sis)/)) {1;} # els # if ($node=~/cetim/i) {$COST=1000;} if ($node=~/(rustenborgh|hofwijck|regenboog|broekplein)/i) {$COST=1000;} print NODES "$IP=$COST|"; if ($COST ne 10) {print "$node {$if} $IP=$COST|\n";} } print NODES "\n"; } } #make_cfg sub parse_config { foreach $if (keys %config) { $cfg=$config{$if}; #if (! $html) {print "Parsing interface: $if\n";} while ($cfg) { $cfg=~s/^([^\n\r]+)[\r\n]*//m; $line=$1; $line=~s/\s*#.*//; if ((($name,$value)=split(/=/,$line)) eq 2) { #print "VAL($name)=$value\n"; $doit="if (exists(\$$name\{\"$if\"\})) {\$$name\{\"$if\"\}.=\"$separator$value\";} else {\$$name\{\"$if\"\}.=\"$value\";}"; #print "DOIT: [$doit]\n"; eval($doit); } #print "CFG:[$cfg]\n"; $cfg=~s/[\r\n]*$//m; } } #if ($functions_only<1) {print "Done parsing config.\n";} } sub calc_ip { local($i)=@_; local($a,$b,$c,$d); local($nm); local($ip,$width)=split(/\//,$i); local($a,$b,$c,$d)=split(/\./,$ip); local($ii)=($a<<24)+($b<<16)+($c<<8)+$d; if ($width eq 32) {$nm=0xffffffff;} else {$nm=0xffffffff-1<<(31-$width);} $nw=($ii & $nm); $br=$nw | (0xffffffff & ~$nm); $netmask=itoadr($nm);; $broadcast=itoadr($br);; $network=itoadr($nw); # $i=itoadr($ii); # printf "ip=$ip|width=$width|nm=%0x|$netmask|br=%0x|$broadcast|$i|\n",$nm,$br; return($ii,$netmask,$broadcast,$network,$width); } sub itoadr { local($ip)=@_; local($a,$b,$c,$d); $a=($ip & 0xff000000) >> 24; $b=($ip & 0x00ff0000) >> 16; $c=($ip & 0x0000ff00) >> 8; $d=($ip & 0x000000ff); return("$a.$b.$c.$d"); }