root/trunk/flowmon-web/charts/top-src.inc.php

Revision 4, 4.7 kB (checked in by ixs, 16 years ago)

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

Line 
1 <?php
2 #
3 # Copyright (C) 2008 Red Hat, Inc.
4 # Author: Andreas Thienemann <athienem@redhat.com>
5 #
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU Library General Public License as published by
8 # the Free Software Foundation; version 2 only
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU Library General Public License for more details.
14 #
15 # You should have received a copy of the GNU Library General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 # Copyright 2004, 2005 Red Hat, Inc.
19 #
20 # AUTHOR: Andreas Thienemann <athienem@redhat.com>
21 #
22
23 require_once('stacked-bars.inc.php');
24
25 // Get the data from the table, format it and write it out to a file
26 function chart_prepare($flowsrc, $starttime, $endtime, $nslookup = False) {
27     global $date_fmt_str;
28     global $dbh;
29
30     // Define the plot properties
31     $style = 'Top Sources';
32     $chart_title = $style.' '.$flowsrc.' - '.strftime($date_fmt_str, $starttime).' to '.strftime($date_fmt_str, $endtime);
33     $ytitle = 'Bytes';
34
35     // Grab the data from the database
36     // get top-talkers for the timespan: top 9 hosts plus rest-traffic
37     $q = $dbh->prepare('SELECT IPSrc, SUM(Bytes) AS TrafficSum
38             FROM Flows
39             WHERE TimeStop BETWEEN ? AND ?
40             AND FlowSrc = ?
41             GROUP BY IPSrc
42             ORDER BY TrafficSum DESC
43             LIMIT 0, 9');
44     $q->bindParam(1, $starttime, PDO::PARAM_INT);
45     $q->bindParam(2, $endtime, PDO::PARAM_INT);
46     $q->bindParam(3, sprintf('%u', ip2long($flowsrc)), PDO::PARAM_INT);
47     $q->execute();
48
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             }
67         }
68         $legend[] = 'rest';
69         $limit = substr($limit, 0, (strlen($limit) - 2));
70
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();
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];
126                     } else {
127                         $data[$i][] = '';
128                     }
129                 } else {
130                     $data[$i][] = '';
131                 }
132             }
133         }
134
135
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         }
140
141         if ($nslookup === True) {
142             for ($i=0; $i < count($legend); $i++) {
143                 $legend[$i] = gethostbyaddr($legend[$i]).' ('.$legend[$i].')';
144             }
145         }
146
147         return draw_stackedbar($chart_title, $legend, $ytitle, $data);
148     }
149 }
150
Note: See TracBrowser for help on using the browser.