#!/bin/rc
# collect topology of network by doing a traceroute of
# every host this can get very slow if many hosts timeout.
fn dotrace {
cat $* |
while(s=`{read}){
ip/traceroute $s |
awk -v 'prev='^$sysname '
$1 ~ "^[0-9]+.[0-9]+.[0-9]+.[0-9]+$" {
host = $5
if(host == "")
host = $1;
printf("%s %s %s\n", $2, prev, host);
prev = host;
}
'
}
}
# Draw network topology using dot. We exclude leaf nodes as there are
# probably many of these. Each vertex is labeled with the RTT in milliseconds.
fn dograph {
@{
echo 'graph tracenet {'
sort +1 $* |
uniq +1 |
awk '{
rtt = $1
src = $2
dst = $3
map[src "|" dst] = rtt;
num[src "|" dst]++;
hits[src]++;
hits[dst]++;
}
END{
for(pair in map){
rtt = map[pair];
n = split(pair, a, "|");
src = a[1];
dst = a[2];
if(hits[dst] > 1)
printf("\t \"%s\" -- \"%s\" [label=%5.1f]\n",
src, dst, rtt/1000);
}
}
'
echo '}'
} |
dot '-Gsize=11,8' '-Grotate=90' -Tps
}
fn usage {
echo 'usage: tracenet -t [ip-list] > tracenet.out # trace network' >[1=2]
echo 'or tracenet -g [tracenet.out] > tracenet.ps # draw graph' >[1=2]
exit 'usage'
}
prog=usage
while(! ~ $#* 0 && ~ $1 -* && ! ~ $1 --){
switch($1){
case -t
prog=dotrace
shift
case -g
prog=dograph
shift
case -*
usage
}
}
if(! ~ $#* 0 && ~ $1 --)
shift
$prog $*
|