53 | | // Fill the legend build the WHERE limit |
---|
54 | | $legend = $q->fetchAll(PDO::FETCH_COLUMN, 0); |
---|
55 | | $limit = ''; |
---|
56 | | for ($i = 0; $i < count($legend); $i++) { |
---|
57 | | $limit .= @$legend[$i].', '; |
---|
58 | | if (array_key_exists($i, $legend)) { |
---|
59 | | $legend[$i] = long2ip($legend[$i]); |
---|
60 | | } else { |
---|
61 | | $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 | } |
---|
67 | | // divide the timespan into 5min intervals |
---|
68 | | // query the traffic per talker in 5min intervals |
---|
69 | | // Initialize the data_table |
---|
70 | | $data = array(); |
---|
71 | | $steps = 0; |
---|
72 | | $rest_table = array(); |
---|
73 | | for ($time1 = $starttime; $time1 < $endtime; $time1 += (5 * 60)) { |
---|
74 | | $time2 = ($time1 + (5 * 60)); |
---|
75 | | $steps++; |
---|
76 | | // Add the column header (time) to the data array |
---|
77 | | $data[] = array(strftime('%H:%M', $time1)); |
---|
78 | | $q = $dbh->prepare('SELECT IPDst, SUM(Bytes) AS TrafficSum |
---|
79 | | FROM Flows |
---|
80 | | WHERE TimeStop BETWEEN ? AND ? |
---|
81 | | AND IPDst IN ('.$limit.') |
---|
82 | | AND FlowSrc = ? |
---|
83 | | GROUP BY IPDst |
---|
84 | | ORDER BY TrafficSum DESC |
---|
85 | | LIMIT 0, 9'); |
---|
86 | | $q->bindParam(1, $time1, PDO::PARAM_INT); |
---|
87 | | $q->bindParam(2, $time2, PDO::PARAM_INT); |
---|
88 | | $q->bindParam(3, sprintf('%u', ip2long($flowsrc)), PDO::PARAM_INT); |
---|
89 | | $q->execute(); |
---|
90 | | $r = $q->fetchAll(); |
---|
91 | | $i = (count($data) - 1); |
---|
92 | | foreach ($r as $row) { |
---|
93 | | $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 IPDst, SUM(Bytes) AS TrafficSum |
---|
| 83 | FROM Flows |
---|
| 84 | WHERE TimeStop BETWEEN ? AND ? |
---|
| 85 | AND IPDst IN ('.$limit.') |
---|
| 86 | AND FlowSrc = ? |
---|
| 87 | GROUP BY IPDst |
---|
| 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 IPDst 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(); |
---|
96 | | // Get the rest of the aggregated traffic to fill up the bars |
---|
97 | | $q = $dbh->prepare('SELECT SUM(Bytes) AS TrafficSum |
---|
98 | | FROM Flows |
---|
99 | | WHERE TimeStop BETWEEN ? AND ? |
---|
100 | | AND IPDst NOT IN ('.$limit.') |
---|
101 | | AND FlowSrc = ?'); |
---|
102 | | $q->bindParam(1, $time1, PDO::PARAM_INT); |
---|
103 | | $q->bindParam(2, $time2, PDO::PARAM_INT); |
---|
104 | | $q->bindParam(3, sprintf('%u', ip2long($flowsrc)), PDO::PARAM_INT); |
---|
105 | | $q->execute(); |
---|
106 | | $rest_table[] = $q->fetch(); |
---|
107 | | } |
---|
108 | | |
---|
109 | | // Iterate through the legend and fill the data array from the temporary data array |
---|
110 | | // This function makes sure that each top talker is always at the same position |
---|
111 | | // in the multidimensional data table. |
---|
112 | | // This is necessary for phpplot to assign the same color to each host on |
---|
113 | | // sequential columns |
---|
114 | | // $ip is the key for the temp_data lookup |
---|
115 | | foreach ($legend as $ip) { |
---|
116 | | for($i = 0; $i < $steps; $i++) { |
---|
117 | | if (array_key_exists($i, $tmpdata)) { |
---|
118 | | // The "column" exists, let's sort the rows |
---|
119 | | $key = sprintf('%u', ip2long($ip)); |
---|
120 | | if (array_key_exists($key, $tmpdata[$i])) { |
---|
121 | | $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 | } |
---|
137 | | // Create the chart, write it to tmp/output.png |
---|
138 | | $plot = new PHPlot(800, 400); |
---|
139 | | $plot->SetIsInline(True); |
---|
140 | | //$plot->SetPrintImage(False); |
---|
141 | | $plot->SetImageBorderType('plain'); |
---|
142 | | $plot->SetDataColors($data_colors); |
---|
143 | | |
---|
144 | | |
---|
145 | | $plot->SetPlotType('stackedbars'); |
---|
146 | | $plot->SetDataType('text-data'); |
---|
147 | | $plot->SetDataValues($data); |
---|
148 | | |
---|
149 | | $plot->SetTitle($chart_title); |
---|
150 | | $plot->SetYTitle($ytitle); |
---|
151 | | $plot->SetLegend($legend); |
---|
152 | | |
---|
153 | | $plot->SetXTickLabelPos('none'); |
---|
154 | | $plot->SetXTickPos('none'); |
---|
155 | | |
---|
156 | | $plot->SetNumberFormat(',', '.'); |
---|
157 | | $plot->SetPrecisionY(0); |
---|
158 | | |
---|
159 | | $plot->SetOutputFile($output); |
---|
160 | | $plot->DrawGraph(); |
---|
161 | | |
---|
162 | | chmod($output, 0644); |
---|
163 | | $target = dirname($output).'/'.basename($output).'.png'; |
---|
164 | | if (rename($output, $target)) { |
---|
165 | | return 'tmp/'.basename($target); |
---|
166 | | } else { |
---|
167 | | return False; |
---|
| 141 | return draw_stackedbar($chart_title, $legend, $ytitle, $data); |
---|