summaryrefslogtreecommitdiffstats
path: root/modules-available/systemstatus/page.inc.php
diff options
context:
space:
mode:
authorSimon Rettberg2020-07-07 16:36:46 +0200
committerSimon Rettberg2020-07-07 16:36:46 +0200
commitd635a52fd965519eecb717ea5b953a5f12ef9b88 (patch)
tree621d70b385d35409ff5a9f93edbf42ba39ad584f /modules-available/systemstatus/page.inc.php
parent[systemstatus] Add dnbd3-master-proxy to service status (diff)
downloadslx-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.php183
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()