weathermap4rrd-perl-1.2rc3/0000755000000000000000000000000010243634504015614 5ustar rootroot00000000000000weathermap4rrd-perl-1.2rc3/weathermap0000755000000000000000000012545610244420056017710 0ustar rootroot00000000000000#!/usr/bin/perl # Weathermap4rrd # Alexandre Fontelle, # http://weathermap4rrd.tropicalex.net # based on Network Wearthermap - version 1.1.1 from Panagiotis Christias (http://netmon.grnet.gr/weathermap/) # modified for RRDTool use and other stuff $VERSION = "1.2RC3"; use Getopt::Long; use GD; use RRDs; use POSIX; ################################################################ # # Configuration parameters # $CONFIG = "weathermap.conf"; # Default value if nothing is specified in config file $OUTPUTFILE = "weathermap.png"; # Default value if nothing is specified in config file $DEBUG = 0; $WIDTH = 740; # Default value if nothing is specified in config file $HEIGHT = 600; # Default value if nothing is specified in config file $DATE = "now"; $FONT = gdLargeFont; $RRDTOOL_PATH = "/usr/bin/"; ################################################################ %optctl=(); GetOptions(\%optctl, "config:s", "output:s", "date:s", "version", "group:s", "help", "debug", "") || exit(1); if($optctl{"config"}) { $CONFIG = $optctl{"config"} }; if($optctl{"output"}) { $OUTPUTFILE = $optctl{"output"} }; if($optctl{"date"}) { $DATE =`/bin/date --date="$optctl{"date"}" +%s`; } else { $DATE = 0; } if($optctl{"version"}) { &version; exit; } if($optctl{"group"}) { $filter=$optctl{"group"}; print "DEBUG : filter for group $filter\n" if ($DEBUG); } if($optctl{"help"}) { &usage; exit; } if($optctl{"debug"}) { $DEBUG=1; } if ($DEBUG) { print "Weathermap4rrd $version"; } &read_config($CONFIG); if($background){ open (PNG,"$background") || die "$background: $!\n"; $map = newFromPng GD::Image(PNG) || die "newFromPng failed."; close PNG; } else { $map=new GD::Image($WIDTH,$HEIGHT) } if(! $titlebackground_red) { $titlebackground_red=255; $titlebackground_green=255; $titlebackground_blue=255; } if(! $titleforeground_red) { $titleforeground_red=0; $titleforeground_green=0; $titleforeground_blue=0; } #$maxColors = $map->colorsTotal; &alloc_colors; #$map->transparent($white); if ( $GD::VERSION > 2 ) { # Anti-aliasing enable gdAntiAliased(); $map->setAntiAliased($white); # to disable anti-aliasing #$map->setAntiAliasedDontBlend($color,0); #print "ok ".$GD::VERSION."\n"; } print "Reading rrd files...\n\n" if($DEBUG); foreach $link (keys %target){ $data = $target{$link}; print "FILE: $data\n" if($DEBUG); if ( ! $DATE ) { $DATE= RRDs::last "$data"; $version=&rrdtool_getversion(); print "RRDTool binary version detected : $version\n" if ($DEBUG); if ($version=="1.2") { $DATE= $DATE-300; } print "No date specified, last value will be read : ".scalar localtime($DATE)."\n" if ($DEBUG); } my ($start,$step,$names,$data) = RRDs::fetch "$data","AVERAGE","--start","$DATE","--end","$DATE"; my $ERR=RRDs::error; die "W4RRD ERROR while reading $target{$link}: $ERR\n" if $ERR; print "Start: ", scalar localtime($start), " ($start)\n" if($DEBUG); print "Step size: $step seconds\n" if($DEBUG); print "DS names: ", join (", ", @$names)."\n" if($DEBUG); print "Data points: ", $#$data + 1, "\n" if($DEBUG); foreach my $line (@$data) { if(@$line[0] != null) { $input{$link}=@$line[$inpos{$link}-1]*$coef{$link}; $output{$link}=@$line[$outpos{$link}-1]*$coef{$link}; print "LINK: $link, Input: $input{$link}\n" if($DEBUG); print "LINK: $link, Output: $output{$link}\n" if($DEBUG); } } } print "\nDisplaying icons...\n\n" if($DEBUG); foreach $node (keys %iconpng){ if ($iconpng{$node} && (-e $iconpng{$node}) ) { open (ICON,$iconpng{$node}) || warn "$iconpng{$node}: $!\n"; $icone = newFromPng GD::Image(ICON); ($IconWidth,$IconHeight) = $icone->getBounds; $factor=$iconresize{$node}/100; if (! $factor) { $factor=1; } if ($iconx{$node}==0) { $iconx{$node} = $xpos{$node}-$IconWidth*$factor/2; $icony{$node} = $ypos{$node}-$IconHeight*$factor/2; } if ($icon_transparent{$node}==0) { $icon_transparent{$node}= 100; } $icone2=new GD::Image($IconWidth*$factor,$IconHeight*$factor); $white2=$icone2->colorAllocate(255,255,255); $icone2->transparent($white2); $icone2->copyResized($icone,0,0,0,0,$IconWidth*$factor,$IconHeight*$factor,$IconWidth,$IconHeight); $map->copyMerge($icone2,$iconx{$node},$icony{$node},0,0,$IconWidth*$factor,$IconHeight*$factor,$icon_transparent{$node}); close ICON; } else { print "File \"$iconpng{$node}\" not found !!. Icon will not appear on graph\n"; } } print "\nCalculating rates...\n\n" if($DEBUG); foreach $link (keys %target){ if ( (! $filter) || ($filter eq $group_name{$link} )) { $outrate=(int(($output{$link}/$maxbytesout{$link}+0.005)*100)>100) ? 100:int(($output{$link}/$maxbytesout{$link}+0.005)*100); $inrate=(int(($input{$link}/$maxbytesin{$link}+0.005)*100)>100) ? 100:int(($input{$link}/$maxbytesin{$link}+0.005)*100); if($output{$link} != 0 && $outrate == 0) { $outrate=1 } if($input{$link} != 0 && $inrate == 0) { $inrate=1 } print "$target{$link}: in=$input{$link}/$maxbytesin{$link} out=$output{$link}/$maxbytesout{$link}\n" if($DEBUG); print "Maxbytesin($link)=$maxbytesin{$link} Maxbytesout($link)=$maxbytesout{$link}\n" if($DEBUG); print "$target{$link}: outrate=$outrate%, inrate=$inrate%\n" if($DEBUG); $width=4; # Display first arrow from node A to node B if ($internodes{$link}) { if ($arrow_type{$link} eq "dot") { if ( ($GD::VERSION > 2.0) ) { if ($internodes{$link}==1) { &draw_arrow_dot( $xpos{$nodea{$link}}, $ypos{$nodea{$link}}, $internodex{$link}{$internodes{$link}},$internodey{$link}{$internodes{$link}}, $width, 0,1, &select_color($outrate), $outrate); &draw_arrow_dot( $xpos{$nodea{$link}}, $ypos{$nodea{$link}}, $internodex{$link}{$internodes{$link}},$internodey{$link}{$internodes{$link}}, $width, 0, 0, $black, $outrate); } else { &draw_dot( $xpos{$nodea{$link}}, $ypos{$nodea{$link}}, $internodex{$link}{1},$internodey{$link}{1}, $width, 0,1, &select_color($outrate), $outrate); &draw_dot( $xpos{$nodea{$link}}, $ypos{$nodea{$link}}, $internodex{$link}{1},$internodey{$link}{1}, $width, 0, 0, $black, $outrate); for ($i=1; $i=125000) { $coefdisplay=8/(1000*1000); $unitdisplay="Mbits"; } else { $coefdisplay=8/1000; $unitdisplay="Kbits"; } $todisplay=sprintf ("%.1f",$output{$link}*$coefdisplay). "$unitdisplay"; &label(&middle($xpos{$nodea{$link}},$internodex{$link}{1}), &middle($ypos{$nodea{$link}},$internodey{$link}{1})+15, "$todisplay", 0); } } else { # If no internodes are defined if ($arrow_type{$link} eq "dot") { if ( ($GD::VERSION > 2.0) ) { &draw_arrow_dot( $xpos{$nodea{$link}}, $ypos{$nodea{$link}}, &middle($xpos{$nodea{$link}},$xpos{$nodeb{$link}}), &middle($ypos{$nodea{$link}},$ypos{$nodeb{$link}}), $width, 0,1, &select_color($outrate), $outrate); &draw_arrow_dot( $xpos{$nodea{$link}}, $ypos{$nodea{$link}}, &middle($xpos{$nodea{$link}},$xpos{$nodeb{$link}}), &middle($ypos{$nodea{$link}},$ypos{$nodeb{$link}}), $width, 0,0, $black, $outrate); } } else { &draw_arrow( $xpos{$nodea{$link}}, $ypos{$nodea{$link}}, &middle($xpos{$nodea{$link}},$xpos{$nodeb{$link}}), &middle($ypos{$nodea{$link}},$ypos{$nodeb{$link}}), $width,1, &select_color($outrate), $outrate); &draw_arrow( $xpos{$nodea{$link}}, $ypos{$nodea{$link}}, &middle($xpos{$nodea{$link}},$xpos{$nodeb{$link}}), &middle($ypos{$nodea{$link}},$ypos{$nodeb{$link}}), $width, 0, $black, $outrate); } &label(&middle($xpos{$nodea{$link}},&middle($xpos{$nodea{$link}},$xpos{$nodeb{$link}})), &middle($ypos{$nodea{$link}},&middle($ypos{$nodea{$link}},$ypos{$nodeb{$link}})), $outrate . "%", 0); if ($displayvalue{$link}) { if ($output{$link} >=125000) { $coefdisplay=8/(1000*1000); $unitdisplay="Mbits"; } else { $coefdisplay=8/1000; $unitdisplay="Kbits"; } $todisplay=sprintf ("%.1f",$output{$link}*$coefdisplay). "$unitdisplay"; &label(&middle($xpos{$nodea{$link}},&middle($xpos{$nodea{$link}},$xpos{$nodeb{$link}})), &middle($ypos{$nodea{$link}},&middle($ypos{$nodea{$link}},$ypos{$nodeb{$link}}+70)), "$todisplay", 0); } } # Display second arrow from node B to node A if ($internodes{$link}) { if ($arrow_type{$link} eq "dot") { if ( ($GD::VERSION > 2.0) ) { if ($internodes{$link}==1) { &draw_arrow_dot( $xpos{$nodeb{$link}}, $ypos{$nodeb{$link}}, $internodex{$link}{$internodes{$link}},$internodey{$link}{$internodes{$link}}, $width, 0,1, &select_color($inrate), $inrate); &draw_arrow_dot( $xpos{$nodeb{$link}}, $ypos{$nodeb{$link}}, $internodex{$link}{$internodes{$link}},$internodey{$link}{$internodes{$link}}, $width, 0, 0, $black, $inrate); } else { &draw_dot( $xpos{$nodeb{$link}}, $ypos{$nodeb{$link}}, $internodex{$link}{$internodes{$link}},$internodey{$link}{$internodes{$link}}, $width, 0,1, &select_color($inrate), $inrate); &draw_dot( $xpos{$nodeb{$link}}, $ypos{$nodeb{$link}}, $internodex{$link}{$internodes{$link}},$internodey{$link}{$internodes{$link}}, $width, 0, 0, $black, $inrate); for ($i=$internodes{$link}; $i>ceil($internodes{$link}/2)+1;$i--) { &draw_dot( $internodex{$link}{$i},$internodey{$link}{$i}, $internodex{$link}{$i-1},$internodey{$link}{$i-1}, $width, 0,1, &select_color($inrate), $inrate); &draw_dot( $internodex{$link}{$i},$internodey{$link}{$i}, $internodex{$link}{$i-1},$internodey{$link}{$i-1}, $width, 0, 0, $black, $inrate); } if ($internodes{$link} % 2) { # Draw arrow to middle internode &draw_arrow_dot( $internodex{$link}{$i},$internodey{$link}{$i}, $internodex{$link}{ceil($internodes{$link}/2)},$internodey{$link}{ceil($internodes{$link}/2)}, $width, 0,1, &select_color($inrate), $inrate); &draw_arrow_dot( $internodex{$link}{$i},$internodey{$link}{$i}, $internodex{$link}{ceil($internodes{$link}/2)},$internodey{$link}{ceil($internodes{$link}/2)}, $width, 0, 0, $black, $inrate); } else { # Draw arrow to middle of central internodes &draw_arrow_dot( $internodex{$link}{$i},$internodey{$link}{$i}, middle($internodex{$link}{$i},$internodex{$link}{$i-1}), middle($internodey{$link}{$i},$internodey{$link}{$i-1}), $width, 0,1, &select_color($inrate), $inrate); &draw_arrow_dot( $internodex{$link}{$i},$internodey{$link}{$i}, middle($internodex{$link}{$i},$internodex{$link}{$i-1}), middle($internodey{$link}{$i},$internodey{$link}{$i-1}), $width, 0, 0, $black, $inrate); } } } } else { if ($internodes{$link}==1) { &draw_arrow( $xpos{$nodeb{$link}}, $ypos{$nodeb{$link}}, $internodex{$link}{$internodes{$link}}, $internodey{$link}{$internodes{$link}}, $width, 1, &select_color($inrate), $inrate); &draw_arrow( $xpos{$nodeb{$link}}, $ypos{$nodeb{$link}}, $internodex{$link}{$internodes{$link}}, $internodey{$link}{$internodes{$link}}, $width, 0, $black, $inrate); } else { &draw_rectangle( $xpos{$nodeb{$link}}, $ypos{$nodeb{$link}}, $internodex{$link}{$internodes{$link}}, $internodey{$link}{$internodes{$link}}, $width, 1, &select_color($inrate), $inrate); &draw_rectangle( $xpos{$nodeb{$link}}, $ypos{$nodeb{$link}}, $internodex{$link}{$internodes{$link}}, $internodey{$link}{$internodes{$link}}, $width, 0, $black, $inrate); for ($i=$internodes{$link}; $i>ceil($internodes{$link}/2)+1;$i--) { &draw_rectangle( $internodex{$link}{$i},$internodey{$link}{$i}, $internodex{$link}{$i-1},$internodey{$link}{$i-1}, $width, 1, &select_color($inrate), $inrate); &draw_rectangle( $internodex{$link}{$i},$internodey{$link}{$i}, $internodex{$link}{$i-1},$internodey{$link}{$i-1}, $width, 0, $black, $inrate); } if ($internodes{$link} % 2) { # Draw arrow to middle internode &draw_arrow( $internodex{$link}{$i},$internodey{$link}{$i}, $internodex{$link}{ceil($internodes{$link}/2)},$internodey{$link}{ceil($internodes{$link}/2)}, $width,1, &select_color($inrate), $inrate); &draw_arrow( $internodex{$link}{$i},$internodey{$link}{$i}, $internodex{$link}{ceil($internodes{$link}/2)},$internodey{$link}{ceil($internodes{$link}/2)}, $width,0, $black, $inrate); } else { # Draw arrow to middle of central internodes &draw_arrow( $internodex{$link}{$i},$internodey{$link}{$i}, middle($internodex{$link}{$i},$internodex{$link}{$i-1}), middle($internodey{$link}{$i},$internodey{$link}{$i-1}), $width,1, &select_color($inrate), $inrate); &draw_arrow( $internodex{$link}{$i},$internodey{$link}{$i}, middle($internodex{$link}{$i},$internodex{$link}{$i-1}), middle($internodey{$link}{$i},$internodey{$link}{$i-1}), $width, 0, $black, $inrate); } } } # Display bandwidth % links from node B to node A &label( &middle($xpos{$nodeb{$link}},$internodex{$link}{$internodes{$link}}), &middle($ypos{$nodeb{$link}},$internodey{$link}{$internodes{$link}}), $inrate . "%", 0); if ($displayvalue{$link}) { if ($input{$link} >=125000) { $coefdisplay=8/(1000*1000); $unitdisplay="Mbits"; } else { $coefdisplay=8/1000; $unitdisplay="Kbits"; } $todisplay=sprintf ("%.1f",$input{$link}*$coefdisplay). "$unitdisplay"; &label(&middle($xpos{$nodeb{$link}},$internodex{$link}{$internodes{$link}}), &middle($ypos{$nodeb{$link}},$internodey{$link}{$internodes{$link}})+15, "$todisplay", 0); } } else { # If no internodes are defined if ($arrow_type{$link} eq "dot") { if ( ($GD::VERSION > 2.0) ) { &draw_arrow_dot( $xpos{$nodeb{$link}}, $ypos{$nodeb{$link}}, &middle($xpos{$nodea{$link}},$xpos{$nodeb{$link}}), &middle($ypos{$nodea{$link}},$ypos{$nodeb{$link}}), $width, 0,1, &select_color($inrate), $inrate); &draw_arrow_dot( $xpos{$nodeb{$link}}, $ypos{$nodeb{$link}}, &middle($xpos{$nodea{$link}},$xpos{$nodeb{$link}}), &middle($ypos{$nodea{$link}},$ypos{$nodeb{$link}}), $width, 0,0, $black, $inrate); } } else { &draw_arrow( $xpos{$nodeb{$link}}, $ypos{$nodeb{$link}}, &middle($xpos{$nodea{$link}},$xpos{$nodeb{$link}}), &middle($ypos{$nodea{$link}},$ypos{$nodeb{$link}}), $width,1, &select_color($inrate), $inrate); &draw_arrow( $xpos{$nodeb{$link}}, $ypos{$nodeb{$link}}, &middle($xpos{$nodea{$link}},$xpos{$nodeb{$link}}), &middle($ypos{$nodea{$link}},$ypos{$nodeb{$link}}), $width, 0, $black, $inrate); } &label(&middle($xpos{$nodeb{$link}},&middle($xpos{$nodea{$link}},$xpos{$nodeb{$link}})), &middle($ypos{$nodeb{$link}},&middle($ypos{$nodea{$link}},$ypos{$nodeb{$link}})), $inrate . "%", 0); if ($displayvalue{$link}) { if ($input{$link} >=125000) { $coefdisplay=8/(1000*1000); $unitdisplay="Mbits"; } else { $coefdisplay=8/1000; $unitdisplay="Kbits"; } $todisplay=sprintf ("%.1f",$input{$link}*$coefdisplay). "$unitdisplay"; &label(&middle($xpos{$nodeb{$link}},&middle($xpos{$nodea{$link}},$xpos{$nodeb{$link}})), &middle($ypos{$nodeb{$link}},&middle($ypos{$nodea{$link}},$ypos{$nodeb{$link}}+70)), "$todisplay", 0); } } if ($internodedisplay{$link}) { for ($i=1; $i<=($internodes{$link}); $i++) { $gdinternode=&draw_internode($i,$FONT,$black,$white); $map->copyMerge( $gdinternode, $internodex{$link}{$i}-($FONT->width*length($i)),$internodey{$link}{$i}-($FONT->height)/2, 0,0, ($gdinternode->width),($gdinternode->height), $internodedisplay{$link} ); } } } } print "\n" if($DEBUG); foreach(keys %xpos){ &label($xpos{$_},$ypos{$_},$label{$_}, 3); #&label($xpos{$_},$ypos{$_},"$xpos{$_} - $ypos{$_}", 3); } &annotation; # print image... print "Generating image file $OUTPUTFILE...\n\n" if($DEBUG); open(PNG,">$OUTPUTFILE")||die("$OUTPUTFILE: $!\n"); if ( $^O eq 'MSWin32' ) { binmode ( PNG ) ; } print PNG $map->png; close PNG; # hint, resizing the image could make it look better exit; # print labels sub label{ my($xpos,$ypos,$label,$pad)=@_; my($strwidth)=$FONT->width*length($label); my($strheight)=$FONT->height; $map->filledRectangle( $xpos-$strwidth/2-$pad-2, $ypos-$strheight/2-$pad+1, $xpos+$strwidth/2+$pad+1, $ypos+$strheight/2+$pad, $black); $map->filledRectangle( $xpos-$strwidth/2-$pad-1, $ypos-$strheight/2-$pad+2, $xpos+$strwidth/2+$pad, $ypos+$strheight/2+$pad-1, $white); $map->string($FONT, $xpos-$strwidth/2, $ypos-$strheight/2+1, $label, $black) } # print annotation sub annotation{ my($title)="Traffic load"; $strwidth=gdLargeFont->width*length($label{$_}); $strheight=gdLargeFont->height; #$t=localtime(time); $t=localtime($DATE); # $t=gmtime(time); if (gdSmallFont->width*length("Last update on $t")>gdLargeFont->width*length($titlegraph)) { $titlewidth=gdSmallFont->width*length("Last update on $t"); } else { $titlewidth=gdLargeFont->width*length($titlegraph); } $map->filledRectangle($titlexpos+1, $titleypos+1, $titlexpos+$titlewidth+3, $titleypos+gdLargeFont->height*2+3, $titlebackground); $map->rectangle($titlexpos, $titleypos, $titlexpos+$titlewidth+4, $titleypos+gdLargeFont->height*2+4, $titleforeground); $map->string(gdLargeFont, $titlexpos+2, $titleypos+2, $titlegraph, $titleforeground); $map->string(gdSmallFont, $titlexpos+2, $titleypos+20, "Last update on $t", $titleforeground); $map->filledRectangle($keyxpos,$keyypos, $keyxpos+gdLargeFont->width*length($title)+10, $keyypos+gdLargeFont->height*($scales+1)+gdTinyFont->height*2.5, $black); $map->filledRectangle($keyxpos,$keyypos, $keyxpos+gdLargeFont->width*length($title)+10, $keyypos+gdLargeFont->height*($scales+1)+10, $gray); $map->rectangle($keyxpos,$keyypos, $keyxpos+gdLargeFont->width*length($title)+10, $keyypos+gdLargeFont->height*($scales+1)+gdTinyFont->height*2.5, $black); $map->string(gdLargeFont, $keyxpos+4, $keyypos+4, "Traffic load", $black); my($i)=1; foreach(sort {$scale_low{$a}<=>$scale_low{$b}} keys %scale_low){ $map->filledRectangle( $keyxpos+6, $keyypos+gdLargeFont->height*$i+8, $keyxpos+6+16, $keyypos+gdLargeFont->height*$i+gdLargeFont->height+6, $color{$_}); $map->string(gdLargeFont, $keyxpos+6+20, $keyypos+gdLargeFont->height*$i+8, "$scale_low{$_}-$scale_high{$_}%", $black); # "$color{$_} $scale_low{$_}-$scale_high{$_}%", $black); $i++ } #$map->string(gdTinyFont,$keyxpos+2,$keyypos+gdLargeFont->height*$i+8,"Weathermap4RRD $VERSION",$black); $map->string( gdTinyFont, $keyxpos+(((gdLargeFont->width)*length($title)+10)-((gdTinyFont->width)*length("Weathermap4RRD $VERSION")))/2+2, $keyypos+gdLargeFont->height*($i)+11, "Weathermap4RRD $VERSION", $white); } sub select_color { my($rate)=($_[0]>100) ? 100:$_[0]; if($rate=="0"){return($darkgray)} foreach(sort {$scale_high{$a}<=>$scale_high{$b}} keys %scale_high){ if($scale_low{$_}<=$rate && $rate<=$scale_high{$_}){ return($color{$_}); } } } sub autoscale { my($autoscale_div,$start_red,$start_green,$start_blue,$end_red,$end_green,$end_blue)=($_[0],$_[1],$_[2],$_[3],$_[4],$_[5],$_[6]); if (!$autoscale_div) { $autoscale_div=7; } #print "autoscale=$autoscale_div\n"; $dif_red=-($start_red-$end_red); $dif_green=-($start_green-$end_green); $dif_blue=-($start_blue-$end_blue); $step_red=$dif_red/$autoscale_div; $step_green=$dif_green/$autoscale_div; $step_blue=$dif_blue/$autoscale_div; $bounder_inf=0; $bounder_sup=int(100/$autoscale_div); for ($i=0; $i<$autoscale_div; $i++) { $scale_low{"$bounder_inf:$bounder_sup"}=$bounder_inf; $scale_high{"$bounder_inf:$bounder_sup"}=$bounder_sup; $scale_red{"$bounder_inf:$bounder_sup"}=$start_red+$i*$step_red; $scale_green{"$bounder_inf:$bounder_sup"}=$start_green+$i*$step_green; $scale_blue{"$bounder_inf:$bounder_sup"}=$start_blue+$i*$step_blue; $bounder_inf=$bounder_sup; if ( $i == ($autoscale_div-2)) { $bounder_sup=100; } else { $bounder_sup=($i+2)*int(100/$autoscale_div); } } } sub alloc_colors { if ( ($white=$map->colorAllocate(255,255,255)) =="-1") { $white=$map->colorClosest(255,255,255); print "**** Warning ****\n"; print "Background picture is using a 8-bit indexed palette. Unable to allocate new color to palette.\n"; print "Colors needed by Weathermap4rrd will be based on existing colors. Few of them could be bad displayed.\n"; print "To get right color displayed, you should convert background picture to 24-bit truecolor mode.\n"; print "********\n"; } if ( ($black=$map->colorAllocate(0,0,0)) =="-1") { $black=$map->colorClosest(0,0,0); } if ( ($gray=$map->colorAllocate(248,248,248)) =="-1") { $gray=$map->colorClosest(248,248,248); } if (($red=$map->colorAllocate(255,0,0)) =="-1") { $red=$map->colorClosest(255,0,0); } if (($green=$map->colorAllocate(64,255,128)) =="-1") { $green=$map->colorClosest(64,255,128); } if (($darkgray=$map->colorAllocate(128,128,128)) =="-1") { $darkgray=$map->colorClosest(128,128,128); } if (($titlebackground=$map->colorAllocate($titlebackground_red,$titlebackground_green,$titlebackground_blue)) =="-1") { $titlebackground=$map->colorClosest($titlebackground_red,$titlebackground_green,$titlebackground_blue); } if (($titleforeground=$map->colorAllocate($titleforeground_red,$titleforeground_green,$titleforeground_blue)) =="-1") { $titleforeground=$map->colorClosest($titleforeground_red,$titleforeground_green,$titleforeground_blue); } foreach(keys %scale_red){ if (($color{$_} = $map->colorAllocate($scale_red{$_},$scale_green{$_},$scale_blue{$_})) =="-1" ) { $color{$_} = $map->colorClosest($scale_red{$_},$scale_green{$_},$scale_blue{$_}); } } } sub read_config { my($config)=shift; my($node,$link); print "\nReading configuration file...\n\n" if($DEBUG); $scales=0; open(CONF,$config) or die "$config: $!\n"; while(){ if(/^\s*BACKGROUND\s+(\S+)/i){ if(-s "$1"){ $background=$1; print "found BACKGROUND: $background\n" if($DEBUG); } } if(/^\s*FONT\s+(\S+)/i){ if("$1" ne ""){ @FONTLIST=(gdTinyFont,gdSmallFont,gdMediumBoldFont,gdLargeFont,gdGiantFont); $FONT=$FONTLIST[$1-1]; print "found FONT: $FONT\n" if($DEBUG); } } if(/^\s*CNT_WIDTH_ARROW_BASE\s+(\d+)/i){ if("$1" ne ""){ $CNT_WIDTH_ARROW_BASE=$1; print "found CNT_WIDTH_ARROW_BASE: $CNT_WIDTH_ARROW_BASE\n" if($DEBUG); } } if(/^\s*WIDTH\s+(\d+)/i){ if("$1" ne ""){ $WIDTH=$1; print "found WIDTH: $WIDTH\n" if($DEBUG); } } if(/^\s*HEIGHT\s+(\d+)/i){ if("$1" ne ""){ $HEIGHT=$1; print "found HEIGHT: $HEIGHT\n" if($DEBUG); } } if(/^\s*NODE\s+(\S+)/i){ $node=$1; print "found NODE: $node\n" if($DEBUG); } if(/^\s*POSITION\s+(\d+)\s+(\d+)/i){ $xpos{$node}=$1; $ypos{$node}=$2; print "found NODE: $node XPOS: $xpos{$node} YPOS: $xpos{$node}\n" if($DEBUG); } if(/^\s*LABEL\s+(\S+)/i){ $label{$node}=$1; print "found NODE: $node LABEL: $label{$node}\n" if($DEBUG); } if(/^\s*ICONRESIZE\s+(\d+)/i){ $iconresize{$node}=$1; print "found ICONRESIZE: $node ICONRESIZE: $iconresize{$node}\n" if($DEBUG); } if(/^\s*ICON\s+(\S+)/i){ $iconpng{$node}=$1; print "found ICON: $node ICON: $iconpng{$node}\n" if($DEBUG); } if(/^\s*ICONPOS\s+(\d+)\s+(\d+)/i){ $iconx{$node}=$1; $icony{$node}=$2; print "found ICONPOS: $node ICONPOS x: $iconx{$node}\n" if($DEBUG); print "found ICONPOS: $node ICONPOS y: $icony{$node}\n" if($DEBUG); } if(/^\s*ICONTPT\s+(\d+)/i){ $icon_transparent{$node}=$1; print "found ICONTPT: $node ICONTPT: $icon_transparent{$node}\n" if($DEBUG); } if(/^\s*LINK\s+(\S+)/i){ $link=$1; print "found LINK: $link\n" if($DEBUG); } if(/^\s*NODES\s+(\S+)\s+(\S+)/i){ $nodea{$link}=$1; $nodeb{$link}=$2; print "found LINK: $link NODEA: $nodea{$link} NODEB: $nodeb{$link}\n" if($DEBUG); } if(/^\s*ARROW\s+(\S+)/i){ $arrow_type{$link}=$1; print "found ARROW: $link ARROW: $arrow_type{$link}\n" if($DEBUG); } if(/^\s*GROUP\s+(\S+)/i){ $group_name{$link}=$1; print "found GROUP: $link GROUP: $group_name{$link}\n" if($DEBUG); } if(/^\s*TARGET\s+(\S+)/i){ $target{$link}=$1; print "found LINK: $link TARGET: $target{$link}\n" if($DEBUG); } # If only one value is set for bandwidth. IN=OUT bandwidth. if(/^\s*BANDWIDTH\s+(\d+)/i){ $bandwidth{$link}=$1; $maxbytesin{$link}=$bandwidth{$link}*1000/8; $maxbytesout{$link}=$maxbytesin{$link}; print "found LINK: $link BANDWIDTH: $bandwidth{$link}\n" if($DEBUG); } if(/^\s*BANDWIDTH\s+(\S+)\s+(\S+)/i){ $bandwidthin{$link}=$1; $maxbytesin{$link}=$bandwidthin{$link}*1000/8; $bandwidthout{$link}=$2; $maxbytesout{$link}=$bandwidthout{$link}*1000/8; print "found LINK: $link BANDWIDTH IN: $bandwidthin{$link} BANDWIDTH OUT: $bandwidthout{$link}\n" if($DEBUG); } if(/^\s*WIDTH\s+(\d+)/i){ $WIDTH=$1; print "found LINK: WIDTH : $WIDTH\n" if($DEBUG); } if(/^\s*HEIGHT\s+(\d+)/i){ $HEIGHT=$1; print "found LINK: HEIGHT : $HEIGHT\n" if($DEBUG); } if(/^\s*OUTPUTFILE\s+(\S+)/i){ $OUTPUTFILE=$1; print "found OUTPUTFILE: $OUTPUTFILE\n" if($DEBUG); } if(/^\s*UNIT\s+(\S+)/i){ $unit{$link}=$1; if ( $unit{$link} eq "Mbits" ) { $coef{$link}=1000*1000/8; } if ( $unit{$link} eq "Kbits" ) { $coef{$link}=1000/8; } if ( $unit{$link} eq "bits" ) { $coef{$link}=1/8; } if ( $unit{$link} eq "Mbytes" ) { $coef{$link}=1024*1024; } if ( $unit{$link} eq "Kbytes" ) { $coef{$link}=1024; } if ( $unit{$link} eq "bytes" ) { $coef{$link}=1; } print "found LINK: $link COEF: $coef{$link}\n" if($DEBUG); } if(/^\s*INPOS\s+(\d+)/i){ $inpos{$link}=$1; print "found LINK: $link INPOS : $inpos{$link}\n" if($DEBUG); } if(/^\s*OUTPOS\s+(\d+)/i){ $outpos{$link}=$1; print "found LINK: $link OUTPOS : $outpos{$link}\n" if($DEBUG); } if(/^\s*DISPLAYVALUE\s+(\d+)/i){ $displayvalue{$link}=$1; print "found LINK: $link DISPLAYVALUE : $displayvalue{$link}\n" if($DEBUG); } if(/^\s*TITLE\s+\"(.+)\"/i){ $titlegraph="$1"; print "found LINK: $link TITLE : --$titlegraph--\n" if($DEBUG); } if(/^\s*KEYPOS\s+(\d+)\s+(\d+)/i){ $keyxpos=$1; $keyypos=$2; print "found KEY POSITION: $keyxpos $keyypos\n" if($DEBUG); } if(/^\s*TITLEPOS\s+(\d+)\s+(\d+)/i){ $titlexpos=$1; $titleypos=$2; print "found TITLE POSITION: $titlexpos $titleypos\n" if($DEBUG); } if(/^\s*TITLEBACKGROUND\s+(\d+)\s+(\d+)\s+(\d+)/i){ $titlebackground_red=$1; $titlebackground_green=$2; $titlebackground_blue=$3; print "found TITLE BACKGROUND: $titlebackground_red $titlebackground_green $titlebackground_blue\n" if($DEBUG); } if(/^\s*TITLEFOREGROUND\s+(\d+)\s+(\d+)\s+(\d+)/i){ $titleforeground_red=$1; $titleforeground_green=$2; $titleforeground_blue=$3; print "found TITLE FOREGROUND: $titleforeground_red $titleforeground_green $titleforeground_blue\n" if($DEBUG); } if(/^\s*AUTOSCALE\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/i){ $autoscale=1; $autoscale_div=$1; $scales=$autoscale_div; autoscale($autoscale_div,$2,$3,$4,$5,$6,$7); print "found AUTOSCALE: $link AUTOSCALE: $autoscale\n" if($DEBUG); } if( (/^\s*AUTOSCALE\s+(\d+)/i) && (!$autoscale)){ $autoscale=1; $autoscale_div=$1; $scales=$autoscale_div; autoscale($autoscale_div,24,232,2,233,28,1); print "found AUTOSCALE: $link AUTOSCALE: $autoscale\n" if($DEBUG); } if(/^\s*INTERNODE\s+(\d+)\s+(\d+)/i){ $internodes{$link}++; $internodex{$link}{$internodes{$link}}=$1; $internodey{$link}{$internodes{$link}}=$2; print "found INTERNODE : $link INTERNODE $internodes{$link} position $internodex{$link}{$internodes{$link}} $internodey{$link}{$internodes{$link}}\n" if($DEBUG); } if(/^\s*INTERNODEDISPLAY\s+(\d+)/i){ $internodedisplay{$link}=$1; print "found INTERNODEDISPLAY : $link INTERNODEDISPLAY ".$internodedisplay{$link}." directive detected.\n" if($DEBUG); } if(/^\s*SCALE\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/i){ if ($autoscale) { if (!$warn_autoscale) { print "Warning : AUTOSCALE directive used. Your own SCALE values won't be used.\n"; } $warn_autoscale=1; } else { $scale_low{"$1:$2"}=$1; $scale_high{"$1:$2"}=$2; $scale_red{"$1:$2"}=$3; $scale_green{"$1:$2"}=$4; $scale_blue{"$1:$2"}=$5; $scales++; print "found SCALE DATA: $1:$2 $3:$4:$5\n" if($DEBUG); } } } print "\n" if($DEBUG); } sub middle{ return int( $_[0] + ($_[1]-$_[0])/2 ) } sub dist{ return int( sqrt( $_[0]*$_[0] + $_[1]*$_[1] ) ) } sub newx{ my($a,$b,$x,$y)=@_; return int( cos( atan2($y,$x) + atan2($b,$a) ) * sqrt( $x*$x + $y*$y ) ); } sub newy{ my($a,$b,$x,$y)=@_; return int( sin( atan2($y,$x) + atan2($b,$a) ) * sqrt( $x*$x + $y*$y ) ); } sub dist_bw_points{ my($x1,$y1,$x2,$y2)=($_[0],$_[1],$_[2],$_[3]); return int(sqrt(($x2-$x1)*($x2-$x1)+($y2-$y1)*($y2-$y1))); } sub getposy_line { my($x,$x1,$y1,$x2,$y2)=($_[0],$_[1],$_[2],$_[3],$_[4]); $a=($y2-$y1)/($x2-$x1); $b=$y1-$a*$x1; return int($a*$x+$b); } sub getposx_line { my($y,$x1,$y1,$x2,$y2)=($_[0],$_[1],$_[2],$_[3],$_[4]); $c=($x2-$x1)/($y2-$y1); $d=$x1-$c*$y1; return int($c*$y+$d); } sub draw_rectangle { my($x1,$y1,$x2,$y2,$w,$solid,$color,$out)=($_[0],$_[1],$_[2],$_[3],$_[4],$_[5],$_[6],$_[7]); my($arrow)=new GD::Polygon; my($base_arrow)=$out/20; #if ($base_arrow<1 || $CNT_WIDTH_ARROW_BASE == 1) { $base_arrow=1 } $base_arrow=1; $arrow->addPt( $x1 + &newx($x2-$x1, $y2-$y1, 0, $base_arrow*$w), $y1 + &newy($x2-$x1, $y2-$y1, 0, $base_arrow*$w) ); $arrow->addPt( $x2 + &newx($x2-$x1, $y2-$y1, 0, $w), $y2 + &newy($x2-$x1, $y2-$y1, 0, $w) ); $arrow->addPt( $x2 + &newx($x2-$x1, $y2-$y1, 0, -$w), $y2 + &newy($x2-$x1, $y2-$y1, 0, -$w) ); $arrow->addPt( $x1 + &newx($x2-$x1, $y2-$y1, 0, -$base_arrow*$w), $y1 + &newy($x2-$x1, $y2-$y1, 0, -$base_arrow*$w) ); if($solid){ $map->filledPolygon($arrow,$color); }else{ $map->polygon($arrow,$color); } } sub draw_arrow { my($x1,$y1,$x2,$y2,$w,$solid,$color,$out)=($_[0],$_[1],$_[2],$_[3],$_[4],$_[5],$_[6],$_[7]); my($arrow)=new GD::Polygon; my($base_arrow)=$out/20; #if ($base_arrow<1 || $CNT_WIDTH_ARROW_BASE == 1) { $base_arrow=1 } $base_arrow=1; $arrow->addPt( $x1 + &newx($x2-$x1, $y2-$y1, 0, $base_arrow*$w), $y1 + &newy($x2-$x1, $y2-$y1, 0, $base_arrow*$w) ); $arrow->addPt( $x2 + &newx($x2-$x1, $y2-$y1, -4*$w, $w), $y2 + &newy($x2-$x1, $y2-$y1, -4*$w, $w) ); $arrow->addPt( $x2 + &newx($x2-$x1, $y2-$y1, -4*$w, 2*$w), $y2 + &newy($x2-$x1, $y2-$y1, -4*$w, 2*$w) ); $arrow->addPt( $x2, $y2); $arrow->addPt( $x2 + &newx($x2-$x1, $y2-$y1, -4*$w, -2*$w), $y2 + &newy($x2-$x1, $y2-$y1, -4*$w, -2*$w) ); $arrow->addPt( $x2 + &newx($x2-$x1, $y2-$y1, -4*$w, -$w), $y2 + &newy($x2-$x1, $y2-$y1, -4*$w, -$w) ); $arrow->addPt( $x1 + &newx($x2-$x1, $y2-$y1, 0, -$base_arrow*$w), $y1 + &newy($x2-$x1, $y2-$y1, 0, -$base_arrow*$w) ); if($solid){ $map->filledPolygon($arrow,$color); }else{ $map->polygon($arrow,$color); } } sub draw_internode{ my ($string,$font,$textcolor,$bgcolor)=($_[0],$_[1],$_[2],$_[3]); $radius=7; $pix_width=2*$radius; $pix_height=2*$radius; $inter = new GD::Image ($pix_width+2,$pix_height+2); $whiteinter=$inter->colorAllocate(255, 255, 255); $inter->transparent($whiteinter); $blackinter=$inter->colorAllocate(0,0,0); $redinter=$inter->colorAllocate(255,0,0); $blueinter=$inter->colorAllocate(0,0,255); $yellowinter=$inter->colorAllocate(255,255,0); $inter->filledEllipse($radius+1, $radius+1,2*$radius,2*$radius,$blueinter); $inter->ellipse($radius+1, $radius+1,2*$radius,2*$radius,$blackinter); $width=gdTinyFont->width*length($string); $inter->string(gdTinyFont, $radius-1, $radius-$width/2, $string, $yellowinter); return ($inter); } sub draw_dot{ my($x1,$y1,$x2,$y2,$w,$step,$solid,$color,$out)=($_[0],$_[1],$_[2],$_[3],$_[4],$_[5],$_[6],$_[7],$_[8]); $start_rayon=$w; $rayon=$w; $dif_horizontal=abs($x1-$x2); $dif_vertical=abs($y1-$y2); if ($dif_horizontal>$dif_vertical) { if ( ($x1 < $x2) ) { for ($xi = $x1+$start_rayon; (dist_bw_points($xi,$yi,$x2,$y2)>2*$w) ; $xi=$xi+$last_rayon+$rayon+$step) { $yi=getposy_line($xi,$x1,$y1,$x2,$y2); if ($solid) { $map->filledEllipse($xi,$yi,2*$rayon, 2*$rayon,$color); } else { $map->ellipse($xi,$yi,2*$rayon, 2*$rayon,$color); } $last_rayon=$rayon; if (($CNT_WIDTH_ARROW_BASE == 0) && ($start_rayon!=$w) && ($rayon>$w)) { $rayon=$start_rayon*(dist_bw_points($xi,$yi,$x2,$y2)/dist_bw_points($x1,$y1,$x2,$y2)); } } } else { for ($xi = $x1-$start_rayon; dist_bw_points($xi,$yi,$x2,$y2)>2*$w; $xi=$xi-($last_rayon+$rayon)-$step) { $yi=getposy_line($xi,$x1,$y1,$x2,$y2); if ($solid) { $map->filledEllipse($xi,$yi,2*$rayon, 2*$rayon,$color); } else { $map->ellipse($xi,$yi,2*$rayon, 2*$rayon,$color); } $last_rayon=$rayon; if (($CNT_WIDTH_ARROW_BASE == 0) && ($start_rayon!=$w) && ($rayon>$w)) { $rayon=$start_rayon*(dist_bw_points($xi,$yi,$x2,$y2)/dist_bw_points($x1,$y1,$x2,$y2)); } } } } else { if ( ($y1<$y2) ) { for ($yi = $y1+$start_rayon; dist_bw_points($xi,$yi,$x2,$y2)>2*$w; $yi=$yi+$last_rayon+$rayon+$step) { $xi=getposx_line($yi,$x1,$y1,$x2,$y2); if ($solid) { $map->filledEllipse($xi,$yi,2*$rayon, 2*$rayon,$color); } else { $map->ellipse($xi,$yi,2*$rayon, 2*$rayon,$color); } $last_rayon=$rayon; if (($CNT_WIDTH_ARROW_BASE == 0) && ($start_rayon!=$w) && ($rayon>$w)) { $rayon=$start_rayon*(dist_bw_points($xi,$yi,$x2,$y2)/dist_bw_points($x1,$y1,$x2,$y2)); } } } else { for ($yi = $y1-$start_rayon; dist_bw_points($xi,$yi,$x2,$y2)>2*$w; $yi=$yi-($last_rayon+$rayon)-$step) { $xi=getposx_line($yi,$x1,$y1,$x2,$y2); if ($solid) { $map->filledEllipse($xi,$yi,2*$rayon, 2*$rayon,$color); } else { $map->ellipse($xi,$yi,2*$rayon, 2*$rayon,$color); } $last_rayon=$rayon; if (($CNT_WIDTH_ARROW_BASE == 0) && ($start_rayon!=$w) && ($rayon>$w)) { $rayon=$start_rayon*(dist_bw_points($xi,$yi,$x2,$y2)/dist_bw_points($x1,$y1,$x2,$y2)); } } } } } sub draw_arrow_dot{ my($x1,$y1,$x2,$y2,$w,$step,$solid,$color,$out)=($_[0],$_[1],$_[2],$_[3],$_[4],$_[5],$_[6],$_[7],$_[8]); $start_rayon=$w; $rayon=$w; $dif_horizontal=abs($x1-$x2); $dif_vertical=abs($y1-$y2); if ($dif_horizontal>$dif_vertical) { if ( ($x1 < $x2) ) { for ($xi = $x1+$start_rayon; (dist_bw_points($xi,$yi,$x2,$y2)>4*$w) ; $xi=$xi+$last_rayon+$rayon+$step) { $yi=getposy_line($xi,$x1,$y1,$x2,$y2); if ($solid) { $map->filledEllipse($xi,$yi,2*$rayon, 2*$rayon,$color); } else { $map->ellipse($xi,$yi,2*$rayon, 2*$rayon,$color); } $last_rayon=$rayon; if (($CNT_WIDTH_ARROW_BASE == 0) && ($start_rayon!=$w) && ($rayon>$w)) { $rayon=$start_rayon*(dist_bw_points($xi,$yi,$x2,$y2)/dist_bw_points($x1,$y1,$x2,$y2)); } } } else { for ($xi = $x1-$start_rayon; dist_bw_points($xi,$yi,$x2,$y2)>4*$w; $xi=$xi-($last_rayon+$rayon)-$step) { $yi=getposy_line($xi,$x1,$y1,$x2,$y2); if ($solid) { $map->filledEllipse($xi,$yi,2*$rayon, 2*$rayon,$color); } else { $map->ellipse($xi,$yi,2*$rayon, 2*$rayon,$color); } $last_rayon=$rayon; if (($CNT_WIDTH_ARROW_BASE == 0) && ($start_rayon!=$w) && ($rayon>$w)) { $rayon=$start_rayon*(dist_bw_points($xi,$yi,$x2,$y2)/dist_bw_points($x1,$y1,$x2,$y2)); } } } } else { if ( ($y1<$y2) ) { for ($yi = $y1+$start_rayon; dist_bw_points($xi,$yi,$x2,$y2)>4*$w; $yi=$yi+$last_rayon+$rayon+$step) { $xi=getposx_line($yi,$x1,$y1,$x2,$y2); if ($solid) { $map->filledEllipse($xi,$yi,2*$rayon, 2*$rayon,$color); } else { $map->ellipse($xi,$yi,2*$rayon, 2*$rayon,$color); } $last_rayon=$rayon; if (($CNT_WIDTH_ARROW_BASE == 0) && ($start_rayon!=$w) && ($rayon>$w)) { $rayon=$start_rayon*(dist_bw_points($xi,$yi,$x2,$y2)/dist_bw_points($x1,$y1,$x2,$y2)); } } } else { for ($yi = $y1-$start_rayon; dist_bw_points($xi,$yi,$x2,$y2)>4*$w; $yi=$yi-($last_rayon+$rayon)-$step) { $xi=getposx_line($yi,$x1,$y1,$x2,$y2); if ($solid) { $map->filledEllipse($xi,$yi,2*$rayon, 2*$rayon,$color); } else { $map->ellipse($xi,$yi,2*$rayon, 2*$rayon,$color); } $last_rayon=$rayon; if (($CNT_WIDTH_ARROW_BASE == 0) && ($start_rayon!=$w) && ($rayon>$w)) { $rayon=$start_rayon*(dist_bw_points($xi,$yi,$x2,$y2)/dist_bw_points($x1,$y1,$x2,$y2)); } } } } my($arrow)=new GD::Polygon; $arrow->addPt( $x2 + &newx($x2-$x1, $y2-$y1, -4*$w, $w), $y2 + &newy($x2-$x1, $y2-$y1, -4*$w, $w) ); $arrow->addPt( $x2 + &newx($x2-$x1, $y2-$y1, -4*$w, 2*$w), $y2 + &newy($x2-$x1, $y2-$y1, -4*$w, 2*$w) ); $arrow->addPt( $x2, $y2); $arrow->addPt( $x2 + &newx($x2-$x1, $y2-$y1, -4*$w, -2*$w), $y2 + &newy($x2-$x1, $y2-$y1, -4*$w, -2*$w) ); $arrow->addPt( $x2 + &newx($x2-$x1, $y2-$y1, -4*$w, -$w), $y2 + &newy($x2-$x1, $y2-$y1, -4*$w, -$w) ); if($solid){ $map->filledPolygon($arrow,$color); }else{ $map->polygon($arrow,$color); } } sub rrdtool_getversion() { $version=`$RRDTOOL_PATH/rrdtool | grep tobi\@oetiker.ch |cut -d" " -f2`; ($major, $majorsub, $minorsub)= split(/\./, $version); return ($major.".".$majorsub); } sub version { print < Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. weathermap4rrd-perl-1.2rc3/README0000644000000000000000000000561110236146306016477 0ustar rootroot00000000000000----------------------------------------------------------------- Weathermap4RRD (php version) ----------------------------------------------------------------- Weathermap4RRD is a set of scripts that generates picture of network links utilization. Data used to create graph are acquired from RRDTool databases and are displayed as two ways colored arrows on a map representing the logical topology of the network. This program is based on original Network Weathermap script written by Panagiotis Christias (see below for Network Weathermap README file content). Weathermap4RRD exists as php or perl scripts. Please visit http://weathermap4rrd.tropicalex.net for Weathermap4rrd updates. If you're looking for Network weathermap (for MRTG), please visit http://netmon.grnet.gr/weathermap/ for updates Weathermap4RRD is developed by Alexandre Fontelle It may be used, modified and redistributed only under the terms of the GNU General Public License, found in the file LICENSE in this distribution, or at http://www.fsf.org/licenses/gpl.html PERL RELEASE ------------ Files: CHANGELOG - details of modification added to each version INSTALL - Dcoument for how to install and use weathermap4rrd LICENSE - license file README - This file weathermap.conf.example - an example of configuration weathermap - script that will read RRDTool data and generated graph PHP RELEASE ----------- Files: CHANGELOG - details of modification added to each version INSTALL - Dcoument for how to install and use weathermap4rrd LICENSE - license file README - This file weathermap.conf.example - an example of configuration index.php - PHP script that will read RRDTool data and generated graph graphic.php - PHP script that is used by index.php for graphic elements rrd.php - PHP script that is used by index.php for read RRD values (I use Cacti original php scripts) config_tool.php - PHP script that is used by index.php for managing configuration file parameters config.php - PHP script that define default parameters icons - directory with a few example of icons that may be used with NODE directive. ----------------------------------------------------------------- Network Weathermap version 1.1.1 (20040422) ----------------------------------------------------------------- A perl tool that displays in a visual way the utilization of the network links of your network. The required data are acquired from graphs created by the MRTG package and are displayed as two ways colored arrows on a map representing the logical topology of the network. See http://netmon.grnet.gr/weathermap/ for updates. The Network Weathermap is developed by Panagiotis Christias . It may be used, modified and redistributed only under the terms of the GNU General Public License, found in the file LICENSE in this distribution, or at http://www.fsf.org/licenses/gpl.html weathermap4rrd-perl-1.2rc3/CHANGELOG0000644000000000000000000000636310243633543017040 0ustar rootroot00000000000000------------------------------------------- Weathermap4rrd ** PHP and PERL ** CHANGELOG ------------------------------------------- V1.2 RC3 21st May 2005 Perl release : add RRDTool v1.2 support fix black title background display when no TITLEFOREGROUND and TITLEBACKGROUND are not used add INTERNODEDISPLAY directive to display number of internode on graph PHP : add RRDTool v1.2 support fix black title background display when no TITLEFOREGROUND and TITLEBACKGROUND are not used add INTERNODEDISPLAY directive to display number of internode on graph V1.2 RC2b 6th May 2005 Perl release : fix bug for IN value link display (thanks to hoffswell) V1.2 RC2 6th May 2005 Perl release : fix bug for some use of internodes (thanks to Alexandre Modesto) fix bug : normal arrow was not displayed correctly when no INTERNODE defined (thanks to Dan Lowry) fix bug : AUTOSCALE directive behavior was not correct compared to PHP version (thanks to hoffswell) v1.2 RC1 4th May 2005 fix bug for black background when no BACKGROUND directive is used. add conditions for use of AntiAlias GD features (need GD2 version >=2.0.12) add GROUP subdirective usage to allow filter for display add FONT directive usage to set size of font used to display label and bandwidth values add ICON subdirective usage to display icon for nodes add ICONPOS subdirective usage to set up position of icon add ICONTPT subdirective usage to set up transparency of icon add ICONRESIZE subdirective usage to resize icon for nodes add AUTOSCALE directive usage to create gradient for Trafic Load legend add TITLEBACKGROUND directive add TITLEFOREGROUND directive ******************************************* No previous PHP version. ******************************************* Below is CHANGELOG for perl version only v1.1.1h 23rd Apr 2005 fix bug for bandwidth calculating (thank you to Florent M.) fix bug for black background when no BACKGROUND directive is used (thank you to Pierre-Yves M.). v1.1.1g 30th Mar 2005 fix bug for node name that includes "-" character fix bug for PNG background picture based on 8 bits color palette. add black background for Weathermap banner add dot arrow feature available with ARROW directive in config file (for normal arrow use "ARROW normal" / for dot arrow use "ARROW dot") (thanks to Alexandre Modesto for suggestions) v1.1.1f 3rd Mar 2005 split in and out bandwidth value that allow to use WeatherMap4RRD with asynchronous link like ADSL (thanks to Pierre-Yves Maunier for suggestion) v1.1.1e 3rd Feb 2005 fix bug for null value read from RRDTool database in some case v1.1.1d: 1st Feb 2005 add version display in DEBUG mode to help people sending me output for debug. add binmode for png generation on Win32 v1.1.1c: 29 Jan 2005 Modify --version option to display good informations about Weathermap4rrd Remove CONFIGFILE directive in configuration file (stupid because CONFIGFILE is obvious already read!!) v1.1.1b: 22 Jan 2005 Added following options : - generation of graph based on past date (--date option) - several parameters can be place in config file (TITLE, TITLEPOS, DISPLAYVALUE and others...see INSTALL file for details) v1.1.1: Jan 2005 Initial release of Weathermap4rrd based on Network Weathermap version 1.1.1 weathermap4rrd-perl-1.2rc3/INSTALL0000644000000000000000000000065710236146306016655 0ustar rootroot00000000000000################################ Weathermap4RRD 2005 ################################ HOW TO INSTALL Weathermap4RRD ? ------------------------------- Please consult http://weathermap4rrd.tropicalex.net/documentation.php for details HOW TO CONFIGURE Weathermap4RRD ? --------------------------------- Please consult http://weathermap4rrd.tropicalex.net/directives.php for details Alexandre Fontelle weathermap4rrd-perl-1.2rc3/icons/0000755000000000000000000000000010236146306016727 5ustar rootroot00000000000000weathermap4rrd-perl-1.2rc3/icons/router.png0000644000000000000000000003325210236146306020762 0ustar rootroot00000000000000PNG  IHDRPNtIME(& pHYsN N }gAMA a69IDATx}$yWW3}ܳ;]%);hZaQR"HhZH S?O ,%Ah::lQH{UW}{fyH;r {{=4U"[>D~3%V"XLD`%2ID$V"XLD`%2ID$V"XLD`%2ID$V"XLD`%2ID$V"XLD`%2ID$V"XLD`%2ID$V"XLD`%2ID$V"XLD~3sׯ[4D&+Q&rx4m,JWNC4y.ǂD^H`EοVk+iK] K 5.C"yXo|駟~7*BT^YYY[;X(B5l?FkpQ6Ư wF_|ꩧ^/[Lf*,|jf6Tf]wݵ489ELErāod}-' /⋍Z 0LaXtX%u\RY]]=~xeãr}˝ y晝zN0y3,=s/b7]T.T2759 K@}/^7?'׳U)# CS.3Q0Zb#4h{*x85XiЛǎY]d3f@|c*6٢m,<2E".^LST>ei`.EO rɅŹSN*x67gGX~0 ˯knvJcPdg2Y}D|&c>a \^['+-mn,HނàҠ3`-,MO[.+{/_s=ױ}(&|XR,0:]Lc >}h1aFCM?aYb; ]+L#`c\G|vvvT 8|7l%uDW/sXH U׍YbJ( 0K1hd^Wtχ3d ԤpxF #Yʏ 0M~(Xx)T*Ao---fg}|rDUw`~CIXYE و$h9\-V|H#g#HUĝPfz#hЏۆj& gN}ff8[]]Y"s$wc?9J}u򵧾g}vwAS*׈'<*a^!nXgi>Gဂ&ZU K$:po V >V|J &L۵<'e6+eNJ?şP#g`T… 4LoGK |CW {?x_+/_vK*~g S%2 Z?-')<4fּ`‚Yxb| Gw56E,㸬 &Kd9{ALxS=gE0ىϜ923SԵA`/CAr$ˑ|4u[.MdKoq͔ě8X ƒ?#PCTCi|ܵO#l2F<q`pe%7}d m a9oi!bɠg! $guFJs)x= ]!n:0m,L[I}@\!\033355̗;Vο) =q"G׾}^}!u)T B ISߕI^gHN:MWdY' c(^|"* H"KN'="v^ ОfFHX_vCO :X;}|5m_mX X!W_WܜYy&^64+Q%q#8߸~4mF =Ft>W āG*/McSf}f8E *)ҔOY!(.1P&{~=0XvY9ŷ` j5'?"TUϠe9EeiHT8uԽ{9iy!RV= /տ?8~{ʠeC]:I .)UXn±;gAE * 'JeJaё9B>K (~ _T%?|JgT Ii0J[=`\&[,g旗*=,L*`}=/ƸOZXd^iI h&=nbDvLXH1X*8.;Pdii*W~eTxz V#ӪO^R8=ÞnHp0nGt\@^*;J#Pz,Lg4JܩSwQP>?v@}Ͽ曥 ?fg)1]kbkX2ȈR5); +GM#2@/$bD/xEC7A!Ҵ^O @ I >F aX!cjZmtEJeJbc.C!zlir({{{sXxB˜54CsLog+kπa<c1Geꔰxf _[BH~UL{ #o,,H '1u_j1=DįT v z^2}4-}ڝ N",z{/7y|$u`uK琛 w(딲Lic&N;\Pw Âᵸzԁ_\rvsa7CZ 7:jbiHE%7WF*ZyMt}F/ƠBSB\д hed⸗O8k1Ҁ1_LԜxmq r`@Ri~A^9siT=Jf%K4۱%ESR 6rbz}J7u٧[;#1oI8~Volnnb{AY)iOtt j> JWp7vouqy\l6j7ɡo8U_W^y"l:{O6mK1@'`(=$`r-7M U\Ծ`HaS d02<ǣWNG XFR).l)dopw,%y( oc!p| CAE% +L*u=Z`bT.g]YY)';/7sss:IVT[_z+ b%b%>DS|D|Ổw ЎУ*6@:GХ$8Ũ'3mhL>AMU޹ZP B.]`)4G^ERQ{vT*xN]3Q̤QQlFI.Gel^ЦVe;*meiXPK[=Rb xUJS |]tɷB.ͤAf AK7tmI1֫cԱcS|%cK%9@f8(b ^y3ktA0rTO'*4e"T.8 ~[oܼ{iOOrdВ_YXKFԼ+^mwqq1Z@*u28Z߫s0ÔNՄCe[Bd_S!gxnAg[ ;KS 9(,FXh_xU3nn k*zz9 ]:nlymxxWӿx(:+BY^_MHҔH`N No`e3bPmXƔQ5ba|Pv3R#Qj/oCT7QFV808cO^ [F>8K\6[J/F2ff Dr4j7G+E4m99.\ ,+:z|ff[ SfPF@To<j CA66HGzxUTWVV|E.Q12,6Yi?K$0KzX~~\$Ci}:ѯWt"H k#%FyO=pRT#TTo`fs˥ ¢]]^Hv})\)26XW{mZd[mn^_Ow{n&)3 ER ii-px0b&k vK/nn7\vV7,ʧΥϞ=ljs:1L]ֽ慄HQn8{ Fv@%1QTi,Aadi6DmQzg>05 ͛NSiٳ4<= ;{D>e[긻.څdbqgϞ} C \\TI:zwaY$lݡ ZTXݰ|=4|y˗K=Jm{[XϗS7)Zh41&s00DP).G~.wLbGeP~]d˴ fȝvlO `OU{6f,1Jcf,먥KX &.&鞦i2)|JԢxJiVO^]k)qQP黜uSx%{)P%_RҚ&#p#Š/^,ZkiQ,C ˁtΖQ4ze`קњai65yic^q7nllޜ-]Ep~08m(b%>|P^XvĀFd+Kp:2>|1xp5#Z.wph7Y)Q/^KyeS\LyȒm-)낤? J@5PO$A>d*|Qm*pGgTzFDy'(^Ӏ7]KVa r锔IaWyx_7;W5jxG}0mVزƴ0RrݕeB!Lf)W]0 j 2Йsv{ zJ?(A {VyRtD&Me6ym ~ސӥh˭,:>~tN`ꞣ&b>A@v^\E{t@ިnll2ӧOK\SVּr2FjT'WK[j \5;S, gVw[uev{{xǥDaѨ&IjJكޠIڿ}yzIpk7GJtR2/WQ{Zʡ U4x- IvS a)F9 y^t*[I9Hǻ)|Ǹ+^Bq Jpr NZՅt*%+tQޟ9w[]]{_XNsS)lڃV[ 2Md%OSPI G40dh:A0J<ɠrT7XXzHb D?rd}ދ2FHg@QJI%cD72nJE.l2qG%n 6<]hUOcěXn8=5S.󹹙 a8V S @S&,Je6Iᬤr'n+| {|ws]x Î܋DO4,JqF=}#UE4\x88~U|?}&A ^cu/; ̧c ">ol> - n޸H#)4=e*?e6iR*ᴴmǾy]$ꠣ+8n@jl05+_\\&NDO)O|ÿTӏ]&*WW._eץj='ͺS0Eu($!>sLUG{б66H-.4}Cqfggq{5"nx1mpOs $RyaaH͆oYQ/G>cjt5a`NPw-}uvڵ~O* iݼyh5>+$z(sځgV۠I=>W+CDp?)QTnk 7n:d.rۂA K{ }y@aH_MY%b3˗o^[Z-\Q8caBmtwES[b|#X]us,HUڼq Em;wNV+uX@>W.#-ngcŜ?b9@^[`n^ticvW]~t2c Z\&<N!$NP|7(VbܺAKޠ'y|^envn^fwwRndžO F S4*4W_yNػ귆6 3x۩aX +n &vX3h:m|Z}J]R<{cVڌmxAa""?l%sB>HKv%ǹE3ԅ ]t>ק7b@ ӸKVCV(̙3O?V{{;b!1 )%ޥJF|s[ZW>-,띶>BR%߳$DO'cू7RaFT,*2wJy/FZFz*` Kj{)^3Yb^1ҢGQ(:qjz~Ie-?\F}rG3Ѓ 2Jo76[5Xfנ8Ltxj#Gi[bTI%(SER@)?qO s8 VG\@MM\ۑoJ$Rq=Kr-ŋ?/}iv[*D8ct}D==jVmsʇANۦE5 nw:f%il_lեaaӔ.+<ﲨH$Cv9[R@H}w-(2Kw=>@: h3-x^ca}}==5-*oI P=9}F:"C)3˕<$&~= @DWDɁ  RX^^(=kj?}j.,G \-Dd C-.UF*6^A`ZADpFv3-*S`vNZNӨ p$LC}R׼0eԞA]:Rn, |O>O~<vMN8nD 4ˬc,ޮU(^][TOk呩=[{n Þ`X>(GME*[%h:ҍ54 Khlz3Rb'- yg+1fYoi^°M)Tl>}WKZ MZN"9\Xq.ё'džWqh2կKP( %XYED`+ *f|r9qȶ[Z__UۣVj+е)}PQ{ATGz$DŚ:9anZCc>OѴ`Jߔ?:=Se)WY:kkV(\S pJglmm9Rg&4M(1j<6T=h^O2ElW^>? x{Bߓ$PE W#=򹥥V5*zH]VR#-V@;\w*%yQWQ4p<77G[{~_GuGJx0W.W>[m5VZݓVfѢpP k{+++Ϝp}.~IkTFPib@6hMeX/^ğBl2gXI;y{ɏ%=gϞ'?yyu{K߫$u%6yu՚[ ,8qTO}}, [[h^z|I>RA4E\UtkfH`WNpgh}utc[{OPo^dtf]bbb=BUaUy_bznDIU-2S{y~šJP\¾Ҕ&F!:ڂqpsktRNS@f|IDATxŚ \[w{bXm׹B(իHNΕ@۵]edsV8C`!6Ek9o q\qtP@yYHCQmZU? tt/u{N@7Tَ\ϟg%Tk}|dbf۝~h`[ODXQe0n:/CWmOY[(IpX+Ek2l'^x?"1`yL`P2سCzH80E݄`(?\l?jDhJ@7A`FeڪYž_hLe2(8?ORwV|H[,\"˚DF<,/O_m}At*GHdI{I~z!Dx&-L5]m[5{_mgvp0B9f[ǩϊ$c&AcBTPKMMhH&)oYyK #tVVLI8LIA@LLX0jٌ`4 ՘,A8PW=:{uw;0w4{_qBh"Bp{v׫1ah|$a9cBjXM(Y+ߵپ{(:q < w`^%!rZZfhF4[# զ\3Oc}dzE4T_Z+_|QJk%Q0o&hrlDz#4R, X(IÇEKY媿n~| ɑ(ZQA*X3pшc~,?!;ZgeߔѴB RX0MX.^p  4)[8% B*:hii˸mƷ?|ۙ{d"Ḩs9 ZI BفʢLЎ.ע`uC(FF`,î! = ULxs]+**6OYs3@ , K(&z]z!EdYBG,Q?=KA2RlZEP+@-18x :wJdieS7?98qL>\up8-訾T)q{q`x$M%b`o4JQ bHx6LE>ojq&c^Q3;:4;{؍D}P}d"VRX…#px!ʟ4vhO,\t)qD3`㪙*(w Z 6)EoN\J1zU)rE).rx tr `(#qxdxp?]L7'[s *<7RTj­`0Hk=eqB0Yws8rydr<uZRp${8J $/L]}]n,B.PY bxb Ji ,l*Q*r9X zem!5Wct3t.NK)2{`JuuE)䔡0 %.ȥ 7&@AJJ  zݦ4#.[_IRA S4^nYWJ)%W1v1I$<7B)}"} a"# =@xqec!1TdA\]dLRpK*!%] ҾGid H_yHV.Xz;<ͳ <(.ىX2"pȞ/AJ&t8!RA \Њg\-\sJ&y⺂@5k{ .qtED|XBJpXd2'5§mLHsw%P|$FdXD t,E0FQ*GO¹^ʗMERǐFA+plZvadذ+W.C^szbz'FG+$#1n"`H n {lJXHBHO-R% Cji 1/L#Wde|Go>ˆz %"Ul7O&@/ o&WXL%(%uV ,f.M-ͥ4 # +ReuɓOq:tvg($`EHvl !X>.E-I1r#I ?Z)%U!)B&h4'r7-YjSϹ~^:;5<>=4::1 yX'ϻfz)}bxlq1 1QJČVFg|s0BF'Ntd=~%}-ҧ~ TgF'bb v"orI2ɠ9G@VJsIJ:MBZ2ܮN rFʕ6Gm^Vu3'KWC==51=>5`2HRO@'?2ɐ7e)Pa3 &99h$S>Ƞ[4tVhM Wgmı,@(4 ƕLJC9 r("X`cDX(5 vw͈!HnC~S]}=[   W c+AS2a,T"}/`?L];";m&]jHnG~qGjorxhjn`60*/kzHL'+RQT—/^A2*֖ٞؓH PJwͶN]/Ap6>~z,*&NOSHTF  KA"a/MIE 8"-&=3.y{ܭ54V*v|P}DgEH M{PM(HAYOa&e`+G +X %ѡNʞg2 )P/M^hb1|w;  a!M"3Drn x r /K̓BWtHkZ &b@mߗy39~M,?H ZSHtB}F* RB/0/\~Lh7OAPaX(,Qn?ʋAOY I_Q$x 헣┯B60Ҫ*.Pjtzle߻5Z 4fmZ~),|>xC&c::956¾TAYt%F32S6]bǮupSV!Ou.o.߯tĔnQ?)@XVy^YEjPn"3>3'VݽެJBӡSw:_xlރMYap4$b+]'^FR=Od*3`" pD|]x~P0hM#%Xhԍjv}]upNVA~Q#+?Hz?;*A_˴Wf1XǛj 덫 #gFgn;BxeW=vO\s@4.)a!t(W%(Z}Ȅ&ɡoiîPs^@S0Sn6d?ܹ/|Ml6!v7\"D"JOڶO}Eݮ7/)7Z &ęu58ֽK'ǚel^_W  CF+.}<*CFl=.}9eoYR@.TkOnlU?P岦2&OWq@iU.IFkt"JDSx<syGfRC!v}@*(lTw6"qɊ}]|WwvwUyLoWc)\E\@brhEax[_n 48չg\Ώ=V/czuKwc>uz}  3HV]$a-YVnݲ߳Щ~\ze ?8z{y՝3]ZWQUWFhiHC4қKz ڝNv Ċ{5+-kͥ(^#nr|HȥC" z#˩vZ`Py{ާc^qsņ͵u(Zy ֿ iky2Bq`n0U_^N\qt3>+;mnܽUXߗ`\WЙr~VO<ӏam[w:3Wՙ0z;9`͎_%Ye99NՑo]cog߸}ӎCMYMn(5ז(#d`ŷ+4?^m(lN{kTߔM״՛ݴĺ\cZA5mGP+mVx1N7\#_lʶ1ڛnismiE}E]:deV~]9ew?tߊ/nj-ݶ/߲e Xy.(\}}ymFcڰ颛oK׬.h(˵j+6lٰu >3QQ^2՚/PJ\٫n\zu M5EEP6bŦ\u*甙rͮ]ֽw][ϠlRby -kv}'zݼ[wv}VhӮ[_ZZ{Z/ROm,5hn޼y֛mq?/^oujM dk?Jt|bʫV] ՙ]f>jL%^vǖ~|YW$*GIENDB`weathermap4rrd-perl-1.2rc3/icons/terminal.png0000644000000000000000000000062610236146306021254 0ustar rootroot00000000000000PNG  IHDRQQQ-tEXtCreation Timedim. 3 avr. 2005 20:06:18 +0100߸tIME03& pHYs  ~gAMA aPLTEJI1{yZ˵KqUtRNS@fIDATxQ P_yh~mgJZ+ & $@3`D3ȂEdX|-Pl'cѢE-Zhxo}zsb pS+LV2fD'*2|xX1`7#D0e~Ǐjb>,Kn,]Ou8o%3-IENDB`weathermap4rrd-perl-1.2rc3/icons/wireless_router.png0000644000000000000000000000132410236146306022672 0ustar rootroot00000000000000PNG  IHDRmbmp-tEXtCreation Timedim. 3 avr. 2005 20:10:26 +0100 tIME /' pHYs  ~gAMA aPLTEyַtRNS@fIDATxۖ P y  5lR25'6tM.=0{M'NejSԦ6@Nɪ{khRIڵP)~)6?2Xj@w:B  ޱ*I{CNy#9,?3x @E 80й4`T9Kh:彈i+,jsEJԉV0RkV=Y]sv䗃,ڃ]joViO&pdaD0iޜ~౤9Ӊ%pQikXl)YO$y ׶\ L8."w?b,WLb+:]װ`?iH< #醢٬el/>6Msͧ7jkjS{?mv\¥#l c$uzG O *{r7J`,K] ls\ģ&k;)4.,SփIENDB`weathermap4rrd-perl-1.2rc3/icons/pix.png0000644000000000000000000000104010236146306020230 0ustar rootroot00000000000000PNG  IHDR_7]5f-tEXtCreation Timedim. 3 avr. 2005 20:09:06 +0100ttIME SW pHYs  ~gAMA aPLTEy}ftRNS@fNIDATxɂ Eр7' 5;s"tΆ@q/7b*K-ݜCߓ{S{[^?Azk  ;kx6-wq %0`]t>IENDB`weathermap4rrd-perl-1.2rc3/icons/server.png0000644000000000000000000000052210236146306020742 0ustar rootroot00000000000000PNG  IHDR2Qw-tEXtCreation Timedim. 3 avr. 2005 20:07:20 +0100HtIME.' pHYs  ~gAMA aPLTEJI1{yZcaJ˵FCtRNS@fzIDATx `@D(vEspL`"zZˆL(>h$#{#=j6&y-1(?Ȳϸ;>\UJ$U]qb&w gk #TZb%IENDB`weathermap4rrd-perl-1.2rc3/icons/router_cisco.png0000644000000000000000000000116410236146306022137 0ustar rootroot00000000000000PNG  IHDRm@' -tEXtCreation Timedim. 3 avr. 2005 19:41:40 +0100stIMEZh pHYs  ~gAMA aPLTEyUtRNS@fIDATx˖ P7O[y+zfa OĸAJ,QMUOJg2YUS'r:\` UvGŬyu5d̒M /7QAR DyʔƸQmglLT쇙J:83W0,Mkj/ V, bhN̞~aa̫AmtC]K&?S~fp;VZP / ]KhKqٱAؕN;