xaizek / rocketgit (License: AGPLv3+) (since 2018-12-09)
Light and fast Git hosting solution suitable to serve both as a hub or as a personal code storage with its tickets, pull requests, API and much more.
<root> / inc / stats.inc.php (11c653df75b1d37fc403cc8c30fd6f12972aab46) (4,132B) (mode 100644) [raw]
<?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;
}

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://code.reversed.top/user/xaizek/rocketgit

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/rocketgit

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