Show
Ignore:
Timestamp:
12/05/08 10:18:51 (16 years ago)
Author:
ixs
Message:

Additional changes, nslookup support, added time selection to the chart itself...

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/flowmon-web/charts/top-src.inc.php

    r1 r4  
    2121# 
    2222 
    23 require_once('phplot-5.0.5/phplot.php'); 
     23require_once('stacked-bars.inc.php'); 
    2424 
    2525// Get the data from the table, format it and write it out to a file 
    26 function chart_prepare($flowsrc, $starttime, $endtime, $timeframe = False) { 
     26function chart_prepare($flowsrc, $starttime, $endtime, $nslookup = False) { 
    2727        global $date_fmt_str; 
    2828        global $dbh; 
    29  
    30         if ($timeframe != False) { 
    31                 $starttime = (time() - $timeframe); 
    32                 $endtime = time(); 
    33         } 
    3429 
    3530        // Define the plot properties 
     
    3732        $chart_title = $style.' '.$flowsrc.' - '.strftime($date_fmt_str, $starttime).' to '.strftime($date_fmt_str, $endtime); 
    3833        $ytitle = 'Bytes'; 
    39         $output = tempnam('tmp/', 'plot'); 
    40         $data_colors = array('SkyBlue', 'green', 'orange', 'blue', 'purple', 'red', 'violet', 'azure1', 'yellow', 'DarkGreen'); 
    41  
    4234 
    4335        // Grab the data from the database 
     
    5547        $q->execute(); 
    5648 
    57         // Fill the legend build the WHERE limit 
    58         $legend = $q->fetchAll(PDO::FETCH_COLUMN, 0); 
    59         $limit = ''; 
    60         for ($i = 0; $i < count($legend); $i++) { 
    61                 $limit .= @$legend[$i].', '; 
    62                 if (array_key_exists($i, $legend)) { 
    63                         $legend[$i] = long2ip($legend[$i]); 
    64                 } else { 
    65                         $legend[$i] = ''; 
     49        // Did this return anything at all? 
     50        if ($q->rowCount() == 0) { 
     51                // No 
     52                print('No data for query-period'); 
     53                return False; 
     54        } else { 
     55                // Yes? Carry on! 
     56 
     57                // Fill the legend build the WHERE limit 
     58                $legend = $q->fetchAll(PDO::FETCH_COLUMN, 0); 
     59                $limit = ''; 
     60                for ($i = 0; $i < count($legend); $i++) { 
     61                        $limit .= @$legend[$i].', '; 
     62                        if (array_key_exists($i, $legend)) { 
     63                                $legend[$i] = long2ip($legend[$i]); 
     64                        } else { 
     65                                $legend[$i] = ''; 
     66                        } 
    6667                } 
    67         } 
    68         $legend[] = 'rest'; 
    69         $limit = substr($limit, 0, (strlen($limit) - 2)); 
     68                $legend[] = 'rest'; 
     69                $limit = substr($limit, 0, (strlen($limit) - 2)); 
    7070 
    71         // divide the timespan into 5min intervals 
    72         // query the traffic per talker in 5min intervals 
    73         // Initialize the data_table 
    74         $data = array(); 
    75         $steps = 0; 
    76         $rest_table = array(); 
    77         for ($time1 = $starttime; $time1 < $endtime; $time1 += (5 * 60)) { 
    78                 $time2 = ($time1 + (5 * 60)); 
    79                 $steps++; 
    80                 // Add the column header (time) to the data array 
    81                 $data[] = array(strftime('%H:%M', $time1)); 
    82                 $q = $dbh->prepare('SELECT IPSrc, SUM(Bytes) AS TrafficSum 
    83                                 FROM Flows 
    84                                 WHERE TimeStop BETWEEN ? AND ? 
    85                                 AND IPSrc IN ('.$limit.') 
    86                                 AND FlowSrc = ? 
    87                                 GROUP BY IPSrc 
    88                                 ORDER BY TrafficSum DESC 
    89                                 LIMIT 0, 9'); 
    90                 $q->bindParam(1, $time1, PDO::PARAM_INT); 
    91                 $q->bindParam(2, $time2, PDO::PARAM_INT); 
    92                 $q->bindParam(3, sprintf('%u', ip2long($flowsrc)), PDO::PARAM_INT); 
    93                 $q->execute(); 
    94                 $r = $q->fetchAll(); 
    95                 $i = (count($data) - 1); 
    96                 foreach ($r as $row) { 
    97                         $tmpdata[$i][$row[0]] = $row[1]; 
     71                // divide the timespan into 5min intervals 
     72                // query the traffic per talker in 5min intervals 
     73                // Initialize the data_table 
     74                $data = array(); 
     75                $steps = 0; 
     76                $rest_table = array(); 
     77                for ($time1 = $starttime; $time1 < $endtime; $time1 += (5 * 60)) { 
     78                        $time2 = ($time1 + (5 * 60)); 
     79                        $steps++; 
     80                        // Add the column header (time) to the data array 
     81                        $data[] = array(strftime('%H:%M', $time1)); 
     82                        $q = $dbh->prepare('SELECT IPSrc, SUM(Bytes) AS TrafficSum 
     83                                        FROM Flows 
     84                                        WHERE TimeStop BETWEEN ? AND ? 
     85                                        AND IPSrc IN ('.$limit.') 
     86                                        AND FlowSrc = ? 
     87                                        GROUP BY IPSrc 
     88                                        ORDER BY TrafficSum DESC 
     89                                        LIMIT 0, 9'); 
     90                        $q->bindParam(1, $time1, PDO::PARAM_INT); 
     91                        $q->bindParam(2, $time2, PDO::PARAM_INT); 
     92                        $q->bindParam(3, sprintf('%u', ip2long($flowsrc)), PDO::PARAM_INT); 
     93                        $q->execute(); 
     94                        $r = $q->fetchAll(); 
     95                        $i = (count($data) - 1); 
     96                        foreach ($r as $row) { 
     97                                $tmpdata[$i][$row[0]] = $row[1]; 
     98                        } 
     99 
     100                        // Get the rest of the aggregated traffic to fill up the bars 
     101                        $q = $dbh->prepare('SELECT SUM(Bytes) AS TrafficSum 
     102                                        FROM Flows 
     103                                        WHERE TimeStop BETWEEN ? AND ? 
     104                                        AND IPSrc NOT IN ('.$limit.') 
     105                                        AND FlowSrc = ?'); 
     106                        $q->bindParam(1, $time1, PDO::PARAM_INT); 
     107                        $q->bindParam(2, $time2, PDO::PARAM_INT); 
     108                        $q->bindParam(3, sprintf('%u', ip2long($flowsrc)), PDO::PARAM_INT); 
     109                        $q->execute(); 
     110                        $rest_table[] = $q->fetch(); 
    98111                } 
    99112 
    100                 // Get the rest of the aggregated traffic to fill up the bars 
    101                 $q = $dbh->prepare('SELECT SUM(Bytes) AS TrafficSum 
    102                                 FROM Flows 
    103                                 WHERE TimeStop BETWEEN ? AND ? 
    104                                 AND IPSrc NOT IN ('.$limit.') 
    105                                 AND FlowSrc = ?'); 
    106                 $q->bindParam(1, $time1, PDO::PARAM_INT); 
    107                 $q->bindParam(2, $time2, PDO::PARAM_INT); 
    108                 $q->bindParam(3, sprintf('%u', ip2long($flowsrc)), PDO::PARAM_INT); 
    109                 $q->execute(); 
    110                 $rest_table[] = $q->fetch(); 
    111         } 
    112  
    113         // Iterate through the legend and fill the data array from the temporary data array 
    114         // This function makes sure that each top talker is always at the same position 
    115         // in the multidimensional data table. 
    116         // This is necessary for phpplot to assign the same color to each host on 
    117         // sequential columns 
    118         // $ip is the key for the temp_data lookup 
    119         foreach ($legend as $ip) { 
    120                 for($i = 0; $i < $steps; $i++) { 
    121                         if (array_key_exists($i, $tmpdata)) { 
    122                         // The "column" exists, let's sort the rows 
    123                                 $key = sprintf('%u', ip2long($ip)); 
    124                                 if (array_key_exists($key, $tmpdata[$i])) { 
    125                                         $data[$i][] = $tmpdata[$i][$key]; 
     113                // Iterate through the legend and fill the data array from the temporary data array 
     114                // This function makes sure that each top talker is always at the same position 
     115                // in the multidimensional data table. 
     116                // This is necessary for phpplot to assign the same color to each host on 
     117                // sequential columns 
     118                // $ip is the key for the temp_data lookup 
     119                foreach ($legend as $ip) { 
     120                        for($i = 0; $i < $steps; $i++) { 
     121                                if (array_key_exists($i, $tmpdata)) { 
     122                                // The "column" exists, let's sort the rows 
     123                                        $key = sprintf('%u', ip2long($ip)); 
     124                                        if (array_key_exists($key, $tmpdata[$i])) { 
     125                                                $data[$i][] = $tmpdata[$i][$key]; 
     126                                        } else { 
     127                                                $data[$i][] = ''; 
     128                                        } 
    126129                                } else { 
    127130                                        $data[$i][] = ''; 
    128131                                } 
    129                         } else { 
    130                                 $data[$i][] = ''; 
    131132                        } 
    132133                } 
    133         } 
    134134 
    135135 
    136         // Append the data from the rest_table to the data array 
    137         for($i = 0; $i < $steps; $i++) { 
    138                 $data[$i][(count($data[$i]) - 1)] = $rest_table[$i][0]; 
    139        
     136               // Append the data from the rest_table to the data array 
     137               for($i = 0; $i < $steps; $i++) { 
     138                       $data[$i][(count($data[$i]) - 1)] = $rest_table[$i][0]; 
     139               
    140140 
    141         // Create the chart, write it to tmp/output.png 
    142         $plot = new PHPlot(900, 400); 
    143         $plot->SetIsInline(True); 
    144         //$plot->SetPrintImage(False); 
    145         $plot->SetImageBorderType('plain'); 
    146         $plot->SetDataColors($data_colors); 
     141                if ($nslookup === True) { 
     142                        for ($i=0; $i < count($legend); $i++) { 
     143                                $legend[$i] = gethostbyaddr($legend[$i]).' ('.$legend[$i].')'; 
     144                        } 
     145                } 
    147146 
    148  
    149         $plot->SetPlotType('stackedbars'); 
    150         $plot->SetDataType('text-data'); 
    151         $plot->SetDataValues($data); 
    152  
    153         $plot->SetTitle($chart_title); 
    154         $plot->SetYTitle($ytitle); 
    155         $plot->SetLegend($legend); 
    156  
    157         $plot->SetXTickLabelPos('none'); 
    158         $plot->SetXTickPos('none'); 
    159  
    160         $plot->SetLegendPixels(760, 40); 
    161         $plot->SetMarginsPixels(100, 150, 50, 50); 
    162  
    163  
    164         $plot->SetNumberFormat(',', '.'); 
    165         $plot->SetPrecisionY(0); 
    166         $plot->SetYLabelType('data'); 
    167  
    168         $plot->SetOutputFile($output); 
    169         $plot->DrawGraph(); 
    170  
    171         chmod($output, 0644); 
    172         $target =  dirname($output).'/'.basename($output).'.png'; 
    173         if (rename($output, $target)) { 
    174                 return 'tmp/'.basename($target); 
    175         } else { 
    176                 return False; 
     147                return draw_stackedbar($chart_title, $legend, $ytitle, $data); 
    177148        } 
    178149} 
    179