Enumerate AlertState (#11665)

* Enumerate AlertState

* fix typo

* add missing use's

* .

* .
This commit is contained in:
SourceDoctor
2020-05-24 04:14:36 +02:00
committed by GitHub
parent b8c6769049
commit b89eb22cd5
46 changed files with 163 additions and 90 deletions

View File

@@ -36,6 +36,7 @@ namespace LibreNMS\Alert;
use App\Models\Device; use App\Models\Device;
use LibreNMS\Alert\AlertUtil; use LibreNMS\Alert\AlertUtil;
use LibreNMS\Alert\AlertDB; use LibreNMS\Alert\AlertDB;
use LibreNMS\Enum\AlertState;
class AlertRules class AlertRules
{ {
@@ -50,7 +51,7 @@ class AlertRules
//Check to see if disable alerting is set //Check to see if disable alerting is set
if (AlertUtil::hasDisableNotify($device_id)) { if (AlertUtil::hasDisableNotify($device_id)) {
echo "Disable alerting is set, Clearing active alerts and skipping alert rules check\r\n"; echo "Disable alerting is set, Clearing active alerts and skipping alert rules check\r\n";
$device_alert['state'] = 0; $device_alert['state'] = AlertState::CLEAR;
$device_alert['alerted'] = 0; $device_alert['alerted'] = 0;
$device_alert['open'] = 0; $device_alert['open'] = 0;
dbUpdate($device_alert, 'alerts', '`device_id` = ?', array($device_id)); dbUpdate($device_alert, 'alerts', '`device_id` = ?', array($device_id));
@@ -90,9 +91,9 @@ class AlertRules
$current_state = dbFetchCell("SELECT state FROM alerts WHERE rule_id = ? AND device_id = ? ORDER BY id DESC LIMIT 1", [$rule['id'], $device_id]); $current_state = dbFetchCell("SELECT state FROM alerts WHERE rule_id = ? AND device_id = ? ORDER BY id DESC LIMIT 1", [$rule['id'], $device_id]);
if ($doalert) { if ($doalert) {
if ($current_state == 2) { if ($current_state == AlertState::ACKNOWLEDGED) {
c_echo('Status: %ySKIP'); c_echo('Status: %ySKIP');
} elseif ($current_state >= 1) { } elseif ($current_state >= AlertState::ACTIVE) {
c_echo('Status: %bNOCHG'); c_echo('Status: %bNOCHG');
// NOCHG here doesn't mean no change full stop. It means no change to the alert state // NOCHG here doesn't mean no change full stop. It means no change to the alert state
// So we update the details column with any fresh changes to the alert output we might have. // So we update the details column with any fresh changes to the alert output we might have.
@@ -108,24 +109,24 @@ class AlertRules
dbUpdate(array('details' => $details), 'alert_log', 'id = ?', array($alert_log['id'])); dbUpdate(array('details' => $details), 'alert_log', 'id = ?', array($alert_log['id']));
} else { } else {
$extra = gzcompress(json_encode(array('contacts' => AlertUtil::getContacts($qry), 'rule'=>$qry)), 9); $extra = gzcompress(json_encode(array('contacts' => AlertUtil::getContacts($qry), 'rule'=>$qry)), 9);
if (dbInsert(['state' => 1, 'device_id' => $device_id, 'rule_id' => $rule['id'], 'details' => $extra], 'alert_log')) { if (dbInsert(['state' => AlertState::ACTIVE, 'device_id' => $device_id, 'rule_id' => $rule['id'], 'details' => $extra], 'alert_log')) {
if (is_null($current_state)) { if (is_null($current_state)) {
dbInsert(array('state' => 1, 'device_id' => $device_id, 'rule_id' => $rule['id'], 'open' => 1,'alerted' => 0), 'alerts'); dbInsert(array('state' => AlertState::ACTIVE, 'device_id' => $device_id, 'rule_id' => $rule['id'], 'open' => 1,'alerted' => 0), 'alerts');
} else { } else {
dbUpdate(['state' => 1, 'open' => 1, 'timestamp' => array('NOW()')], 'alerts', 'device_id = ? && rule_id = ?', [$device_id, $rule['id']]); dbUpdate(['state' => AlertState::ACTIVE, 'open' => 1, 'timestamp' => array('NOW()')], 'alerts', 'device_id = ? && rule_id = ?', [$device_id, $rule['id']]);
} }
c_echo(PHP_EOL . 'Status: %rALERT'); c_echo(PHP_EOL . 'Status: %rALERT');
} }
} }
} else { } else {
if (!is_null($current_state) && $current_state == 0) { if (!is_null($current_state) && $current_state == AlertState::RECOVERED) {
c_echo('Status: %bNOCHG'); c_echo('Status: %bNOCHG');
} else { } else {
if (dbInsert(['state' => 0, 'device_id' => $device_id, 'rule_id' => $rule['id']], 'alert_log')) { if (dbInsert(['state' => AlertState::RECOVERED, 'device_id' => $device_id, 'rule_id' => $rule['id']], 'alert_log')) {
if (is_null($current_state)) { if (is_null($current_state)) {
dbInsert(['state' => 0, 'device_id' => $device_id, 'rule_id' => $rule['id'], 'open' => 1, 'alerted' => 0], 'alerts'); dbInsert(['state' => AlertState::RECOVERED, 'device_id' => $device_id, 'rule_id' => $rule['id'], 'open' => 1, 'alerted' => 0], 'alerts');
} else { } else {
dbUpdate(['state' => 0, 'open' => 1, 'note' => '', 'timestamp' => array('NOW()')], 'alerts', 'device_id = ? && rule_id = ?', [$device_id, $rule['id']]); dbUpdate(['state' => AlertState::RECOVERED, 'open' => 1, 'note' => '', 'timestamp' => array('NOW()')], 'alerts', 'device_id = ? && rule_id = ?', [$device_id, $rule['id']]);
} }
c_echo(PHP_EOL . 'Status: %gOK'); c_echo(PHP_EOL . 'Status: %gOK');

View File

@@ -33,6 +33,7 @@ namespace LibreNMS\Alert;
use App\Models\DevicePerf; use App\Models\DevicePerf;
use LibreNMS\Config; use LibreNMS\Config;
use LibreNMS\Util\Time; use LibreNMS\Util\Time;
use LibreNMS\Enum\AlertState;
use Log; use Log;
class RunAlerts class RunAlerts
@@ -122,13 +123,13 @@ class RunAlerts
$tpl = new Template; $tpl = new Template;
$template = $tpl->getTemplate($obj); $template = $tpl->getTemplate($obj);
if ($alert['state'] >= 1) { if ($alert['state'] >= AlertState::ACTIVE) {
$obj['title'] = $template->title ?: 'Alert for device '.$device['hostname'].' - '.($alert['name'] ? $alert['name'] : $alert['rule']); $obj['title'] = $template->title ?: 'Alert for device '.$device['hostname'].' - '.($alert['name'] ? $alert['name'] : $alert['rule']);
if ($alert['state'] == 2) { if ($alert['state'] == AlertState::ACKNOWLEDGED) {
$obj['title'] .= ' got acknowledged'; $obj['title'] .= ' got acknowledged';
} elseif ($alert['state'] == 3) { } elseif ($alert['state'] == AlertState::WORSE) {
$obj['title'] .= ' got worse'; $obj['title'] .= ' got worse';
} elseif ($alert['state'] == 4) { } elseif ($alert['state'] == AlertState::BETTER) {
$obj['title'] .= ' got better'; $obj['title'] .= ' got better';
} }
@@ -146,9 +147,9 @@ class RunAlerts
if (!empty($extra['diff'])) { if (!empty($extra['diff'])) {
$obj['diff'] = $extra['diff']; $obj['diff'] = $extra['diff'];
} }
} elseif ($alert['state'] == 0) { } elseif ($alert['state'] == AlertState::RECOVERED) {
// Alert is now cleared // Alert is now cleared
$id = dbFetchRow('SELECT alert_log.id,alert_log.time_logged,alert_log.details FROM alert_log WHERE alert_log.state != 2 && alert_log.state != 0 && alert_log.rule_id = ? && alert_log.device_id = ? && alert_log.id < ? ORDER BY id DESC LIMIT 1', array($alert['rule_id'], $alert['device_id'], $alert['id'])); $id = dbFetchRow('SELECT alert_log.id,alert_log.time_logged,alert_log.details FROM alert_log WHERE alert_log.state != ? && alert_log.state != ? && alert_log.rule_id = ? && alert_log.device_id = ? && alert_log.id < ? ORDER BY id DESC LIMIT 1', array(AlertState::ACKNOWLEDGED, AlertState::RECOVERED, $alert['rule_id'], $alert['device_id'], $alert['id']));
if (empty($id['id'])) { if (empty($id['id'])) {
return false; return false;
} }
@@ -222,7 +223,7 @@ class RunAlerts
public function clearStaleAlerts() public function clearStaleAlerts()
{ {
$sql = "SELECT `alerts`.`id` AS `alert_id`, `devices`.`hostname` AS `hostname` FROM `alerts` LEFT JOIN `devices` ON `alerts`.`device_id`=`devices`.`device_id` RIGHT JOIN `alert_rules` ON `alerts`.`rule_id`=`alert_rules`.`id` WHERE `alerts`.`state`!=0 AND `devices`.`hostname` IS NULL"; $sql = "SELECT `alerts`.`id` AS `alert_id`, `devices`.`hostname` AS `hostname` FROM `alerts` LEFT JOIN `devices` ON `alerts`.`device_id`=`devices`.`device_id` RIGHT JOIN `alert_rules` ON `alerts`.`rule_id`=`alert_rules`.`id` WHERE `alerts`.`state`!=".AlertState::CLEAR." AND `devices`.`hostname` IS NULL";
foreach (dbFetchRows($sql) as $alert) { foreach (dbFetchRows($sql) as $alert) {
if (empty($alert['hostname']) && isset($alert['alert_id'])) { if (empty($alert['hostname']) && isset($alert['alert_id'])) {
dbDelete('alerts', '`id` = ?', array($alert['alert_id'])); dbDelete('alerts', '`id` = ?', array($alert['alert_id']));
@@ -289,9 +290,9 @@ class RunAlerts
public function runAcks() public function runAcks()
{ {
foreach ($this->loadAlerts('alerts.state = 2 && alerts.open = 1') as $alert) { foreach ($this->loadAlerts('alerts.state = '.AlertState::ACKNOWLEDGED.' && alerts.open = '.AlertState::ACTIVE) as $alert) {
$this->issueAlert($alert); $this->issueAlert($alert);
dbUpdate(array('open' => 0), 'alerts', 'rule_id = ? && device_id = ?', array($alert['rule_id'], $alert['device_id'])); dbUpdate(array('open' => AlertState::CLEAR), 'alerts', 'rule_id = ? && device_id = ?', array($alert['rule_id'], $alert['device_id']));
} }
} }
@@ -301,8 +302,8 @@ class RunAlerts
*/ */
public function runFollowUp() public function runFollowUp()
{ {
foreach ($this->loadAlerts('alerts.state > 0 && alerts.open = 0') as $alert) { foreach ($this->loadAlerts('alerts.state > '.AlertState::CLEAR.' && alerts.open = 0') as $alert) {
if ($alert['state'] != 2 || ($alert['info']['until_clear'] === false)) { if ($alert['state'] != AlertState::ACKNOWLEDGED || ($alert['info']['until_clear'] === false)) {
$rextra = json_decode($alert['extra'], true); $rextra = json_decode($alert['extra'], true);
if ($rextra['invert']) { if ($rextra['invert']) {
continue; continue;
@@ -322,18 +323,18 @@ class RunAlerts
$o = sizeof($alert['details']['rule']); $o = sizeof($alert['details']['rule']);
$n = sizeof($chk); $n = sizeof($chk);
$ret = 'Alert #' . $alert['id']; $ret = 'Alert #' . $alert['id'];
$state = 0; $state = AlertState::CLEAR;
if ($n > $o) { if ($n > $o) {
$ret .= ' Worsens'; $ret .= ' Worsens';
$state = 3; $state = AlertState::WORSE;
$alert['details']['diff'] = array_diff($chk, $alert['details']['rule']); $alert['details']['diff'] = array_diff($chk, $alert['details']['rule']);
} elseif ($n < $o) { } elseif ($n < $o) {
$ret .= ' Betters'; $ret .= ' Betters';
$state = 4; $state = AlertState::BETTER;
$alert['details']['diff'] = array_diff($alert['details']['rule'], $chk); $alert['details']['diff'] = array_diff($alert['details']['rule'], $chk);
} }
if ($state > 0 && $n > 0) { if ($state > AlertState::CLEAR && $n > 0) {
$alert['details']['rule'] = $chk; $alert['details']['rule'] = $chk;
if (dbInsert(array( if (dbInsert(array(
'state' => $state, 'state' => $state,
@@ -385,7 +386,7 @@ class RunAlerts
*/ */
public function runAlerts() public function runAlerts()
{ {
foreach ($this->loadAlerts('alerts.state != 2 && alerts.open = 1') as $alert) { foreach ($this->loadAlerts('alerts.state != '.AlertState::ACKNOWLEDGED.' && alerts.open = 1') as $alert) {
$noiss = false; $noiss = false;
$noacc = false; $noacc = false;
$updet = false; $updet = false;
@@ -404,7 +405,7 @@ class RunAlerts
$tolerence_window = Config::get('alert.tolerance_window'); $tolerence_window = Config::get('alert.tolerance_window');
if (!empty($rextra['count']) && empty($rextra['interval'])) { if (!empty($rextra['count']) && empty($rextra['interval'])) {
// This check below is for compat-reasons // This check below is for compat-reasons
if (!empty($rextra['delay']) && $alert['state'] != 0) { if (!empty($rextra['delay']) && $alert['state'] != AlertState::RECOVERED) {
if ((time() - strtotime($alert['time_logged']) + $tolerence_window) < $rextra['delay'] || (!empty($alert['details']['delay']) && (time() - $alert['details']['delay'] + $tolerence_window) < $rextra['delay'])) { if ((time() - strtotime($alert['time_logged']) + $tolerence_window) < $rextra['delay'] || (!empty($alert['details']['delay']) && (time() - $alert['details']['delay'] + $tolerence_window) < $rextra['delay'])) {
continue; continue;
} else { } else {
@@ -413,7 +414,7 @@ class RunAlerts
} }
} }
if ($alert['state'] == 1 && !empty($rextra['count']) && ($rextra['count'] == -1 || $alert['details']['count']++ < $rextra['count'])) { if ($alert['state'] == AlertState::ACTIVE && !empty($rextra['count']) && ($rextra['count'] == -1 || $alert['details']['count']++ < $rextra['count'])) {
if ($alert['details']['count'] < $rextra['count']) { if ($alert['details']['count'] < $rextra['count']) {
$noacc = true; $noacc = true;
} }
@@ -423,7 +424,7 @@ class RunAlerts
} }
} else { } else {
// This is the new way // This is the new way
if (!empty($rextra['delay']) && (time() - strtotime($alert['time_logged']) + $tolerence_window) < $rextra['delay'] && $alert['state'] != 0) { if (!empty($rextra['delay']) && (time() - strtotime($alert['time_logged']) + $tolerence_window) < $rextra['delay'] && $alert['state'] != AlertState::RECOVERED) {
continue; continue;
} }
@@ -436,7 +437,7 @@ class RunAlerts
} }
} }
if (in_array($alert['state'], [1,3,4]) && !empty($rextra['count']) && ($rextra['count'] == -1 || $alert['details']['count']++ < $rextra['count'])) { if (in_array($alert['state'], [AlertState::ACTIVE, AlertState::WORSE, AlertState::BETTER]) && !empty($rextra['count']) && ($rextra['count'] == -1 || $alert['details']['count']++ < $rextra['count'])) {
if ($alert['details']['count'] < $rextra['count']) { if ($alert['details']['count'] < $rextra['count']) {
$noacc = true; $noacc = true;
} }
@@ -470,7 +471,7 @@ class RunAlerts
Log::event('Skipped alerts because all parent devices are down', $alert['device_id'], 'alert', 1); Log::event('Skipped alerts because all parent devices are down', $alert['device_id'], 'alert', 1);
} }
if ($alert['state'] == 0 && $rextra['recovery'] == false) { if ($alert['state'] == AlertState::RECOVERED && $rextra['recovery'] == false) {
// Rule is set to not send a recovery alert // Rule is set to not send a recovery alert
$noiss = true; $noiss = true;
} }
@@ -545,9 +546,9 @@ class RunAlerts
public function alertLog($result, $obj, $transport) public function alertLog($result, $obj, $transport)
{ {
$prefix = [ $prefix = [
0 => "recovery", AlertState::RECOVERED => "recovery",
1 => $obj['severity']." alert", AlertState::ACTIVE => $obj['severity']." alert",
2 => "acknowledgment" AlertState::ACKNOWLEDGED => "acknowledgment"
]; ];
$prefix[3] = &$prefix[0]; $prefix[3] = &$prefix[0];
$prefix[4] = &$prefix[0]; $prefix[4] = &$prefix[0];

View File

@@ -26,6 +26,7 @@
namespace LibreNMS\Alert; namespace LibreNMS\Alert;
use App\Models\AlertTemplate; use App\Models\AlertTemplate;
use LibreNMS\Enum\AlertState;
class Template class Template
{ {
@@ -107,7 +108,7 @@ class Template
{ {
return '{{ $alert->title }}' . PHP_EOL . return '{{ $alert->title }}' . PHP_EOL .
'Severity: {{ $alert->severity }}' . PHP_EOL . 'Severity: {{ $alert->severity }}' . PHP_EOL .
'@if ($alert->state == 0)Time elapsed: {{ $alert->elapsed }} @endif ' . PHP_EOL . '@if ($alert->state == '.AlertState::RECOVERED.')Time elapsed: {{ $alert->elapsed }} @endif ' . PHP_EOL .
'Timestamp: {{ $alert->timestamp }}' . PHP_EOL . 'Timestamp: {{ $alert->timestamp }}' . PHP_EOL .
'Unique-ID: {{ $alert->uid }}' . PHP_EOL . 'Unique-ID: {{ $alert->uid }}' . PHP_EOL .
'Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif ' . PHP_EOL . 'Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif ' . PHP_EOL .

View File

@@ -5,6 +5,7 @@ namespace LibreNMS\Alert;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use LibreNMS\Interfaces\Alert\Transport as TransportInterface; use LibreNMS\Interfaces\Alert\Transport as TransportInterface;
use LibreNMS\Config; use LibreNMS\Config;
use LibreNMS\Enum\AlertState;
abstract class Transport implements TransportInterface abstract class Transport implements TransportInterface
{ {
@@ -48,11 +49,11 @@ abstract class Transport implements TransportInterface
public static function getColorForState($state) public static function getColorForState($state)
{ {
$colors = array( $colors = array(
0 => Config::get('alert_colour.ok'), AlertState::CLEAR => Config::get('alert_colour.ok'),
1 => Config::get('alert_colour.bad'), AlertState::ACTIVE => Config::get('alert_colour.bad'),
2 => Config::get('alert_colour.acknowledged'), AlertState::ACKNOWLEDGED => Config::get('alert_colour.acknowledged'),
3 => Config::get('alert_colour.worse'), AlertState::WORSE => Config::get('alert_colour.worse'),
4 => Config::get('alert_colour.better'), AlertState::BETTER => Config::get('alert_colour.better'),
); );
return isset($colors[$state]) ? $colors[$state] : '#337AB7'; return isset($colors[$state]) ? $colors[$state] : '#337AB7';

View File

@@ -16,6 +16,7 @@
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Config; use LibreNMS\Config;
class Alerta extends Transport class Alerta extends Transport
@@ -34,7 +35,7 @@ class Alerta extends Transport
$host = $opts['url']; $host = $opts['url'];
$curl = curl_init(); $curl = curl_init();
$text = strip_tags($obj['msg']); $text = strip_tags($obj['msg']);
$severity = ($obj['state'] == 0 ? $opts['recoverstate'] : $opts['alertstate']); $severity = ($obj['state'] == AlertState::RECOVERED ? $opts['recoverstate'] : $opts['alertstate']);
$deviceurl = (Config::get('base_url') . 'device/device=' . $obj['device_id']); $deviceurl = (Config::get('base_url') . 'device/device=' . $obj['device_id']);
$devicehostname = $obj['hostname']; $devicehostname = $obj['hostname'];
$data = [ $data = [

View File

@@ -23,6 +23,7 @@
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Config; use LibreNMS\Config;
class Alertmanager extends Transport class Alertmanager extends Transport
@@ -37,7 +38,7 @@ class Alertmanager extends Transport
public static function contactAlertmanager($obj, $api) public static function contactAlertmanager($obj, $api)
{ {
if ($obj['state'] == 0) { if ($obj['state'] == AlertState::RECOVERED) {
$alertmanager_status = 'endsAt'; $alertmanager_status = 'endsAt';
} else { } else {
$alertmanager_status = 'startsAt'; $alertmanager_status = 'startsAt';

View File

@@ -26,6 +26,7 @@
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use GuzzleHttp\Client; use GuzzleHttp\Client;
class Api extends Transport class Api extends Transport

View File

@@ -39,6 +39,7 @@
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Config; use LibreNMS\Config;
class Boxcar extends Transport class Boxcar extends Transport
@@ -71,16 +72,16 @@ class Boxcar extends Transport
break; break;
} }
switch ($obj['state']) { switch ($obj['state']) {
case 0: case AlertState::RECOVERED:
$title_text = "OK"; $title_text = "OK";
if (!empty($api['sound_ok'])) { if (!empty($api['sound_ok'])) {
$data['notification[sound]'] = $api['sound_ok']; $data['notification[sound]'] = $api['sound_ok'];
} }
break; break;
case 1: case AlertState::Active:
$title_text = $severity; $title_text = $severity;
break; break;
case 2: case AlertState::ACKNOWLEDGED:
$title_text = "Acknowledged"; $title_text = "Acknowledged";
break; break;
} }

View File

@@ -1,6 +1,7 @@
<?php <?php
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Canopsis extends Transport class Canopsis extends Transport

View File

@@ -11,6 +11,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Ciscospark extends Transport class Ciscospark extends Transport

View File

@@ -23,6 +23,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Clickatell extends Transport class Clickatell extends Transport

View File

@@ -28,6 +28,7 @@
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Discord extends Transport class Discord extends Transport

View File

@@ -23,6 +23,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Dummy extends Transport class Dummy extends Transport

View File

@@ -16,6 +16,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. */ * along with this program. If not, see <http://www.gnu.org/licenses/>. */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Elasticsearch extends Transport class Elasticsearch extends Transport
@@ -65,19 +66,19 @@ class Elasticsearch extends Transport
$host = $es_host . ':' . $es_port . '/' . $index . '/' . $type; $host = $es_host . ':' . $es_port . '/' . $index . '/' . $type;
switch ($obj['state']) { switch ($obj['state']) {
case 0: case AlertState::RECOVERED:
$state = "ok"; $state = "ok";
break; break;
case 1: case AlertState::ACTIVE:
$state = $severity; $state = $severity;
break; break;
case 2: case AlertState::ACKNOWLEDGED:
$state = "acknowledged"; $state = "acknowledged";
break; break;
case 3: case AlertState::WORSE:
$state = "worse"; $state = "worse";
break; break;
case 4: case AlertState::BETTER:
$state = "better"; $state = "better";
break; break;
} }

View File

@@ -23,6 +23,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Gitlab extends Transport class Gitlab extends Transport
@@ -40,7 +41,7 @@ class Gitlab extends Transport
public function contactGitlab($obj, $opts) public function contactGitlab($obj, $opts)
{ {
// Don't create tickets for resolutions // Don't create tickets for resolutions
if ($obj['state'] != 0) { if ($obj['state'] != AlertState::CLEAR) {
$device = device_by_id_cache($obj['device_id']); // for event logging $device = device_by_id_cache($obj['device_id']); // for event logging
$project_id = $opts['project-id']; $project_id = $opts['project-id'];

View File

@@ -23,6 +23,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Hipchat extends Transport class Hipchat extends Transport

View File

@@ -23,6 +23,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
/** /**
@@ -46,7 +47,7 @@ class Hue extends Transport
public function contactHue($obj, $opts) public function contactHue($obj, $opts)
{ {
// Don't alert on resolve at this time // Don't alert on resolve at this time
if ($obj['state'] == 0) { if ($obj['state'] == AlertState::RECOVERED) {
return true; return true;
} else { } else {
$device = device_by_id_cache($obj['device_id']); // for event logging $device = device_by_id_cache($obj['device_id']); // for event logging

View File

@@ -23,6 +23,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
use LibreNMS\Config; use LibreNMS\Config;

View File

@@ -23,6 +23,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Jira extends Transport class Jira extends Transport

View File

@@ -11,6 +11,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
use LibreNMS\Config; use LibreNMS\Config;

View File

@@ -6,6 +6,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Linenotify extends Transport class Linenotify extends Transport

View File

@@ -23,6 +23,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
use LibreNMS\Config; use LibreNMS\Config;

View File

@@ -23,6 +23,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Mattermost extends Transport class Mattermost extends Transport

View File

@@ -11,6 +11,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Msteams extends Transport class Msteams extends Transport

View File

@@ -23,6 +23,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Nagios extends Transport class Nagios extends Transport

View File

@@ -23,6 +23,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Opsgenie extends Transport class Opsgenie extends Transport

View File

@@ -11,6 +11,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
use LibreNMS\Config; use LibreNMS\Config;

View File

@@ -27,6 +27,7 @@ namespace LibreNMS\Alert\Transport;
use GuzzleHttp\Client; use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException; use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
use Log; use Log;
use Validator; use Validator;
@@ -37,9 +38,9 @@ class Pagerduty extends Transport
public function deliverAlert($obj, $opts) public function deliverAlert($obj, $opts)
{ {
if ($obj['state'] == 0) { if ($obj['state'] == AlertState::RECOVERED) {
$obj['event_type'] = 'resolve'; $obj['event_type'] = 'resolve';
} elseif ($obj['state'] == 2) { } elseif ($obj['state'] == AlertState::ACKNOWLEDGED) {
$obj['event_type'] = 'acknowledge'; $obj['event_type'] = 'acknowledge';
} else { } else {
$obj['event_type'] = 'trigger'; $obj['event_type'] = 'trigger';

View File

@@ -23,6 +23,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Playsms extends Transport class Playsms extends Transport

View File

@@ -23,6 +23,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Pushbullet extends Transport class Pushbullet extends Transport

View File

@@ -37,6 +37,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Pushover extends Transport class Pushover extends Transport
@@ -69,7 +70,7 @@ class Pushover extends Transport
break; break;
} }
switch ($obj['state']) { switch ($obj['state']) {
case 0: case AlertState::RECOVERED:
$data['priority'] = 0; $data['priority'] = 0;
if (!empty($api['options']['sound_ok'])) { if (!empty($api['options']['sound_ok'])) {
$data['sound'] = $api['options']['sound_ok']; $data['sound'] = $api['options']['sound_ok'];

View File

@@ -23,6 +23,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Rocket extends Transport class Rocket extends Transport

View File

@@ -22,6 +22,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
use LibreNMS\Config; use LibreNMS\Config;
@@ -37,13 +38,6 @@ class Sensu extends Transport
const CRITICAL = 2; const CRITICAL = 2;
const UNKNOWN = 3; const UNKNOWN = 3;
// LibreNMS alert coding
const RECOVER = 0;
const ALERT = 1;
const ACK = 2;
const WORSE = 3;
const BETTER = 4;
private static $status = array( private static $status = array(
'ok' => Sensu::OK, 'ok' => Sensu::OK,
'warning' => Sensu::WARNING, 'warning' => Sensu::WARNING,
@@ -51,11 +45,11 @@ class Sensu extends Transport
); );
private static $severity = array( private static $severity = array(
'recovered' => Sensu::RECOVER, 'recovered' => AlertState::RECOVERED,
'alert' => Sensu::ALERT, 'alert' => AlertState::ACTIVE,
'acknowledged' => Sensu::ACK, 'acknowledged' => AlertState::ACKNOWLEDGED,
'worse' => Sensu::WORSE, 'worse' => AlertState::WORSE,
'better' => Sensu::BETTER, 'better' => AlertState::BETTER,
); );
private static $client = null; private static $client = null;
@@ -85,7 +79,7 @@ class Sensu extends Transport
return 'Sensu API is not responding'; return 'Sensu API is not responding';
} }
if ($obj['state'] !== Sensu::RECOVER && $obj['state'] !== Sensu::ACK && $obj['alerted'] === 0) { if ($obj['state'] !== AlertState::RECOVERED && $obj['state'] !== AlertState::ACKNOWLEDGED && $obj['alerted'] === 0) {
// If this is the first event, send a forced "ok" dated (rrd.step / 2) seconds ago to tell Sensu the last time the check was healthy // If this is the first event, send a forced "ok" dated (rrd.step / 2) seconds ago to tell Sensu the last time the check was healthy
$data = Sensu::generateData($obj, $opts, Sensu::OK, round(Config::get('rrd.step', 300) / 2)); $data = Sensu::generateData($obj, $opts, Sensu::OK, round(Config::get('rrd.step', 300) / 2));
Log::debug('Sensu transport sent last good event to socket: ', $data); Log::debug('Sensu transport sent last good event to socket: ', $data);
@@ -142,7 +136,7 @@ class Sensu extends Transport
{ {
return array_filter([ return array_filter([
'generated-by' => 'LibreNMS', 'generated-by' => 'LibreNMS',
'acknowledged' => $obj['state'] === Sensu::ACK ? 'true' : 'false', 'acknowledged' => $obj['state'] === AlertState::ACKNOWLEDGED ? 'true' : 'false',
'contact' => $obj['sysContact'], 'contact' => $obj['sysContact'],
'description' => $obj['sysDescr'], 'description' => $obj['sysDescr'],
'location' => $obj['location'], 'location' => $obj['location'],
@@ -158,7 +152,7 @@ class Sensu extends Transport
{ {
// Sensu only has a single short (status) to indicate both severity and status, so we need to map LibreNMS' state and severity onto it // Sensu only has a single short (status) to indicate both severity and status, so we need to map LibreNMS' state and severity onto it
if ($state === Sensu::RECOVER) { if ($state === AlertState::RECOVERED) {
// LibreNMS alert is resolved, send ok // LibreNMS alert is resolved, send ok
return Sensu::OK; return Sensu::OK;
} }

View File

@@ -23,6 +23,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Slack extends Transport class Slack extends Transport

View File

@@ -23,6 +23,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;

View File

@@ -23,6 +23,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Smsfeedback extends Transport class Smsfeedback extends Transport

View File

@@ -16,6 +16,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. */ * along with this program. If not, see <http://www.gnu.org/licenses/>. */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Splunk extends Transport class Splunk extends Transport
@@ -68,30 +69,30 @@ class Splunk extends Transport
} }
switch ($obj['state']) { switch ($obj['state']) {
case 0: case AlertState::RECOVERED:
$severity = 6; $severity = 6;
break; break;
case 2: case AlertState::ACKNOWLEDGED:
$severity = 6; $severity = 6;
break; break;
} }
$ignore = array("template", "contacts", "rule", "string", "debug", "faults", "builder", "transport", "alert", "msg", "transport_name"); $ignore = array("template", "contacts", "rule", "string", "debug", "faults", "builder", "transport", "alert", "msg", "transport_name");
$splunk_prefix = '<' . $severity . '> '; $splunk_prefix = '<' . $severity . '> ';
foreach ($obj as $key => $val) { foreach ($obj as $key => $val) {
if (in_array($key, $ignore)) { if (in_array($key, $ignore)) {
continue; continue;
} }
$splunk_prefix .= $key . '="' . $val . '", '; $splunk_prefix .= $key . '="' . $val . '", ';
} }
$ignore = array("attribs", "vrf_lite_cisco", "community", "authlevel", "authname", "authpass", "authalgo", "cryptopass", "cryptoalgo", "snmpver", "port"); $ignore = array("attribs", "vrf_lite_cisco", "community", "authlevel", "authname", "authpass", "authalgo", "cryptopass", "cryptoalgo", "snmpver", "port");
foreach ($device as $key => $val) { foreach ($device as $key => $val) {
if (in_array($key, $ignore)) { if (in_array($key, $ignore)) {
continue; continue;
} }
$splunk_prefix .= 'device_' . $key . '="' . $val . '", '; $splunk_prefix .= 'device_' . $key . '="' . $val . '", ';
} }
$splunk_prefix = substr($splunk_prefix, 0, -1); $splunk_prefix = substr($splunk_prefix, 0, -1);
@@ -113,7 +114,7 @@ class Splunk extends Transport
} }
return true; return true;
} }
public static function configTemplate() public static function configTemplate()
{ {
return [ return [

View File

@@ -16,6 +16,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. */ * along with this program. If not, see <http://www.gnu.org/licenses/>. */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Syslog extends Transport class Syslog extends Transport
@@ -79,14 +80,14 @@ class Syslog extends Transport
} }
switch ($obj['state']) { switch ($obj['state']) {
case 0: case AlertState::RECOVERED:
$state = "OK"; $state = "OK";
$severity = 6; $severity = 6;
break; break;
case 1: case AlertState::ACTIVE:
$state = $sev_txt; $state = $sev_txt;
break; break;
case 2: case AlertState::ACKNOWLEDGED:
$state = "Acknowledged"; $state = "Acknowledged";
$severity = 6; $severity = 6;
break; break;

View File

@@ -24,6 +24,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Telegram extends Transport class Telegram extends Transport

View File

@@ -15,6 +15,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Twilio extends Transport class Twilio extends Transport

View File

@@ -24,6 +24,7 @@
*/ */
namespace LibreNMS\Alert\Transport; namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport; use LibreNMS\Alert\Transport;
class Victorops extends Transport class Victorops extends Transport
@@ -47,11 +48,11 @@ class Victorops extends Transport
'state_message' => $obj['msg'], 'state_message' => $obj['msg'],
'monitoring_tool' => 'librenms', 'monitoring_tool' => 'librenms',
); );
if ($obj['state'] == 0) { if ($obj['state'] == AlertState::RECOVERED) {
$protocol['message_type'] = 'recovery'; $protocol['message_type'] = 'recovery';
} elseif ($obj['state'] == 2) { } elseif ($obj['state'] == AlertState::ACKNOWLEDGED) {
$protocol['message_type'] = 'acknowledgement'; $protocol['message_type'] = 'acknowledgement';
} elseif ($obj['state'] == 1) { } elseif ($obj['state'] == AlertState::ACTIVE) {
$protocol['message_type'] = 'critical'; $protocol['message_type'] = 'critical';
} }

View File

@@ -0,0 +1,36 @@
<?php
/**
* Alert.php
*
* Enumerates alarming Level
*
* 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.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @package LibreNMS
* @link http://librenms.org
* @copyright 2020 Thomas Berberich
* @author Thomas Berberich <sourcehhdoctor@gmail.com>
*/
namespace LibreNMS\Enum;
abstract class AlertState
{
const CLEAR = 0;
const ACTIVE = 1;
const ACKNOWLEDGED = 2;
const WORSE = 3;
const BETTER = 4;
const RECOVERED = 0;
}

View File

@@ -22,6 +22,7 @@ namespace LibreNMS;
use LibreNMS\DB\Eloquent; use LibreNMS\DB\Eloquent;
use LibreNMS\Authentication\LegacyAuth; use LibreNMS\Authentication\LegacyAuth;
use LibreNMS\Enum\AlertState;
class IRCBot class IRCBot
{ {
@@ -237,10 +238,10 @@ class IRCBot
} }
switch ($alert['state']) : switch ($alert['state']) :
case 3: case AlertState::WORSE:
$severity_extended = '+'; $severity_extended = '+';
break; break;
case 4: case AlertState::BETTER:
$severity_extended = '-'; $severity_extended = '-';
break; break;
default: default:
@@ -248,7 +249,7 @@ class IRCBot
endswitch; endswitch;
$severity = str_replace(array('warning', 'critical'), array($this->_color('Warning', 'yellow'), $this->_color('Critical', 'red')), $alert['severity']).$severity_extended.' '; $severity = str_replace(array('warning', 'critical'), array($this->_color('Warning', 'yellow'), $this->_color('Critical', 'red')), $alert['severity']).$severity_extended.' ';
if ($alert['state'] == 0 and $this->config['irc_alert_utf8']) { if ($alert['state'] == AlertState::RECOVERED and $this->config['irc_alert_utf8']) {
$severity = str_replace(array('Warning', 'Critical'), array('̶W̶a̶r̶n̶i̶n̶g', '̶C̶r̶i̶t̶i̶c̶a̶l'), $severity); $severity = str_replace(array('Warning', 'Critical'), array('̶W̶a̶r̶n̶i̶n̶g', '̶C̶r̶i̶t̶i̶c̶a̶l'), $severity);
} }

View File

@@ -530,7 +530,7 @@ class Service:
exception("Unable to log performance statistics - is the database still online?") exception("Unable to log performance statistics - is the database still online?")
def logfile_watchdog(self): def logfile_watchdog(self):
try: try:
# check that lofgile has been written to within last poll period # check that lofgile has been written to within last poll period
logfile_mdiff = datetime.now().timestamp() - os.path.getmtime(self.config.watchdog_logfile) logfile_mdiff = datetime.now().timestamp() - os.path.getmtime(self.config.watchdog_logfile)

View File

@@ -27,6 +27,7 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use LibreNMS\Enum\AlertState;
class Alert extends Model class Alert extends Model
{ {
@@ -41,7 +42,7 @@ class Alert extends Model
*/ */
public function scopeActive($query) public function scopeActive($query)
{ {
return $query->where('state', '=', '1'); return $query->where('state', '=', AlertState::ACTIVE);
} }
/** /**
@@ -51,7 +52,7 @@ class Alert extends Model
*/ */
public function scopeAcknowledged($query) public function scopeAcknowledged($query)
{ {
return $query->where('state', '=', '2'); return $query->where('state', '=', AlertState::ACKNOWLEDGED);
} }
// ---- Define Relationships ---- // ---- Define Relationships ----

View File

@@ -26,6 +26,7 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use LibreNMS\Enum\AlertState;
class AlertRule extends BaseModel class AlertRule extends BaseModel
{ {
@@ -52,7 +53,7 @@ class AlertRule extends BaseModel
{ {
return $query->enabled() return $query->enabled()
->join('alerts', 'alerts.rule_id', 'alert_rules.id') ->join('alerts', 'alerts.rule_id', 'alert_rules.id')
->whereNotIn('alerts.state', [0, 2]); ->whereNotIn('alerts.state', [AlertState::CLEAR, AlertState::ACKNOWLEDGED, AlertState::RECOVERED]);
} }
/** /**