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 LibreNMS\Alert\AlertUtil;
use LibreNMS\Alert\AlertDB;
use LibreNMS\Enum\AlertState;
class AlertRules
{
@@ -50,7 +51,7 @@ class AlertRules
//Check to see if disable alerting is set
if (AlertUtil::hasDisableNotify($device_id)) {
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['open'] = 0;
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]);
if ($doalert) {
if ($current_state == 2) {
if ($current_state == AlertState::ACKNOWLEDGED) {
c_echo('Status: %ySKIP');
} elseif ($current_state >= 1) {
} elseif ($current_state >= AlertState::ACTIVE) {
c_echo('Status: %bNOCHG');
// 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.
@@ -108,24 +109,24 @@ class AlertRules
dbUpdate(array('details' => $details), 'alert_log', 'id = ?', array($alert_log['id']));
} else {
$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)) {
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 {
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');
}
}
} else {
if (!is_null($current_state) && $current_state == 0) {
if (!is_null($current_state) && $current_state == AlertState::RECOVERED) {
c_echo('Status: %bNOCHG');
} 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)) {
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 {
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');

View File

@@ -33,6 +33,7 @@ namespace LibreNMS\Alert;
use App\Models\DevicePerf;
use LibreNMS\Config;
use LibreNMS\Util\Time;
use LibreNMS\Enum\AlertState;
use Log;
class RunAlerts
@@ -122,13 +123,13 @@ class RunAlerts
$tpl = new Template;
$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']);
if ($alert['state'] == 2) {
if ($alert['state'] == AlertState::ACKNOWLEDGED) {
$obj['title'] .= ' got acknowledged';
} elseif ($alert['state'] == 3) {
} elseif ($alert['state'] == AlertState::WORSE) {
$obj['title'] .= ' got worse';
} elseif ($alert['state'] == 4) {
} elseif ($alert['state'] == AlertState::BETTER) {
$obj['title'] .= ' got better';
}
@@ -146,9 +147,9 @@ class RunAlerts
if (!empty($extra['diff'])) {
$obj['diff'] = $extra['diff'];
}
} elseif ($alert['state'] == 0) {
} elseif ($alert['state'] == AlertState::RECOVERED) {
// 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'])) {
return false;
}
@@ -222,7 +223,7 @@ class RunAlerts
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) {
if (empty($alert['hostname']) && isset($alert['alert_id'])) {
dbDelete('alerts', '`id` = ?', array($alert['alert_id']));
@@ -289,9 +290,9 @@ class RunAlerts
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);
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()
{
foreach ($this->loadAlerts('alerts.state > 0 && alerts.open = 0') as $alert) {
if ($alert['state'] != 2 || ($alert['info']['until_clear'] === false)) {
foreach ($this->loadAlerts('alerts.state > '.AlertState::CLEAR.' && alerts.open = 0') as $alert) {
if ($alert['state'] != AlertState::ACKNOWLEDGED || ($alert['info']['until_clear'] === false)) {
$rextra = json_decode($alert['extra'], true);
if ($rextra['invert']) {
continue;
@@ -322,18 +323,18 @@ class RunAlerts
$o = sizeof($alert['details']['rule']);
$n = sizeof($chk);
$ret = 'Alert #' . $alert['id'];
$state = 0;
$state = AlertState::CLEAR;
if ($n > $o) {
$ret .= ' Worsens';
$state = 3;
$state = AlertState::WORSE;
$alert['details']['diff'] = array_diff($chk, $alert['details']['rule']);
} elseif ($n < $o) {
$ret .= ' Betters';
$state = 4;
$state = AlertState::BETTER;
$alert['details']['diff'] = array_diff($alert['details']['rule'], $chk);
}
if ($state > 0 && $n > 0) {
if ($state > AlertState::CLEAR && $n > 0) {
$alert['details']['rule'] = $chk;
if (dbInsert(array(
'state' => $state,
@@ -385,7 +386,7 @@ class 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;
$noacc = false;
$updet = false;
@@ -404,7 +405,7 @@ class RunAlerts
$tolerence_window = Config::get('alert.tolerance_window');
if (!empty($rextra['count']) && empty($rextra['interval'])) {
// 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'])) {
continue;
} 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']) {
$noacc = true;
}
@@ -423,7 +424,7 @@ class RunAlerts
}
} else {
// 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;
}
@@ -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']) {
$noacc = true;
}
@@ -470,7 +471,7 @@ class RunAlerts
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
$noiss = true;
}
@@ -545,9 +546,9 @@ class RunAlerts
public function alertLog($result, $obj, $transport)
{
$prefix = [
0 => "recovery",
1 => $obj['severity']." alert",
2 => "acknowledgment"
AlertState::RECOVERED => "recovery",
AlertState::ACTIVE => $obj['severity']." alert",
AlertState::ACKNOWLEDGED => "acknowledgment"
];
$prefix[3] = &$prefix[0];
$prefix[4] = &$prefix[0];

View File

@@ -26,6 +26,7 @@
namespace LibreNMS\Alert;
use App\Models\AlertTemplate;
use LibreNMS\Enum\AlertState;
class Template
{
@@ -107,7 +108,7 @@ class Template
{
return '{{ $alert->title }}' . 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 .
'Unique-ID: {{ $alert->uid }}' . 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 LibreNMS\Interfaces\Alert\Transport as TransportInterface;
use LibreNMS\Config;
use LibreNMS\Enum\AlertState;
abstract class Transport implements TransportInterface
{
@@ -48,11 +49,11 @@ abstract class Transport implements TransportInterface
public static function getColorForState($state)
{
$colors = array(
0 => Config::get('alert_colour.ok'),
1 => Config::get('alert_colour.bad'),
2 => Config::get('alert_colour.acknowledged'),
3 => Config::get('alert_colour.worse'),
4 => Config::get('alert_colour.better'),
AlertState::CLEAR => Config::get('alert_colour.ok'),
AlertState::ACTIVE => Config::get('alert_colour.bad'),
AlertState::ACKNOWLEDGED => Config::get('alert_colour.acknowledged'),
AlertState::WORSE => Config::get('alert_colour.worse'),
AlertState::BETTER => Config::get('alert_colour.better'),
);
return isset($colors[$state]) ? $colors[$state] : '#337AB7';

View File

@@ -16,6 +16,7 @@
namespace LibreNMS\Alert\Transport;
use LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Config;
class Alerta extends Transport
@@ -34,7 +35,7 @@ class Alerta extends Transport
$host = $opts['url'];
$curl = curl_init();
$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']);
$devicehostname = $obj['hostname'];
$data = [

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -23,6 +23,7 @@
*/
namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport;
class Gitlab extends Transport
@@ -40,7 +41,7 @@ class Gitlab extends Transport
public function contactGitlab($obj, $opts)
{
// 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
$project_id = $opts['project-id'];

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -22,6 +22,7 @@
*/
namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport;
use LibreNMS\Config;
@@ -37,13 +38,6 @@ class Sensu extends Transport
const CRITICAL = 2;
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(
'ok' => Sensu::OK,
'warning' => Sensu::WARNING,
@@ -51,11 +45,11 @@ class Sensu extends Transport
);
private static $severity = array(
'recovered' => Sensu::RECOVER,
'alert' => Sensu::ALERT,
'acknowledged' => Sensu::ACK,
'worse' => Sensu::WORSE,
'better' => Sensu::BETTER,
'recovered' => AlertState::RECOVERED,
'alert' => AlertState::ACTIVE,
'acknowledged' => AlertState::ACKNOWLEDGED,
'worse' => AlertState::WORSE,
'better' => AlertState::BETTER,
);
private static $client = null;
@@ -85,7 +79,7 @@ class Sensu extends Transport
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
$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);
@@ -142,7 +136,7 @@ class Sensu extends Transport
{
return array_filter([
'generated-by' => 'LibreNMS',
'acknowledged' => $obj['state'] === Sensu::ACK ? 'true' : 'false',
'acknowledged' => $obj['state'] === AlertState::ACKNOWLEDGED ? 'true' : 'false',
'contact' => $obj['sysContact'],
'description' => $obj['sysDescr'],
'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
if ($state === Sensu::RECOVER) {
if ($state === AlertState::RECOVERED) {
// LibreNMS alert is resolved, send ok
return Sensu::OK;
}

View File

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

View File

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

View File

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

View File

@@ -16,6 +16,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. */
namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport;
class Splunk extends Transport
@@ -68,10 +69,10 @@ class Splunk extends Transport
}
switch ($obj['state']) {
case 0:
case AlertState::RECOVERED:
$severity = 6;
break;
case 2:
case AlertState::ACKNOWLEDGED:
$severity = 6;
break;
}

View File

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

View File

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

View File

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

View File

@@ -24,6 +24,7 @@
*/
namespace LibreNMS\Alert\Transport;
use LibreNMS\Enum\AlertState;
use LibreNMS\Alert\Transport;
class Victorops extends Transport
@@ -47,11 +48,11 @@ class Victorops extends Transport
'state_message' => $obj['msg'],
'monitoring_tool' => 'librenms',
);
if ($obj['state'] == 0) {
if ($obj['state'] == AlertState::RECOVERED) {
$protocol['message_type'] = 'recovery';
} elseif ($obj['state'] == 2) {
} elseif ($obj['state'] == AlertState::ACKNOWLEDGED) {
$protocol['message_type'] = 'acknowledgement';
} elseif ($obj['state'] == 1) {
} elseif ($obj['state'] == AlertState::ACTIVE) {
$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\Authentication\LegacyAuth;
use LibreNMS\Enum\AlertState;
class IRCBot
{
@@ -237,10 +238,10 @@ class IRCBot
}
switch ($alert['state']) :
case 3:
case AlertState::WORSE:
$severity_extended = '+';
break;
case 4:
case AlertState::BETTER:
$severity_extended = '-';
break;
default:
@@ -248,7 +249,7 @@ class IRCBot
endswitch;
$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);
}

View File

@@ -27,6 +27,7 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use LibreNMS\Enum\AlertState;
class Alert extends Model
{
@@ -41,7 +42,7 @@ class Alert extends Model
*/
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)
{
return $query->where('state', '=', '2');
return $query->where('state', '=', AlertState::ACKNOWLEDGED);
}
// ---- Define Relationships ----

View File

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