diff options
author | Simon Rettberg | 2021-06-25 16:21:17 +0200 |
---|---|---|
committer | Simon Rettberg | 2021-06-25 16:21:17 +0200 |
commit | 32f0677dbca9e3347b931c1d0105eb37aa57e90d (patch) | |
tree | ddad4562e7ee8439a24e2462d44614692bb71d14 /modules-available/eventlog/pages/transports.inc.php | |
parent | Update .idea (diff) | |
download | slx-admin-32f0677dbca9e3347b931c1d0105eb37aa57e90d.tar.gz slx-admin-32f0677dbca9e3347b931c1d0105eb37aa57e90d.tar.xz slx-admin-32f0677dbca9e3347b931c1d0105eb37aa57e90d.zip |
[eventlog] Add event filtering and notification system
Diffstat (limited to 'modules-available/eventlog/pages/transports.inc.php')
-rw-r--r-- | modules-available/eventlog/pages/transports.inc.php | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/modules-available/eventlog/pages/transports.inc.php b/modules-available/eventlog/pages/transports.inc.php new file mode 100644 index 00000000..b72f36f9 --- /dev/null +++ b/modules-available/eventlog/pages/transports.inc.php @@ -0,0 +1,176 @@ +<?php + +class SubPage +{ + + public static function doPreprocess() + { + if (Request::isPost()) { + $action = Request::post('action'); + if ($action === 'save-transport') { + self::saveTransport(); + } elseif ($action === 'delete-transport') { + self::deleteTransport(); + } else { + Message::addError('main.invalid-action', $action); + } + Util::redirect('?do=eventlog&show=transports'); + } + } + + private static function saveTransport() + { + User::assertPermission('filter.transports.edit'); + $id = Request::post('id', Request::REQUIRED, 'int'); + $rules = Request::post('rules', [], 'array'); + static $types = [ + 'type' => [Request::REQUIRED, 'string', ['mail', 'irc', 'http', 'group']], + 'mail-config-id' => [0, 'int'], + 'mail-users' => [[], 'int[]'], + 'mail-extra-mails' => ['', 'string'], + 'irc-server' => ['', 'string'], + 'irc-server-password' => ['', 'string'], + 'irc-target' => ['', 'string'], + 'irc-nickname' => ['', 'string'], + 'http-uri' => ['', 'string'], + 'http-method' => ['', 'string', ['GET', 'POST']], + 'http-post-field' => ['', 'string'], + 'http-post-format' => ['', 'string', ['FORM', 'JSON', 'JSON_AUTO']], + 'group-list' => [[], 'int[]'], + ]; + $data = []; + foreach ($types as $key => $def) { + if (substr($def[1], -1) === ']') { + $type = substr($def[1], 0, -2); + $array = true; + } else { + $type = $def[1]; + $array = false; + } + if ($array) { + $value = Request::post($key, [], 'array'); + foreach ($value as &$v) { + settype($v, $type); + if (isset($def[2]) && !in_array($v, $def[2])) { + Message::addWarning('main.value-invalid', $key, $v); + } + } + } else { + $value = Request::post($key, $def[0], $type); + if (isset($def[2]) && !in_array($value, $def[2])) { + Message::addWarning('main.value-invalid', $key, $value); + } + } + $data[$key] = $value; + } + //die(print_r($data)); + $params = [ + 'title' => Request::post('title', 'Backend', 'string'), + 'description' => Request::post('description', '', 'string'), + 'data' => json_encode($data), + ]; + if ($id === 0) { + $res = Database::exec("INSERT INTO notification_backend (title, description, data) + VALUES (:title, :description, :data)", $params); + $id = Database::lastInsertId(); + } else { + $params['transportid'] = $id; + $res = Database::exec("UPDATE notification_backend + SET title = :title, description = :description, data = :data + WHERE transportid = :transportid", $params); + } + if (empty($rules)) { + Database::exec("DELETE FROM notification_rule_x_transport WHERE transportid = :id", ['id' => $id]); + } else { + Database::exec("DELETE FROM notification_rule_x_transport + WHERE transportid = :id AND ruleid NOT IN (:rules)", + ['id' => $id, 'rules' => $rules]); + Database::exec("INSERT IGNORE INTO notification_rule_x_transport (ruleid, transportid) + VALUES :list", ['list' => array_map(function ($i) use ($id) { return [$i, $id]; }, $rules)]); + } + if ($res > 0) { + Message::addSuccess('transport-saved', $id); + } + Util::redirect('?do=eventlog&show=transports§ion=transports'); + } + + private static function deleteTransport() + { + User::assertPermission('filter.transports.edit'); + $id = Request::post('id', Request::REQUIRED, 'int'); + Database::exec("DELETE FROM notification_backend WHERE transportid = :id", ['id' => $id]); + } + + /* + * + */ + + public static function doRender() + { + $id = Request::get('id', null, 'int'); + if ($id !== null) { + self::showTransportEditor($id); + } else { + // LIST + $data = []; + $data['transports'] = []; + foreach (Database::queryAll('SELECT transportid, title, data, + Count(ruleid) AS useCount + FROM notification_backend nb + LEFT JOIN notification_rule_x_transport sfxb USING (transportid) + GROUP BY transportid, title + ORDER BY title, transportid') as $transport) { + $json = json_decode($transport['data'], true); + $transport['type'] = $json['type']; + $transport['details'] = NotificationTransport::getInstance($json); + $data['transports'][] = $transport; + } + Render::addTemplate('page-filters-transports', $data); + } + } + + /** + * @param int $id Transport to edit, 0 to create a new one + */ + private static function showTransportEditor(int $id) + { + if ($id !== 0) { + $entry = Database::queryFirst('SELECT transportid, title, description, data + FROM notification_backend + WHERE transportid = :id', ['id' => $id]); + if ($entry === false) { + Message::addError('invalid-transport-id', $id); + Util::redirect('?do=eventlog&show=transports§ion=transports'); + } + $entry['data'] = json_decode($entry['data'], true); + $entry[($entry['data']['type'] ?? '') . '_selected'] = 'selected'; + $entry[($entry['data']['http-method'] ?? '') . '_selected'] = 'selected'; + $entry[($entry['data']['http-post-format'] ?? '') . '_selected'] = 'selected'; + } else { + $entry = ['transportid' => $id]; + } + $entry['users'] = []; + foreach (Database::queryAll("SELECT userid, login, fullname, email FROM user ORDER BY login") as $row) { + $row['disabled'] = strpos($row['email'], '@') ? '' : 'disabled'; + $row['selected'] = in_array($row['userid'], $entry['data']['mail-users'] ?? []) ? 'selected' : ''; + $entry['users'][] = $row; + } + $entry['mailconfigs'] = []; + foreach (Database::queryAll("SELECT configid, host, port, senderaddress FROM mail_config") as $row) { + $row['selected'] = $row['configid'] == $entry['data']['mail-config-id'] ? 'selected' : ''; + $entry['mailconfigs'][] = $row; + } + foreach (Database::queryAll("SELECT transportid, title FROM notification_backend") as $row) { + $row['selected'] = in_array($row['transportid'], ($entry['data']['group-list'] ?? [])) ? 'selected' : ''; + $entry['backends'][] = $row; + } + Module::isAvailable('bootstrap_multiselect'); + $entry['rules'] = Database::queryAll("SELECT sf.ruleid, sf.title, + IF(sfxb.transportid IS NULL, '', 'selected') AS selected + FROM notification_rule sf + LEFT JOIN notification_rule_x_transport sfxb ON (sf.ruleid = sfxb.ruleid AND sfxb.transportid = :id)", + ['id' => $id]); + Render::addTemplate('page-filters-edit-transport', $entry); + } + +}
\ No newline at end of file |