From ba2a49e9875eda489385e370bb9f2259779caa7b Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 2 Dec 2014 19:22:48 +0100 Subject: Tweaks and fixes --- apis/taskmanager.inc.php | 14 ++++++++- inc/property.inc.php | 3 +- inc/taskmanager.inc.php | 3 +- inc/taskmanagercallback.inc.php | 56 ++++++++++++++++++++++++++++++++- inc/trigger.inc.php | 48 ++++++++++++++-------------- lang/de/templates/baseconfig/_page.json | 1 - lang/en/templates/baseconfig/_page.json | 1 - lang/pt/templates/baseconfig/_page.json | 1 - modules/backup.inc.php | 3 +- modules/eventlog.inc.php | 2 +- modules/serversetup.inc.php | 8 +++-- templates/backup/restore.html | 6 +++- templates/baseconfig/_page.html | 2 +- templates/serversetup/ipxe.html | 2 +- 14 files changed, 111 insertions(+), 39 deletions(-) diff --git a/apis/taskmanager.inc.php b/apis/taskmanager.inc.php index 8365aac7..102352d2 100644 --- a/apis/taskmanager.inc.php +++ b/apis/taskmanager.inc.php @@ -7,15 +7,27 @@ if (!is_array($_POST['ids'])) { die('{"error" : "No Task ids given in POST data."}'); } +$callbacks = false; + $return = array(); foreach ($_POST['ids'] as $id) { + // Get task status $status = Taskmanager::status($id); if ($status === false) { $return[] = array('id' => $id, 'error' => 'No connection to TaskManager'); continue; } $return[] = $status; - if (!isset($status['statusCode']) || ($status['statusCode'] !== TASK_WAITING && $status['statusCode'] !== TASK_PROCESSING)) { + // Handle callbacks (if any) + if ($callbacks === false) + $callbacks = TaskmanagerCallback::getPendingCallbacks(); + if (isset($callbacks[$id])) { + foreach ($callbacks[$id] as $callback) { + TaskmanagerCallback::handleCallback($callback, $status); + } + } + // Release task if done + if (Taskmanager::isFailed($status) || Taskmanager::isFinished($status)) { Taskmanager::release($id); } } diff --git a/inc/property.inc.php b/inc/property.inc.php index dd70b8d4..6a639dd2 100644 --- a/inc/property.inc.php +++ b/inc/property.inc.php @@ -57,10 +57,11 @@ class Property return self::get('server-ip', 'none'); } - public static function setServerIp($value) + public static function setServerIp($value, $automatic = false) { if ($value === self::getServerIp()) return false; + EventLog::info('Server IP changed from ' . self::getServerIp() . ' to ' . $value . ($automatic ? ' (auto detected)' : '')); self::set('server-ip', $value); Event::serverIpChanged(); } diff --git a/inc/taskmanager.inc.php b/inc/taskmanager.inc.php index dd16c62d..05db5b5d 100644 --- a/inc/taskmanager.inc.php +++ b/inc/taskmanager.inc.php @@ -128,7 +128,8 @@ class Taskmanager } /** - * Check whether the given task can be considered failed. + * Check whether the given task can be considered failed. This + * includes that the task id is invalid, etc. * * @param array $task struct representing task, obtained by ::status * @return boolean true if task failed, false if finished successfully or still waiting/running diff --git a/inc/taskmanagercallback.inc.php b/inc/taskmanagercallback.inc.php index 3ef4745c..951a1de3 100644 --- a/inc/taskmanagercallback.inc.php +++ b/inc/taskmanagercallback.inc.php @@ -5,7 +5,7 @@ */ class TaskmanagerCallback { - + /** * Add a callback for given task id. This is the only exception in this class, * as this is not a callback, but a function to define one :) @@ -31,6 +31,51 @@ class TaskmanagerCallback )); } + /** + * Get all pending callbacks from the callback table. + * + * @return array list of array(taskid => list of callbacks) + */ + public static function getPendingCallbacks() + { + $retval = array(); + $res = Database::simpleQuery("SELECT taskid, cbfunction FROM callback"); + while ($row = $res->fetch(PDO::FETCH_ASSOC)) { + $retval[$row['taskid']][] = $row; + } + return $retval; + } + + /** + * Handle the given callback. Will delete the entry from the callback + * table if appropriate. + * + * @param array $callback entry from the callback table (cbfunction + taskid) + * @param array $status status of the task as returned by the taskmanager. If NULL it will be queried. + */ + public static function handleCallback($callback, $status = NULL) + { + if (is_null($status)) + $status = Taskmanager::status($callback['taskid']); + if ($status === false) // No reply from Taskmanager, retry later + return; + if (Taskmanager::isFailed($status) || Taskmanager::isFinished($status)) { + $del = Database::exec("DELETE FROM callback WHERE taskid = :task AND cbfunction = :cb LIMIT 1", array('task' => $callback['taskid'], 'cb' => $callback['cbfunction'])); + if ($del === 0) // No entry deleted, so someone else must have deleted it - race condition, do nothing + return; + } + if (Taskmanager::isFinished($status)) { + $func = array('TaskmanagerCallback', preg_replace('/\W/', '', $callback['cbfunction'])); + if (!call_user_func_array('method_exists', $func)) { + Eventlog::warning("handleCallback: Callback {$callback['cbfunction']} doesn't exist."); + } else { + call_user_func($func, $status); + } + } + } + + // #################################################################### + /** * Result of trying to (re)launch ldadp. */ @@ -40,4 +85,13 @@ class TaskmanagerCallback EventLog::warning("Could not start/stop LDAP-AD-Proxy instances", $task['data']['messages']); } + public static function dbRestored($task) + { + error_log("dbRestored."); + if (Taskmanager::isFinished($task) && !Taskmanager::isFailed($task)) { + error_log("LOGGING."); + EventLog::info('Configuration backup restored.'); + } + } + } diff --git a/inc/trigger.inc.php b/inc/trigger.inc.php index 790323b5..a5a149c8 100644 --- a/inc/trigger.inc.php +++ b/inc/trigger.inc.php @@ -65,11 +65,11 @@ class Trigger } } if ($publicCandidate !== 'none' && $publicCandidate !== 'many') { - Property::setServerIp($publicCandidate); + Property::setServerIp($publicCandidate, true); return true; } if ($privateCandidate !== 'none' && $privateCandidate !== 'many') { - Property::setServerIp($privateCandidate); + Property::setServerIp($privateCandidate, true); return true; } return false; @@ -109,26 +109,29 @@ class Trigger * To be called if the server ip changes, as it's embedded in the AD module configs. * This will then recreate all AD tgz modules. */ - public static function rebuildAdModules() + public static function rebuildAdModules($parent = NULL) { - $task = Taskmanager::submit('LdadpLauncher', array('ids' => array())); // Stop all running instances + $task = Taskmanager::submit('LdadpLauncher', array( + 'parentTask' => $parent, + 'failOnParentFail' => false, + 'ids' => array() + )); // Stop all running instances $ads = ConfigModule::getAdConfigs(); if (empty($ads)) - return; + return false; - $parent = isset($task['id']) ? $task['id'] : NULL; + if (isset($task['id'])) + $parent = $task['id']; foreach ($ads as $ad) { $ad['parentTask'] = $parent; $ad['failOnParentFail'] = false; + $ad['proxyip'] = Property::getServerIp(); $task = Taskmanager::submit('CreateAdConfig', $ad); if (isset($task['id'])) $parent = $task['id']; } - if (Taskmanager::waitComplete($parent, 2000) === false) { - EventLog::warning('Rebuilding LDAP-AD-Proxy config failed. AD Auth might not work properly.'); - sleep(1); - } - Trigger::ldadp(); + Trigger::ldadp($parent); + return $parent; } /** @@ -157,23 +160,20 @@ class Trigger } /** - * Check and process all callbacks + * Check and process all callbacks. */ public static function checkCallbacks() { - $res = Database::simpleQuery("SELECT taskid, cbfunction FROM callback"); - while ($row = $res->fetch(PDO::FETCH_ASSOC)) { - $status = Taskmanager::status($row['taskid']); - if (Taskmanager::isFailed($status) || Taskmanager::isFinished($status)) - Database::exec("DELETE FROM callback WHERE taskid = :task AND cbfunction = :cb LIMIT 1", array('task' => $row['taskid'], 'cb' => $row['cbfunction'])); - if (Taskmanager::isFinished($status)) { - $func = array('TaskmanagerCallback', preg_replace('/\W/', '', $row['cbfunction'])); - if (!call_user_func_array('method_exists', $func)) { - Eventlog::warning("Callback {$row['cbfunction']} doesn't exist."); - } else { - call_user_func($func, $status); - } + $callbackList = TaskmanagerCallback::getPendingCallbacks(); + foreach ($callbackList as $taskid => $callbacks) { + $status = Taskmanager::status($taskid); + if ($status === false) + continue; + foreach ($callbacks as $callback) { + TaskmanagerCallback::handleCallback($callback, $status); } + if (Taskmanager::isFailed($status) || Taskmanager::isFinished($status)) + Taskmanager::release($status); } } diff --git a/lang/de/templates/baseconfig/_page.json b/lang/de/templates/baseconfig/_page.json index fe62ab86..ec3e4c33 100644 --- a/lang/de/templates/baseconfig/_page.json +++ b/lang/de/templates/baseconfig/_page.json @@ -1,7 +1,6 @@ { "lang_basicConfiguration": "Basiskonfiguration", "lang_close": "Schlie\u00dfen", - "lang_help": "Hilfe", "lang_reset": "Zur\u00fccksetzen", "lang_save": "Speichern" } \ No newline at end of file diff --git a/lang/en/templates/baseconfig/_page.json b/lang/en/templates/baseconfig/_page.json index dfd235b5..31a2fd3a 100644 --- a/lang/en/templates/baseconfig/_page.json +++ b/lang/en/templates/baseconfig/_page.json @@ -1,7 +1,6 @@ { "lang_basicConfiguration": "Basic Configuration", "lang_close": "Close", - "lang_help": "Help", "lang_reset": "Reset", "lang_save": "Save" } \ No newline at end of file diff --git a/lang/pt/templates/baseconfig/_page.json b/lang/pt/templates/baseconfig/_page.json index fc1e8508..988c3b17 100644 --- a/lang/pt/templates/baseconfig/_page.json +++ b/lang/pt/templates/baseconfig/_page.json @@ -1,7 +1,6 @@ { "lang_basicConfiguration": "Configura\u00e7\u00e3o B\u00e1sica", "lang_close": "Fechar", - "lang_help": "Ajuda", "lang_reset": "Limpar", "lang_save": "Salvar" } \ No newline at end of file diff --git a/modules/backup.inc.php b/modules/backup.inc.php index 61964d47..2a44997a 100644 --- a/modules/backup.inc.php +++ b/modules/backup.inc.php @@ -96,6 +96,7 @@ class Page_Backup extends Page $this->templateData['mountid'] = $task['id']; $parent = $task['id']; } + EventLog::info('Creating backup, v' . Database::getExpectedSchemaVersion() . ' on ' . Property::getServerIp()); // Finally run backup $task = Taskmanager::submit('BackupRestore', array( 'mode' => 'restore', @@ -106,8 +107,8 @@ class Page_Backup extends Page if (isset($task['id'])) { $this->templateData['restoreid'] = $task['id']; $parent = $task['id']; + TaskmanagerCallback::addCallback($task, 'dbRestored'); } - // TODO: Trigger::rebuildAdModules(); // Wait a bit $task = Taskmanager::submit('SleepTask', array( 'seconds' => 3, diff --git a/modules/eventlog.inc.php b/modules/eventlog.inc.php index f67bc8a7..a070f5a2 100644 --- a/modules/eventlog.inc.php +++ b/modules/eventlog.inc.php @@ -57,7 +57,7 @@ class Page_EventLog extends Page { switch ($type) { case 'info': - return 'green'; + return ''; case 'warning': return 'orange'; case 'failure': diff --git a/modules/serversetup.inc.php b/modules/serversetup.inc.php index 93d373c1..37868308 100644 --- a/modules/serversetup.inc.php +++ b/modules/serversetup.inc.php @@ -125,9 +125,11 @@ class Page_ServerSetup extends Page $this->currentMenu['defaultentry'] = Request::post('defaultentry', 'net'); $this->currentMenu['timeout'] = $timeout; $this->currentMenu['custom'] = Request::post('custom', ''); - $this->currentMenu['masterpassword'] = Request::post('masterpassword', ''); - if (!preg_match('/^\$[1456]\$.+\$/', $this->currentMenu['masterpassword'])) - $this->currentMenu['masterpassword'] = Crypto::hash6($this->currentMenu['masterpassword']); + $this->currentMenu['masterpasswordclear'] = Request::post('masterpassword', ''); + if (empty($this->currentMenu['masterpasswordclear'])) + $this->currentMenu['masterpassword'] = 'invalid'; + else + $this->currentMenu['masterpassword'] = Crypto::hash6($this->currentMenu['masterpasswordclear']); Property::setBootMenu($this->currentMenu); $id = Trigger::ipxe(); Util::redirect('?do=ServerSetup&taskid=' . $id); diff --git a/templates/backup/restore.html b/templates/backup/restore.html index 2e33beb3..e613bdf4 100644 --- a/templates/backup/restore.html +++ b/templates/backup/restore.html @@ -51,8 +51,12 @@ $.ajax({url: "index.php?do=Main", timeout: 3000}).success(function(data, textStatus, jqXHR) { if (textStatus !== "success" && textStatus !== "notmodified") return; + if (data.indexOf('Connecting to the local database failed') > -1) + return; clearTimeout(slxTimeoutId); - window.location.replace("index.php?do=Main&message[]=success%7Crestore-done"); + setTimeout(function() { + window.location.replace("index.php?do=Main&message[]=success%7Crestore-done"); + }, 2000); }); } diff --git a/templates/baseconfig/_page.html b/templates/baseconfig/_page.html index f72a25f4..054e0a6c 100644 --- a/templates/baseconfig/_page.html +++ b/templates/baseconfig/_page.html @@ -15,7 +15,7 @@ {{{item}}}
- {{lang_help}} +
diff --git a/templates/serversetup/ipxe.html b/templates/serversetup/ipxe.html index ec8ddc2f..3d3d9b1d 100644 --- a/templates/serversetup/ipxe.html +++ b/templates/serversetup/ipxe.html @@ -29,7 +29,7 @@
{{lang_masterPassword}}
- +
{{lang_masterPasswordHelp}}
-- cgit v1.2.3-55-g7522