File inc/graph.inc.php changed (mode: 100644) (index 67e00ea..a6be63d) |
... |
... |
function rg_graph_pos($db, $itime, $unit) |
51 |
51 |
/* |
/* |
52 |
52 |
* Loads data for graphs (helper) |
* Loads data for graphs (helper) |
53 |
53 |
* TODO: what about DST? |
* TODO: what about DST? |
|
54 |
|
* @mode - 'avg' if we need averages per bar, 'sum' for sum |
54 |
55 |
*/ |
*/ |
55 |
|
function rg_graph_query($db, $start, $end, $unit, $query, $params) |
|
|
56 |
|
function rg_graph_query($db, $start, $end, $unit, $mode, $query, $params) |
56 |
57 |
{ |
{ |
57 |
58 |
rg_log_enter('graph_query start=' . $start . ' end=' . $end |
rg_log_enter('graph_query start=' . $start . ' end=' . $end |
58 |
|
. ' unit=' . $unit . ' query=' . $query); |
|
|
59 |
|
. ' unit=' . $unit . ' mode=' . $mode . ' query=' . $query); |
59 |
60 |
|
|
60 |
61 |
$ret = FALSE; |
$ret = FALSE; |
61 |
62 |
while (1) { |
while (1) { |
|
... |
... |
function rg_graph_query($db, $start, $end, $unit, $query, $params) |
66 |
67 |
} |
} |
67 |
68 |
|
|
68 |
69 |
$ret = array('list' => array(), 'min' => -1, 'max' => 0); |
$ret = array('list' => array(), 'min' => -1, 'max' => 0); |
|
70 |
|
$counts = array(); |
69 |
71 |
while (($row = rg_sql_fetch_array($res))) { |
while (($row = rg_sql_fetch_array($res))) { |
70 |
72 |
$p = rg_graph_pos($db, $row['itime'], $unit); |
$p = rg_graph_pos($db, $row['itime'], $unit); |
71 |
73 |
if ($p === FALSE) |
if ($p === FALSE) |
|
... |
... |
function rg_graph_query($db, $start, $end, $unit, $query, $params) |
73 |
75 |
|
|
74 |
76 |
$pos = $p['pos']; |
$pos = $p['pos']; |
75 |
77 |
if (!isset($ret['list'][$pos])) |
if (!isset($ret['list'][$pos])) |
76 |
|
$ret['list'][$pos] = 1; |
|
|
78 |
|
$ret['list'][$pos] = $row['value']; |
77 |
79 |
else |
else |
78 |
|
$ret['list'][$pos] += 1; |
|
|
80 |
|
$ret['list'][$pos] += $row['value']; |
|
81 |
|
|
|
82 |
|
if (!isset($counts[$pos])) |
|
83 |
|
$counts[$pos] = 1; |
|
84 |
|
else |
|
85 |
|
$counts[$pos]++; |
79 |
86 |
} |
} |
80 |
87 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
81 |
88 |
|
|
|
... |
... |
function rg_graph_query($db, $start, $end, $unit, $query, $params) |
90 |
97 |
$pos = $p['pos']; |
$pos = $p['pos']; |
91 |
98 |
$next = $p['next']; |
$next = $p['next']; |
92 |
99 |
|
|
93 |
|
if (!isset($ret['list'][$pos])) |
|
|
100 |
|
if (!isset($ret['list'][$pos])) { |
94 |
101 |
$ret['list'][$pos] = 0; |
$ret['list'][$pos] = 0; |
|
102 |
|
} else if (strcmp($mode, 'avg') == 0) { |
|
103 |
|
$ret['list'][$pos] = intval($ret['list'][$pos] / $counts[$pos]); |
|
104 |
|
} |
95 |
105 |
|
|
96 |
106 |
if (($ret['min'] == -1) || ($ret['min'] > $ret['list'][$pos])) |
if (($ret['min'] == -1) || ($ret['min'] > $ret['list'][$pos])) |
97 |
107 |
$ret['min'] = $ret['list'][$pos]; |
$ret['min'] = $ret['list'][$pos]; |
|
... |
... |
function rg_graph($a) |
117 |
127 |
$a['scale_style'] = 'font-size: 8pt'; |
$a['scale_style'] = 'font-size: 8pt'; |
118 |
128 |
|
|
119 |
129 |
$data_start_x = 10; |
$data_start_x = 10; |
120 |
|
$data_start_y = 30; |
|
|
130 |
|
$data_start_y = 40; |
121 |
131 |
|
|
122 |
|
$len = strlen(sprintf("%s", $a['data']['max'])); |
|
|
132 |
|
$len = max(4, strlen(sprintf("%s", $a['data']['max']))); |
123 |
133 |
$data_start_x += $len * 8 + 3; |
$data_start_x += $len * 8 + 3; |
124 |
134 |
|
|
125 |
135 |
$c = count($a['data']['list']); |
$c = count($a['data']['list']); |
|
... |
... |
function rg_graph($a) |
132 |
142 |
rg_log('DEBUG: w=' . $w); |
rg_log('DEBUG: w=' . $w); |
133 |
143 |
|
|
134 |
144 |
$ret = '<svg width="' . $w . '" height="' . $h . '"' |
$ret = '<svg width="' . $w . '" height="' . $h . '"' |
|
145 |
|
. ' viewbox="0 0 ' . $w . ' ' . $h . '"' |
135 |
146 |
. ' class="stats_svg">' . "\n"; |
. ' class="stats_svg">' . "\n"; |
136 |
147 |
|
|
137 |
148 |
// Background |
// Background |
|
... |
... |
function rg_graph($a) |
143 |
154 |
. '">' . $a['title'] . '</text>' . "\n"; |
. '">' . $a['title'] . '</text>' . "\n"; |
144 |
155 |
|
|
145 |
156 |
// Subtitle |
// Subtitle |
146 |
|
$ret .= '<text x="' . $data_start_x . '"' |
|
147 |
|
. ' y="' . ($data_start_y + 2 + $a['h'] + 3 + 12) . '"' |
|
|
157 |
|
$a['subtitle_style'] .= '; text-anchor: end'; |
|
158 |
|
$ret .= '<text x="' . ($data_start_x + 2 + $a['w'] + 2) . '"' |
|
159 |
|
. ' y="' . ($data_start_y - 5) . '"' |
148 |
160 |
. ' style="' . $a['subtitle_style'] . '">' |
. ' style="' . $a['subtitle_style'] . '">' |
149 |
161 |
. $a['subtitle'] . '</text>' . "\n"; |
. $a['subtitle'] . '</text>' . "\n"; |
150 |
162 |
|
|
|
... |
... |
function rg_graph($a) |
175 |
187 |
. ' height="' . (2 + $a['h'] + 1 + 2) . '"' |
. ' height="' . (2 + $a['h'] + 1 + 2) . '"' |
176 |
188 |
. ' style="' . $a['data_style'] . '" />' . "\n"; |
. ' style="' . $a['data_style'] . '" />' . "\n"; |
177 |
189 |
|
|
178 |
|
$factor = $a['h'] / $a['data']['max']; |
|
|
190 |
|
if ($a['data']['max'] == 0) |
|
191 |
|
$factor = 1; |
|
192 |
|
else |
|
193 |
|
$factor = $a['h'] / $a['data']['max']; |
179 |
194 |
$x = $data_start_x + 2; |
$x = $data_start_x + 2; |
180 |
195 |
foreach ($a['data']['list'] as $pos => $v0) { |
foreach ($a['data']['list'] as $pos => $v0) { |
181 |
196 |
$v = sprintf('%u', $v0 * $factor); |
$v = sprintf('%u', $v0 * $factor); |
File inc/mr.inc.php changed (mode: 100644) (index f9f9020..8123f2f) |
... |
... |
function rg_mr_merge_set_status($db, $repo_id, $id, $status) |
365 |
365 |
* Loads data for graphs |
* Loads data for graphs |
366 |
366 |
* @unit - interval on which a sum is made |
* @unit - interval on which a sum is made |
367 |
367 |
*/ |
*/ |
368 |
|
function rg_mr_data($db, $type, $start, $end, $unit) |
|
|
368 |
|
function rg_mr_data($db, $type, $start, $end, $unit, $mode) |
369 |
369 |
{ |
{ |
370 |
370 |
$params = array('start' => $start, 'end' => $end); |
$params = array('start' => $start, 'end' => $end); |
371 |
371 |
switch ($type) { |
switch ($type) { |
372 |
372 |
case 'create_mr': |
case 'create_mr': |
373 |
|
$q = 'SELECT itime FROM merge_requests' |
|
|
373 |
|
$q = 'SELECT 1 AS value, itime FROM merge_requests' |
374 |
374 |
. ' WHERE itime >= @@start@@ AND itime <= @@end@@'; |
. ' WHERE itime >= @@start@@ AND itime <= @@end@@'; |
375 |
375 |
break; |
break; |
376 |
376 |
default: return FALSE; |
default: return FALSE; |
377 |
377 |
} |
} |
378 |
378 |
|
|
379 |
|
return rg_graph_query($db, $start, $end, $unit, $q, $params); |
|
|
379 |
|
return rg_graph_query($db, $start, $end, $unit, $mode, $q, $params); |
380 |
380 |
} |
} |
381 |
381 |
|
|
382 |
382 |
/* |
/* |
File inc/repo.inc.php changed (mode: 100644) (index cdf0bb0..48d7042) |
... |
... |
function rg_repo_lock($db, $repo_id, $uid, $lock, $reason) |
1563 |
1563 |
* Loads data for graphs |
* Loads data for graphs |
1564 |
1564 |
* @unit - interval on which a sum is made |
* @unit - interval on which a sum is made |
1565 |
1565 |
*/ |
*/ |
1566 |
|
function rg_repo_data($db, $type, $start, $end, $unit) |
|
|
1566 |
|
function rg_repo_data($db, $type, $start, $end, $unit, $mode) |
1567 |
1567 |
{ |
{ |
1568 |
1568 |
$params = array('start' => $start, 'end' => $end); |
$params = array('start' => $start, 'end' => $end); |
1569 |
1569 |
switch ($type) { |
switch ($type) { |
1570 |
1570 |
case 'create_repo': |
case 'create_repo': |
1571 |
|
$q = 'SELECT itime FROM repos' |
|
|
1571 |
|
$q = 'SELECT 1 AS value, itime FROM repos' |
1572 |
1572 |
. ' WHERE itime >= @@start@@ AND itime <= @@end@@'; |
. ' WHERE itime >= @@start@@ AND itime <= @@end@@'; |
1573 |
1573 |
break; |
break; |
1574 |
1574 |
case 'create_bug': |
case 'create_bug': |
1575 |
|
$q = 'SELECT itime FROM bugs' |
|
|
1575 |
|
$q = 'SELECT 1 AS value, itime FROM bugs' |
1576 |
1576 |
. ' WHERE itime >= @@start@@ AND itime <= @@end@@'; |
. ' WHERE itime >= @@start@@ AND itime <= @@end@@'; |
1577 |
1577 |
break; |
break; |
1578 |
1578 |
case 'history': |
case 'history': |
1579 |
|
$q = 'SELECT itime FROM repo_history' |
|
|
1579 |
|
$q = 'SELECT 1 AS value, itime FROM repo_history' |
1580 |
1580 |
. ' WHERE itime >= @@start@@ AND itime <= @@end@@'; |
. ' WHERE itime >= @@start@@ AND itime <= @@end@@'; |
1581 |
1581 |
break; |
break; |
1582 |
1582 |
default: return FALSE; |
default: return FALSE; |
1583 |
1583 |
} |
} |
1584 |
1584 |
|
|
1585 |
|
return rg_graph_query($db, $start, $end, $unit, $q, $params); |
|
|
1585 |
|
return rg_graph_query($db, $start, $end, $unit, $mode, $q, $params); |
1586 |
1586 |
} |
} |
1587 |
1587 |
|
|
1588 |
1588 |
/* |
/* |
File inc/site/stats.php deleted (index 413d348..0000000) |
1 |
|
<?php |
|
2 |
|
include_once(__DIR__ . '/../graph.inc.php'); |
|
3 |
|
|
|
4 |
|
$_sub = empty($paras) ? "" : array_shift($paras); |
|
5 |
|
switch ($_sub) { |
|
6 |
|
default: /* main stats page */ |
|
7 |
|
$rg['graph'] = array(); |
|
8 |
|
$rg['graph']['users'] = 'bla'; |
|
9 |
|
|
|
10 |
|
$start = gmmktime(0, 0, 0, gmdate('m'), gmdate('d'), gmdate('Y') - 1); |
|
11 |
|
$end = gmmktime(0, 0, 0, gmdate('m'), gmdate('d') + 1, gmdate('Y')) - 1; |
|
12 |
|
|
|
13 |
|
$subtitle = gmdate('Y-m-d H:i:s', $start) |
|
14 |
|
. ' - ' . gmdate('Y-m-d H:i:s', $end) . " UTC\n"; |
|
15 |
|
|
|
16 |
|
$a = array( |
|
17 |
|
'bg_style' => 'fill: #bdf', |
|
18 |
|
'h' => 150, |
|
19 |
|
'title_style' => 'color: #fff', |
|
20 |
|
'subtitle' => $subtitle, |
|
21 |
|
'subtitle_style' => 'color: #00f; font-size: 8pt', |
|
22 |
|
'data_style' => 'fill: #ffa', |
|
23 |
|
'data_line_style' => 'fill: #f00', |
|
24 |
|
'data_line_width' => 1, |
|
25 |
|
'gap' => 1, |
|
26 |
|
'footer_style' => 'font-color: #000; font-size: 8pt' |
|
27 |
|
); |
|
28 |
|
|
|
29 |
|
$b = $a; |
|
30 |
|
$b['title'] = '๐ธ Users'; |
|
31 |
|
$r = rg_user_data($db, 'create_account', $start, $end, 'day'); |
|
32 |
|
if ($r === FALSE) { |
|
33 |
|
$rg['graph']['users'] = 'Error generating graph!'; |
|
34 |
|
} else { |
|
35 |
|
$b['data'] = $r; |
|
36 |
|
$rg['graph']['HTML:users'] = rg_graph($b); |
|
37 |
|
} |
|
38 |
|
|
|
39 |
|
$b = $a; |
|
40 |
|
$b['title'] = '๐ธ Repositories'; |
|
41 |
|
$r = rg_repo_data($db, 'create_repo', $start, $end, 'day'); |
|
42 |
|
if ($r === FALSE) { |
|
43 |
|
$rg['graph']['repos'] = 'Error generating graph!'; |
|
44 |
|
} else { |
|
45 |
|
$b['data'] = $r; |
|
46 |
|
$rg['graph']['HTML:repos'] = rg_graph($b); |
|
47 |
|
} |
|
48 |
|
|
|
49 |
|
$b = $a; |
|
50 |
|
$b['title'] = '๐ Bugs'; |
|
51 |
|
$r = rg_repo_data($db, 'create_bug', $start, $end, 'day'); |
|
52 |
|
if ($r === FALSE) { |
|
53 |
|
$rg['graph']['repos'] = 'Error generating graph!'; |
|
54 |
|
} else { |
|
55 |
|
$b['data'] = $r; |
|
56 |
|
$rg['graph']['HTML:bugs'] = rg_graph($b); |
|
57 |
|
} |
|
58 |
|
|
|
59 |
|
$b = $a; |
|
60 |
|
$b['title'] = 'โ Merge requests'; |
|
61 |
|
$r = rg_mr_data($db, 'create_mr', $start, $end, 'day'); |
|
62 |
|
if ($r === FALSE) { |
|
63 |
|
$rg['graph']['repos'] = 'Error generating graph!'; |
|
64 |
|
} else { |
|
65 |
|
$b['data'] = $r; |
|
66 |
|
$rg['graph']['HTML:mrs'] = rg_graph($b); |
|
67 |
|
} |
|
68 |
|
|
|
69 |
|
$b = $a; |
|
70 |
|
$b['title'] = '๐
Repositories history entries'; |
|
71 |
|
$r = rg_repo_data($db, 'history', $start, $end, 'day'); |
|
72 |
|
if ($r === FALSE) { |
|
73 |
|
$rg['graph']['repos'] = 'Error generating graph!'; |
|
74 |
|
} else { |
|
75 |
|
$b['data'] = $r; |
|
76 |
|
$rg['graph']['HTML:repo_history'] = rg_graph($b); |
|
77 |
|
} |
|
78 |
|
|
|
79 |
|
$b = $a; |
|
80 |
|
$b['title'] = '๐ SSH keys'; |
|
81 |
|
$r = rg_ssh_data($db, 'create_key', $start, $end, 'day'); |
|
82 |
|
if ($r === FALSE) { |
|
83 |
|
$rg['graph']['repos'] = 'Error generating graph!'; |
|
84 |
|
} else { |
|
85 |
|
$b['data'] = $r; |
|
86 |
|
$rg['graph']['HTML:keys'] = rg_graph($b); |
|
87 |
|
} |
|
88 |
|
|
|
89 |
|
$body .= rg_template('site/stats.html', $rg, TRUE /*xss*/); |
|
90 |
|
break; |
|
91 |
|
} |
|
File inc/ssh.inc.php changed (mode: 100644) (index 00b868e..f5c0e48) |
... |
... |
function rg_ssh_dispatch($db, $ip, $uid, $orig_cmd) |
420 |
420 |
* Loads data for graphs |
* Loads data for graphs |
421 |
421 |
* @unit - interval on which a sum is made |
* @unit - interval on which a sum is made |
422 |
422 |
*/ |
*/ |
423 |
|
function rg_ssh_data($db, $type, $start, $end, $unit) |
|
|
423 |
|
function rg_ssh_data($db, $type, $start, $end, $unit, $mode) |
424 |
424 |
{ |
{ |
425 |
425 |
$params = array('start' => $start, 'end' => $end); |
$params = array('start' => $start, 'end' => $end); |
426 |
426 |
switch ($type) { |
switch ($type) { |
427 |
427 |
case 'create_key': |
case 'create_key': |
428 |
|
$q = 'SELECT itime FROM keys' |
|
|
428 |
|
$q = 'SELECT 1 AS value, itime FROM keys' |
429 |
429 |
. ' WHERE itime >= @@start@@ AND itime <= @@end@@'; |
. ' WHERE itime >= @@start@@ AND itime <= @@end@@'; |
430 |
430 |
break; |
break; |
431 |
431 |
default: return FALSE; |
default: return FALSE; |
432 |
432 |
} |
} |
433 |
433 |
|
|
434 |
|
return rg_graph_query($db, $start, $end, $unit, $q, $params); |
|
|
434 |
|
return rg_graph_query($db, $start, $end, $unit, $mode, $q, $params); |
435 |
435 |
} |
} |
436 |
436 |
|
|
437 |
437 |
?> |
?> |
File inc/stats.inc.php added (mode: 100644) (index 0000000..ca1c809) |
|
1 |
|
<?php |
|
2 |
|
|
|
3 |
|
// Gather stats about the system |
|
4 |
|
|
|
5 |
|
/* |
|
6 |
|
* Returns stats about the disk |
|
7 |
|
*/ |
|
8 |
|
function rg_stats_disk() |
|
9 |
|
{ |
|
10 |
|
global $rg_state_dir; |
|
11 |
|
|
|
12 |
|
$r = disk_total_space($rg_state_dir) |
|
13 |
|
- disk_free_space($rg_state_dir); |
|
14 |
|
return sprintf("%u", $r / 1024 / 1024 / 1024); |
|
15 |
|
} |
|
16 |
|
|
|
17 |
|
/* |
|
18 |
|
* Inserts data in the database |
|
19 |
|
*/ |
|
20 |
|
function rg_stats_insert($db) |
|
21 |
|
{ |
|
22 |
|
$ret = FALSE; |
|
23 |
|
while (1) { |
|
24 |
|
$now = time(); |
|
25 |
|
$load = rg_load(); |
|
26 |
|
$disk_used_gib = rg_stats_disk(); |
|
27 |
|
$m = rg_memory(); |
|
28 |
|
$mem_used_mib = intval(($m['total'] - $m['avail']) / 1024); |
|
29 |
|
|
|
30 |
|
$params = array('now' => $now, |
|
31 |
|
'load' => $load, |
|
32 |
|
'disk_used_gib' => $disk_used_gib, |
|
33 |
|
'mem_used_mib' => $mem_used_mib); |
|
34 |
|
$sql = 'INSERT INTO stats_' . gmdate("Y_m", $now) |
|
35 |
|
. ' (itime, load, disk_used_gib, mem_used_mib)' |
|
36 |
|
. ' VALUES (@@now@@, @@load@@, @@disk_used_gib@@' |
|
37 |
|
. ', @@mem_used_mib@@)'; |
|
38 |
|
$res = rg_sql_query_params($db, $sql, $params); |
|
39 |
|
if ($res == FALSE) { |
|
40 |
|
rg_internal_error('cannot insert stats: ' . rg_sql_error()); |
|
41 |
|
break; |
|
42 |
|
} |
|
43 |
|
|
|
44 |
|
$ret = TRUE; |
|
45 |
|
break; |
|
46 |
|
} |
|
47 |
|
|
|
48 |
|
return $ret; |
|
49 |
|
} |
|
50 |
|
|
|
51 |
|
/* |
|
52 |
|
* Loads data for graphs |
|
53 |
|
* @unit - interval on which a sum is made |
|
54 |
|
*/ |
|
55 |
|
function rg_stats_data($db, $type, $start, $end, $unit, $mode) |
|
56 |
|
{ |
|
57 |
|
$params = array('start' => $start, 'end' => $end); |
|
58 |
|
switch ($type) { |
|
59 |
|
case 'disk': |
|
60 |
|
$q = 'SELECT disk_used_gib AS value, itime FROM stats' |
|
61 |
|
. ' WHERE itime >= @@start@@ AND itime <= @@end@@'; |
|
62 |
|
break; |
|
63 |
|
case 'mem': |
|
64 |
|
$q = 'SELECT mem_used_mib AS value, itime FROM stats' |
|
65 |
|
. ' WHERE itime >= @@start@@ AND itime <= @@end@@'; |
|
66 |
|
break; |
|
67 |
|
case 'load': |
|
68 |
|
$q = 'SELECT load AS value, itime FROM stats' |
|
69 |
|
. ' WHERE itime >= @@start@@ AND itime <= @@end@@'; |
|
70 |
|
break; |
|
71 |
|
default: return FALSE; |
|
72 |
|
} |
|
73 |
|
|
|
74 |
|
return rg_graph_query($db, $start, $end, $unit, $mode, $q, $params); |
|
75 |
|
} |
File inc/stats/stats.php added (mode: 100644) (index 0000000..9f787c3) |
|
1 |
|
<?php |
|
2 |
|
include_once(__DIR__ . '/../graph.inc.php'); |
|
3 |
|
|
|
4 |
|
$_sub = empty($paras) ? 'year' : array_shift($paras); |
|
5 |
|
switch ($_sub) { |
|
6 |
|
case 'month': |
|
7 |
|
$period = 'hour'; |
|
8 |
|
$start = gmmktime(0, 0, 0, gmdate('m') - 1, gmdate('d'), gmdate('Y')); |
|
9 |
|
$end = gmmktime(0, 0, 0, gmdate('m'), gmdate('d') + 1, gmdate('Y')) - 1; |
|
10 |
|
break; |
|
11 |
|
|
|
12 |
|
case '12hours': |
|
13 |
|
$period = 'minute'; |
|
14 |
|
$start = gmmktime(gmdate('H') + 12, 0, 0, gmdate('m'), gmdate('d') - 1, gmdate('Y')); |
|
15 |
|
$end = gmmktime(gmdate('H'), 0, 0, gmdate('m'), gmdate('d'), gmdate('Y')) - 1; |
|
16 |
|
break; |
|
17 |
|
|
|
18 |
|
case 'year': |
|
19 |
|
default: |
|
20 |
|
$period = 'day'; |
|
21 |
|
$start = gmmktime(0, 0, 0, gmdate('m'), gmdate('d'), gmdate('Y') - 1); |
|
22 |
|
$end = gmmktime(0, 0, 0, gmdate('m'), gmdate('d') + 1, gmdate('Y')) - 1; |
|
23 |
|
break; |
|
24 |
|
} |
|
25 |
|
|
|
26 |
|
$rg['stats_menu'][$_sub] = 1; |
|
27 |
|
$body .= rg_template('stats/menu.html', $rg, TRUE /*xss*/); |
|
28 |
|
|
|
29 |
|
if (1) { |
|
30 |
|
/* main stats page */ |
|
31 |
|
$rg['graph'] = array(); |
|
32 |
|
$rg['graph']['users'] = 'bla'; |
|
33 |
|
|
|
34 |
|
$subtitle = gmdate('Y-m-d H:i:s', $start) |
|
35 |
|
. ' - ' . gmdate('Y-m-d H:i:s', $end) . " UTC\n"; |
|
36 |
|
|
|
37 |
|
$a = array( |
|
38 |
|
'bg_style' => 'fill: #bdf', |
|
39 |
|
'h' => 150, |
|
40 |
|
'title_style' => 'color: #fff', |
|
41 |
|
'subtitle' => $subtitle, |
|
42 |
|
'subtitle_style' => 'color: #00f; font-size: 8pt', |
|
43 |
|
'data_style' => 'fill: #ffa', |
|
44 |
|
'data_line_style' => 'fill: #f00', |
|
45 |
|
'data_line_width' => 1, |
|
46 |
|
'gap' => 0, |
|
47 |
|
'footer_style' => 'font-color: #000; font-size: 8pt' |
|
48 |
|
); |
|
49 |
|
|
|
50 |
|
$b = $a; |
|
51 |
|
$b['title'] = '๐ธ Users'; |
|
52 |
|
$r = rg_user_data($db, 'create_account', $start, $end, $period, 'sum'); |
|
53 |
|
if ($r === FALSE) { |
|
54 |
|
$rg['graph']['users'] = 'Error generating user graph!'; |
|
55 |
|
} else { |
|
56 |
|
$b['data'] = $r; |
|
57 |
|
$rg['graph']['HTML:users'] = rg_graph($b); |
|
58 |
|
} |
|
59 |
|
|
|
60 |
|
$b = $a; |
|
61 |
|
$b['title'] = '๐ธ Repositories'; |
|
62 |
|
$r = rg_repo_data($db, 'create_repo', $start, $end, $period, 'sum'); |
|
63 |
|
if ($r === FALSE) { |
|
64 |
|
$rg['graph']['repos'] = 'Error generating repo graph!'; |
|
65 |
|
} else { |
|
66 |
|
$b['data'] = $r; |
|
67 |
|
$rg['graph']['HTML:repos'] = rg_graph($b); |
|
68 |
|
} |
|
69 |
|
|
|
70 |
|
$b = $a; |
|
71 |
|
$b['title'] = '๐ Bugs'; |
|
72 |
|
$r = rg_repo_data($db, 'create_bug', $start, $end, $period, 'sum'); |
|
73 |
|
if ($r === FALSE) { |
|
74 |
|
$rg['graph']['bugs'] = 'Error generating bugs graph!'; |
|
75 |
|
} else { |
|
76 |
|
$b['data'] = $r; |
|
77 |
|
$rg['graph']['HTML:bugs'] = rg_graph($b); |
|
78 |
|
} |
|
79 |
|
|
|
80 |
|
$b = $a; |
|
81 |
|
$b['title'] = 'โ Merge requests'; |
|
82 |
|
$r = rg_mr_data($db, 'create_mr', $start, $end, $period, 'sum'); |
|
83 |
|
if ($r === FALSE) { |
|
84 |
|
$rg['graph']['mrs'] = 'Error generating mr graph!'; |
|
85 |
|
} else { |
|
86 |
|
$b['data'] = $r; |
|
87 |
|
$rg['graph']['HTML:mrs'] = rg_graph($b); |
|
88 |
|
} |
|
89 |
|
|
|
90 |
|
$b = $a; |
|
91 |
|
$b['title'] = '๐
Repositories history entries'; |
|
92 |
|
$r = rg_repo_data($db, 'history', $start, $end, $period, 'sum'); |
|
93 |
|
if ($r === FALSE) { |
|
94 |
|
$rg['graph']['repo_history'] = 'Error generating repo history graph!'; |
|
95 |
|
} else { |
|
96 |
|
$b['data'] = $r; |
|
97 |
|
$rg['graph']['HTML:repo_history'] = rg_graph($b); |
|
98 |
|
} |
|
99 |
|
|
|
100 |
|
$b = $a; |
|
101 |
|
$b['title'] = '๐ SSH keys'; |
|
102 |
|
$r = rg_ssh_data($db, 'create_key', $start, $end, $period, 'sum'); |
|
103 |
|
if ($r === FALSE) { |
|
104 |
|
$rg['graph']['keys'] = 'Error generating keys graph!'; |
|
105 |
|
} else { |
|
106 |
|
$b['data'] = $r; |
|
107 |
|
$rg['graph']['HTML:keys'] = rg_graph($b); |
|
108 |
|
} |
|
109 |
|
|
|
110 |
|
$b = $a; |
|
111 |
|
$b['title'] = '๐ฝ Disk space used (GiB)'; |
|
112 |
|
$r = rg_stats_data($db, 'disk', $start, $end, $period, 'avg'); |
|
113 |
|
if ($r === FALSE) { |
|
114 |
|
$rg['graph']['disk'] = 'Error generating disk graph!'; |
|
115 |
|
} else { |
|
116 |
|
$b['data'] = $r; |
|
117 |
|
$rg['graph']['HTML:disk'] = rg_graph($b); |
|
118 |
|
} |
|
119 |
|
|
|
120 |
|
$b = $a; |
|
121 |
|
$b['title'] = '๐ง Memory used (MiB)'; |
|
122 |
|
$r = rg_stats_data($db, 'mem', $start, $end, $period, 'avg'); |
|
123 |
|
if ($r === FALSE) { |
|
124 |
|
$rg['graph']['mem'] = 'Error generating disk graph!'; |
|
125 |
|
} else { |
|
126 |
|
$b['data'] = $r; |
|
127 |
|
$rg['graph']['HTML:mem'] = rg_graph($b); |
|
128 |
|
} |
|
129 |
|
|
|
130 |
|
$b = $a; |
|
131 |
|
$b['title'] = '๐ Load'; |
|
132 |
|
$r = rg_stats_data($db, 'load', $start, $end, $period, 'avg'); |
|
133 |
|
if ($r === FALSE) { |
|
134 |
|
$rg['graph']['load'] = 'Error generating disk graph!'; |
|
135 |
|
} else { |
|
136 |
|
$b['data'] = $r; |
|
137 |
|
$rg['graph']['HTML:load'] = rg_graph($b); |
|
138 |
|
} |
|
139 |
|
|
|
140 |
|
$body .= rg_template('stats/stats.html', $rg, TRUE /*xss*/); |
|
141 |
|
} |
|
142 |
|
|
File inc/user.inc.php changed (mode: 100644) (index 3c46fa5..f3ab0bc) |
... |
... |
function rg_user_nice($db, $uid) |
1859 |
1859 |
* Loads data for graphs |
* Loads data for graphs |
1860 |
1860 |
* @unit - interval on which a sum is made |
* @unit - interval on which a sum is made |
1861 |
1861 |
*/ |
*/ |
1862 |
|
function rg_user_data($db, $type, $start, $end, $unit) |
|
|
1862 |
|
function rg_user_data($db, $type, $start, $end, $unit, $mode) |
1863 |
1863 |
{ |
{ |
1864 |
1864 |
$params = array('start' => $start, 'end' => $end); |
$params = array('start' => $start, 'end' => $end); |
1865 |
1865 |
switch ($type) { |
switch ($type) { |
1866 |
1866 |
case 'create_account': |
case 'create_account': |
1867 |
|
$q = 'SELECT itime FROM users' |
|
|
1867 |
|
$q = 'SELECT 1 AS value, itime FROM users' |
|
1868 |
|
. ' WHERE itime >= @@start@@ AND itime <= @@end@@' |
|
1869 |
|
. ' AND is_admin = 0'; |
|
1870 |
|
break; |
|
1871 |
|
case 'disk': |
|
1872 |
|
$q = 'SELECT disk_used_mb AS value, itime FROM users' |
1868 |
1873 |
. ' WHERE itime >= @@start@@ AND itime <= @@end@@' |
. ' WHERE itime >= @@start@@ AND itime <= @@end@@' |
1869 |
1874 |
. ' AND is_admin = 0'; |
. ' AND is_admin = 0'; |
1870 |
1875 |
break; |
break; |
1871 |
1876 |
default: return FALSE; |
default: return FALSE; |
1872 |
1877 |
} |
} |
1873 |
1878 |
|
|
1874 |
|
return rg_graph_query($db, $start, $end, $unit, $q, $params); |
|
|
1879 |
|
return rg_graph_query($db, $start, $end, $unit, $mode, $q, $params); |
1875 |
1880 |
} |
} |
1876 |
1881 |
|
|
1877 |
1882 |
/* |
/* |
File inc/util.inc.php changed (mode: 100644) (index 9658156..361104a) |
... |
... |
function rg_unlock($file) |
194 |
194 |
fclose($_lock[$file]); |
fclose($_lock[$file]); |
195 |
195 |
} |
} |
196 |
196 |
|
|
|
197 |
|
/* |
|
198 |
|
* Returns information bout memory usage of the OS |
|
199 |
|
*/ |
|
200 |
|
function rg_memory() |
|
201 |
|
{ |
|
202 |
|
$r = @file('/proc/meminfo'); |
|
203 |
|
if ($r === FALSE) |
|
204 |
|
return FALSE; |
|
205 |
|
|
|
206 |
|
$ret = array(); |
|
207 |
|
$found = 0; |
|
208 |
|
foreach ($r as $line) { |
|
209 |
|
$t = explode(':', $line); |
|
210 |
|
$k = rtrim($t[0], ' '); |
|
211 |
|
$t = explode(' ', trim($t[1])); |
|
212 |
|
$v = $t[0]; |
|
213 |
|
|
|
214 |
|
if (strcmp($k, 'MemTotal') == 0) { |
|
215 |
|
$ret['total'] = $v; |
|
216 |
|
$found++; |
|
217 |
|
} else if (strcmp($k, 'MemAvailable') == 0) { |
|
218 |
|
$ret['avail'] = $v; |
|
219 |
|
$found++; |
|
220 |
|
} |
|
221 |
|
|
|
222 |
|
if ($found == 2) |
|
223 |
|
break; |
|
224 |
|
} |
|
225 |
|
|
|
226 |
|
return $ret; |
|
227 |
|
} |
|
228 |
|
|
|
229 |
|
/* |
|
230 |
|
* Taks a list (example: 0-4,6-7) and return exploded elements (0,1,2,3,4,6,7) |
|
231 |
|
*/ |
|
232 |
|
function rg_list_expand($s) |
|
233 |
|
{ |
|
234 |
|
$t = explode(',', trim($s)); |
|
235 |
|
$ret = array(); |
|
236 |
|
$i = 0; |
|
237 |
|
while (isset($t[$i])) { |
|
238 |
|
$x = explode('-', $t[$i]); |
|
239 |
|
if (!isset($x[1])) { |
|
240 |
|
$ret[] = $t[$i]; |
|
241 |
|
} else { |
|
242 |
|
for ($j = $x[0]; $j <= $x[1]; $j++) |
|
243 |
|
$ret[] = $j; |
|
244 |
|
} |
|
245 |
|
$i++; |
|
246 |
|
} |
|
247 |
|
|
|
248 |
|
return $ret; |
|
249 |
|
} |
|
250 |
|
|
|
251 |
|
/* |
|
252 |
|
* Returns the number of online cores |
|
253 |
|
*/ |
|
254 |
|
function rg_cores() |
|
255 |
|
{ |
|
256 |
|
$r = @file_get_contents('/sys/devices/system/cpu/online'); |
|
257 |
|
if ($r === FALSE) |
|
258 |
|
return 1; |
|
259 |
|
|
|
260 |
|
$online_cores = rg_list_expand($r); |
|
261 |
|
return count($online_cores); |
|
262 |
|
} |
|
263 |
|
|
|
264 |
|
/* |
|
265 |
|
* Returns the load of the system multiplied by 100 and divided by the number of cores |
|
266 |
|
* Example: 4 cores, load 8 will return 2 |
|
267 |
|
*/ |
197 |
268 |
function rg_load() |
function rg_load() |
198 |
269 |
{ |
{ |
199 |
|
return intval(file_get_contents("/proc/loadavg")); |
|
|
270 |
|
// Number of cores |
|
271 |
|
$r = @file_get_contents('/proc/loadavg'); |
|
272 |
|
if ($r === FALSE) |
|
273 |
|
return 0; |
|
274 |
|
|
|
275 |
|
$t = explode(' ', $r); |
|
276 |
|
$v = 100 * $t[0]; |
|
277 |
|
return intval($v / rg_cores()); |
200 |
278 |
} |
} |
201 |
279 |
|
|
202 |
280 |
/* |
/* |
File scripts/cron.php changed (mode: 100644) (index 97cfc7c..604dc39) |
... |
... |
require_once($INC . "/keys.inc.php"); |
16 |
16 |
require_once($INC . "/fixes.inc.php"); |
require_once($INC . "/fixes.inc.php"); |
17 |
17 |
require_once($INC . "/mr.inc.php"); |
require_once($INC . "/mr.inc.php"); |
18 |
18 |
require_once($INC . "/admin.inc.php"); |
require_once($INC . "/admin.inc.php"); |
|
19 |
|
require_once($INC . "/stats.inc.php"); |
19 |
20 |
require_once($INC . "/ver.php"); |
require_once($INC . "/ver.php"); |
20 |
21 |
|
|
21 |
22 |
$now = time(); |
$now = time(); |
|
... |
... |
$now = time(); |
23 |
24 |
rg_log_set_file($rg_log_dir . "/cron.log"); |
rg_log_set_file($rg_log_dir . "/cron.log"); |
24 |
25 |
rg_log_set_sid("000000"); // to spread the logs |
rg_log_set_sid("000000"); // to spread the logs |
25 |
26 |
|
|
26 |
|
if (rg_load() > 5) |
|
27 |
|
exit(0); |
|
28 |
|
|
|
29 |
27 |
// locking |
// locking |
30 |
28 |
rg_lock_or_exit("cron.lock"); |
rg_lock_or_exit("cron.lock"); |
31 |
29 |
|
|
|
... |
... |
rg_base_url_build($rg['hostname'], $rg['http_allow'], $rg['https_allow']); |
60 |
58 |
$rg['base_url'] = rg_base_url(); |
$rg['base_url'] = rg_base_url(); |
61 |
59 |
rg_log('DEBUG: base_url=' . rg_base_url()); |
rg_log('DEBUG: base_url=' . rg_base_url()); |
62 |
60 |
|
|
|
61 |
|
|
|
62 |
|
rg_stats_insert($db); |
|
63 |
|
|
63 |
64 |
if (gmdate("Hi") == "0105") { |
if (gmdate("Hi") == "0105") { |
64 |
65 |
while (1) { |
while (1) { |
|
66 |
|
if (rg_load() > 100) |
|
67 |
|
break; |
|
68 |
|
|
65 |
69 |
rg_log("Compute repository sizes if dirty..."); |
rg_log("Compute repository sizes if dirty..."); |
66 |
70 |
// delete 'dirty' files |
// delete 'dirty' files |
67 |
71 |
$sql = 'SELECT uid, repo_id, master, disk_used_mb FROM repos' |
$sql = 'SELECT uid, repo_id, master, disk_used_mb FROM repos' |
|
... |
... |
if (gmdate("Hi") == "0605") { |
160 |
164 |
rg_log_exit(); |
rg_log_exit(); |
161 |
165 |
} |
} |
162 |
166 |
|
|
163 |
|
if (gmdate("dHi") == "010610") { |
|
|
167 |
|
while (gmdate("dHi") == "010610") { |
|
168 |
|
if (rg_load() > 100) |
|
169 |
|
break; |
|
170 |
|
|
164 |
171 |
rg_log_enter("Clean old empty slave tables..."); |
rg_log_enter("Clean old empty slave tables..."); |
165 |
172 |
|
|
166 |
173 |
$ts = time() - 3 * 31 * 24 * 3600; |
$ts = time() - 3 * 31 * 24 * 3600; |
|
... |
... |
if (gmdate("dHi") == "010610") { |
199 |
206 |
rg_sql_free_result($res2); |
rg_sql_free_result($res2); |
200 |
207 |
} |
} |
201 |
208 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
|
209 |
|
break; |
202 |
210 |
} |
} |
203 |
211 |
|
|
204 |
212 |
rg_log_exit(); |
rg_log_exit(); |
205 |
213 |
} |
} |
206 |
214 |
|
|
207 |
|
rg_log_cron(); |
|
208 |
|
|
|
209 |
215 |
rg_sql_struct_slaves_update($db); |
rg_sql_struct_slaves_update($db); |
210 |
216 |
|
|
211 |
217 |
if (gmdate("Hi") == "0100") |
if (gmdate("Hi") == "0100") |
|
... |
... |
if (gmdate("Hi") == "0100") |
214 |
220 |
// TODO: move it as an event after the push |
// TODO: move it as an event after the push |
215 |
221 |
rg_mr_queue_process($db); |
rg_mr_queue_process($db); |
216 |
222 |
|
|
|
223 |
|
rg_log_cron(); |
|
224 |
|
|
217 |
225 |
rg_log("Done!"); |
rg_log("Done!"); |
218 |
226 |
?> |
?> |