List of commits:
Subject Hash Author Date (UTC)
More statistics changes (load, cpu, mem) e7f38e72405a227788a7011ea17dd57d0d4de67c Catalin(ux) M. BOIE 2019-11-19 19:31:24
Cosmetic 0a0b258e8993cb5035e018b049018ac41b99eb01 Catalin(ux) M. BOIE 2019-11-17 11:09:56
Insist on respecting the privacy b464bcc35476ffa23a83beaf956e8f7b15163d7c Catalin(ux) M. BOIE 2019-11-17 11:03:36
Remove PayPal donation because of legal uncertainly cd938af4c5cdbd81190e535973588dee6b697d34 Catalin(ux) M. BOIE 2019-11-17 11:03:07
nginx sample update 1f9eb2d293e91139f397cc45cb206d8994471134 Catalin(ux) M. BOIE 2019-11-17 09:10:02
Mostly cosmetic 3bf09056ede99df46c1b59802e6cf2c7bebf4f13 Catalin(ux) M. BOIE 2019-11-17 09:09:31
Added statistics for the installation ed743a601cd187431ccd80b57113ba9bb5704035 Catalin(ux) M. BOIE 2019-11-17 09:08:33
ldap: if we have no server, it is useless to continue processing c022b68a942f471e51cb8343bfef1cda390b27b1 Catalin(ux) M. BOIE 2019-11-16 06:30:47
Do not try to access a repo if is deleted 0a6b1bb704fbeaf60ba053ecc0c323a80f0e397c Catalin(ux) M. BOIE 2019-11-15 19:49:31
Some git tweaks to deal with empty repositories c42a22e41cd6d29862e13077e60374ceb7b0c946 Catalin(ux) M. BOIE 2019-11-14 03:30:12
Texts updates + cosmetic 70246eecb7b63460d28f20b5e2f3c9c1c50852ae Catalin(ux) M. BOIE 2019-11-14 03:29:33
Docker updates aa4cf359af2c7c1e20e4f33c478f2bbcd134f081 Catalin(ux) M. BOIE 2019-11-14 03:24:05
Because of docker, we are now using HTTP_HOST insead of SERVER_NAME 9cf31231d760daac43e1c3454c5a308d69ea4898 Catalin(ux) M. BOIE 2019-11-14 03:22:37
Corrected stupid space char inside cache key 5958389c03b7536d6332a51e30b112ad3a520571 Catalin(ux) M. BOIE 2019-11-10 21:15:32
nginx: remove text/html because it is always added to gzip_types f8717bc9ac127e806696f088389c2911a6d37e28 Catalin(ux) M. BOIE 2019-11-09 13:05:54
vm: get rid of i386 (we move to x86_64) 67662a7b71f1b21f53fe7fa819afdf366ad3b4b4 Catalin(ux) M. BOIE 2019-11-09 07:58:05
SELinux: allow httpd_t to map rocketgit_exec_t files 6d3550736af317791be3d6355dd90bf64de323f5 Catalin(ux) M. BOIE 2019-11-09 00:36:03
Added rg_git_repo_is_empty function plus func test a13c5439fceffd8b1474f1105ca37c7b703d2fc9 Catalin(ux) M. BOIE 2019-11-08 04:34:34
TODO updates, user_min/max defaults changed d2f35a43f5de793565e0df9889d587c524df5f20 Catalin(ux) M. BOIE 2019-11-06 16:32:08
More rg_exec2 fixes 808297884e42942c83762040c4247c7cf9a593e8 Catalin(ux) M. BOIE 2019-11-06 16:31:09
Commit e7f38e72405a227788a7011ea17dd57d0d4de67c - More statistics changes (load, cpu, mem)
Author: Catalin(ux) M. BOIE
Author date (UTC): 2019-11-19 19:31
Committer name: Catalin(ux) M. BOIE
Committer date (UTC): 2019-11-19 19:31
Parent(s): 0a0b258e8993cb5035e018b049018ac41b99eb01
Signing key:
Tree: 481ac72ad2d4438b41dfe8bec37eabc9b4f9347a
File Lines added Lines deleted
inc/dispatch/dispatch.php 1 1
inc/graph.inc.php 25 10
inc/mr.inc.php 3 3
inc/repo.inc.php 5 5
inc/site/stats.php 0 91
inc/ssh.inc.php 3 3
inc/stats.inc.php 75 0
inc/stats/stats.php 142 0
inc/struct.inc.php 13 1
inc/user.inc.php 8 3
inc/util.inc.php 79 1
root/index.php 1 0
root/themes/default/main.css 1 1
root/themes/default/stats/menu.html 17 0
root/themes/default/stats/stats.html 6 2
scripts/cron.php 14 6
scripts/events.php 1 1
File inc/dispatch/dispatch.php changed (mode: 100644) (index 1a6d32e..b9ecadd)
... ... case 'discover':
114 114 break; break;
115 115
116 116 case 'stats': case 'stats':
117 include($INC . "/site/stats.php");
117 include($INC . "/stats/stats.php");
118 118 break; break;
119 119
120 120 case 'doc': case 'doc':
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/struct.inc.php changed (mode: 100644) (index 978d55a..655883a)
... ... $rg_sql_struct[44]['other'] = array(
646 646 ); );
647 647 // Here, 0.71 was released. // Here, 0.71 was released.
648 648
649 // Do not forget to add the new tables to statistics
649 $rg_sql_struct[45] = array();
650 $rg_sql_struct[45]['tables'] = array(
651 'stats' => 'CREATE TABLE stats ('
652 . 'itime INT NOT NULL'
653 . ', load INT NOT NULL'
654 . ', disk_used_gib INT NOT NULL'
655 . ', mem_used_mib INT NOT NULL)'
656 );
657 $rg_sql_struct[45]['other'] = array();
658 $rg_sql_struct_slaves['stats'] = 'stats';
659
660
661 // Do not forget to add the new created tables to statistics
650 662 // This must be the last line // This must be the last line
651 663 $rg_sql_schema_ver = count($rg_sql_struct); $rg_sql_schema_ver = count($rg_sql_struct);
652 664
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 root/index.php changed (mode: 100644) (index 73d7f6b..546f9ea)
... ... include_once($INC . "/demo.inc.php");
29 29 include_once($INC . "/ver.php"); include_once($INC . "/ver.php");
30 30 include_once($INC . "/ldap.inc.php"); include_once($INC . "/ldap.inc.php");
31 31 include_once($INC . "/ssh.inc.php"); include_once($INC . "/ssh.inc.php");
32 include_once($INC . "/stats.inc.php");
32 33
33 34 rg_prof_start("MAIN"); rg_prof_start("MAIN");
34 35
File root/themes/default/main.css changed (mode: 100644) (index 334da7f..ad835c3)
... ... legend { padding: 0px 2pt; }
613 613 } }
614 614
615 615 .stats_svg { .stats_svg {
616 display: grid;
617 616 padding: 5px; padding: 5px;
617 height: auto;
618 618 } }
File root/themes/default/stats/menu.html added (mode: 100644) (index 0000000..937ff25)
1 <div class="main_title">Statistics</div>
2
3 <div class="menu menu2">
4 <ul>
5 <li@@if(@@stats_menu::year@@ == 1){{ class="selected"}}>
6 <a href="/op/stats/year">Last 12 months</a>
7 </li>
8
9 <li@@if(@@stats_menu::month@@ == 1){{ class="selected"}}>
10 <a href="/op/stats/month">Last 31 days</a>
11 </li>
12
13 <li@@if(@@stats_menu::12hours@@ == 1){{ class="selected"}}>
14 <a href="/op/stats/12hours">Last 12 hours</a>
15 </li>
16 </ul>
17 </div>
File root/themes/default/stats/stats.html renamed from root/themes/default/site/stats.html (similarity 74%) (mode: 100644) (index 03b038d..88ea680)
1 <div class="main_title">Statistics</div>
2
3 1 <div class="islands"> <div class="islands">
4 2
5 3 @@graph::users@@ @@graph::users@@
 
14 12
15 13 @@graph::keys@@ @@graph::keys@@
16 14
15 @@graph::disk@@
16
17 @@graph::mem@@
18
19 @@graph::load@@
20
17 21 </div> </div>
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 ?> ?>
File scripts/events.php changed (mode: 100644) (index 6fafef7..4b168ee)
... ... do {
123 123 do { do {
124 124 // check machine load - if too big we will delay // check machine load - if too big we will delay
125 125 $load = rg_load(); $load = rg_load();
126 if ($load > 10) {
126 if ($load > 100) {
127 127 rg_log("Load too big! Skip queue processing."); rg_log("Load too big! Skip queue processing.");
128 128 break; break;
129 129 } }
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/catalinux/rocketgit

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/catalinux/rocketgit

Clone this repository using git:
git clone git://git.rocketgit.com/user/catalinux/rocketgit

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main