diff options
author | Simon Rettberg | 2020-07-07 16:36:46 +0200 |
---|---|---|
committer | Simon Rettberg | 2020-07-07 16:36:46 +0200 |
commit | d635a52fd965519eecb717ea5b953a5f12ef9b88 (patch) | |
tree | 621d70b385d35409ff5a9f93edbf42ba39ad584f /modules-available/systemstatus/page.inc.php | |
parent | [systemstatus] Add dnbd3-master-proxy to service status (diff) | |
download | slx-admin-d635a52fd965519eecb717ea5b953a5f12ef9b88.tar.gz slx-admin-d635a52fd965519eecb717ea5b953a5f12ef9b88.tar.xz slx-admin-d635a52fd965519eecb717ea5b953a5f12ef9b88.zip |
[systemstatus/sysconfig] Manage LDADP via systemd
Finally got rid of our own little service manager. Status/restart
handling capabilities were added to the system status page.
TODO: Permissions for dnbd3, service (re)starting in general
Diffstat (limited to 'modules-available/systemstatus/page.inc.php')
-rw-r--r-- | modules-available/systemstatus/page.inc.php | 183 |
1 files changed, 107 insertions, 76 deletions
diff --git a/modules-available/systemstatus/page.inc.php b/modules-available/systemstatus/page.inc.php index 6d317b47..f94aa4d4 100644 --- a/modules-available/systemstatus/page.inc.php +++ b/modules-available/systemstatus/page.inc.php @@ -3,8 +3,6 @@ class Page_SystemStatus extends Page { - private $rebootTask = false; - protected function doPreprocess() { User::load(); @@ -14,27 +12,51 @@ class Page_SystemStatus extends Page Util::redirect('?do=Main'); } - if (Request::post('action') === 'reboot') { + $action = Request::post('action', false, 'string'); + if ($action === 'reboot') { User::assertPermission("serverreboot"); - $this->rebootTask = Taskmanager::submit('Reboot'); + $task = Taskmanager::submit('Reboot'); + if (Taskmanager::isTask($task)) { + Util::redirect('?do=systemstatus&taskid=' . $task['id']); + } + } elseif ($action === 'service-start' || $action === 'service-restart') { + $this->handleServiceAction(substr($action, 8)); + } + if (Request::isPost()) { + Util::redirect('?do=systemstatus'); } User::assertPermission('*'); } + private function handleServiceAction(string $action) + { + $service = Request::post('service', Request::REQUIRED, 'string'); + $task = Taskmanager::submit('Systemctl', ['operation' => $action, 'service' => $service]); + $extra = ''; + $cmp = preg_replace('/\.service$|@.*$/', '', $service); + if ($cmp === 'dmsd') { + $extra = '#id-DmsdLog_pane'; + } elseif ($cmp === 'ldadp') { + $extra = '#id-LdadpLog_pane'; + } elseif ($cmp === 'dnbd3-server') { + $extra = '#id-Dnbd3Log_pane'; + } + Util::redirect('?do=systemstatus&taskid=' . $task['id'] . '&taskname=' . urlencode($service) . $extra); + } + protected function doRender() { $data = array(); - if (is_array($this->rebootTask) && isset($this->rebootTask['id'])) { - $data['rebootTask'] = $this->rebootTask['id']; - } - $tabs = array('DmsdLog', 'Netstat', 'PsList', 'LdadpLog', 'LighttpdLog'); + $data['taskid'] = Request::get('taskid', '', 'string'); + $data['taskname'] = Request::get('taskname', 'Reboot', 'string'); + $tabs = array('DmsdLog', 'Netstat', 'PsList', 'LdadpLog', 'LighttpdLog', 'Dnbd3Log'); $data['tabs'] = array(); // Dictionary::translate('tab_DmsdLog') Dictionary::translate('tab_LdadpLog') Dictionary::translate('tab_Netstat') - // Dictionary::translate('tab_LighttpdLog') Dictionary::translate('tab_PsList') + // Dictionary::translate('tab_LighttpdLog') Dictionary::translate('tab_PsList') Dictionary::translate('tab_Dnbd3Log') foreach ($tabs as $tab) { $data['tabs'][] = array( 'type' => $tab, - 'name' => Dictionary::translate('tab_' . $tab), + 'name' => Dictionary::translate('tab_' . $tab, true), 'enabled' => User::hasPermission('tab.' . $tab), ); } @@ -238,10 +260,16 @@ class Page_SystemStatus extends Page 'task' => Taskmanager::submit('Systemctl', ['service' => $svc, 'operation' => 'is-active']) ); } - $tasks[] = array( - 'name' => 'LDAP/AD-Proxy', - 'task' => Trigger::ldadp() - ); + $ldapIds = $ldadp = false; + if (Module::isAvailable('sysconfig')) { + $ldapIds = ConfigModuleBaseLdap::getActiveModuleIds(); + if (!empty($ldapIds)) { + $ldadp = array( // No name - no display + 'task' => ConfigModuleBaseLdap::ldadp('check', $ldapIds) // TODO: Proper --check usage + ); + $tasks[] =& $ldadp; + } + } $deadline = time() + 10; do { $done = true; @@ -257,13 +285,40 @@ class Page_SystemStatus extends Page } while (!$done && time() < $deadline); foreach ($tasks as $task) { + if (!isset($task['name'])) + continue; $fail = Taskmanager::isFailed($task['task']); - $data['services'][] = array( + $entry = array( 'name' => $task['name'], + 'service' => $task['name'], 'fail' => $fail, - 'data' => isset($task['data']) ? $task['data'] : null, - 'unknown' => $task['task'] === false ); + if ($fail) { + if (!isset($task['task']['data'])) { + $entry['error'] = 'Taskmanager Error'; + } elseif (isset($task['task']['data']['messages'])) { + $entry['error'] = $task['task']['data']['messages']; + } + } + $data['services'][] = $entry; + } + if ($ldadp !== false) { + //error_log(print_r($ldadp, true)); + preg_match_all('/^ldadp@(\d+)\.service\s+(\S+)$/m', $ldadp['task']['data']['messages'], $out, PREG_SET_ORDER); + $instances = []; + foreach ($out as $instance) { + $instances[$instance[1]] = $instance[2]; + } + foreach ($ldapIds as $id) { + $status = $instances[$id] ?? 'failed'; + $fail = ($status !== 'running'); + $data['services'][] = [ + 'name' => 'LDAP/AD Proxy #' . $id, + 'service' => 'ldadp@' . $id, + 'fail' => $fail, + 'error' => $fail ? $status : false, + ]; + } } echo Render::parse('services', $data); @@ -271,35 +326,23 @@ class Page_SystemStatus extends Page protected function ajaxDmsdLog() { - User::assertPermission("tab.dmsdlog"); - $fh = @fopen('/var/log/dmsd.log', 'r'); - if ($fh === false) { - echo 'Error opening log file'; - return; - } - fseek($fh, -6000, SEEK_END); - $data = fread($fh, 6000); - @fclose($fh); - if ($data === false) { - echo 'Error reading from log file'; - return; - } - // If we could read less, try the .1 file too - $amount = 6000 - strlen($data); - if ($amount > 100) { - $fh = @fopen('/var/log/dmsd.log.1', 'r'); - if ($fh !== false) { - fseek($fh, -$amount, SEEK_END); - $data = fread($fh, $amount) . $data; - @fclose($fh); - } - } - if (strlen($data) < 5990) { - $start = 0; - } else { - $start = strpos($data, "\n") + 1; - } - echo '<pre>', htmlspecialchars(substr($data, $start), ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), '</pre>'; + $this->showJournal('dmsd.service', 'tab.dmsdlog'); + } + + protected function ajaxDnbd3Log() + { + $this->showJournal('dnbd3-server.service', 'tab.dnbd3log'); + } + + protected function showJournal($service, $permission) + { + User::assertPermission($permission); + $output = [ + 'name' => $service, + 'service' => $service, + 'task' => Taskmanager::submit('Systemctl', ['operation' => 'journal', 'service' => $service]), + ]; + echo Render::parse('ajax-journal', ['modules' => [$output]]); } protected function ajaxLighttpdLog() @@ -338,40 +381,28 @@ class Page_SystemStatus extends Page protected function ajaxLdadpLog() { User::assertPermission("tab.ldadplog"); - $haveSysconfig = Module::isAvailable('sysconfig'); - $files = glob('/var/log/ldadp/*.log', GLOB_NOSORT); - if ($files === false || empty($files)) echo('No logs found'); - $now = time(); - foreach ($files as $file) { - $mod = filemtime($file); - if ($now - $mod > 86400) continue; - // New enough - handle - preg_match(',/(\d+)\.log,', $file, $out); - $module = $haveSysconfig ? ConfigModule::get($out[1]) : false; + if (!Module::isAvailable('sysconfig')) { + die('SysConfig module not enabled'); + } + $ids = ConfigModuleBaseLdap::getActiveModuleIds(); + //error_log(print_r($ids, true)); + $output = []; + foreach ($ids as $id) { + $module = ConfigModule::get($id); if ($module === false) { - echo '<h4>Module ', $out[1], '</h4>'; - } else { - echo '<h4>Module ', htmlspecialchars($module->title()), '</h4>'; - } - $fh = @fopen($file, 'r'); - if ($fh === false) { - echo '<pre>Error opening log file</pre>'; - continue; - } - fseek($fh, -5000, SEEK_END); - $data = fread($fh, 5000); - @fclose($fh); - if ($data === false) { - echo '<pre>Error reading from log file</pre>'; - continue; - } - if (strlen($data) < 4990) { - $start = 0; + $name = "#$id"; } else { - $start = strpos($data, "\n") + 1; + $name = $module->title(); } - echo '<pre>', htmlspecialchars(substr($data, $start), ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), '</pre>'; + $service = "ldadp@{$id}.service"; + $output[] = [ + 'name' => $name, + 'service' => $service, + 'task' => Taskmanager::submit('Systemctl', ['operation' => 'journal', 'service' => $service]), + ]; } + //error_log(print_r($output, true)); + echo Render::parse('ajax-journal', ['modules' => $output]); } protected function ajaxNetstat() |