diff options
Diffstat (limited to 'modules-available/sysconfig/inc/configtgz.inc.php')
-rw-r--r-- | modules-available/sysconfig/inc/configtgz.inc.php | 62 |
1 files changed, 44 insertions, 18 deletions
diff --git a/modules-available/sysconfig/inc/configtgz.inc.php b/modules-available/sysconfig/inc/configtgz.inc.php index c1df2c93..ff9e306d 100644 --- a/modules-available/sysconfig/inc/configtgz.inc.php +++ b/modules-available/sysconfig/inc/configtgz.inc.php @@ -88,9 +88,7 @@ class ConfigTgz * * @param bool $deleteOnError * @param int $timeoutMs - * @return string - OK (success) - * - OUTDATED (updating failed, but old version still exists) - * - MISSING (failed and no old version available) + * @return string|bool true=success, false=error, string=taskid, still running */ public function generate($deleteOnError = false, $timeoutMs = 0) { @@ -100,18 +98,20 @@ class ConfigTgz // Get all config modules for system config foreach ($this->modules as $module) { if (!empty($module['filepath']) && file_exists($module['filepath'])) { - $files[] = $module['filepath']; + // Dupcheck only for custom modules for now + $files[$module['filepath']] = ($module['moduletype'] === 'CustomModule'); } } $task = self::recompress($files, $this->file); // Wait for completion - if ($timeoutMs > 0 && !Taskmanager::isFailed($task) && !Taskmanager::isFinished($task)) + if ($timeoutMs > 0 && !Taskmanager::isFailed($task) && !Taskmanager::isFinished($task)) { $task = Taskmanager::waitComplete($task, $timeoutMs); - if ($task === true || (isset($task['statusCode']) && $task['statusCode'] === Taskmanager::TASK_FINISHED)) { + } + if (Taskmanager::isFinished($task)) { // Success! - $this->markUpdated(); + $this->markUpdated($task); return true; } if (!is_array($task) || !isset($task['id']) || Taskmanager::isFailed($task)) { @@ -154,12 +154,37 @@ class ConfigTgz return $this->mark('OUTDATED'); } - private function markUpdated() + private function markUpdated($task) { if ($this->configId === 0) Util::traceError('ConfigTgz::markUpdated called with invalid config id!'); - if ($this->areAllModulesUpToDate()) - return $this->mark('OK'); + if ($this->areAllModulesUpToDate()) { + if (empty($task['data']['warnings'])) { + $warnings = ''; + } else { + // There have been warnings while generating the combined archive + // Most likely duplicate file entries. + // Get mapping of moduleid to module name for prettier log display + $res = Database::simpleQuery('SELECT moduleid, title FROM configtgz_module'); + $mods = []; + while ($row = $res->fetch(PDO::FETCH_ASSOC)) { + $mods[$row['moduleid']] = $row['title']; + } + // Now extract module id from filename and if applicable, replace filename by module name + $warnings = preg_replace_callback('#/opt/openslx/configs/modules/(\w+)_id-(\d+)__.*$#m', function ($m) use ($mods) { + if (!isset($mods[$m[2]])) + return $m[0]; + return $mods[$m[2]] . ' (' . $m[1] . '#' . $m[2] . ')'; + }, $task['data']['warnings']); + } + Database::exec("UPDATE configtgz SET status = :status, warnings = :warnings + WHERE configid = :configid LIMIT 1", [ + 'configid' => $this->configId, + 'status' => 'OK', + 'warnings' => $warnings, + ]); + return 'OK'; + } return $this->mark('OUTDATED'); } @@ -174,10 +199,10 @@ class ConfigTgz private function mark($status) { - Database::exec("UPDATE configtgz SET status = :status WHERE configid = :configid LIMIT 1", array( + Database::exec("UPDATE configtgz SET status = :status WHERE configid = :configid LIMIT 1", [ 'configid' => $this->configId, - 'status' => $status - )); + 'status' => $status, + ]); return $status; } @@ -186,7 +211,7 @@ class ConfigTgz */ /** - * @param string[] $files source files to include + * @param bool[] $files source files to include key = file, value = dupCheck * @param string $destFile where to store final result * @return false|array taskmanager task */ @@ -200,7 +225,7 @@ class ConfigTgz foreach (Hook::load('config-tgz') as $hook) { $file = $handler($hook); if ($file !== false) { - $files[] = $file; + $files[$file] = true; } } @@ -356,9 +381,10 @@ class ConfigTgz /** * (Re)generating a config tgz succeeded. Update db entry. * + * @param array $task the task object * @param array $args contains 'configid' and optionally 'deleteOnError' */ - public static function generateSucceeded($args) + public static function generateSucceeded($task, $args) { if (!isset($args['configid']) || !is_numeric($args['configid'])) { EventLog::warning('Ignoring generateSucceeded event as it has no configid assigned.'); @@ -369,7 +395,7 @@ class ConfigTgz EventLog::warning('generateSucceeded callback for config id ' . $args['configid'] . ', but no instance could be generated.'); return; } - $config->markUpdated(); + $config->markUpdated($task); } - + } |