The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

perfSONAR_PS::owdb

DESCRIPTION

TBD

owdb_prep()

owdb_prep: this routine is used to initialize the database connection for fetching owamp data. Pass in a ref to a hash, and it will be filled with values for: START END SENT LOST DUPS MIN MAX ERR ALPHA_%08.6f (with the %08.6f replaced ala sprintf for every alpha value passed in using the 'ALPHAS' arg.) ALPHAS (A sub hash with the keys set from the original alphas passed in and the values set to the delay of that "alpha".)

owdb_fetch()

TDB

owdb_plot_script()

TDB

bwdb_plot_script()

TDB

bwdb_dist_plot_script()

TDB

ntpdb_loop_plot_script()

TDB

ntpdb_peer_plot_script()

TDB

ntpdb_color_per_peer_plot_script()

TDB

trdb_plot_script()

TDB

ts_owptstamppldatetime()

TDB

        my $nrecs;
        my $sql;
        my $sth;
        my @row;
        my $sql2;
        my $sth2;
        my @row2;

        ######################################################################
        # Definition of parameters

        my $basex = 0; #base for all plots of the traceroute route tree
        my $basey = 0;
        my $stepx = 500;
        my $stepy = 700;
        my $radius= 200;
        my $offsetTextx = 7000;
        my $offsetTexty = 500;

        my $outfile = "route_changes.fig"; 
        my $psfile = "route_changes.ps"; 
        my $pngfile = "route_changes.png"; 
        ######################################################################
        #global vars
        my (@arrayOfDates,       @arrayOfRoutes,         %hashOfRoutes,  %hashOfRoutesList,      %arrayOfDefectsByDate);
        my (@listOfRouters, @stringOfRouters);
        my ($maxRoutes, $sumRoutes,     $errorInTrace);
        my (%edge,      %x,     %y,     %error, %name,  %domain); #data about each router [node] and link [edge] in the graph
        my (%miniEdge, @miniRouter); #same but for the timed graphs
        my ($source, $destination); #source and destination nodes
        my $family="hola"; #destination
        my $dir; #source
        my $indir;
        my $maxy;
        my ($widthWeigth);
        my (%nodeIndex, @routeName);
        my @nodeNumbers;
        my ($xfigSummaryTreeWithDomains, $xfigSummaryTree, $xfigTimedTree,
                $printTableWithAllAnomalies, $nodebug);

        $nodebug = 1;
        chomp($dir = `/`);
        $outfile = $dir  "/tmp/traceplots/". $outfile;
        $psfile = $dir  "/tmp/traceplots/". $psfile;
        $pngfile = $dir "/tmp/traceplots/". $pngfile;

        print `rm -rf $outfile $psfile $pngfile`;

        $indir = $dir . "/tmp/tracedata";
        
        #code to generate the input files by quering the database

        #output file
        open (OUT,">$outfile");
        #go over all families
        &goOverAllFamilies();
        close OUT;

        #Convert fig to ps
        #print `fig2dev -L ps -m 0.750 -x -200 -y -1500 -M -e -z Letter $outfile $psfile`;
        print `fig2dev -L ps -m 0.75 $outfile $psfile`;
        #Convert ps to png
        #print `convert $psfile $pngfile`;
        print `gs -dNOPAUSE -q -sDEVICE=png256 -sOutputFile=$pngfile $psfile -dBATCH`;
        $plfh = $pngfile;

        if(!$plfh){
                $nrecs++;
        } else {
                $nrecs =  0;
        }
        return $nrecs;
}

###################################################################### sub printDebug { if (!$nodebug) { print STDERR "@_"; } }

###################################################################### #go over all families sub goOverAllFamilies() {

        &printXFigHeader();
        my $key;
        my $value;

        my @file_list;

        my @listOfFiles = `ls $indir`;
#       print "\nFile list: @listOfFiles\n";

        undef @arrayOfDates;
        undef @arrayOfRoutes;
        undef %hashOfRoutes;
        undef %hashOfRoutesList;
        undef %arrayOfDefectsByDate;
        $maxRoutes = 0;
        $sumRoutes = 0;
        $errorInTrace = 0;

        my $file;
        my $routerNum;
        my $router;
        my $date;
        my @field;
        my $fileNumber;

        #go over all files
        $fileNumber = 0;
        foreach $file (@listOfFiles) {
                chop($file);
                $file = $indir . "/" . $file ;
                #print "\nInput file: $file \n";
                open(IN, "<$file");
                $routerNum = 1;
                #if($fileNumber!=0){&SetArrayOfRoutes("$date");}
                &ClearListOfRouters();

                #$date = $1;
                if ($errorInTrace) {printDebug "clearing up the error ($date)\n\n";print "Inside 3.2\n";}
                $errorInTrace = 0;

                my $lineNum=0;
                my $line;
                while ($line=<IN>) {
                        #print "Reading Line $line\n";
                        if($lineNum==0){
                        @routeName[$fileNumber]= $line;
                        $lineNum++;
                        next;
                        }
                        $lineNum++;
                        if($lineNum > 10000) {last;}
                        @field = split ' ', $line ;
                        #&InsertRouter(@field[1], $fileNumber);
                        &InsertRouter(@field[0], -1);

                        $nodeIndex{@field[0]}= "@field[1] @field[2]";


                }
                #This is a new trace

                #if (!$errorInTrace && ($stringOfRouters[0] ne "")) {

                &SetArrayOfRoutes("$fileNumber");
                #print "Inside 3.1\n";
                #}
                #print "String of Routers: @stringOfRouters \n";
                #print "List of Routers: @listOfRouters \n";
                $fileNumber++;
        }


        #&SetArrayOfRoutes("UNDEF");

        &calculateEdges($date);
        &xfigTimedTree();
}

###################################################################### sub printXFigHeader() { print OUT "#FIG 3.1\n". # "Landscape\n". "Portrait\n". "Center\n". "Inches\n". "1200 2\n"; } ######################################################################

###################################################################### sub SetArrayOfRoutes() { my ($date) =@_; my ($i, $myStringOfRouters, $myStringOfRouters0);

        for ($i=0; $i < 3; $i++) {
          $myStringOfRouters = $stringOfRouters[$i];
          $myStringOfRouters0 = $stringOfRouters[0];
                if (($i == 0) || ($myStringOfRouters ne $myStringOfRouters0)) {
                        $arrayOfDates[$sumRoutes] = "$date";
                #       print "I am doing something\n";
                        $arrayOfRoutes[$sumRoutes] = $myStringOfRouters;
                        $hashOfRoutes{$myStringOfRouters}=5-$date;
                        #$hashOfRoutes{$date}=$myStringOfRouters;
                        $sumRoutes++;
                        $hashOfRoutesList{$myStringOfRouters}= \@{$listOfRouters[$i]};
                        #if ($maxRoutes < $hashOfRoutes{$myStringOfRouters}) {
                        #       $maxRoutes = $hashOfRoutes{$myStringOfRouters};
                        #}
#                               printDebug "router: $myStringOfRouters=> $hashOfRoutes{$myStringOfRouters}\n";
                }
        }
}
######################################################################
sub GetRouterName() {
        my ($router) = @_;

        return ($router, $router);
}
######################################################################
sub ClearListOfRouters() {
        my $i;
        for ($i=0; $i <= 3; $i++) {
                @{$listOfRouters[$i]}= ();
                $stringOfRouters[$i]="";
  }
}
######################################################################
sub InsertRouter() {
        my ($router, $listNum) = @_;
        my $i;

# printDebug "router: $router\n"; if ($listNum >= 0 ) { push(@{$listOfRouters[$listNum]}, "$router"); if ($stringOfRouters[$listNum] ne "") { $stringOfRouters[$listNum] .= "-"; } $stringOfRouters[$listNum] .= "$router"; } else { for ($i=0; $i <= $#listOfRouters; $i++) { push(@{$listOfRouters[$i]}, "$router"); if ($stringOfRouters[$i] ne "") { $stringOfRouters[$i] .= "-"; } $stringOfRouters[$i] .= "$router"; } } }

###################################################################### sub calculateEdges() { my ($date) = @_;

        my ($router, $end, $i);
        my ($key);

        undef %edge;
        undef %x;
        undef %y;
        undef %error;
        undef %name;
        undef %domain;
#       %edge = %x = %y = ();
        my $y=0;
        my ($x, $first, $previous);

        if ($maxRoutes > 20) {$widthWeigth = 20/$maxRoutes;}
        else {$widthWeigth=1;}
        $maxy=0;
        $destination = "";
        my (@routes);
        #print "Inside Edge 1.0\n";
        #now print the results of all the files
        if (%hashOfRoutes !=()) {
                #print "Inside Edge 1.1\n";
                my $mostCommmonRoute =1;
                foreach $key (sort  { $hashOfRoutes{$b} <=> $hashOfRoutes{$a} } keys %hashOfRoutes) {
                #foreach $key (sort  { $hashOfRoutes{$a} <=> $hashOfRoutes{$b} } keys %hashOfRoutes) {
                #my(@routelist);
                #@routelist = keys %hashOfRoutes;
                #print "Route list: @routelist\n";
                #foreach $key (@routelist) {
                        #print "Inside Edge 1.2\n";
                        printDebug "router: $key=> $hashOfRoutes{$key}\n";
                        @routes = split(/-/, $key);
                        if ($mostCommmonRoute) {
                                $mostCommmonRoute=0;
                                $source = $routes[0];
                                $destination = $routes[$#routes];
                        }

                        $first =1;
                        $maxy = ++$y;
                        $x=0;
                        foreach $router (@routes) {
                                $x++;
                                #printDebug "router: $router ($x, $y)\n";
                                if ($first) {
                                        $first=0;
                                        $previous = "$router";
                                        if (! defined  $x{"$router"}) {
                                                ($domain{"$router"}, $name{"$router"})= &GetRouterName($router);
                                                $x{"$router"}=$x;
                                                $y{"$router"}=$y;
                                        printDebug "$router ($x, $y, $name{$router}, $domain{$router})\n";
                                        }
                                        next;
                                }

                                ${$edge{"$router"}}{"$previous"}+=$hashOfRoutes{"$key"};
                                if (! defined  $x{"$router"}) {
                                        ($domain{"$router"}, $name{"$router"})= &GetRouterName($router);
                                        $x{"$router"}=$x;
                                        $y{"$router"}=$y;
                                        printDebug "$router ($x, $y, $name{$router}, $domain{$router})\n";
                                }
                                $previous = "$router";
                        }
                if ("$router" ne "$destination") {
                                $error{"$router"}++;
                                printDebug "$router error: ".$error{"$router"}."\n";
                                ${$arrayOfDefectsByDate{$date}}{"NotEndingInDestination"}++;
                        }
#                               printDebug "$router $destination\n";
          }
        $maxy = $y;
}
}
######################################################################

###################################################################### sub calculateMiniEdges() { my ($path, $numPaths) = @_; # printDebug "$path=> $numPaths\n";

        undef %miniEdge;
        undef @miniRouter;
        &recalculateMiniEdges($path, $numPaths);
}
######################################################################
sub recalculateMiniEdges() {
        my ($path, $numPaths) = @_;

        my ($router);
        my ($first, $previous);

# printDebug "$path=> $numPaths\n";

        #now print the results of all the files
        if (%hashOfRoutes !=()) {
                $first =1;
                foreach $router (split(/-/, $path)) {
#                       printDebug "router: $router ($x, $y)\n";
                        push (@miniRouter, "$router");
                        if ($first) {
                                $first=0;
                                $previous = "$router";
                                next;
                        }
                        ${$miniEdge{"$router"}}{"$previous"}+=$numPaths;
                #                                       printDebug "$router ($x, $y)\n";
                $previous = "$router";
        }

        #print "LIst of miniRouter: @miniRouter\n";
}

} ###################################################################### sub xfigTimedTree() {

        my ($centerx,                   $centery,                       $borderx,                       $bordery,                       $width);
        my ($startx,                                    $starty,                                        $endx,                                  $endy);
        my ($labelx,                    $labely,                                $label, $textx, $texty);
        my ($router, $end, $i);
        my ($sumEdges, $firstDate);

        if (%hashOfRoutes !=()) {
                #print "fig 1.0 \n";
                my $numPaths=1;
                for ($i=0; $i<=$#arrayOfRoutes; $i++) {
                        #print "fig 1.1 \n";
#printDebug "path=> $arrayOfRoutes[$i] \n****** $arrayOfRoutes[$i+1]\n";
                        if ($numPaths==1) {
                                $firstDate=$arrayOfDates[$i];
                        }

                        if (((($i+1)<=$#arrayOfRoutes) &&
                                        ("$arrayOfRoutes[$i]" eq "$arrayOfRoutes[$i+1]")) &&
                                        ((($i+2)<=$#arrayOfRoutes) && ("$arrayOfDates[$i+1]" ne "$arrayOfDates[$i+2]"))) {
                                #print "fig 1.2 \n";
                                $numPaths++;
                                next;
                        }

                        if ((($i+1)<=$#arrayOfRoutes) &&
                                        ("$arrayOfDates[$i]" eq "$arrayOfDates[$i+1]")) {
                                #print "fig 1.3 \n";
                                &calculateMiniEdges($arrayOfRoutes[$i], 1);
                                &recalculateMiniEdges($arrayOfRoutes[$i+1], 1);
#printDebug "path=> $arrayOfRoutes[$i] \n****** $arrayOfRoutes[$i+1]\n";
                                $i++;
                        } elsif ((($i+2)<=$#arrayOfRoutes) &&
                                        ("$arrayOfDates[$i]" eq "$arrayOfDates[$i+2]")) {
                                #print "fig 1.4 \n";
                                &calculateMiniEdges($arrayOfRoutes[$i], 1);
                                &recalculateMiniEdges($arrayOfRoutes[$i+1], 1);
                                &recalculateMiniEdges($arrayOfRoutes[$i+2], 1);
                                $i++;
                                $i++;
                        } else {
                                #print "fig 1.5 \n";
                                &calculateMiniEdges($arrayOfRoutes[$i], $numPaths);
                        }

                        $maxy=0;

                        #Print the route Name first
                        print OUT "4 0 0 2 0 0 18 0.0000 4 135 360 $basex $basey @routeName[$i]\\001\n\n";
                        $basey+=300;

                        foreach $router (@miniRouter) {
                                #print "Router: $router ($x{\"$router\"},$y{\"$router\"})\n";
                                $centerx=$basex+$x{"$router"}*$stepx;
                                $centery=$basey+$y{"$router"}*$stepy;
                                if ($maxy < $y{"$router"}) {$maxy = $y{"$router"};};

                                #printDebug "router: $router ($centerx, $centery)\n";

                                $borderx=$centerx-$radius;
                                $bordery=$centery-$radius;
                                $width=1;
                                print OUT "1 3 0 $width -1 7 0 0 -1 0.000 1 0.0000 $centerx $centery ".
                                        "$radius $radius $borderx $bordery $borderx $bordery\n";
                                $labelx=$centerx-$radius;
                                $labely=$centery-$radius;
                                #if ($router =~ /(\w+)\.(\w+)\.(\w+)\.(\w+)/) {
                                #label="$4";
                                #}
                                $label = $router;
                                print OUT "4 0 0 2 0 0 16 0.0000 4 135 360 $labelx $labely $label\\001\n\n";
                                #print OUT "4 0 0 2 0 0 12 0.0000 4 135 360 $labelx $labely test\\001\n\n";

                                $sumEdges=0;
                                foreach $end ( keys %{$miniEdge{"$router"}}) {
                                        $startx=$centerx;
                                        $starty=$centery;
                                        $endx=$basex+$x{"$end"}*$stepx;
                                        $endy=$basey+$y{"$end"}*$stepy;
                                        $width=int(${$miniEdge{"$router"}}{"$end"}*$widthWeigth);
                                        $width=($width?$width:1);
                                        $sumEdges+=${$miniEdge{"$router"}}{"$end"};
                                        if (($startx == $endx) && ($starty == $endy)) {
                                                #this is looping into itself
                                                $endx=$startx-$radius;
                                                $endy=$starty+$radius*1.5;
                                        }
                                        print OUT "2 1 0 $width -1 7 0 0 -1 0.000 0 0 -1 0 0 2\n".
                                        "         $startx $starty $endx $endy\n";
                                        #                                       printDebug "$router $end 2 1 0 $width -1 7 0 0 -1 0.000 0 0 -1 0 0 2\n".
                                        #                                               "         $startx $starty $endx                                                                 (=$basex+".$x{"$end"}."*$stepx) $endy \n";
                                }
                                #$labelx=$centerx+$radius*0;
                                #$labely=$centery+$radius+200;
                                #$label=(int($sumEdges/$sumRoutes*100))."%";
                                #if ($label eq "0%") {
                                #$label=(int($sumEdges/$sumRoutes*1000))."%%";
                                #}
                                #if ($label eq "0%%") {
                                #         $label=".".(int($sumEdges/$sumRoutes*10000))."%%";
                                #}
                                #print OUT "4 0 1 2 0 0 12 0.0000 4 135 360 $labelx $labely $label \\001\n\n";

                        }
                        $basey += ($maxy+1)*$stepy;
                        $numPaths=1;
                }

        $texty = $offsetTexty+$basey;
        $textx = $offsetTextx+$basex;

        my $key;
        foreach $key (sort (keys %nodeIndex)){
        print OUT "4 0 -1 0 0 0 16 0.0000 4 135 360 $stepx $texty $key => $nodeIndex{$key} \\001\n\n";
        #$textx += $basex;
        $texty += 250;
        }

}

#print "Done leaving Timed Tree\n"; }

SEE ALSO

FindBin, POSIX, Fcntl, FileHandle, perfSONAR_PS::OWP, perfSONAR_PS::OWP::Utils, perfSONAR_PS::CGI::Carp, File::Basename

To join the 'perfSONAR-PS' mailing list, please visit:

  https://mail.internet2.edu/wws/info/i2-perfsonar

The perfSONAR-PS subversion repository is located at:

  https://svn.internet2.edu/svn/perfSONAR-PS

Questions and comments can be directed to the author, or the mailing list. Bugs, feature requests, and improvements can be directed here:

  https://bugs.internet2.edu/jira/browse/PSPS

VERSION

$Id: owdb.pm 1877 2008-03-27 16:33:01Z aaron $

AUTHOR

Jeff Boote, boote@internet2.edu Jason Zurawski, zurawski@internet2.edu

LICENSE

You should have received a copy of the Internet2 Intellectual Property Framework along with this software. If not, see <http://www.internet2.edu/membership/ip.html>

COPYRIGHT

Copyright (c) 2002-2008, Internet2

All rights reserved.

1 POD Error

The following errors were encountered while parsing the POD:

Around line 1892:

=pod directives shouldn't be over one line long! Ignoring all 5 lines of content