<?php // Gather stats about the system $rg_stats_error = ''; function rg_stats_set_error($str) { global $rg_stats_error; $rg_stats_error = $str; rg_log('stats_set_error: ' . $str); } function rg_stats_error() { global $rg_stats_error; return $rg_stats_error; } /* * Returns stats about the disk */ function rg_stats_disk() { global $rg_state_dir; $r = disk_total_space($rg_state_dir) - disk_free_space($rg_state_dir); return sprintf("%u", $r / 1024 / 1024 / 1024); } /* * Inserts data in the database */ function rg_stats_insert($db) { $ret = FALSE; while (1) { $now = time(); $load = rg_load(); $disk_used_gib = rg_stats_disk(); $m = rg_memory(); $mem_used_mib = intval(($m['total'] - $m['avail']) / 1024); $params = array('now' => $now, 'load' => $load, 'disk_used_gib' => $disk_used_gib, 'mem_used_mib' => $mem_used_mib); $sql = 'INSERT INTO stats_' . gmdate("Y_m", $now) . ' (itime, load, disk_used_gib, mem_used_mib)' . ' VALUES (@@now@@, @@load@@, @@disk_used_gib@@' . ', @@mem_used_mib@@)'; $res = rg_sql_query_params($db, $sql, $params); if ($res == FALSE) { rg_internal_error('cannot insert stats: ' . rg_sql_error()); break; } $ret = TRUE; break; } return $ret; } /* * Loads data for graphs * @unit - interval on which a sum is made */ function rg_stats_data($db, $type, $start, $end, $unit, $mode) { $params = array('start' => $start, 'end' => $end); switch ($type) { case 'disk': $q = 'SELECT disk_used_gib AS value, itime FROM stats' . ' WHERE itime >= @@start@@ AND itime <= @@end@@'; break; case 'mem': $q = 'SELECT mem_used_mib AS value, itime FROM stats' . ' WHERE itime >= @@start@@ AND itime <= @@end@@'; break; case 'load': $q = 'SELECT load AS value, itime FROM stats' . ' WHERE itime >= @@start@@ AND itime <= @@end@@'; break; default: rg_internal_error('invalid type'); return FALSE; } $ret = rg_graph_query($db, $start, $end, $unit, $mode, $q, $params, ''); if ($ret === FALSE) rg_stats_set_error(rg_graph_error()); return $ret; } /* * Store 'conns' stats */ function rg_stats_conns_insert($db) { global $rg_stats_conns_paras; $ret = FALSE; while (1) { if (!isset($rg_stats_conns_paras['elap'])) $rg_stats_conns_paras['elap'] = intval((microtime(TRUE) - $rg_stats_conns_paras['start']) * 1000); $rg_stats_conns_paras['start'] = intval($rg_stats_conns_paras['start']); $list = array( 'ua' => '', 'cmd' => '', 'referer' => '', 'url' => '', 'uid' => 0, 'repo_id' => 0 ); foreach ($list as $k => $v) if (!isset($rg_stats_conns_paras[$k])) $rg_stats_conns_paras[$k] = $v; if (rg_is_bot($rg_stats_conns_paras['ua'])) { $ret = TRUE; break; } $sql = 'INSERT INTO conns_' . gmdate('Y_m', $rg_stats_conns_paras['start']) . ' (type, uid, repo_id, itime, ip, url' . ', referer, elap, ua, cmd)' . ' VALUES (@@type@@, @@uid@@' . ', @@repo_id@@, @@start@@, @@ip@@, @@url@@' . ', @@referer@@, @@elap@@, @@ua@@, @@cmd@@)'; $res = rg_sql_query_params($db, $sql, $rg_stats_conns_paras); if ($res == FALSE) { rg_internal_error('cannot insert conns: ' . rg_sql_error()); break; } $ret = TRUE; break; } return $ret; } /* * Set a parameter for conns_insert * Added to be able to not pass &$rg everywhere and to not collude with $rg */ $rg_stats_conns_paras = array(); function rg_stats_conns_set($para, $value) { global $rg_stats_conns_paras; rg_log('DEBUG: stats_conns_set ' . $para . '=[' . $value . ']'); $rg_stats_conns_paras[$para] = $value; } /* * Loads data for graphs * @unit - interval on which a sum is made */ function rg_conns_data($db, $type, $start, $end, $unit, $mode) { $params = array('start' => $start, 'end' => $end); switch ($type) { case 'total': $q = 'SELECT 1 AS value, itime FROM conns' . ' WHERE itime >= @@start@@ AND itime <= @@end@@'; break; default: rg_internal_error('invalid type'); return FALSE; } $ret = rg_graph_query($db, $start, $end, $unit, $mode, $q, $params, ''); if ($ret === FALSE) rg_stats_set_error(rg_graph_error()); return $ret; }