From 32b2593cfef7efe877fb2961f377db137fd2be93 Mon Sep 17 00:00:00 2001 From: Anthony F McInerney Date: Mon, 14 Sep 2020 13:04:49 +0100 Subject: [PATCH] Add service templates --- .../modal/delete_service_template.inc.php | 78 ++++++++ .../html/modal/new_service_template.inc.php | 169 ++++++++++++++++++ includes/html/pages/addsrv-template.inc.php | 40 +++++ .../html/pages/services-templates.inc.php | 156 ++++++++++++++++ .../html/print-service-add-template.inc.php | 48 +++++ includes/services.inc.php | 65 +++++++ sql-schema/282.sql | 1 + 7 files changed, 557 insertions(+) create mode 100644 includes/html/modal/delete_service_template.inc.php create mode 100644 includes/html/modal/new_service_template.inc.php create mode 100644 includes/html/pages/addsrv-template.inc.php create mode 100644 includes/html/pages/services-templates.inc.php create mode 100644 includes/html/print-service-add-template.inc.php create mode 100644 sql-schema/282.sql diff --git a/includes/html/modal/delete_service_template.inc.php b/includes/html/modal/delete_service_template.inc.php new file mode 100644 index 0000000000..5f541bd8f2 --- /dev/null +++ b/includes/html/modal/delete_service_template.inc.php @@ -0,0 +1,78 @@ + + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. Please see LICENSE.txt at the top level of + * the source code distribution for details. + */ + +if (Auth::user()->hasGlobalAdmin()) { + ?> + + + + + diff --git a/includes/html/modal/new_service_template.inc.php b/includes/html/modal/new_service_template.inc.php new file mode 100644 index 0000000000..967ef3a40c --- /dev/null +++ b/includes/html/modal/new_service_template.inc.php @@ -0,0 +1,169 @@ + + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. Please see LICENSE.txt at the top level of + * the source code distribution for details. + */ + +if (Auth::user()->hasGlobalAdmin()) { + // Build the types list. + $dir = \LibreNMS\Config::get('nagios_plugins'); + if (file_exists($dir) && is_dir($dir)) { + $files = scandir($dir); + $dir .= DIRECTORY_SEPARATOR; + foreach ($files as $file) { + if (is_executable($dir.$file) && is_file($dir.$file) && strstr($file, 'check_')) { + list(,$check_name) = explode('_', $file, 2); + $stype .= ""; + } + } + } + ?> + + + + + hasGlobalAdmin()) { + include 'includes/html/error-no-perm.inc.php'; +} else { + if ($vars['addsrvtp']) { + if (Auth::user()->hasGlobalAdmin()) { + $updated = '1'; + + $service_template_id = add_service_template($vars['device_group'], $vars['type'], $vars['descr'], $vars['params'], 0); + if ($service_template_id) { + $message .= $message_break.'Service Template added ('.$service_template_id.')!'; + $message_break .= '
'; + } + } + } + foreach (list_available_services() as $current_service) { + $servicesform .= ""; + } + + foreach (dbFetchRows('SELECT * FROM `device_groups` ORDER BY `name`') as $device_group) { + $devicegroupsform .= "'; + } + + if ($updated) { + print_message('Device Settings Saved'); + } + + $pagetitle[] = 'Add service template'; + + echo "
+
"; + + include_once 'includes/html/print-service-add-template.inc.php'; + + echo '
+
'; +}//end if diff --git a/includes/html/pages/services-templates.inc.php b/includes/html/pages/services-templates.inc.php new file mode 100644 index 0000000000..f769f15a4f --- /dev/null +++ b/includes/html/pages/services-templates.inc.php @@ -0,0 +1,156 @@ + +
+
+
+
+ Services » + + 'Basic', + ); + + if (!$vars['view']) { + $vars['view'] = 'basic'; + } + + // The menu option - on the left + + $sep = ''; + + foreach ($menu_options as $option => $text) { + if (empty($vars['view'])) { + $vars['view'] = $option; + } + + echo $sep; + if ($vars['view'] == $option) { + echo ""; + } + + echo generate_link($text, $vars, array( + 'view' => $option + )); + if ($vars['view'] == $option) { + echo ''; + } + + $sep = ' | '; + } + + unset($sep); + + // The status option - on the right + + echo '
'; + $sep = ''; + unset($sep); + echo '
'; + echo '
'; + echo '
'; + echo '
'; + + $sql_param = array(); + + $host_par = array(); + $perms_sql = null; + if (!Auth::user()->hasGlobalRead()) { + $device_group_ids = Permissions::devicesForUser()->toArray() ?: [0]; + $perms_sql .= " AND `D`.`device_group_id` IN " .dbGenPlaceholders(count($device_group_ids)); + $host_par = $device_group_ids; + } + + $host_sql = 'SELECT `D`.`device_group_id`,`D`.`name` FROM device_groups AS D, services_template AS S WHERE D.device_group_id = S.device_group_id ' . $perms_sql . ' GROUP BY `D`.`name`, `D`.`device_group_id`, `D`.`sysName` ORDER BY D.name'; + + $shift = 1; + foreach (dbFetchRows($host_sql, $host_par) as $device_group) { + $device_group_id = $device_group['device_group_id']; + $device_group_name = $device_group['name']; + #$device_sysName = $device_group['name']; + $devlink = generate_device_link($device_group, null, array('tab' => 'services')); + if ($shift == 1) { + array_unshift($sql_param, $device_group_id); + $shift = 0; + } else { + $sql_param[0] = $device_group_id; + } + + $header = true; + $footer = false; + + $service_template_iteration = 0; + $services_template = dbFetchRows("SELECT * FROM `services_template` WHERE `device_group_id` = ? $where ORDER BY service_template_type", $sql_param); + $services_template_count = count($services_template); + foreach ($services_template as $service_template) { + $service_template_iteration++; + + if ($service_template_iteration < 2 && $header) { + echo '
'; + echo '

' . $devlink . '

' . $device_group_name . '
'; + echo '
'; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + + $header = false; + + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + if (Auth::user()->hasGlobalAdmin()) { + echo ""; + } + echo ''; + + if ($service_template_iteration >= $services_template_count) { + $footer = true; + } + + if ($footer) { + echo '
ServiceLast ChangedDescriptionMessage
' . nl2br(display($service_template['service_template_type'])) . '' . formatUptime(time() - $service_template['service_template_changed']) . '' . nl2br(display($service_template['service_template_desc'])) . '' . nl2br(display($service_template['service_template_message'])) . ' + + +
'; + echo '
'; + echo '
'; + } + } + } + unset($samehost); + ?> +
+
+
+
diff --git a/includes/html/print-service-add-template.inc.php b/includes/html/print-service-add-template.inc.php new file mode 100644 index 0000000000..fc7f8649f3 --- /dev/null +++ b/includes/html/print-service-add-template.inc.php @@ -0,0 +1,48 @@ +Add Service Template +
+ " . csrf_field() . " +
+
+ + +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+ This may be required based on the service check. +
+
+ +
+
"; diff --git a/includes/services.inc.php b/includes/services.inc.php index a6cc1c8e40..20e5de723b 100644 --- a/includes/services.inc.php +++ b/includes/services.inc.php @@ -105,6 +105,71 @@ function delete_service($service = null) return dbDelete('services', '`service_id` = ?', array($service)); } +function add_service_template($device_group, $type, $desc, $param = "", $ignore = 0, $disabled = 0) +{ + + if (!is_array($device_group)) { + $device_group = device_group_by_id_cache($device_group); + } + + $insert = array('device_group_id' => $device_group['device_group_id'], 'service_template_type' => $type, 'service_template_changed' => array('UNIX_TIMESTAMP(NOW())'), 'service_template_desc' => $desc, 'service_template_param' => $param, 'service_template_ignore' => $ignore, 'service_template_disabled' => $disabled); + return dbInsert($insert, 'services_template'); +} + +function service_template_get($device_group = null, $service = null) +{ + $sql_query = "SELECT `service_template_id`,`device_group_id`,`service_template_type`,`service_template_desc`,`service_template_param`,`service_template_ignore`,`service_template_changed`,`service_template_disabled` FROM `services_template` WHERE"; + $sql_param = array(); + $add = 0; + + d_echo("SQL Query: ".$sql_query); + if (!is_null($service)) { + // Add a service filter to the SQL query. + $sql_query .= " `service_template_id` = ? AND"; + $sql_param[] = $service; + $add++; + } + if (!is_null($device)) { + // Add a device filter to the SQL query. + $sql_query .= " `device_group_id` = ? AND"; + $sql_param[] = $device_group; + $add++; + } + + if ($add == 0) { + // No filters, remove " WHERE" -6 + $sql_query = substr($sql_query, 0, strlen($sql_query)-6); + } else { + // We have filters, remove " AND" -4 + $sql_query = substr($sql_query, 0, strlen($sql_query)-4); + } + d_echo("SQL Query: ".$sql_query); + + // $service is not null, get only what we want. + $services = dbFetchRows($sql_query, $sql_param); + d_echo("Service Array: ".print_r($services, true)."\n"); + + return $services; +} + +function edit_service_template($update = array(), $service = null) +{ + if (!is_numeric($service)) { + return false; + } + + return dbUpdate($update, 'services_template', '`service_template_id`=?', array($service)); +} + +function delete_service_template($service = null) +{ + if (!is_numeric($service)) { + return false; + } + + return dbDelete('services_template', '`service_template_id` = ?', array($service)); +} + function discover_service($device, $service) { if (! dbFetchCell('SELECT COUNT(service_id) FROM `services` WHERE `service_type`= ? AND `device_id` = ?', array($service, $device['device_id']))) { diff --git a/sql-schema/282.sql b/sql-schema/282.sql new file mode 100644 index 0000000000..5aa76245ba --- /dev/null +++ b/sql-schema/282.sql @@ -0,0 +1 @@ +CREATE TABLE IF NOT EXISTS `services_template` ( `service_template_id` int unsigned NOT NULL AUTO_INCREMENT, `device_group_id` int NOT NULL, `service_template_type` varchar(255) NOT NULL, `service_template_desc` text NOT NULL, `service_template_param` text NOT NULL, `service_template_ignore` tinyint(1) NOT NULL, `service_template_changed` int unsigned NOT NULL DEFAULT '0', `service_template_disabled` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`service_tempate_id`), KEY `service_template_devicegroup` (`device_group_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_unicode_ci; \ No newline at end of file