Vnuml2dot

From VNUML-WIKI
Jump to: navigation, search

How to generate a graph of the scenario topology

Thanks to Francisco Jesus Monserrat Coll (RedIRIS), we provide here a small script in Perl that can be used to get a graphical representation of VNUML scenario.

To use it (let's assume that the script is named vnuml2dot.pl)

 vnuml2dot scenario.xml > scenario.dot
 neato -Tpng -oscenario.png scenario.dot

And now you can see scenario.png with any graphic program (Gimp, etc.). The neato command comes with the graphviz package (in Debian, just 'apt-get install libgraphviz-perl').

Note that, in the words of its own author, the script is not perfect and there is room for improvement. If you develop improved versions, please tell us about it!

vnuml2dot.pl script

 #!/usr/bin/perl
 #
 # Nota:
 #  networks -> circle
 #  vms -> squares
 #  interfaces -> lines
 
 open FILE,  $ARGV[0]  || die "Can't open $ARGV[0]\n" ;
 
 my @conf=<FILE> ;
 close FILE ;
 
 print<<FIN;
 
 // Graph of VNUML configuration from $ARGV[0] 
 graph G {
 overlap=scale
 splines=true
 sep=.1
 
 FIN
 
 # OK magic starts!
 
 print "// Networks\n" ;
 my ($net,$type) ;
 for (my $i=0 ; $i!=@conf ; $i ++ ) {
 	#print "Linea = $conf[$i]\n" ;
 	if ($conf[$i] =~ /.*<net.*name=\"(.*)".*mode=\"(.*)\".*\/>.*/ ) { 
 		$net= $1 ;
 		$type=$2 ;
 	print "$net [label=\"Red $net, $type\"] ;\n" ;
 	print "$net [shape=\"circle\"] ;\n" ;
 	}
 }
 
 # OK now vms
 
 print "\n\n// Machines \n" ;
 my $linea = join "", @conf ;
 
 $linea =~ m/<vm (.*)<\/vm>.*/msi ;
 my @maquinas= split /<\/vm>/ , $1 ;
 
 for (my $i=0 ; $i!=@maquinas ; $i++ ) {
   if ( $maquinas[$i] =~ /name.*=.*\"(.*)\"/ ) {
     my $maquina=$1 ;
     print  "$1 [label=\"$1\"] ;\n" ;
     print  "$1 [shape=\"box\"] ;\n" ; 
     # Interface magic
     my $if= $maquinas[$i] ;
     # Koder
     my @t = split /\n/, $if ;
     my $if=  join "" , @t ;
     # 
     $if=~ m/<if(.*)<\/if>.*/msi ;
     #print "Lo que sale es $1\n" ;
     my @ifs= split /<\/if>/, $1 ;
     for (my $k=0 ; $k!=@ifs ; $k++ ){
       #  print "$ifs[$k]\n" ;
       my $t = $ifs[$k] ;
       # print "if=$t\n" ;
       $t =~ /.*id.*=.*\"(.*)\".*net.*=.*\"(.*)\".*<ipv4.*>(.*)<\/ipv4>/s ;
       # print "if= $1 , net=$2 \n" ;
       print "// Network connections of $maquina\n" ;
       print "// Network interface $1 IP address $3 network $3\n" ;
       print "$maquina -- $2  [ label = \"$3\" ];\n " ;
     }	
     print "\n" ;
   }
 }
 
 print "\n}\n" ;