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 AMOUNT INTEGER,
47 MEMORY_USAGE INTEGER,
48 CPU_LOAD FLOAT,
49 INFO BLOB
50 )";
51 $ret = sqlite_query($query, $res);
52 }
54 return($res);
55 }
59 static function log($type, $plugin, $category, $action, $amount = 1, $duration = 0, $info ='')
60 {
61 global $config;
62 global $clicks;
63 $type = sqlite_escape_string($type);
64 $plugin = sqlite_escape_string($plugin);
65 $action = sqlite_escape_string($action);
66 $timestamp = time();
67 $mtimestamp = microtime(TRUE);
68 $uuid = $config->getGOsaUUID();
69 $amount = sqlite_escape_string($amount);
70 $duration = sqlite_escape_string($duration);
71 $info = sqlite_escape_string($info);
72 $clicks = sqlite_escape_string($clicks);
73 $memory_usage = sqlite_escape_string(stats::get_memory_usage());
74 $cpu_load = sqlite_escape_string(stats::get_cpu_load());
76 $tmp = array();
77 foreach($category as $cat){
78 $tmp[] = trim($cat, '\/,; ');
79 }
80 $category = sqlite_escape_string(implode($tmp, ', '));
82 $res = stats::checkDatabase();
83 $TABLE_NAME = 'stats';
84 $query = "
85 INSERT INTO {$TABLE_NAME}
86 (ACTID, TYPE, PLUGIN, CATEGORY, ACTION, UUID, MTIMESTAMP, TIMESTAMP, AMOUNT, DURATION, MEMORY_USAGE, CPU_LOAD, INFO)
87 VALUES
88 ('{$clicks}','{$type}','{$plugin}','{$category}','{$action}','{$uuid}',
89 '{$mtimestamp}','{$timestamp}','{$amount}','{$duration}','{$memory_usage}','{$cpu_load}','{$info}')";
90 sqlite_query($query, $res);
91 }
93 static function get_memory_usage()
94 {
95 return(memory_get_usage());
96 }
98 static function get_cpu_load()
99 {
100 $cur = time();
101 if(empty(stats::$last_cpu_load) || (($cur - stats::$last_cpu_load_stamp) >=2 )){
102 list($one, $five, $ten) =preg_split("/ /",shell_exec('cat /proc/loadavg'));
103 stats::$last_cpu_load = $one;
104 stats::$last_cpu_load_stamp = $cur;
105 }
106 return(stats::$last_cpu_load);
107 }
109 static function show()
110 {
111 $res = stats::checkDatabase();
112 $TABLE_NAME = 'stats';
113 $query = "SELECT * FROM {$TABLE_NAME} ORDER BY MTIMESTAMP";
114 $query = "SELECT PLUGIN, ACTION, MAX(DURATION) as 'DURATION' FROM {$TABLE_NAME} WHERE ACTION='modify' GROUP BY PLUGIN,ACTION ";
115 $query = "SELECT * FROM {$TABLE_NAME} ORDER BY ID DESC LIMIT 30";
116 $query = "SELECT * FROM {$TABLE_NAME} WHERE plugin != 'LDAP' ORDER BY ID DESC LIMIT 30";
117 $ret = sqlite_query($query, $res);
118 echo "<pre>";
120 $colSize = 16;
122 $title = FALSE;
123 foreach(sqlite_fetch_all($ret) as $entry){
124 if(!$title){
125 foreach($entry as $key => $str) {
126 if(is_numeric($key)) continue;
127 echo str_pad($key,$colSize,' ')."|";
128 }
129 echo "\n";
130 foreach($entry as $key => $str) {
131 if(is_numeric($key)) continue;
132 echo str_pad('',$colSize,'-')."-";
133 }
134 echo "\n";
135 $title = TRUE;
136 }
138 foreach($entry as $key => $str){
139 if(is_numeric($key)) continue;
140 if($key == "DURATION" || $key == "MTIMESTAMP" || $key == "CPU_LOAD"){
141 $str = sprintf("%0.4f", preg_replace("/,/",".",$str));
142 echo str_pad($str,$colSize,' ', STR_PAD_LEFT)."|";
143 }else{
144 echo str_pad($str,$colSize,' ')."|";
145 }
146 }
147 echo "\n";
148 }
149 echo sqlite_error_string($ret);
151 echo "\n------ \n";
152 echo "Time spent per plugin-category \n";
153 echo "------ \n";
155 $query = "
156 SELECT SUM(DURATION) AS DUR, CATEGORY
157 FROM {$TABLE_NAME}
158 WHERE plugin != 'LDAP'
159 GROUP BY CATEGORY
160 ORDER BY DUR DESC LIMIT 10";
161 $ret = sqlite_query($query, $res);
163 $colSize = 16;
164 $title = FALSE;
165 foreach(sqlite_fetch_all($ret) as $entry){
166 foreach($entry as $key => $str){
167 if(is_numeric($key)) continue;
168 echo str_pad($str,$colSize,' ')."|";
169 }
170 echo "\n";
171 }
174 echo sqlite_error_string($ret);
176 echo "\n------ \n";
177 echo "Time spent per plugin \n";
178 echo "------ \n";
180 $query = "
181 SELECT SUM(DURATION) AS DUR, PLUGIN, UUID
182 FROM {$TABLE_NAME}
183 WHERE plugin != 'LDAP'
184 GROUP BY PLUGIN, UUID
185 ORDER BY DUR DESC LIMIT 10";
186 $ret = sqlite_query($query, $res);
188 $colSize = 16;
189 $title = FALSE;
190 foreach(sqlite_fetch_all($ret) as $entry){
191 foreach($entry as $key => $str){
192 if(is_numeric($key)) continue;
193 echo str_pad($str,$colSize,' ')."|";
194 }
195 echo "\n";
196 }
197 echo sqlite_error_string($ret);
199 # * Anzahl von Objekttypen
200 # * Anzahl der Löschungen pro Objekttyp
201 # * Anzahl der Erzeugungen pro Objekttyp
202 # * Anzahl der Bearbeitungen pro Objekttyp
203 # * Anzahl der Verschiebungen pro Objekttyp
204 # * Anzahl der Mehrfachbearbeitungen pro Objekttyp
205 # * Antwortzeiten pro aktion
206 # * Anzahl der Passwortänderungen
207 # * Anzahl der unterschiedlichen Anmeldungen
210 echo "\n------ \n";
211 echo "Actions done per plugin \n";
212 echo "------ \n";
214 $query = "
215 SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN
216 FROM {$TABLE_NAME}
217 WHERE TYPE = 'plugin'
218 AND PLUGIN != 'LDAP'
219 GROUP BY ACTION,PLUGIN
220 ORDER BY CNT DESC LIMIT 30";
221 $ret = sqlite_query($query, $res);
223 $colSize = 16;
224 $title = FALSE;
225 foreach(sqlite_fetch_all($ret) as $entry){
226 foreach($entry as $key => $str){
227 if(is_numeric($key)) continue;
228 echo str_pad($str,$colSize,' ')."|";
229 }
230 echo "\n";
231 }
232 echo sqlite_error_string($ret);
234 echo "\n------ \n";
235 echo "'create' actions done per plugin (5 most)\n";
236 echo "------ \n";
238 $query = "
239 SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN
240 FROM {$TABLE_NAME}
241 WHERE TYPE = 'plugin'
242 AND PLUGIN != 'LDAP'
243 AND ACTION = 'create'
244 GROUP BY ACTION,PLUGIN
245 ORDER BY CNT DESC LIMIT 5";
246 $ret = sqlite_query($query, $res);
248 $colSize = 16;
249 $title = FALSE;
250 foreach(sqlite_fetch_all($ret) as $entry){
251 foreach($entry as $key => $str){
252 if(is_numeric($key)) continue;
253 echo str_pad($str,$colSize,' ')."|";
254 }
255 echo "\n";
256 }
257 echo sqlite_error_string($ret);
259 echo "\n------ \n";
260 echo "'move' actions done per plugin (5 most)\n";
261 echo "------ \n";
263 $query = "
264 SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN
265 FROM {$TABLE_NAME}
266 WHERE TYPE = 'plugin'
267 AND PLUGIN != 'LDAP'
268 AND ACTION = 'move'
269 GROUP BY ACTION,PLUGIN
270 ORDER BY CNT DESC LIMIT 5";
271 $ret = sqlite_query($query, $res);
273 $colSize = 16;
274 $title = FALSE;
275 foreach(sqlite_fetch_all($ret) as $entry){
276 foreach($entry as $key => $str){
277 if(is_numeric($key)) continue;
278 echo str_pad($str,$colSize,' ')."|";
279 }
280 echo "\n";
281 }
282 echo sqlite_error_string($ret);
284 echo "\n------ \n";
285 echo "'view' actions done per plugin (5 most)\n";
286 echo "------ \n";
288 $query = "
289 SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN
290 FROM {$TABLE_NAME}
291 WHERE TYPE = 'plugin'
292 AND PLUGIN != 'LDAP'
293 AND ACTION = 'view'
294 GROUP BY ACTION,PLUGIN
295 ORDER BY CNT DESC LIMIT 5";
296 $ret = sqlite_query($query, $res);
298 $colSize = 16;
299 $title = FALSE;
300 foreach(sqlite_fetch_all($ret) as $entry){
301 foreach($entry as $key => $str){
302 if(is_numeric($key)) continue;
303 echo str_pad($str,$colSize,' ')."|";
304 }
305 echo "\n";
306 }
307 echo sqlite_error_string($ret);
309 echo "\n------ \n";
310 echo "'open' actions done per plugin (5 most)\n";
311 echo "------ \n";
313 $query = "
314 SELECT COUNT(ACTION) as CNT, ACTION, PLUGIN, UUID
315 FROM {$TABLE_NAME}
316 WHERE TYPE = 'plugin'
317 AND PLUGIN != 'LDAP'
318 AND ACTION = 'open'
319 GROUP BY ACTION,PLUGIN, UUID
320 ORDER BY CNT DESC LIMIT 5";
321 $ret = sqlite_query($query, $res);
323 $colSize = 16;
324 $title = FALSE;
325 foreach(sqlite_fetch_all($ret) as $entry){
326 foreach($entry as $key => $str){
327 if(is_numeric($key)) continue;
328 echo str_pad($str,$colSize,' ')."|";
329 }
330 echo "\n";
331 }
332 echo sqlite_error_string($ret);
334 echo "\n------ \n";
335 echo "Time per session\n";
336 echo "------ \n";
338 $query = "
339 SELECT SUM(DURATION) as DUR, UUID
340 FROM {$TABLE_NAME}
341 GROUP BY UUID
342 ORDER BY DUR DESC LIMIT 10";
343 $ret = sqlite_query($query, $res);
345 $colSize = 16;
346 $title = FALSE;
347 foreach(sqlite_fetch_all($ret) as $entry){
348 foreach($entry as $key => $str){
349 if(is_numeric($key)) continue;
350 echo str_pad($str,$colSize,' ')."|";
351 }
352 echo "\n";
353 }
354 echo sqlite_error_string($ret);
356 echo "\n------ \n";
357 echo "Most used password hashes\n";
358 echo "------ \n";
360 $query = "
361 SELECT DISTINCT(INFO), COUNT(INFO) as CNT
362 FROM {$TABLE_NAME}
363 WHERE ACTION = 'change_password'
364 GROUP BY INFO
365 ORDER BY INFO DESC LIMIT 10";
366 $ret = sqlite_query($query, $res);
368 $colSize = 16;
369 $title = FALSE;
370 foreach(sqlite_fetch_all($ret) as $entry){
371 foreach($entry as $key => $str){
372 if(is_numeric($key)) continue;
373 echo str_pad($str,$colSize,' ')."|";
374 }
375 echo "\n";
376 }
377 echo sqlite_error_string($ret);
379 echo "\n------ \n";
380 echo "Actions at all\n";
381 echo "------ \n";
383 $query = "
384 SELECT DISTINCT(ACTION), COUNT(ACTION) AS CNT
385 FROM {$TABLE_NAME}
386 GROUP BY ACTION
387 ORDER BY CNT DESC LIMIT 10";
388 $ret = sqlite_query($query, $res);
390 $colSize = 16;
391 $title = FALSE;
392 foreach(sqlite_fetch_all($ret) as $entry){
393 foreach($entry as $key => $str){
394 if(is_numeric($key)) continue;
395 echo str_pad($str,$colSize,' ')."|";
396 }
397 echo "\n";
398 }
399 echo sqlite_error_string($ret);
401 echo "\n------ \n";
402 echo "Time spent per action\n";
403 echo "------ \n";
405 $query = "
406 SELECT DISTINCT(ACTION), SUM(DURATION) AS DUR
407 FROM {$TABLE_NAME}
408 GROUP BY ACTION
409 ORDER BY DUR DESC LIMIT 10";
410 $ret = sqlite_query($query, $res);
412 $colSize = 16;
413 $title = FALSE;
414 foreach(sqlite_fetch_all($ret) as $entry){
415 foreach($entry as $key => $str){
416 if(is_numeric($key)) continue;
417 echo str_pad($str,$colSize,' ')."|";
418 }
419 echo "\n";
420 }
421 echo sqlite_error_string($ret);
423 echo "\n------ \n";
424 echo "Average time per action\n";
425 echo "------ \n";
427 $query = "
428 SELECT DISTINCT(ACTION), AVG(DURATION) AS DUR
429 FROM {$TABLE_NAME}
430 GROUP BY ACTION
431 ORDER BY DUR DESC LIMIT 10";
432 $ret = sqlite_query($query, $res);
434 $colSize = 16;
435 $title = FALSE;
436 foreach(sqlite_fetch_all($ret) as $entry){
437 foreach($entry as $key => $str){
438 if(is_numeric($key)) continue;
439 echo str_pad($str,$colSize,' ')."|";
440 }
441 echo "\n";
442 }
443 echo sqlite_error_string($ret);
445 echo "</pre>";
446 }
447 }
450 ?>