summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2014-12-02 19:22:48 +0100
committerSimon Rettberg2014-12-02 19:22:48 +0100
commitba2a49e9875eda489385e370bb9f2259779caa7b (patch)
tree2654d7b4a6bf99d584e146f7708c75a5b8beaeac
parentFix wrong event type when displaying event log (diff)
downloadslx-admin-ba2a49e9875eda489385e370bb9f2259779caa7b.tar.gz
slx-admin-ba2a49e9875eda489385e370bb9f2259779caa7b.tar.xz
slx-admin-ba2a49e9875eda489385e370bb9f2259779caa7b.zip
Tweaks and fixes
-rw-r--r--apis/taskmanager.inc.php14
-rw-r--r--inc/property.inc.php3
-rw-r--r--inc/taskmanager.inc.php3
-rw-r--r--inc/taskmanagercallback.inc.php56
-rw-r--r--inc/trigger.inc.php48
-rw-r--r--lang/de/templates/baseconfig/_page.json1
-rw-r--r--lang/en/templates/baseconfig/_page.json1
-rw-r--r--lang/pt/templates/baseconfig/_page.json1
-rw-r--r--modules/backup.inc.php3
-rw-r--r--modules/eventlog.inc.php2
-rw-r--r--modules/serversetup.inc.php8
-rw-r--r--templates/backup/restore.html6
-rw-r--r--templates/baseconfig/_page.html2
-rw-r--r--templates/serversetup/ipxe.html2
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 :)
@@ -32,6 +32,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.
*/
public static function ldadpStartup($task)
@@ -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);
});
}
</script>
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}}}
</div>
<div class="col-md-2">
- <a class="btn btn-default" data-toggle="modal" data-target="#help-{{setting}}">{{lang_help}}</a>
+ <a class="btn btn-default" data-toggle="modal" data-target="#help-{{setting}}"><span class="glyphicon glyphicon-question-sign"></span></a>
</div>
</div>
</div>
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 @@
<div class="form-group">
<strong>{{lang_masterPassword}}</strong>
<div class="form-narrow">
- <input type="text" class="form-control" name="masterpassword" value="{{masterpassword}}">
+ <input type="text" class="form-control" name="masterpassword" value="{{masterpasswordclear}}">
</div>
<i>{{lang_masterPasswordHelp}}</i>
</div>