added http://meshcube.org/nylon/utils/olsr-topology-view.pl into
authorBernd Petrovitsch <bernd@firmix.at>
Sat, 3 Nov 2007 22:56:07 +0000 (22:56 +0000)
committerBernd Petrovitsch <bernd@firmix.at>
Sat, 3 Nov 2007 22:56:07 +0000 (22:56 +0000)
lib/httpinfo/misc as suggested by Jens Nachtigall <nachtigall@web.de>

CHANGELOG
lib/httpinfo/misc/olsr-topology-view.pl [new file with mode: 0644]

index 410e1b9..a3c6524 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,5 @@
 This file states changes as of version 0.2.4:
-$Id: CHANGELOG,v 1.107 2007/11/02 20:58:06 bernd67 Exp $
+$Id: CHANGELOG,v 1.108 2007/11/03 22:56:07 bernd67 Exp $
 
 0.5.5 ---------------------------------------------------------------------
 
@@ -35,6 +35,8 @@ PATCHES and CLEANUPS by Bernd Petrovitsch <bernd@firmix.at>
 - Some minor and trivial cleanup: Added two functions to calculate the ETX
   value from a struct tc_edge_entry and a struct link_entry, respectively.
   And use them everywhere.
+- added http://meshcube.org/nylon/utils/olsr-topology-view.pl into
+  lib/httpinfo/misc as suggested by Jens Nachtigall <nachtigall@web.de>
 
 0.5.4 ---------------------------------------------------------------------
 
diff --git a/lib/httpinfo/misc/olsr-topology-view.pl b/lib/httpinfo/misc/olsr-topology-view.pl
new file mode 100644 (file)
index 0000000..6098589
--- /dev/null
@@ -0,0 +1,206 @@
+#!/usr/bin/perl
+
+# a hack to display OLSR topology information
+#
+# copyleft 2004 Bruno Randolf <br1@subnet.at>
+# licensed under the GPL
+
+use IO::Socket;
+use Getopt::Long;
+
+$TOPPATH = "/tmp";
+$NAME = "topology";
+$FILENAME = "$TOPPATH/$NAME.dot";
+$EXT = "png";
+$SERVER = "localhost";
+$PORT = "2004";
+$FULLSCREEN = 0;
+$HELP = 0;
+$KEEP = 0;
+$BGCOLOR = "black";
+$STYLE = 1;
+$SIZE = "8,8";
+$ROOTWIN = 0;
+$ONCE = 0;
+$GRAPH = 1;
+$SHOW = 1;
+$FONTNAME = "Courier";
+$FONTSIZE = 12;
+$LINEWIDTH = 0;
+$LINECOLOR = 0;
+$RESOLV = 0;
+
+GetOptions ("server=s" => \$SERVER,
+           "port=s" => \$PORT,
+           "fullscreen!" => \$FULLSCREEN,
+           "help!" => \$HELP,
+           "keep!" => \$KEEP,
+           "bgcolor=s" => \$BGCOLOR,
+           "fontname=s" => \$FONTNAME,
+           "fontsize=s" => \$FONTSIZE,
+           "style=i" => \$STYLE,
+           "size=s" => \$SIZE,
+           "rootwin!" => \$ROOTWIN,
+           "once!" => \$ONCE,
+           "graph!" => \$GRAPH,
+           "show!" => \$SHOW,
+           "linewidth!" => \$LINEWIDTH,
+           "linecolor!" => \$LINECOLOR,
+           "resolv" => \$RESOLV,
+            );
+
+if ($HELP) {
+       print << "EOF";
+usage: $0 [ --server SERVER ] [--port PORT] [--fullscreen] [--keep]
+
+a hack to display OLSR topology information
+
+options:
+        --server SERVER    connect to OLSR node (default: localhost)
+        --port PORT        connect to port (default: 2004)
+        --bgcolor          background color (default: black)
+        --fontname         font name (default: Courier)
+        --fontsize         font size (default: 12)
+        --style            drawing style 1, 2 or 3 (default:1)
+        --size X,Y         image size in inches for graphviz (default: 8,8)
+        --[no]fullscreen   display fullscreen (default: off)
+        --[no]rootwin      display in root window (default: off)
+        --[no]graph        genereate graphics (default: on)
+        --[no]show         display the graphics (default: on)
+        --[no]once         run only 1 time, then exit (default: run forever)
+        --[no]linewith     change line width according to metric (default: off)
+        --[no]linecolor    change line color according to metric (default: off)
+        --[no]resolv       resolv hostnames (default: off)
+        --[no]keep         keep the .dot files with timestamp in /tmp (default: off)
+
+requires the "graphviz" and "imagemagick" packages installed
+and the "olsrd_dot_draw" plugin configured on the olsr node
+
+EOF
+       exit;
+}
+
+
+`touch $TOPPATH/$NAME.$EXT`;
+
+$remote = IO::Socket::INET->new(
+                        Proto    => "tcp",
+                        PeerAddr => $SERVER,
+                        PeerPort => $PORT,
+                    )
+                  or die "cannot connect to port $PORT at $SERVER!\nis the olsrd_dot_draw plugin loaded and configured to allow connections from this host?\n";
+
+$f;
+$start = 1;
+
+$FULLOPT = "-backdrop -background black" if $FULLSCREEN;
+
+if ($STYLE == 1) {
+       $DOT_CMD = "neato -Tpng -Gsize=${SIZE} -Gbgcolor=${BGCOLOR} -Gsplines=true -Nstyle=filled -Nfontname=${FONTNAME} -Nfontsize=${FONTSIZE} -Efontname=${FONTNAME} -Efontsize=${FONTSIZE} -Ncolor=white -Nfillcolor=white -Ecolor=grey -Elen=4 -Earrowsize=2 -Efontcolor=white $FILENAME -o $TOPPATH/$NAME.new";
+}
+elsif ($STYLE == 2) {
+       $BGCOLOR = "grey";
+       $DOT_CMD = "dot -Tpng -Gsize=${SIZE} -Elen=2 -Ncolor=grey -Nstyle=filled -Nfillcolor=white -Nfontname=${FONTNAME} -Nfontsize=${FONTSIZE} -Efontname=${FONTNAME} -Efontsize=${FONTSIZE} -Nfontcolor=red -Nwidth=1 -Gbgcolor=$BGCOLOR $FILENAME -o $TOPPATH/$NAME.new";
+}
+elsif ($STYLE == 3) {
+       $BGCOLOR = "\#ff6600";
+       $DOT_CMD = "neato -Tpng -Gsize=10,9 -Gbgcolor=${BGCOLOR} -Gsplines=true -Nstyle=filled -Nfontname=${FONTNAME} -Nfontsize=${FONTSIZE} -Efontname=${FONTNAME} -Efontsize=${FONTSIZE} -Nheight=1.3 -Nwidth=1.3 -Gsplines=true -Ncolor=darkslategrey -Nfillcolor=darkslategrey -Ecolor=black -Elen=4 -Earrowsize=3 $FILENAME -o $TOPPATH/$NAME.new";
+}
+
+
+while ( <$remote> ) 
+{
+       $line = $_;
+       if ($RESOLV) {
+               $line = resolv( $line );
+       }
+       if ($LINEWIDTH || $LINECOLOR) {
+               $line = draw_thicker_metric_lines( $line );
+       }
+       $f = $f . $line;
+
+       # end of one graph
+       if ( $line =~ /}/i ) { 
+               #print "* ";
+               open DOTFILE, ">$FILENAME";
+               print DOTFILE $f;
+               close DOTFILE;
+               $f = "";
+
+               if ($GRAPH) {
+                       `$DOT_CMD`;
+                       `mv $TOPPATH/$NAME.new $TOPPATH/$NAME.$EXT`;
+               }
+               if ($KEEP) {
+                       `cp $TOPPATH/$NAME.dot $TOPPATH/$NAME-\$(date +'%Y-%m-%d-%H-%M-%S').dot`;
+               }
+               if ($SHOW) {
+                       if ($ROOTWIN) {
+                               system "display -window root -backdrop $TOPPATH/$NAME.$EXT &";
+                       }
+                       elsif ($start) {
+                               system "display $FULLOPT -update 5 $TOPPATH/$NAME.$EXT &";
+                               $start = 0;
+                       }
+               }
+               exit if $ONCE;
+       }
+}
+
+print "connection closed\n";
+
+
+sub resolv {
+       my $l = shift;
+       if ( $l =~ /\"(.*)\" -> "([^[]*)"(.*)/) {
+               my $from = $1;
+               my $to = $2;
+               my $rest = $3;
+               $from =~ s/\"//g;
+               $to =~ s/\"//g;
+               my $iaddrf = inet_aton($from);
+               my $fromn  = gethostbyaddr($iaddrf, AF_INET);
+               my $iaddrt = inet_aton($to);
+               my $ton  = gethostbyaddr($iaddrt, AF_INET);
+               $fromn = $from if ! $fromn;
+               $ton = $to if ! $ton;
+               $l = "\"$fromn\" -> \"$ton\"$rest\n";
+       }
+       return $l;
+}
+
+
+sub draw_thicker_metric_lines { 
+       # sla 04.04.2005
+       # a hack to draws thicker lines for better metrics (the better the thicker).
+       # colorize the metric lines.
+       #
+       my $l = shift;
+       if ($l =~ /.*label="[0-9].*/){     # recognizion pattern
+               @n=split (/"/,$l);         # split the string to get the metric value
+               if ($LINECOLOR) {
+                       if ( $n[5]>2 ) {        # colorize metrics greater than 2 gray            
+                               $c="888888";
+                       }
+                       else {                     # colorize metrics less than 2 black
+                               $c="000000";            
+                       }
+                       $setcol = "color=\"#$c\",";
+               }
+               if ($LINEWIDTH) {
+                       if ($n[5]>0 && $n[5]<10) {  # thicker lines if 10 > metric > 0
+                               $lt=6/$n[5];
+                               $at=$lt/2;
+                       }
+                       else {                     # at least draw a thin line
+                               $lt=1;
+                               $at=$lt;
+                       }
+                       $setwidth = "style=\"setlinewidth($lt)\", arrowsize=$at";
+               }
+               $l =~ s/\]/, $setcol $setwidth]/g; # replace pattern
+       }
+       return $l;
+}
+
+__END__