diff --git a/database/migrations/2023_12_12_171400_alert_rule_note.php b/database/migrations/2023_12_12_171400_alert_rule_note.php new file mode 100644 index 0000000000..c5948d1bd4 --- /dev/null +++ b/database/migrations/2023_12_12_171400_alert_rule_note.php @@ -0,0 +1,28 @@ +text('notes')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('alert_rules', function (Blueprint $table) { + $table->dropColumn('notes'); + }); + } +}; diff --git a/doc/API/Alerts.md b/doc/API/Alerts.md index 40c5f5001d..ca779a9db6 100644 --- a/doc/API/Alerts.md +++ b/doc/API/Alerts.md @@ -280,11 +280,12 @@ Input (JSON): show up in the Web UI (true or false). - invert: This would invert the rules check. - name: This is the name of the rule and is mandatory. +- notes: Some informal notes for this rule Example: ```curl -curl -X POST -d '{"devices":[1,2,3], "name": "testrule", "builder":{"condition":"AND","rules":[{"id":"devices.hostname","field":"devices.hostname","type":"string","input":"text","operator":"equal","value":"localhost"}],"valid":true},"severity": "critical","count":15,"delay":"5 m","interval":"5 m","mute":false}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules +curl -X POST -d '{"devices":[1,2,3], "name": "testrule", "builder":{"condition":"AND","rules":[{"id":"devices.hostname","field":"devices.hostname","type":"string","input":"text","operator":"equal","value":"localhost"}],"valid":true},"severity": "critical","count":15,"delay":"5 m","interval":"5 m","mute":false,"notes":"This a note from the API"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules ``` Output: @@ -324,11 +325,12 @@ Input (JSON): show up in the Web UI (true or false). - invert: This would invert the rules check. - name: This is the name of the rule and is mandatory. +- notes: Some informal notes for this rule Example: ```curl -curl -X PUT -d '{"rule_id":1,"device_id":"-1", "name": "testrule", "builder":"{"condition":"AND","rules":[{"id":"devices.hostname","field":"devices.hostname","type":"string","input":"text","operator":"equal","value":"localhost"}],"valid":true}","severity": "critical","count":15,"delay":"5 m","interval":"5 m","mute":false}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules +curl -X PUT -d '{"rule_id":1,"device_id":"-1", "name": "testrule", "builder":{"condition":"AND","rules":[{"id":"devices.hostname","field":"devices.hostname","type":"string","input":"text","operator":"equal","value":"localhost"}],"valid":true},"severity": "critical","count":15,"delay":"5 m","interval":"5 m","mute":false,"notes":"This a note from the API"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules ``` Output: diff --git a/includes/html/api_functions.inc.php b/includes/html/api_functions.inc.php index 7731a82600..07e8f4e4bd 100644 --- a/includes/html/api_functions.inc.php +++ b/includes/html/api_functions.inc.php @@ -1318,6 +1318,7 @@ function add_edit_rule(Illuminate\Http\Request $request) $interval = $data['interval']; $override_query = $data['override_query']; $adv_query = $data['adv_query']; + $notes = $data['notes']; $delay_sec = convert_delay($delay); $interval_sec = convert_delay($interval); if ($mute == 1) { @@ -1355,10 +1356,10 @@ function add_edit_rule(Illuminate\Http\Request $request) } if (is_numeric($rule_id)) { - if (! (dbUpdate(['name' => $name, 'builder' => $builder, 'query' => $query, 'severity' => $severity, 'disabled' => $disabled, 'extra' => $extra_json], 'alert_rules', 'id=?', [$rule_id]) >= 0)) { + if (! (dbUpdate(['name' => $name, 'builder' => $builder, 'query' => $query, 'severity' => $severity, 'disabled' => $disabled, 'extra' => $extra_json, 'notes' => $notes], 'alert_rules', 'id=?', [$rule_id]) >= 0)) { return api_error(500, 'Failed to update existing alert rule'); } - } elseif (! $rule_id = dbInsert(['name' => $name, 'builder' => $builder, 'query' => $query, 'severity' => $severity, 'disabled' => $disabled, 'extra' => $extra_json], 'alert_rules')) { + } elseif (! $rule_id = dbInsert(['name' => $name, 'builder' => $builder, 'query' => $query, 'severity' => $severity, 'disabled' => $disabled, 'extra' => $extra_json, 'notes' => $notes], 'alert_rules')) { return api_error(500, 'Failed to create new alert rule'); } diff --git a/includes/html/forms/alert-rules.inc.php b/includes/html/forms/alert-rules.inc.php index 467c0ce5e8..8c9c224d34 100644 --- a/includes/html/forms/alert-rules.inc.php +++ b/includes/html/forms/alert-rules.inc.php @@ -58,6 +58,7 @@ $mute = isset($_POST['mute']) ? $_POST['mute'] : null; $invert = isset($_POST['invert']) ? $_POST['invert'] : null; $name = strip_tags($_POST['name']); $proc = $_POST['proc']; +$notes = strip_tags($_POST['notes']); $recovery = $vars['recovery']; $acknowledgement = $vars['acknowledgement']; $invert_map = isset($_POST['invert_map']) ? $_POST['invert_map'] : null; @@ -70,26 +71,13 @@ if (! is_numeric($count)) { $delay_sec = convert_delay($delay); $interval_sec = convert_delay($interval); -if ($mute == 'on') { - $mute = true; -} else { - $mute = false; -} - -if ($invert == 'on') { - $invert = true; -} else { - $invert = false; -} +$mute = ($mute == 'on'); +$invert = ($invert == 'on'); $recovery = empty($recovery) ? $recovery = false : true; $acknowledgement = empty($acknowledgement) ? $acknowledgement = false : true; -if ($invert_map == 'on') { - $invert_map = true; -} else { - $invert_map = false; -} +$invert_map = ($invert_map == 'on'); $extra = [ 'mute' => $mute, @@ -118,6 +106,7 @@ if (is_numeric($rule_id) && $rule_id > 0) { 'extra' => $extra_json, 'name' => $name, 'proc' => $proc, + 'notes' => $notes, 'query' => $query, 'builder' => $builder_json, 'invert_map' => $invert_map, @@ -146,6 +135,7 @@ if (is_numeric($rule_id) && $rule_id > 0) { 'disabled' => 0, 'name' => $name, 'proc' => $proc, + 'notes' => $notes, 'query' => $query, 'builder' => $builder_json, 'invert_map' => $invert_map, diff --git a/includes/html/forms/create-alert-item.inc.php b/includes/html/forms/create-alert-item.inc.php index 233ebb3df1..833380a168 100644 --- a/includes/html/forms/create-alert-item.inc.php +++ b/includes/html/forms/create-alert-item.inc.php @@ -27,12 +27,9 @@ $delay = $_POST['delay']; $interval = $_POST['interval']; $mute = $_POST['mute']; $invert = $_POST['invert']; -$name = strip_tages($_POST['name']); -if ($_POST['proc'] != '') { - $proc = $_POST['proc']; -} else { - $proc = ''; -} +$name = strip_tags($_POST['name']); +$notes = isset($_POST['$notes']) ? strip_tags($_POST['$notes']) : ''; +$proc = isset($_POST['proc']) ? strip_tags($_POST['proc']) : ''; if (empty($rule)) { $update_message = 'ERROR: No rule was generated - did you forget to click and / or?'; @@ -65,7 +62,7 @@ if (empty($rule)) { ]; $extra_json = json_encode($extra); if (is_numeric($alert_id) && $alert_id > 0) { - if (dbUpdate(['rule' => $rule, 'severity' => $_POST['severity'], 'extra' => $extra_json, 'name' => $name, 'proc' => $proc, 'query' => $query], 'alert_rules', 'id=?', [$alert_id]) >= 0) { + if (dbUpdate(['rule' => $rule, 'severity' => $_POST['severity'], 'extra' => $extra_json, 'name' => $name, 'proc' => $proc, 'notes' => $notes, 'query' => $query], 'alert_rules', 'id=?', [$alert_id]) >= 0) { $update_message = "Edited Rule: $name: $rule"; } else { $update_message = 'ERROR: Failed to edit Rule: ' . $rule . ''; @@ -74,7 +71,7 @@ if (empty($rule)) { if (is_array($_POST['maps'])) { $device_id = ':' . $device_id; } - if (dbInsert(['device_id' => $device_id, 'rule' => $rule, 'severity' => $_POST['severity'], 'extra' => $extra_json, 'disabled' => 0, 'name' => $name, 'proc' => $proc, 'query' => $query], 'alert_rules')) { + if (dbInsert(['device_id' => $device_id, 'rule' => $rule, 'severity' => $_POST['severity'], 'extra' => $extra_json, 'disabled' => 0, 'name' => $name, 'proc' => $proc, 'notes' => $notes, 'query' => $query], 'alert_rules')) { $update_message = "Added Rule: $name: $rule"; if (is_array($_POST['maps'])) { foreach ($_POST['maps'] as $target) { diff --git a/includes/html/forms/parse-alert-rule.inc.php b/includes/html/forms/parse-alert-rule.inc.php index 183c205929..842b93dd5d 100644 --- a/includes/html/forms/parse-alert-rule.inc.php +++ b/includes/html/forms/parse-alert-rule.inc.php @@ -78,6 +78,7 @@ if (is_array($rule)) { 'transports' => $transports, 'name' => $rule['name'], 'proc' => $rule['proc'], + 'notes' => $rule['notes'], 'builder' => $builder, 'severity' => $rule['severity'], 'adv_query' => $rule['query'], diff --git a/includes/html/forms/sql-from-alert-collection.inc.php b/includes/html/forms/sql-from-alert-collection.inc.php index 3c0e681a03..6613368d03 100644 --- a/includes/html/forms/sql-from-alert-collection.inc.php +++ b/includes/html/forms/sql-from-alert-collection.inc.php @@ -52,6 +52,7 @@ if (is_numeric($template_id)) { $output = [ 'status' => 'ok', 'name' => $rule['name'], + 'notes' => $rule['notes'], 'builder' => $rule['builder'] ?: QueryBuilderParser::fromOld($rule['rule'])->toArray(), 'extra' => array_replace($default_extra, (array) $rule['extra']), 'severity' => $rule['severity'] ?: Config::get('alert_rule.severity'), diff --git a/includes/html/modal/new_alert_rule.inc.php b/includes/html/modal/new_alert_rule.inc.php index ecfe849e5e..7f46294f0d 100644 --- a/includes/html/modal/new_alert_rule.inc.php +++ b/includes/html/modal/new_alert_rule.inc.php @@ -145,6 +145,12 @@ if (Auth::user()->hasGlobalAdmin()) { +