From aeb96b5b7019b2f0bc40ed699dc2877a8729a06b Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Thu, 29 Mar 2018 10:47:58 +0200 Subject: [dnbd3] Fix dnbd3 reboot status feedback Closes #3276 --- modules-available/dnbd3/page.inc.php | 37 +++++++++++++++------- .../dnbd3/templates/page-serverlist.html | 24 ++++++++++---- 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/modules-available/dnbd3/page.inc.php b/modules-available/dnbd3/page.inc.php index 6e4f8885..f30abfe1 100644 --- a/modules-available/dnbd3/page.inc.php +++ b/modules-available/dnbd3/page.inc.php @@ -490,24 +490,37 @@ class Page_Dnbd3 extends Page if (!isset($server['machineuuid'])) { die('Not automatic server.'); } - $this->assertPermission($server); - if (!Module::isAvailable('rebootcontrol')) { - die('No rebootcontrol'); - } $uuid = $server['machineuuid']; - $task = RebootControl::reboot([ $uuid ]); + $task = Request::any('taskid', false, 'string'); if ($task === false) { - die('Taskmanager unreachable'); + $this->assertPermission($server); + if (!Module::isAvailable('rebootcontrol')) { + die('No rebootcontrol'); + } + $task = RebootControl::reboot([$uuid]); + if ($task === false) { + die('Taskmanager unreachable'); + } } - $task = Taskmanager::waitComplete($task, 2000); - if (is_array($task) && isset($task['data']) && isset($task['data']['clientStatus']) && isset($task['data']['clientStatus'][$uuid])) { - $status = $task['data']['clientStatus'][$uuid]; + $task = Taskmanager::waitComplete($task, 1000); + if (is_array($task) && isset($task['data']['clientStatus'][$uuid])) { + $status = [ + 'rebootStatus' => $task['data']['clientStatus'][$uuid], + 'taskStatus' => $task['statusCode'], + 'taskId' => $task['id'], + ]; if (!empty($task['data']['error'])) { - $status .= "\n --- \n" . $task['data']['error']; + $status['error'] = $task['data']['error']; } - die($status); + } else { + $status = [ + 'rebootStatus' => 'FAILURE', + 'taskStatus' => 'FAILURE', + 'taskId' => $task['id'], + ]; } - die('Unknown :-('); + Header('Content-Type: application/json; charset=utf-8'); + die(json_encode($status)); } } diff --git a/modules-available/dnbd3/templates/page-serverlist.html b/modules-available/dnbd3/templates/page-serverlist.html index a51e9723..65e4d6ea 100644 --- a/modules-available/dnbd3/templates/page-serverlist.html +++ b/modules-available/dnbd3/templates/page-serverlist.html @@ -389,20 +389,32 @@ document.addEventListener('DOMContentLoaded', function () { } $t.html(''); var sid = rebootServerId; + var taskId = false; + var lastText; var query = function() { + data = {"token": TOKEN, "action": "reboot", "server": sid}; + if (taskId !== false) data['taskid'] = taskId; $.ajax({ - "data": {"token": TOKEN, "action": "reboot", "server": sid}, + "data": data, "method": "POST", - "dataType": "text", + "dataType": "json", "url": "?do=dnbd3" }).done(function (data) { - $t.text(data); - if (data.indexOf('REBOOTING') !== -1 || data.indexOf('CONNECTING') !== -1) { + if (!data || !data.taskId) return; + if (taskId === false) taskId = data.taskId; + if (data.error) data.rebootStatus += ' (' + data.error + ')'; + if (data.rebootStatus !== lastText) { + $t.empty().text(data.rebootStatus); + } + if (data.taskStatus === 'TASK_PROCESSING' || data.taskStatus === 'TASK_WAITING') { setTimeout(query, 5000); - $t.append($('')); + if (data.rebootStatus !== lastText) { + $t.append($('')); + } } + lastText = data.rebootStatus; }).fail(function () { - $.text('Failed'); + $t.text('Failed'); }); }; query(); -- cgit v1.2.3-55-g7522