summaryrefslogblamecommitdiffstats
path: root/modules-available/statistics/inc/statistics.inc.php
blob: c12f5be4efe66f1816c563e0ead7e8a639048a33 (plain) (tree)
1
2
3
4
5
6
7
8
9








                                              
                                                                   



                                                                                  
                                                                                                                                                      





                                                              
                                                                                      
                 



                                                                      
                                                                                                      
           
                                                                                         



                                                                                                                                    
                                   
                                    






                                                
           

                                                                                                      
                                            
           
                                                                                                       


                                                        
                                     





                                                                                                                      
                                        








                                                        



                                                 
                                                                                                                                           











                                                                                                                       
 
<?php



class Statistics
{

	private static $machineFields = false;

	private static function initFields(int $returnData): string
	{
		if (self::$machineFields === false) {
			$r = new ReflectionClass('Machine');
			$props = $r->getProperties(ReflectionProperty::IS_PUBLIC);
			self::$machineFields = array_flip(array_map(function(/* @var ReflectionProperty $e */ $e) { return $e->getName(); }, $props));
		}
		if ($returnData === Machine::NO_DATA) {
			unset(self::$machineFields['data']);
		} elseif ($returnData === Machine::RAW_DATA) {
			self::$machineFields['data'] = true;
		} else {
			ErrorHandler::traceError('Invalid $returnData option passed');
		}
		return implode(',', array_keys(self::$machineFields));
	}

	/**
	 * @param int $returnData What kind of data to return Machine::NO_DATA, Machine::RAW_DATA, ...
	 */
	public static function getMachine(string $machineuuid, int $returnData): ?Machine
	{
		$fields = self::initFields($returnData);

		$row = Database::queryFirst("SELECT $fields FROM machine WHERE machineuuid = :machineuuid", compact('machineuuid'));
		if ($row === false)
			return null;
		$m = new Machine();
		foreach ($row as $key => $val) {
			$m->{$key} = $val;
		}
		return $m;
	}

	/**
	 * @param int $returnData What kind of data to return Machine::NO_DATA, Machine::RAW_DATA, ...
	 * @param string $sort something like 'lastseen ASC' - not sanitized, don't pass user input!
	 * @return Machine[] list of matches
	 */
	public static function getMachinesByIp(string $ip, int $returnData, string $sort = null): array
	{
		$fields = self::initFields($returnData);

		if ($sort === null) {
			$sort = '';
		} else {
			$sort = "ORDER BY $sort";
		}
		$res = Database::simpleQuery("SELECT $fields FROM machine WHERE clientip = :ip $sort", compact('ip'));
		$list = array();
		foreach ($res as $row) {
			$m = new Machine();
			foreach ($row as $key => $val) {
				$m->{$key} = $val;
			}
			$list[] = $m;
		}
		return $list;
	}

	const SESSION_LENGTH = '~session-length';
	const OFFLINE_LENGTH = '~offline-length';
	const SUSPEND_LENGTH = '~suspend-length';

	public static function logMachineState(string $uuid, string $ip, string $type, int $start, int $length, string $username = ''): int
	{
		return Database::exec('INSERT INTO statistic (dateline, typeid, machineuuid, clientip, username, data)'
			. " VALUES (:start, :type, :uuid, :clientip, :username, :length)", array(
			'start' => $start,
			'type'  => $type,
			'uuid'  => $uuid,
			'clientip' => $ip,
			'username' => $username,
			'length'   => $length,
		));
	}

}