From 5540994f8b70cef689b21ddb27438a9b8084dc0e Mon Sep 17 00:00:00 2001 From: laf Date: Sun, 19 Apr 2015 00:43:16 +0100 Subject: [PATCH] Updates to schedule maintenance --- html/forms/schedule-maintenance.inc.php | 71 +++++++++++ html/includes/table/alert-schedule.inc.php | 21 ++-- html/pages/alert-schedule.inc.php | 133 +++++++++++++++++---- sql-schema/048.sql | 4 + 4 files changed, 190 insertions(+), 39 deletions(-) create mode 100644 sql-schema/048.sql diff --git a/html/forms/schedule-maintenance.inc.php b/html/forms/schedule-maintenance.inc.php index b3be48c0f..dcbcad4fc 100644 --- a/html/forms/schedule-maintenance.inc.php +++ b/html/forms/schedule-maintenance.inc.php @@ -12,4 +12,75 @@ * the source code distribution for details. */ +if(is_admin() === false) { + die('ERROR: You need to be admin'); +} +$sub_type = $_POST['sub_type']; + +if ($sub_type == 'new-maintenance') { + + // Defaults + $status = 'error'; + + $title = mres($_POST['title']); + $notes = mres($_POST['notes']); + $start = mres($_POST['start']); + $end = mres($_POST['end']); + $maps = mres($_POST['maps']); + + if (empty($title)) { + $message = "Missing title
"; + } + if (empty($start)) { + $message .= "Missing start date
"; + } + if (empty($end)) { + $message .= "Missing end date
"; + } + if( !is_array($_POST['maps']) ) { + $message .= "Not mapped to any groups or devices
"; + } + + if (empty($message)) { + $schedule_id = dbInsert(array('start'=>$start,'end'=>$end,'title'=>$title,'notes'=>$notes),'alert_schedule'); + if ($schedule_id > 0) { + $items = array(); + $fail = 0; + foreach( $_POST['maps'] as $target ) { + $item = dbInsert(array('schedule_id'=>$schedule_id,'target'=>$target),'alert_schedule_items'); + if ($item > 0) { + array_push($items,$item); + } else { + $fail = 1; + } + } + if ($fail == 1) { + foreach ($items as $item) { + dbDelete('alert_schedule_items', '`item_id`=?', array($item)); + } + dbDelete('alert_schedule', '`schedule_id`=?', array($schedule_id)); + $message = 'Creating maintenance schedule failed'.$yeah; + } else { + $status = 'ok'; + $message = 'Created maintenance schedule'; + } + } else { + $message = "Issue creating maintenance schedule"; + } + } + + $response = array('status'=>$status,'message'=>$message); + +} elseif ($sub_type == 'parse-maintenance') { + + $schedule_id = $_POST['schedule_id']; + $schedule = dbFetchRow("SELECT * FROM `alert_schedule` WHERE `schedule_id`=?",array($schedule_id)); + $items = array(); + foreach (dbFetchRows("SELECT `target` FROM `alert_schedule_items` WHERE `schedule_id`=?",array($schedule_id)) as $targets) { + $items[] = $targets; + } + $response = array('start'=>$schedule['start'],'end'=>$schedule['end'],'title'=>$schedule['title'],'notes'=>$schedule['notes'],'targets'=>$items); +} + +echo _json_encode($response); diff --git a/html/includes/table/alert-schedule.inc.php b/html/includes/table/alert-schedule.inc.php index dcea1023a..5ec8ef795 100644 --- a/html/includes/table/alert-schedule.inc.php +++ b/html/includes/table/alert-schedule.inc.php @@ -15,14 +15,14 @@ $where = 1; if ($_SESSION['userlevel'] >= '5') { - $sql = " FROM `alert_schedule` AS S LEFT JOIN `devices` AS `D` ON `S`.`device_id`=`D`.`device_id` WHERE $where"; + $sql = " FROM `alert_schedule` AS S WHERE $where"; } else { - $sql = " FROM `alert_schedule` AS S, devices_perms AS P LEFT JOIN `devices` AS `D` WHERE $where AND `S`.`device_id` = `P`.`device_id` AND `P`.`user_id` = ?"; + $sql = " FROM `alert_schedule` AS S WHERE $where"; $param[] = $_SESSION['user_id']; } if (isset($searchPhrase) && !empty($searchPhrase)) { - $sql .= " AND (`D`.`hostname` LIKE '%$searchPhrase%' OR `S`.`start` LIKE '%$searchPhrase%' OR `S`.`end` LIKE '%$searchPhrase%')"; + $sql .= " AND (`S`.`title` LIKE '%$searchPhrase%' OR `S`.`start` LIKE '%$searchPhrase%' OR `S`.`end` LIKE '%$searchPhrase%')"; } $count_sql = "SELECT COUNT(`id`) $sql"; @@ -32,7 +32,7 @@ if (empty($total)) { } if (!isset($sort) || empty($sort)) { - $sort = '`D`.`hostname` ASC '; + $sort = '`S`.`title` ASC '; } $sql .= " ORDER BY $sort"; @@ -46,18 +46,13 @@ if ($rowCount != -1) { $sql .= " LIMIT $limit_low,$limit_high"; } -$sql = "SELECT DATE_FORMAT(`S`.`start`, '%D %b %Y %T') AS `start`, DATE_FORMAT(`S`.`end`, '%D %b %Y %T') AS `end`, `D`.`hostname`, `S`.`device_id` $sql"; +$sql = "SELECT `S`.`schedule_id`, DATE_FORMAT(`S`.`start`, '%D %b %Y %T') AS `start`, DATE_FORMAT(`S`.`end`, '%D %b %Y %T') AS `end`, `S`.`title` $sql"; foreach (dbFetchRows($sql,$param) as $schedule) { - if ($schedule['device_id'] == '-1') { - $host_link = 'All devices'; - } else { - $dev = device_by_id_cache($schedule['device_id']); - $host_link = generate_device_link($dev, shorthost($dev['hostname'])); - } - $response[] = array('hostname'=>$host_link, + $response[] = array('title'=>$schedule['title'], 'start'=>$schedule['start'], - 'end'=>$schedule['end']); + 'end'=>$schedule['end'], + 'id'=>$schedule['schedule_id']); } $output = array('current'=>$current,'rowCount'=>$rowCount,'rows'=>$response,'total'=>$total); diff --git a/html/pages/alert-schedule.inc.php b/html/pages/alert-schedule.inc.php index b9c62c809..71a38085f 100644 --- a/html/pages/alert-schedule.inc.php +++ b/html/pages/alert-schedule.inc.php @@ -14,6 +14,7 @@ $pagetitle[] = "Alert Schedule"; $no_refresh = TRUE; +if(is_admin() !== false) { ?> @@ -26,33 +27,24 @@ $no_refresh = TRUE; +
+ +
+ +
+
+ +
+
+
+
+ +
+
- +
@@ -89,9 +95,10 @@ foreach (dbFetchRows("SELECT `id`,`name` FROM `device_groups`") as $device_group - + +
HostnameTitle Start EndActions
@@ -101,6 +108,13 @@ foreach (dbFetchRows("SELECT `id`,`name` FROM `device_groups`") as $device_group var grid = $("#alert-schedule").bootgrid({ ajax: true, + formatters: { + "commands": function(column, row) + { + return " " + + ""; + } + }, templates: { header: "
"+ "
"+ @@ -116,22 +130,59 @@ var grid = $("#alert-schedule").bootgrid({ }; }, url: "/ajax_table.php" +}).on("loaded.rs.jquery.bootgrid", function() +{ + /* Executes after data is loaded and rendered */ + grid.find(".command-edit").on("click", function(e) + { + $('#schedule_id').val($(this).data("schedule_id")); + $("#schedule-maintenance").modal('show'); + }).end().find(".command-delete").on("click", function(e) + { + alert("You pressed delete on row: " + $(this).data("row-id")); + }); +}); + +$('#schedule-maintenance').on('show.bs.modal', function (event) { + $('#tagmanager').tagmanager(); + var schedule_id = $('#schedule_id').val(); + $('#map-tags').tagmanager({ + strategy: 'array', + tagFieldName: 'maps[]', + initialCap: false + }); + if (schedule_id > 0) { + $.ajax({ + type: "POST", + url: "/ajax_form.php", + data: { type: "schedule-maintenance", sub_type: "parse-maintenance", schedule_id: schedule_id }, + dataType: "json", + success: function(output) { + var arr = []; + $.each ( output['targets'], function( key ) { + arr.push(key); + }); + $('#response').data('tagmanager').populate(arr); + $('#severity').val(output['severity']).change; + var extra = $.parseJSON(output['extra']); + $('#count').val(extra['count']); + } + }); + } }); $('#sched-submit').click('', function(e) { e.preventDefault(); - var device = $("#device").val(); - var start = $("#start").val(); - var end = $("#end").val(); $.ajax({ type: "POST", url: "/ajax_form.php", - data: { type: "schedule-maintenance", subtype: "add", device: device, start: start, end: end }, + data: $('form.schedule-maintenance-form').serialize(), dataType: "json", success: function(data){ if(data.status == 'ok') { $("#message").html('
'+data.message+'
'); $("#schedule-maintenance").modal('hide'); + $("#alert-schedule").bootgrid('reload'); } else { $("#response").html('
'+data.message+'
'); } @@ -143,6 +194,30 @@ $('#sched-submit').click('', function(e) { }); +$('#add-map').click('',function (event) { + $('#map-tags').data('tagmanager').populate([ $('#map-stub').val() ]); + $('#map-stub').val(''); +}); + +$('#map-stub').typeahead([ + { + name: 'map_devices', + remote : '/ajax_search.php?search=%QUERY&type=device&map=1', + header : '
 Devices
', + template: '{{name}}', + valueKey:"name", + engine: Hogan + }, + { + name: 'map_groups', + remote : '/ajax_search.php?search=%QUERY&type=group&map=1', + header : '
 Groups
', + template: '{{name}}', + valueKey:"name", + engine: Hogan + } +]); + $(function () { $("#start").datetimepicker(); $("#end").datetimepicker(); @@ -155,3 +230,9 @@ $(function () { }); + + diff --git a/sql-schema/048.sql b/sql-schema/048.sql new file mode 100644 index 000000000..6a61e06eb --- /dev/null +++ b/sql-schema/048.sql @@ -0,0 +1,4 @@ +ALTER TABLE `alert_schedule` DROP `device_id`; +ALTER TABLE `alert_schedule` CHANGE `id` `schedule_id` INT( 11 ) NOT NULL AUTO_INCREMENT; +ALTER TABLE `alert_schedule` ADD `title` VARCHAR( 255 ) NOT NULL ,ADD `notes` TEXT NOT NULL ; +CREATE TABLE `librenms`.`alert_schedule_items` (`item_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,`schedule_id` INT NOT NULL ,`target` VARCHAR( 255 ) NOT NULL ,INDEX ( `schedule_id` )) ENGINE = INNODB;