From ff6e86e8e5db2728d3b34c10f561cfdb533afa87 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Thu, 6 Jul 2017 13:11:54 +0200 Subject: [runmode] New module for managing special boot modes of clients --- modules-available/runmode/inc/runmode.inc.php | 185 ++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 modules-available/runmode/inc/runmode.inc.php (limited to 'modules-available/runmode/inc') diff --git a/modules-available/runmode/inc/runmode.inc.php b/modules-available/runmode/inc/runmode.inc.php new file mode 100644 index 00000000..5b59f1c1 --- /dev/null +++ b/modules-available/runmode/inc/runmode.inc.php @@ -0,0 +1,185 @@ + $machineuuid, + 'module' => $moduleId, + 'modeid' => $modeId, + 'modedata' => $modeData, + )); + } + return true; + } + + /** + * @param string|\Module $module + * @return array + */ + public static function getForModule($module, $groupByModeId = false) + { + if (is_object($module)) { + $module = $module->getIdentifier(); + } + $res = Database::simpleQuery('SELECT machineuuid, modeid, modedata FROM runmode WHERE module = :module', + compact('module')); + $ret = array(); + while ($row = $res->fetch(PDO::FETCH_ASSOC)) { + if ($groupByModeId) { + if (!isset($ret[$row['modeid']])) { + $ret[$row['modeid']] = array(); + } + $ret[$row['modeid']][] = $row; + } else { + $ret[$row['machineuuid']] = $row; + } + } + return $ret; + } + + /** + * @param string|\Module $module + * @param string $modeId + * @param bool $detailed whether to return meta data about machine, not just machineuuid + * @return array + */ + public static function getForMode($module, $modeId, $detailed = false) + { + if (is_object($module)) { + $module = $module->getIdentifier(); + } + if ($detailed) { + $sel = ', m.hostname, m.clientip, m.macaddr, m.locationid'; + $join = 'INNER JOIN machine m USING (machineuuid)'; + } else { + $join = $sel = ''; + } + $res = Database::simpleQuery( + "SELECT r.machineuuid, r.modedata $sel + FROM runmode r $join + WHERE module = :module AND modeid = :modeId", + compact('module', 'modeId')); + $ret = array(); + while ($row = $res->fetch(PDO::FETCH_ASSOC)) { + if ($detailed && empty($row['hostname'])) { + $row['hostname'] = $row['clientip']; + } + $ret[] = $row; + } + return $ret; + } + + /** + * Get display name of a module's mode. If the module doesn't have a getModeName + * method configured, the modeId is simply returned. Otherwise the return value of + * that method is passed through. getModeName by contract should return false if + * the module doesn't think the given modeId exists. + * + * @param string|\Module $module + * @param string $modeId + * @return string|bool mode name if known, modeId as fallback, or false if mode is not known by module + */ + public static function getModeName($module, $modeId) + { + if (is_object($module)) { + $module = $module->getIdentifier(); + } + $conf = self::getModuleConfig($module); + if ($conf === false || $conf->getModeName === false || !Module::isAvailable($module)) + return $modeId; + return call_user_func($conf->getModeName, $modeId); + } + +} + +/* *\ +|* Helper classes *| +\* */ + +/** + * Class RunModeModuleConfig represents desired config of a runmode + */ +class RunModeModuleConfig +{ + /** + * @var string|false + */ + public $systemdDefaultTarget = false; + /** + * @var string[] + */ + public $systemdDisableTargets = []; + /** + * @var string[] + */ + public $systemdEnableTargets = []; + /** + * @var string Name of function that turns a modeId into a string + */ + public $getModeName = false; + /** + * @var bool Consider this a normal client that should e.g. be shown in client statistics by default + */ + public $isClient = false; + + public function __construct($file) + { + $data = json_decode(file_get_contents($file), true); + if (!is_array($data)) + return; + $this->loadType($data, 'systemdDefaultTarget', 'string'); + $this->loadType($data, 'systemdDisableTargets', 'array'); + $this->loadType($data, 'systemdEnableTargets', 'array'); + $this->loadType($data, 'getModeName', 'string'); + $this->loadType($data, 'isClient', 'string'); + } + + private function loadType($data, $key, $type) + { + if (!isset($data[$key])) + return false; + if (is_string($type) && gettype($data[$key]) !== $type) + return false; + if (is_array($type) && !in_array(gettype($data[$key]), $type)) + return false; + $this->{$key} = $data[$key]; + return true; + } +} -- cgit v1.2.3-55-g7522