From 0aa46a9d4c1e6e22493832e4c7a186e41c0b23c8 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Thu, 29 Mar 2018 11:30:56 +0200 Subject: [sysconfig] Stuff ssh config into "empty" global config This is an ugly hack. The "no sysconfig" runmode option creates an obvious problem if an ssh config exists: It won't be provisioned to the client, so it's not reachable via ssh. We need a proper mechanism for managing config, that flags modules by whether they should be ignored for "no sysconfig" runmode or not, and while we're at it, make it possible to assign additional modules to rooms. --- modules-available/sysconfig/inc/configtgz.inc.php | 43 +++++++++++++++++++---- 1 file changed, 37 insertions(+), 6 deletions(-) (limited to 'modules-available/sysconfig/inc/configtgz.inc.php') diff --git a/modules-available/sysconfig/inc/configtgz.inc.php b/modules-available/sysconfig/inc/configtgz.inc.php index 17c9f35d..ea9ace4d 100644 --- a/modules-available/sysconfig/inc/configtgz.inc.php +++ b/modules-available/sysconfig/inc/configtgz.inc.php @@ -63,7 +63,7 @@ class ConfigTgz foreach ($moduleIds as $module) { $idstr .= ',' . (int)$module; // Casting to int should make it safe } - $res = Database::simpleQuery("SELECT moduleid, filepath, status FROM configtgz_module WHERE moduleid IN ($idstr)"); + $res = Database::simpleQuery("SELECT moduleid, moduletype, filepath, status FROM configtgz_module WHERE moduleid IN ($idstr)"); // Delete old connections Database::exec("DELETE FROM configtgz_x_module WHERE configid = :configid", array('configid' => $this->configId)); // Make connection @@ -98,8 +98,13 @@ class ConfigTgz $files = array(); // Get all config modules for system config foreach ($this->modules as $module) { - if (!empty($module['filepath']) && file_exists($module['filepath'])) + if (!empty($module['filepath']) && file_exists($module['filepath'])) { $files[] = $module['filepath']; + } + if ($module['moduletype'] === 'SshConfig') { + // HACK XXX TODO Global + SSH ugly + self::rebuildEmptyGlobalConfig(); + } } $task = self::recompress($files, $this->file); @@ -222,13 +227,39 @@ class ConfigTgz )); $res = Database::simpleQuery("SELECT configid FROM configtgz"); while ($row = $res->fetch(PDO::FETCH_ASSOC)) { - $module = self::get($row['configid']); - if ($module !== false) { - $module->generate(); + $configTgz = self::get($row['configid']); + if ($configTgz !== false) { + $configTgz->generate(); } } // Build the global "empty" config that just includes global hooks - self::recompress([], SysConfig::GLOBAL_MINIMAL_CONFIG); + self::rebuildEmptyGlobalConfig(); + } + + /** + * Rebuild the general "empty" config that only contains global hook modules + * and forced ones. + */ + private static function rebuildEmptyGlobalConfig() + { + static $onceOnly = false; + if ($onceOnly) + return; + $onceOnly = true; + // HACK TODO XXX -- just stuff (global) ssh config into this one for now, needs proper fix :-( + $res = Database::simpleQuery("SELECT DISTINCT cm.filepath FROM configtgz_module cm + INNER JOIN configtgz_x_module cxm USING (moduleid) + INNER JOIN configtgz_location cl USING (configid) + WHERE cm.moduletype = 'SshConfig' AND cm.status = 'OK' + ORDER BY locationid ASC"); + $extra = []; + while ($row = $res->fetch(PDO::FETCH_ASSOC)) { + if (file_exists($row['filepath'])) { + $extra[] = $row['filepath']; + break; + } + } + self::recompress($extra, SysConfig::GLOBAL_MINIMAL_CONFIG); } /** -- cgit v1.2.3-55-g7522 From 6ba8c427310a64cb9c8d49e901fc016adb541bab Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Thu, 29 Mar 2018 12:38:35 +0200 Subject: Fix warnings --- install-all | 1 + modules-available/sysconfig/inc/configtgz.inc.php | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'modules-available/sysconfig/inc/configtgz.inc.php') diff --git a/install-all b/install-all index 1bde77f7..362d2a4a 100755 --- a/install-all +++ b/install-all @@ -54,6 +54,7 @@ done echo "Rebuilding config.tgz modules" php api.php sysconfig --action rebuild +echo "" echo "Done." diff --git a/modules-available/sysconfig/inc/configtgz.inc.php b/modules-available/sysconfig/inc/configtgz.inc.php index ea9ace4d..5b459a2e 100644 --- a/modules-available/sysconfig/inc/configtgz.inc.php +++ b/modules-available/sysconfig/inc/configtgz.inc.php @@ -289,7 +289,7 @@ class ConfigTgz foreach ($moduleIds as $module) { $idstr .= ',' . (int)$module; // Casting to int should make it safe } - $res = Database::simpleQuery("SELECT moduleid, filepath, status FROM configtgz_module WHERE moduleid IN ($idstr)"); + $res = Database::simpleQuery("SELECT moduleid, moduletype, filepath, status FROM configtgz_module WHERE moduleid IN ($idstr)"); // Make connection while ($row = $res->fetch(PDO::FETCH_ASSOC)) { Database::exec("INSERT INTO configtgz_x_module (configid, moduleid) VALUES (:configid, :moduleid)", array( @@ -312,7 +312,7 @@ class ConfigTgz $instance->configId = $ret['configid']; $instance->configTitle = $ret['title']; $instance->file = $ret['filepath']; - $ret = Database::simpleQuery("SELECT moduleid, filepath, status FROM configtgz_x_module " + $ret = Database::simpleQuery("SELECT moduleid, moduletype, filepath, status FROM configtgz_x_module " . " INNER JOIN configtgz_module USING (moduleid) " . " WHERE configid = :configid", array('configid' => $instance->configId)); $instance->modules = array(); @@ -341,7 +341,7 @@ class ConfigTgz $instance->configId = $row['configid']; $instance->configTitle = $row['title']; $instance->file = $row['filepath']; - $innerRes = Database::simpleQuery("SELECT moduleid, filepath, status FROM configtgz_x_module " + $innerRes = Database::simpleQuery("SELECT moduleid, moduletype, filepath, status FROM configtgz_x_module " . " INNER JOIN configtgz_module USING (moduleid) " . " WHERE configid = :configid", array('configid' => $instance->configId)); $instance->modules = array(); -- cgit v1.2.3-55-g7522 From 5e786faa6c577abfd48976a6839f61d08b0a6e5e Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Thu, 24 May 2018 15:35:46 +0200 Subject: Introduce proper constants for taskmanager status --- inc/property.inc.php | 2 +- inc/taskmanager.inc.php | 27 ++++++++++++---------- .../sysconfig/addmodule_custommodule.inc.php | 4 ++-- .../sysconfig/inc/configmodule.inc.php | 2 +- modules-available/sysconfig/inc/configtgz.inc.php | 2 +- modules-available/sysconfig/page.inc.php | 6 ++--- 6 files changed, 23 insertions(+), 20 deletions(-) (limited to 'modules-available/sysconfig/inc/configtgz.inc.php') diff --git a/inc/property.inc.php b/inc/property.inc.php index 56adb823..b69be1f8 100644 --- a/inc/property.inc.php +++ b/inc/property.inc.php @@ -168,7 +168,7 @@ class Property if (!Taskmanager::isFinished($task)) { $task = Taskmanager::waitComplete($task['id'], 5000); } - if ($task['statusCode'] !== TASK_FINISHED || !isset($task['data']['content'])) { + if ($task['statusCode'] !== Taskmanager::TASK_FINISHED || !isset($task['data']['content'])) { return isset($task['data']['error']) ? $task['data']['error'] : 'Timeout'; } $data = json_decode($task['data']['content'], true); diff --git a/inc/taskmanager.inc.php b/inc/taskmanager.inc.php index 54821e59..dab950ed 100644 --- a/inc/taskmanager.inc.php +++ b/inc/taskmanager.inc.php @@ -6,6 +6,13 @@ class Taskmanager { + const NO_SUCH_TASK = 'NO_SUCH_TASK'; + const TASK_FINISHED = 'TASK_FINISHED'; + const TASK_ERROR = 'TASK_ERROR'; + const TASK_WAITING = 'TASK_WAITING'; + const NO_SUCH_INSTANCE = 'NO_SUCH_INSTANCE'; + const TASK_PROCESSING = 'TASK_PROCESSING'; + /** * UDP socket used for communication with the task manager * @var resource @@ -49,7 +56,7 @@ class Taskmanager if ($async) return true; $reply = self::readReply($seq); - if ($reply === false || !is_array($reply) || !isset($reply['id']) || (isset($reply['statusCode']) && $reply['statusCode'] === NO_SUCH_TASK)) { + if ($reply === false || !is_array($reply) || !isset($reply['id']) || (isset($reply['statusCode']) && $reply['statusCode'] === Taskmanager::NO_SUCH_TASK)) { self::addErrorMessage($reply); return false; } @@ -82,7 +89,7 @@ class Taskmanager /** * Checks whether the given task id corresponds to a known task in the taskmanager. * Returns true iff the taskmanager is reachable and the status of the task - * is different from NO_SUCH_INSTANCE/_TASK. + * is different from Taskmanager::NO_SUCH_INSTANCE/_TASK. * If you pass an array it is assumed that it was already queried and is evaluated * directly. * @@ -96,8 +103,8 @@ class Taskmanager if (is_string($task)) { $task = self::status($task); } - return isset($task['statusCode']) && $task['statusCode'] !== NO_SUCH_INSTANCE - && $task['statusCode'] !== NO_SUCH_TASK; + return isset($task['statusCode']) && $task['statusCode'] !== Taskmanager::NO_SUCH_INSTANCE + && $task['statusCode'] !== Taskmanager::NO_SUCH_TASK; } /** @@ -110,7 +117,7 @@ class Taskmanager public static function waitComplete($task, $timeout = 2500) { if (is_array($task) && isset($task['id'])) { - if ($task['statusCode'] !== TASK_PROCESSING && $task['statusCode'] !== TASK_WAITING) { + if ($task['statusCode'] !== Taskmanager::TASK_PROCESSING && $task['statusCode'] !== Taskmanager::TASK_WAITING) { self::release($task['id']); return $task; } @@ -124,7 +131,7 @@ class Taskmanager $status = self::status($task); if (!isset($status['statusCode'])) break; - if ($status['statusCode'] !== TASK_PROCESSING && $status['statusCode'] !== TASK_WAITING) { + if ($status['statusCode'] !== Taskmanager::TASK_PROCESSING && $status['statusCode'] !== Taskmanager::TASK_WAITING) { $done = true; break; } @@ -147,7 +154,7 @@ class Taskmanager { if (!is_array($task) || !isset($task['statusCode']) || !isset($task['id'])) return true; - if ($task['statusCode'] !== TASK_WAITING && $task['statusCode'] !== TASK_PROCESSING && $task['statusCode'] !== TASK_FINISHED) + if ($task['statusCode'] !== Taskmanager::TASK_WAITING && $task['statusCode'] !== Taskmanager::TASK_PROCESSING && $task['statusCode'] !== Taskmanager::TASK_FINISHED) return true; return false; } @@ -163,7 +170,7 @@ class Taskmanager { if (!is_array($task) || !isset($task['statusCode']) || !isset($task['id'])) return false; - if ($task['statusCode'] !== TASK_WAITING && $task['statusCode'] !== TASK_PROCESSING) + if ($task['statusCode'] !== Taskmanager::TASK_WAITING && $task['statusCode'] !== Taskmanager::TASK_PROCESSING) return true; return false; } @@ -244,7 +251,3 @@ class Taskmanager } } - -foreach (array('TASK_FINISHED', 'TASK_ERROR', 'TASK_WAITING', 'NO_SUCH_TASK', 'NO_SUCH_INSTANCE', 'TASK_PROCESSING') as $i) { - define($i, $i); -} diff --git a/modules-available/sysconfig/addmodule_custommodule.inc.php b/modules-available/sysconfig/addmodule_custommodule.inc.php index 8c24a071..c234f765 100644 --- a/modules-available/sysconfig/addmodule_custommodule.inc.php +++ b/modules-available/sysconfig/addmodule_custommodule.inc.php @@ -62,7 +62,7 @@ class CustomModule_ProcessUpload extends AddModule_Base unlink($tempfile); $this->tmError(); } - if ($status['statusCode'] != TASK_FINISHED) { + if ($status['statusCode'] != Taskmanager::TASK_FINISHED) { unlink($tempfile); $this->taskError($status); } @@ -128,7 +128,7 @@ class CustomModule_CompressModule extends AddModule_Base if (!isset($status['statusCode'])) { $this->tmError(); } - if ($status['statusCode'] != TASK_FINISHED) { + if ($status['statusCode'] != Taskmanager::TASK_FINISHED) { $this->taskError($status); } // Seems ok, create entry diff --git a/modules-available/sysconfig/inc/configmodule.inc.php b/modules-available/sysconfig/inc/configmodule.inc.php index 2cee37a9..b6db9c4f 100644 --- a/modules-available/sysconfig/inc/configmodule.inc.php +++ b/modules-available/sysconfig/inc/configmodule.inc.php @@ -354,7 +354,7 @@ abstract class ConfigModule // Wait for generation if requested if ($timeoutMs > 0 && isset($ret['id']) && !Taskmanager::isFinished($ret)) $ret = Taskmanager::waitComplete($ret, $timeoutMs); - if ($ret === true || (isset($ret['statusCode']) && $ret['statusCode'] === TASK_FINISHED)) { + if ($ret === true || (isset($ret['statusCode']) && $ret['statusCode'] === Taskmanager::TASK_FINISHED)) { // Already Finished if (file_exists($this->moduleArchive) && !file_exists($tmpTgz)) $tmpTgz = false; // If generateInternal succeeded and there's no tmpTgz, it means the file didn't have to be updated diff --git a/modules-available/sysconfig/inc/configtgz.inc.php b/modules-available/sysconfig/inc/configtgz.inc.php index 5b459a2e..7b042cdb 100644 --- a/modules-available/sysconfig/inc/configtgz.inc.php +++ b/modules-available/sysconfig/inc/configtgz.inc.php @@ -112,7 +112,7 @@ class ConfigTgz // Wait for completion if ($timeoutMs > 0 && !Taskmanager::isFailed($task) && !Taskmanager::isFinished($task)) $task = Taskmanager::waitComplete($task, $timeoutMs); - if ($task === true || (isset($task['statusCode']) && $task['statusCode'] === TASK_FINISHED)) { + if ($task === true || (isset($task['statusCode']) && $task['statusCode'] === Taskmanager::TASK_FINISHED)) { // Success! $this->markUpdated(); return true; diff --git a/modules-available/sysconfig/page.inc.php b/modules-available/sysconfig/page.inc.php index 8d1799af..515d432c 100644 --- a/modules-available/sysconfig/page.inc.php +++ b/modules-available/sysconfig/page.inc.php @@ -425,12 +425,12 @@ class Page_SysConfig extends Page $task = Taskmanager::submit('DeleteFile', array( 'file' => $row['filepath'] )); - if (isset($task['statusCode']) && $task['statusCode'] === TASK_WAITING) { + if (isset($task['statusCode']) && $task['statusCode'] === Taskmanager::TASK_WAITING) { $task = Taskmanager::waitComplete($task['id']); } - if (!isset($task['statusCode']) || $task['statusCode'] === TASK_ERROR) { + if (!isset($task['statusCode']) || $task['statusCode'] === Taskmanager::TASK_ERROR) { Message::addWarning('main.task-error', $task['data']['error']); - } elseif ($task['statusCode'] === TASK_FINISHED) { + } elseif ($task['statusCode'] === Taskmanager::TASK_FINISHED) { Message::addSuccess('module-deleted', $row['title']); } Database::exec("DELETE FROM configtgz_module WHERE moduleid = :moduleid LIMIT 1", array('moduleid' => $moduleid)); -- cgit v1.2.3-55-g7522