dc2f00b3ab03b628c1a756909dee1ba775886082
1 <?php
3 class stats
4 {
6 static protected $last_cpu_load = "";
7 static protected $last_cpu_load_stamp = 0;
10 static function checkDatabase()
11 {
12 $TABLE_NAME = 'stats';
14 // Check for modules
15 // php5-sqlite
18 // Try to create database, if it exists just open it.
19 $res = sqlite_open('/var/spool/gosa/stats', 0666, $error);
20 if(!$res){
21 return($res);
22 }
24 // Delete Table
25 $query = "DROP TABLE '{$TABLE_NAME}'";
26 # $ret = sqlite_query($query, $res);
28 // List Tables an check if there is already everything we need.
29 $query = "SELECT name FROM sqlite_master WHERE type='table' and name='{$TABLE_NAME}'";
30 $ret = sqlite_query($query, $res);
31 if(!count(sqlite_fetch_all($ret))){
33 // Check for table existance
34 $query = "
35 CREATE TABLE {$TABLE_NAME} (
36 ID INTEGER PRIMARY KEY,
37 ACTID INTEGER,
38 TYPE TEXT,
39 PLUGIN TEXT,
40 CATEGORY TEXT,
41 ACTION TEXT,
42 UUID TEXT,
43 TIMESTAMP INTEGER,
44 MTIMESTAMP REAL,
45 DURATION REAL,
46 RENDER_TIME REAL,
47 AMOUNT INTEGER,
48 MEMORY_USAGE INTEGER,
49 CPU_LOAD FLOAT,
50 INFO BLOB
51 )";
52 $ret = sqlite_query($query, $res);
53 }
55 return($res);
56 }
60 static function log($type, $plugin, $category, $action, $amount = 1, $duration = 0, $info ='')
61 {
62 global $config;
63 global $clicks;
64 global $overallRenderTimer;
66 if(!isset($overallRenderTimer) || empty($overallRenderTimer)){
67 $renderTime = 0;
68 }else{
69 $renderTime = microtime(TRUE) - $overallRenderTimer;
71 // Now set the overallRenderTimer to the current timestamp - else
72 // we will not be able to sum up the render time in a single SQL statement.
73 $overallRenderTimer = microtime(TRUE);
75 }
77 $type = sqlite_escape_string($type);
78 $plugin = sqlite_escape_string($plugin);
79 $action = sqlite_escape_string($action);
80 $timestamp = time();
81 $mtimestamp = microtime(TRUE);
82 $uuid = $config->getGOsaUUID();
83 $amount = sqlite_escape_string($amount);
84 $duration = sqlite_escape_string($duration);
85 $renderTime = sqlite_escape_string($renderTime);
86 $info = sqlite_escape_string($info);
87 $clicks = sqlite_escape_string($clicks);
88 $memory_usage = sqlite_escape_string(stats::get_memory_usage());
89 $cpu_load = sqlite_escape_string(stats::get_cpu_load());
91 $tmp = array();
92 foreach($category as $cat){
93 $tmp[] = trim($cat, '\/,; ');
94 }
95 $category = sqlite_escape_string(implode($tmp, ', '));
97 $res = stats::checkDatabase();
98 $TABLE_NAME = 'stats';
99 $query = "
100 INSERT INTO {$TABLE_NAME}
101 (ACTID, TYPE, PLUGIN, CATEGORY, ACTION, UUID, MTIMESTAMP, TIMESTAMP,
102 AMOUNT, DURATION, RENDER_TIME, MEMORY_USAGE, CPU_LOAD, INFO)
103 VALUES
104 ('{$clicks}','{$type}','{$plugin}','{$category}','{$action}','{$uuid}',
105 '{$mtimestamp}','{$timestamp}','{$amount}','{$duration}','{$renderTime}',
106 '{$memory_usage}','{$cpu_load}','{$info}')";
107 sqlite_query($query, $res);
108 }
110 static function get_memory_usage()
111 {
112 return(memory_get_usage());
113 }
115 static function get_cpu_load()
116 {
117 $cur = time();
118 if(empty(stats::$last_cpu_load) || (($cur - stats::$last_cpu_load_stamp) >=2 )){
119 list($one, $five, $ten) =preg_split("/ /",shell_exec('cat /proc/loadavg'));
120 stats::$last_cpu_load = $one;
121 stats::$last_cpu_load_stamp = $cur;
122 }
123 return(stats::$last_cpu_load);
124 }
126 static function show()
127 {
128 $res = stats::checkDatabase();
129 $TABLE_NAME = 'stats';
130 $query = "SELECT * FROM {$TABLE_NAME} ORDER BY MTIMESTAMP";
131 $query = "SELECT PLUGIN, ACTION, MAX(DURATION) as 'DURATION' FROM {$TABLE_NAME} WHERE ACTION='modify' GROUP BY PLUGIN,ACTION ";
132 $query = "SELECT * FROM {$TABLE_NAME} ORDER BY ID DESC LIMIT 30";
133 $query = "SELECT * FROM {$TABLE_NAME} WHERE plugin != 'LDAP' ORDER BY ID DESC LIMIT 30";
134 $ret = sqlite_query($query, $res);
135 echo "<pre>";
137 $colSize = 16;
139 $title = FALSE;
140 foreach(sqlite_fetch_all($ret) as $entry){
141 if(!$title){
142 foreach($entry as $key => $str) {
143 if(is_numeric($key)) continue;
144 echo str_pad($key,$colSize,' ')."|";
145 }
146 echo "\n";
147 foreach($entry as $key => $str) {
148 if(is_numeric($key)) continue;
149 echo str_pad('',$colSize,'-')."-";
150 }
151 echo "\n";
152 $title = TRUE;
153 }
155 foreach($entry as $key => $str){
156 if(is_numeric($key)) continue;
157 if($key == "DURATION" || $key == "MTIMESTAMP" || $key == "CPU_LOAD"){
158 $str = sprintf("%0.4f", preg_replace("/,/",".",$str));
159 echo str_pad($str,$colSize,' ', STR_PAD_LEFT)."|";
160 }else{
161 echo str_pad($str,$colSize,' ')."|";
162 }
163 }
164 echo "\n";
165 }
166 echo sqlite_error_string($ret);
168 echo "\n------ \n";
169 echo "Time spent per plugin-category \n";
170 echo "------ \n";
172 $query = "
173 SELECT SUM(DURATION) AS DUR, CATEGORY
174 FROM {$TABLE_NAME}
175 WHERE plugin != 'LDAP'
176 GROUP BY CATEGORY
177 ORDER BY DUR DESC LIMIT 10";
178 $ret = sqlite_query($query, $res);
180 $colSize = 16;
181 $title = FALSE;
182 foreach(sqlite_fetch_all($ret) as $entry){
183 foreach($entry as $key => $str){
184 if(is_numeric($key)) continue;
185 echo str_pad($str,$colSize,' ')."|";
186 }
187 echo "\n";
188 }
191 echo sqlite_error_string($ret);
193 echo "\n------ \n";
194 echo "Time spent per plugin \n";
195 echo "------ \n";
197 $query = "
198 SELECT SUM(DURATION) AS DUR, PLUGIN, UUID
199 FROM {$TABLE_NAME}
200 WHERE plugin != 'LDAP'
201 GROUP BY PLUGIN, UUID
202 ORDER BY DUR DESC LIMIT 10";
203 $ret = sqlite_query($query, $res);
205 $colSize = 16;
206 $title = FALSE;
207 foreach(sqlite_fetch_all($ret) as $entry){
208 foreach($entry as $key => $str){
209 if(is_numeric($key)) continue;
210 echo str_pad($str,$colSize,' ')."|";
211 }
212 echo "\n";
213 }
214 echo sqlite_error_string($ret);
216 # * Anzahl von Objekttypen
217 # * Anzahl der Löschungen pro Objekttyp
218 # * Anzahl der Erzeugungen pro Objekttyp
219 # * Anzahl der Bearbeitungen pro Objekttyp
220 # * Anzahl der Verschiebungen pro Objekttyp
221 # * Anzahl der Mehrfachbearbeitungen pro Objekttyp
222 # * Antwortzeiten pro aktion
223 # * Anzahl der Passwortänderungen
224 # * Anzahl der unterschiedlichen Anmeldungen
227 echo "\n------ \n";
228 echo "Actions done per plugin \n";
229 echo "------ \n";
231 $query = "
232 SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN
233 FROM {$TABLE_NAME}
234 WHERE TYPE = 'plugin'
235 AND PLUGIN != 'LDAP'
236 GROUP BY ACTION,PLUGIN
237 ORDER BY CNT DESC LIMIT 30";
238 $ret = sqlite_query($query, $res);
240 $colSize = 16;
241 $title = FALSE;
242 foreach(sqlite_fetch_all($ret) as $entry){
243 foreach($entry as $key => $str){
244 if(is_numeric($key)) continue;
245 echo str_pad($str,$colSize,' ')."|";
246 }
247 echo "\n";
248 }
249 echo sqlite_error_string($ret);
251 echo "\n------ \n";
252 echo "'create' actions done per plugin (5 most)\n";
253 echo "------ \n";
255 $query = "
256 SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN
257 FROM {$TABLE_NAME}
258 WHERE TYPE = 'plugin'
259 AND PLUGIN != 'LDAP'
260 AND ACTION = 'create'
261 GROUP BY ACTION,PLUGIN
262 ORDER BY CNT DESC LIMIT 5";
263 $ret = sqlite_query($query, $res);
265 $colSize = 16;
266 $title = FALSE;
267 foreach(sqlite_fetch_all($ret) as $entry){
268 foreach($entry as $key => $str){
269 if(is_numeric($key)) continue;
270 echo str_pad($str,$colSize,' ')."|";
271 }
272 echo "\n";
273 }
274 echo sqlite_error_string($ret);
276 echo "\n------ \n";
277 echo "'move' actions done per plugin (5 most)\n";
278 echo "------ \n";
280 $query = "
281 SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN
282 FROM {$TABLE_NAME}
283 WHERE TYPE = 'plugin'
284 AND PLUGIN != 'LDAP'
285 AND ACTION = 'move'
286 GROUP BY ACTION,PLUGIN
287 ORDER BY CNT DESC LIMIT 5";
288 $ret = sqlite_query($query, $res);
290 $colSize = 16;
291 $title = FALSE;
292 foreach(sqlite_fetch_all($ret) as $entry){
293 foreach($entry as $key => $str){
294 if(is_numeric($key)) continue;
295 echo str_pad($str,$colSize,' ')."|";
296 }
297 echo "\n";
298 }
299 echo sqlite_error_string($ret);
301 echo "\n------ \n";
302 echo "'view' actions done per plugin (5 most)\n";
303 echo "------ \n";
305 $query = "
306 SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN
307 FROM {$TABLE_NAME}
308 WHERE TYPE = 'plugin'
309 AND PLUGIN != 'LDAP'
310 AND ACTION = 'view'
311 GROUP BY ACTION,PLUGIN
312 ORDER BY CNT DESC LIMIT 5";
313 $ret = sqlite_query($query, $res);
315 $colSize = 16;
316 $title = FALSE;
317 foreach(sqlite_fetch_all($ret) as $entry){
318 foreach($entry as $key => $str){
319 if(is_numeric($key)) continue;
320 echo str_pad($str,$colSize,' ')."|";
321 }
322 echo "\n";
323 }
324 echo sqlite_error_string($ret);
326 echo "\n------ \n";
327 echo "'open' actions done per plugin (5 most)\n";
328 echo "------ \n";
330 $query = "
331 SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN, UUID
332 FROM {$TABLE_NAME}
333 WHERE TYPE = 'plugin'
334 AND PLUGIN != 'LDAP'
335 AND ACTION = 'open'
336 GROUP BY ACTION,PLUGIN, UUID
337 ORDER BY CNT DESC LIMIT 5";
338 $ret = sqlite_query($query, $res);
340 $colSize = 16;
341 $title = FALSE;
342 foreach(sqlite_fetch_all($ret) as $entry){
343 foreach($entry as $key => $str){
344 if(is_numeric($key)) continue;
345 echo str_pad($str,$colSize,' ')."|";
346 }
347 echo "\n";
348 }
349 echo sqlite_error_string($ret);
351 echo "\n------ \n";
352 echo "Time per session\n";
353 echo "------ \n";
355 $query = "
356 SELECT SUM(DURATION) as DUR, UUID
357 FROM {$TABLE_NAME}
358 GROUP BY UUID
359 ORDER BY DUR DESC LIMIT 10";
360 $ret = sqlite_query($query, $res);
362 $colSize = 16;
363 $title = FALSE;
364 foreach(sqlite_fetch_all($ret) as $entry){
365 foreach($entry as $key => $str){
366 if(is_numeric($key)) continue;
367 echo str_pad($str,$colSize,' ')."|";
368 }
369 echo "\n";
370 }
371 echo sqlite_error_string($ret);
373 echo "\n------ \n";
374 echo "Most used password hashes\n";
375 echo "------ \n";
377 $query = "
378 SELECT DISTINCT(INFO), COUNT(INFO) as CNT
379 FROM {$TABLE_NAME}
380 WHERE ACTION = 'change_password'
381 GROUP BY INFO
382 ORDER BY INFO DESC LIMIT 10";
383 $ret = sqlite_query($query, $res);
385 $colSize = 16;
386 $title = FALSE;
387 foreach(sqlite_fetch_all($ret) as $entry){
388 foreach($entry as $key => $str){
389 if(is_numeric($key)) continue;
390 echo str_pad($str,$colSize,' ')."|";
391 }
392 echo "\n";
393 }
394 echo sqlite_error_string($ret);
396 echo "\n------ \n";
397 echo "Actions at all\n";
398 echo "------ \n";
400 $query = "
401 SELECT DISTINCT(ACTION), COUNT(ACTION) AS CNT
402 FROM {$TABLE_NAME}
403 GROUP BY ACTION
404 ORDER BY CNT DESC LIMIT 10";
405 $ret = sqlite_query($query, $res);
407 $colSize = 16;
408 $title = FALSE;
409 foreach(sqlite_fetch_all($ret) as $entry){
410 foreach($entry as $key => $str){
411 if(is_numeric($key)) continue;
412 echo str_pad($str,$colSize,' ')."|";
413 }
414 echo "\n";
415 }
416 echo sqlite_error_string($ret);
418 echo "\n------ \n";
419 echo "Time spent per action\n";
420 echo "------ \n";
422 $query = "
423 SELECT DISTINCT(ACTION), SUM(DURATION) AS DUR
424 FROM {$TABLE_NAME}
425 GROUP BY ACTION
426 ORDER BY DUR DESC LIMIT 10";
427 $ret = sqlite_query($query, $res);
429 $colSize = 16;
430 $title = FALSE;
431 foreach(sqlite_fetch_all($ret) as $entry){
432 foreach($entry as $key => $str){
433 if(is_numeric($key)) continue;
434 echo str_pad($str,$colSize,' ')."|";
435 }
436 echo "\n";
437 }
438 echo sqlite_error_string($ret);
440 echo "\n------ \n";
441 echo "Average time per action\n";
442 echo "------ \n";
444 $query = "
445 SELECT DISTINCT(ACTION), AVG(DURATION) AS DUR
446 FROM {$TABLE_NAME}
447 GROUP BY ACTION
448 ORDER BY DUR DESC LIMIT 10";
449 $ret = sqlite_query($query, $res);
451 $colSize = 16;
452 $title = FALSE;
453 foreach(sqlite_fetch_all($ret) as $entry){
454 foreach($entry as $key => $str){
455 if(is_numeric($key)) continue;
456 echo str_pad($str,$colSize,' ')."|";
457 }
458 echo "\n";
459 }
460 echo sqlite_error_string($ret);
462 echo "</pre>";
463 }
464 }
467 ?>