From 928fd70ced38eff20eea8de6cb2dc38c4e548c1e Mon Sep 17 00:00:00 2001 From: Rosiak Date: Fri, 26 Feb 2016 23:40:34 +0100 Subject: [PATCH 1/8] Proper State Monitoring --- .../device/overview/generic/sensor.inc.php | 45 ++++++++++++++++--- .../discovery/sensors/states/cisco.inc.php | 43 ++++++++++++++++++ includes/functions.php | 31 +++++++++++++ sql-schema/105.sql | 5 +++ 4 files changed, 118 insertions(+), 6 deletions(-) create mode 100644 includes/discovery/sensors/states/cisco.inc.php create mode 100644 sql-schema/105.sql diff --git a/html/pages/device/overview/generic/sensor.inc.php b/html/pages/device/overview/generic/sensor.inc.php index c93660b6f..3dcae4da1 100644 --- a/html/pages/device/overview/generic/sensor.inc.php +++ b/html/pages/device/overview/generic/sensor.inc.php @@ -2,6 +2,10 @@ $sensors = dbFetchRows('SELECT * FROM `sensors` WHERE `sensor_class` = ? AND device_id = ? ORDER BY `poller_type`, `sensor_oid`, `sensor_index`', array($sensor_class, $device['device_id'])); +if ($sensor_class == 'state') { + $sensors = dbFetchRows('SELECT * FROM `sensors` LEFT JOIN `sensors_to_state_indexes` ON sensors_to_state_indexes.sensor_id = sensors.sensor_id LEFT JOIN state_indexes ON state_indexes.state_index_id = sensors_to_state_indexes.state_index_id WHERE `sensor_class` = ? AND device_id = ? ORDER BY `poller_type`, `sensor_index` ', array($sensor_class, $device['device_id'])); +} + if (count($sensors)) { echo '
@@ -12,6 +16,11 @@ if (count($sensors)) { echo '
'; foreach ($sensors as $sensor) { + $state_translation = array(); + if (!empty($sensor['state_index_id'])) { + $state_translation = dbFetchRows('SELECT * FROM `state_translations` WHERE `state_index_id` = ? AND `state_value` = ? ', array($sensor['state_index_id'], $sensor['sensor_current'])); + } + if (!isset($sensor['sensor_current'])) { $sensor['sensor_current'] = 'NaN'; } @@ -51,12 +60,36 @@ if (count($sensors)) { $sensor_minigraph = generate_lazy_graph_tag($graph_array); $sensor['sensor_descr'] = truncate($sensor['sensor_descr'], 48, ''); - - echo ' - - - - '; + if (!empty($state_translation['0']['state_descr'])) { + $state_style=""; + switch ($state_translation['state_generic_value']) { + case 0: // OK + $state_style="class='label label-success'"; + break; + case 1: // Warning + $state_style="class='label label-warning'"; + break; + case 2: // Critical + $state_style="class='label label-danger'"; + break; + case 3: // Unknown + default: + $state_style="class='label label-default'"; + break; + } + echo ' + + + + '; + } + else { + echo ' + + + + '; + } }//end foreach echo '
'.overlib_link($link, shorten_interface_type($sensor['sensor_descr']), $overlib_content).''.overlib_link($link, $sensor_minigraph, $overlib_content).''.overlib_link($link, ' $sensor['sensor_limit'] ? "style='color: red'" : '').'>'.$sensor['sensor_current'].$sensor_unit.'', $overlib_content).'
'.overlib_link($link, shorten_interface_type($sensor['sensor_descr']), $overlib_content).''.overlib_link($link, $sensor_minigraph, $overlib_content).''.overlib_link($link, ''.$state_translation['0']['state_descr'].'', $overlib_content).'
'.overlib_link($link, shorten_interface_type($sensor['sensor_descr']), $overlib_content).''.overlib_link($link, $sensor_minigraph, $overlib_content).''.overlib_link($link, ' $sensor['sensor_limit'] ? "style='color: red'" : '').'>'.$sensor['sensor_current'].$sensor_unit.'', $overlib_content).'
'; diff --git a/includes/discovery/sensors/states/cisco.inc.php b/includes/discovery/sensors/states/cisco.inc.php new file mode 100644 index 000000000..f4e1ad211 --- /dev/null +++ b/includes/discovery/sensors/states/cisco.inc.php @@ -0,0 +1,43 @@ + $value[0], + 'state_descr' => $value[1], + 'state_draw_graph' => $value[2], + 'state_value' => $value[3], + 'state_generic_value' => $value[4] + ); + dbInsert($insert, 'state_translations'); + } + } + + foreach ($temp as $index => $entry) { + //Discover Sensors + discover_sensor($valid['sensor'], 'state', $device, $cur_oid.$index, $index, $state_name, $temp[$index]['ciscoEnvMonSupplyStatusDescr'], '1', '1', null, null, null, null, $temp[$index]['ciscoEnvMonSupplyState'], 'snmp', $index); + + //Create Sensor To State Index + create_sensor_to_state_index($device, $state_name, $index); + } + } +} diff --git a/includes/functions.php b/includes/functions.php index 37fb4201c..f0b403711 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -1446,3 +1446,34 @@ function rrdtest($path, &$stdOutput, &$stdError) { proc_close($process); return $status['exitcode']; } + +function create_state_index($state_name) { + $insert = array('state_name' => $state_name); + return dbInsert($insert, 'state_indexes'); +} + +function create_sensor_to_state_index($device, $state_name, $index) +{ + $sensor_entry = dbFetchRow('SELECT sensor_id FROM `sensors` WHERE `sensor_class` = ? AND `device_id` = ? AND `sensor_type` = ? AND `sensor_index` = ?', array( + 'state', + $device['device_id'], + $state_name, + $index + )); + $state_indexes_entry = dbFetchRow('SELECT state_index_id FROM `state_indexes` WHERE `state_name` = ?', array( + $state_name + )); + if (!empty($sensor_entry['sensor_id']) && !empty($state_indexes_entry['state_index_id'])) { + $insert = array( + 'sensor_id' => $sensor_entry['sensor_id'], + 'state_index_id' => $state_indexes_entry['state_index_id'], + ); + foreach($insert as $key => $val_check) { + if (!isset($val_check)) { + unset($insert[$key]); + } + } + + $inserted = dbInsert($insert, 'sensors_to_state_indexes'); + } +} diff --git a/sql-schema/105.sql b/sql-schema/105.sql new file mode 100644 index 000000000..fbe3e6e65 --- /dev/null +++ b/sql-schema/105.sql @@ -0,0 +1,5 @@ +CREATE TABLE IF NOT EXISTS `state_indexes` ( `state_index_id` int(11) NOT NULL AUTO_INCREMENT, `state_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`state_index_id`), UNIQUE KEY `state_name` (`state_name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1; +CREATE TABLE IF NOT EXISTS `state_translations` ( `state_translation_id` int(11) NOT NULL AUTO_INCREMENT, `state_index_id` int(11) NOT NULL, `state_descr` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `state_draw_graph` tinyint(1) NOT NULL, `state_value` tinyint(1) NOT NULL, `state_generic_value` tinyint(1) NOT NULL, `state_lastupdated` timestamp NOT NULL, PRIMARY KEY (`state_translation_id`), UNIQUE KEY `state_index_id_value` (`state_index_id`,`state_value`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1; +CREATE TABLE IF NOT EXISTS `sensors_to_state_indexes` ( `sensors_to_state_translations_id` int(11) NOT NULL AUTO_INCREMENT, `sensor_id` int(11) NOT NULL, `state_index_id` int(11) NOT NULL, PRIMARY KEY (`sensors_to_state_translations_id`), UNIQUE KEY `sensor_id_state_index_id` (`sensor_id`,`state_index_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1; +ALTER TABLE `sensors_to_state_indexes` ADD FOREIGN KEY (`sensor_id`) REFERENCES `sensors`(`sensor_id`) ON DELETE RESTRICT ON UPDATE RESTRICT; +ALTER TABLE `sensors_to_state_indexes` ADD FOREIGN KEY (`state_index_id`) REFERENCES `state_indexes`(`state_index_id`) ON DELETE RESTRICT ON UPDATE RESTRICT; From 687bedf1311d61f6d369292e4cee0e7fb7862c6a Mon Sep 17 00:00:00 2001 From: Rosiak Date: Fri, 26 Feb 2016 23:50:32 +0100 Subject: [PATCH 2/8] Add license stuff.. --- includes/discovery/sensors/states/cisco.inc.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/includes/discovery/sensors/states/cisco.inc.php b/includes/discovery/sensors/states/cisco.inc.php index f4e1ad211..1299a2bc9 100644 --- a/includes/discovery/sensors/states/cisco.inc.php +++ b/includes/discovery/sensors/states/cisco.inc.php @@ -1,4 +1,14 @@ + * 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 ($device['os_group'] == 'cisco') { $temp = snmpwalk_cache_multi_oid($device, 'ciscoEnvMonSupplyStatusTable', array(), 'CISCO-ENVMON-MIB'); From d030e959dfcbb2d3307f144ab1e58d5f29b08e14 Mon Sep 17 00:00:00 2001 From: Rosiak Date: Fri, 26 Feb 2016 23:56:54 +0100 Subject: [PATCH 3/8] Scrut fix --- includes/functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/functions.php b/includes/functions.php index f0b403711..ad1463066 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -1474,6 +1474,6 @@ function create_sensor_to_state_index($device, $state_name, $index) } } - $inserted = dbInsert($insert, 'sensors_to_state_indexes'); + dbInsert($insert, 'sensors_to_state_indexes'); } } From ebe9154934f0e9a1e7decb0ceb8a0ebf28eca030 Mon Sep 17 00:00:00 2001 From: Rosiak Date: Sat, 27 Feb 2016 01:56:50 +0100 Subject: [PATCH 4/8] Added more sensors --- .../device/overview/generic/sensor.inc.php | 2 +- .../discovery/sensors/states/cisco.inc.php | 72 +++++++++++-------- 2 files changed, 42 insertions(+), 32 deletions(-) diff --git a/html/pages/device/overview/generic/sensor.inc.php b/html/pages/device/overview/generic/sensor.inc.php index 3dcae4da1..e3dea810b 100644 --- a/html/pages/device/overview/generic/sensor.inc.php +++ b/html/pages/device/overview/generic/sensor.inc.php @@ -3,7 +3,7 @@ $sensors = dbFetchRows('SELECT * FROM `sensors` WHERE `sensor_class` = ? AND device_id = ? ORDER BY `poller_type`, `sensor_oid`, `sensor_index`', array($sensor_class, $device['device_id'])); if ($sensor_class == 'state') { - $sensors = dbFetchRows('SELECT * FROM `sensors` LEFT JOIN `sensors_to_state_indexes` ON sensors_to_state_indexes.sensor_id = sensors.sensor_id LEFT JOIN state_indexes ON state_indexes.state_index_id = sensors_to_state_indexes.state_index_id WHERE `sensor_class` = ? AND device_id = ? ORDER BY `poller_type`, `sensor_index` ', array($sensor_class, $device['device_id'])); + $sensors = dbFetchRows('SELECT * FROM `sensors` LEFT JOIN `sensors_to_state_indexes` ON sensors_to_state_indexes.sensor_id = sensors.sensor_id LEFT JOIN state_indexes ON state_indexes.state_index_id = sensors_to_state_indexes.state_index_id WHERE `sensor_class` = ? AND device_id = ? ORDER BY `poller_type`, `sensor_descr` ', array($sensor_class, $device['device_id'])); } if (count($sensors)) { diff --git a/includes/discovery/sensors/states/cisco.inc.php b/includes/discovery/sensors/states/cisco.inc.php index 1299a2bc9..8f61400b3 100644 --- a/includes/discovery/sensors/states/cisco.inc.php +++ b/includes/discovery/sensors/states/cisco.inc.php @@ -11,43 +11,53 @@ */ if ($device['os_group'] == 'cisco') { - $temp = snmpwalk_cache_multi_oid($device, 'ciscoEnvMonSupplyStatusTable', array(), 'CISCO-ENVMON-MIB'); - $cur_oid = '.1.3.6.1.4.1.9.9.13.1.5.1.3.'; - if (is_array($temp)) { + $tables = array( + array('ciscoEnvMonVoltageStatusTable','.1.3.6.1.4.1.9.9.13.1.2.1.7.','ciscoEnvMonVoltageState','ciscoEnvMonVoltageStatusDescr') , + array('ciscoEnvMonTemperatureStatusTable','.1.3.6.1.4.1.9.9.13.1.3.1.6.','ciscoEnvMonTemperatureState','ciscoEnvMonTemperatureStatusDescr') , + array('ciscoEnvMonFanStatusTable','.1.3.6.1.4.1.9.9.13.1.4.1.3.','ciscoEnvMonFanState','ciscoEnvMonFanStatusDescr') , + array('ciscoEnvMonSupplyStatusTable','.1.3.6.1.4.1.9.9.13.1.5.1.3.','ciscoEnvMonSupplyState','ciscoEnvMonSupplyStatusDescr') + ); - //Create State Index - $state_name = 'ciscoEnvMonSupplyState'; - $state_index_id = create_state_index($state_name); + foreach($tables as $tablevalue){ + $temp = snmpwalk_cache_multi_oid($device, $tablevalue[0], array(), 'CISCO-ENVMON-MIB'); + $cur_oid = $tablevalue[1]; - //Create State Translation - if ($state_index_id) { - $states = array( - array($state_index_id,'normal',0,1,0) , - array($state_index_id,'warning',0,2,1) , - array($state_index_id,'critical',0,3,2) , - array($state_index_id,'shutdown',0,4,3) , - array($state_index_id,'notPresent',0,5,3) , - array($state_index_id,'notFunctioning',0,6,2) - ); - foreach($states as $value){ - $insert = array( - 'state_index_id' => $value[0], - 'state_descr' => $value[1], - 'state_draw_graph' => $value[2], - 'state_value' => $value[3], - 'state_generic_value' => $value[4] - ); - dbInsert($insert, 'state_translations'); + if (is_array($temp)) { + + //Create State Index + $state_name = $tablevalue[2]; + $state_index_id = create_state_index($state_name); + + //Create State Translation + if ($state_index_id) { + $states = array( + array($state_index_id,'normal',0,1,0) , + array($state_index_id,'warning',0,2,1) , + array($state_index_id,'critical',0,3,2) , + array($state_index_id,'shutdown',0,4,3) , + array($state_index_id,'notPresent',0,5,3) , + array($state_index_id,'notFunctioning',0,6,2) + ); + foreach($states as $value){ + $insert = array( + 'state_index_id' => $value[0], + 'state_descr' => $value[1], + 'state_draw_graph' => $value[2], + 'state_value' => $value[3], + 'state_generic_value' => $value[4] + ); + dbInsert($insert, 'state_translations'); + } } - } - foreach ($temp as $index => $entry) { - //Discover Sensors - discover_sensor($valid['sensor'], 'state', $device, $cur_oid.$index, $index, $state_name, $temp[$index]['ciscoEnvMonSupplyStatusDescr'], '1', '1', null, null, null, null, $temp[$index]['ciscoEnvMonSupplyState'], 'snmp', $index); + foreach ($temp as $index => $entry) { + //Discover Sensors + discover_sensor($valid['sensor'], 'state', $device, $cur_oid.$index, $index, $state_name, $temp[$index][$tablevalue[3]], '1', '1', null, null, null, null, $temp[$index][$tablevalue[2]], 'snmp', $index); - //Create Sensor To State Index - create_sensor_to_state_index($device, $state_name, $index); + //Create Sensor To State Index + create_sensor_to_state_index($device, $state_name, $index); + } } } } From 6923a32dbde118b016212afac855d32418fb8ecb Mon Sep 17 00:00:00 2001 From: Rosiak Date: Sat, 27 Feb 2016 02:35:28 +0100 Subject: [PATCH 5/8] A few things ucwords = happy ocd Basic state page Allign order = happy ocd --- html/pages/device/overview/generic/sensor.inc.php | 2 +- html/pages/health.inc.php | 2 ++ html/pages/health/state.inc.php | 7 +++++++ includes/discovery/sensors/states/cisco.inc.php | 3 ++- 4 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 html/pages/health/state.inc.php diff --git a/html/pages/device/overview/generic/sensor.inc.php b/html/pages/device/overview/generic/sensor.inc.php index e3dea810b..45619baab 100644 --- a/html/pages/device/overview/generic/sensor.inc.php +++ b/html/pages/device/overview/generic/sensor.inc.php @@ -3,7 +3,7 @@ $sensors = dbFetchRows('SELECT * FROM `sensors` WHERE `sensor_class` = ? AND device_id = ? ORDER BY `poller_type`, `sensor_oid`, `sensor_index`', array($sensor_class, $device['device_id'])); if ($sensor_class == 'state') { - $sensors = dbFetchRows('SELECT * FROM `sensors` LEFT JOIN `sensors_to_state_indexes` ON sensors_to_state_indexes.sensor_id = sensors.sensor_id LEFT JOIN state_indexes ON state_indexes.state_index_id = sensors_to_state_indexes.state_index_id WHERE `sensor_class` = ? AND device_id = ? ORDER BY `poller_type`, `sensor_descr` ', array($sensor_class, $device['device_id'])); + $sensors = dbFetchRows('SELECT * FROM `sensors` LEFT JOIN `sensors_to_state_indexes` ON sensors_to_state_indexes.sensor_id = sensors.sensor_id LEFT JOIN state_indexes ON state_indexes.state_index_id = sensors_to_state_indexes.state_index_id WHERE `sensor_class` = ? AND device_id = ? ORDER BY `poller_type`, `sensor_oid`, `sensor_index`', array($sensor_class, $device['device_id'])); } if (count($sensors)) { diff --git a/html/pages/health.inc.php b/html/pages/health.inc.php index 49f3032b0..d9ab534f2 100644 --- a/html/pages/health.inc.php +++ b/html/pages/health.inc.php @@ -11,6 +11,7 @@ if ($used_sensors['current']) $datas[] = 'current'; if ($used_sensors['power']) $datas[] = 'power'; if ($used_sensors['dbm']) $datas[] = 'dbm'; if ($used_sensors['load']) $datas[] = 'load'; +if ($used_sensors['state']) $datas[] = 'state'; // FIXME generalize -> static-config ? $type_text['overview'] = "Overview"; @@ -29,6 +30,7 @@ $type_text['power'] = "Power"; $type_text['toner'] = "Toner"; $type_text['dbm'] = "dBm"; $type_text['load'] = "Load"; +$type_text['state'] = "State"; if (!$vars['metric']) { $vars['metric'] = "processor"; diff --git a/html/pages/health/state.inc.php b/html/pages/health/state.inc.php new file mode 100644 index 000000000..b9b8bfc5c --- /dev/null +++ b/html/pages/health/state.inc.php @@ -0,0 +1,7 @@ + $entry) { //Discover Sensors - discover_sensor($valid['sensor'], 'state', $device, $cur_oid.$index, $index, $state_name, $temp[$index][$tablevalue[3]], '1', '1', null, null, null, null, $temp[$index][$tablevalue[2]], 'snmp', $index); + $descr = ucwords($temp[$index][$tablevalue[3]]); + discover_sensor($valid['sensor'], 'state', $device, $cur_oid.$index, $index, $state_name, $descr, '1', '1', null, null, null, null, $temp[$index][$tablevalue[2]], 'snmp', $index); //Create Sensor To State Index create_sensor_to_state_index($device, $state_name, $index); From 73149f3f19aff0e5bd3e0ca44ae08f59004d4e27 Mon Sep 17 00:00:00 2001 From: Rosiak Date: Sat, 27 Feb 2016 15:29:11 +0100 Subject: [PATCH 6/8] More updates Add sensor_prev to be able to alert on state change Add docs --- doc/Developing/Sensor-State-Support.md | 97 ++++++++++++++++++++++++++ includes/polling/functions.inc.php | 6 +- sql-schema/105.sql | 1 + 3 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 doc/Developing/Sensor-State-Support.md diff --git a/doc/Developing/Sensor-State-Support.md b/doc/Developing/Sensor-State-Support.md new file mode 100644 index 000000000..3bdd8a217 --- /dev/null +++ b/doc/Developing/Sensor-State-Support.md @@ -0,0 +1,97 @@ +# Sensor State Support + +### Introduction + +In this section we are briefly going to walk through, what it takes to write sensor state support. +We will also briefly get around the concepts of the current sensor state monitoring. + +### Logic + +For sensor state monitoring, we have 4 DB tables we need to concentrate about. +- sensors +- state_indexes +- state_translations +- sensors_to_state_indexes + +We will just briefly tie a comment to each one of them. + +#### sensors + +*Each time a sensor needs to be polled, the system needs to know which sensor is it that it need to poll, at what oid is this sensor located and what class the sensor is etc. +This information is fetched from the sensors table.* + +#### state_indexes + +*Is where we keep track of which state sensors we monitor.* + +#### state_translations + +*Is where we map the possible returned state sensor values to a generic LibreNMS value, in order to make displaying and alerting more generic. +We also map these values to the actual state sensor(state_index) where these values are actually returned from.* + + +*The LibreNMS generic states is derived from Nagios:* + +``` +0 = OK + +1 = Warning + +2 = Critical + +3 = Unknown +``` + +#### sensors_to_state_indexes + +*Is as you might have guessed, where the sensor_id is mapped to a state_index_id.* + +### Example +This example will be based on a Cisco power supply sensor and is all it takes to have sensor state support for Cisco power supplys in Cisco switches. +The file should be located in /includes/discovery/sensors/state/cisco.inc.php. + +```php + $value[0], + 'state_descr' => $value[1], + 'state_draw_graph' => $value[2], + 'state_value' => $value[3], + 'state_generic_value' => $value[4] + ); + dbInsert($insert, 'state_translations'); + } + } + + foreach ($temp as $index => $entry) { + //Discover Sensors + discover_sensor($valid['sensor'], 'state', $device, $cur_oid.$index, $index, $state_name, $temp[$index]['ciscoEnvMonSupplyStatusDescr'], '1', '1', null, null, null, null, $temp[$index]['ciscoEnvMonSupplyState'], 'snmp', $index); + + //Create Sensor To State Index + create_sensor_to_state_index($device, $state_name, $index); + } + } +} +``` diff --git a/includes/polling/functions.inc.php b/includes/polling/functions.inc.php index 68c48fa94..2db5ee4c5 100644 --- a/includes/polling/functions.inc.php +++ b/includes/polling/functions.inc.php @@ -122,7 +122,11 @@ function poll_sensor($device, $class, $unit) { log_event(ucfirst($class).' '.$sensor['sensor_descr'].' above threshold: '.$sensor_value." $unit (> ".$sensor['sensor_limit']." $unit)", $device, $class, $sensor['sensor_id']); } - dbUpdate(array('sensor_current' => $sensor_value, 'lastupdate' => array('NOW()')), 'sensors', '`sensor_class` = ? AND `sensor_id` = ?', array($class, $sensor['sensor_id'])); + if ($sensor['sensor_class'] == 'state' && $sensor['sensor_current'] != $sensor_value) { + log_event($class . ' sensor has changed from ' . $sensor['sensor_current'] . ' to ' . $sensor_value, $device, $class, $sensor['sensor_id']); + } + + dbUpdate(array('sensor_current' => $sensor_value, 'sensor_prev' => $sensor['sensor_current'], 'lastupdate' => array('NOW()')), 'sensors', '`sensor_class` = ? AND `sensor_id` = ?', array($class,$sensor['sensor_id'])); }//end foreach }//end poll_sensor() diff --git a/sql-schema/105.sql b/sql-schema/105.sql index fbe3e6e65..70f428635 100644 --- a/sql-schema/105.sql +++ b/sql-schema/105.sql @@ -3,3 +3,4 @@ CREATE TABLE IF NOT EXISTS `state_translations` ( `state_translation_id` int(11) CREATE TABLE IF NOT EXISTS `sensors_to_state_indexes` ( `sensors_to_state_translations_id` int(11) NOT NULL AUTO_INCREMENT, `sensor_id` int(11) NOT NULL, `state_index_id` int(11) NOT NULL, PRIMARY KEY (`sensors_to_state_translations_id`), UNIQUE KEY `sensor_id_state_index_id` (`sensor_id`,`state_index_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1; ALTER TABLE `sensors_to_state_indexes` ADD FOREIGN KEY (`sensor_id`) REFERENCES `sensors`(`sensor_id`) ON DELETE RESTRICT ON UPDATE RESTRICT; ALTER TABLE `sensors_to_state_indexes` ADD FOREIGN KEY (`state_index_id`) REFERENCES `state_indexes`(`state_index_id`) ON DELETE RESTRICT ON UPDATE RESTRICT; +ALTER TABLE `sensors` ADD `sensor_prev` float default NULL; From 5a831c6dbc66a491676a1a9dc90761927308534d Mon Sep 17 00:00:00 2001 From: Rosiak Date: Sat, 27 Feb 2016 16:23:58 +0100 Subject: [PATCH 7/8] Check if it exists in table before inserting --- includes/functions.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/includes/functions.php b/includes/functions.php index ad1463066..dcaa363e2 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -1448,8 +1448,10 @@ function rrdtest($path, &$stdOutput, &$stdError) { } function create_state_index($state_name) { - $insert = array('state_name' => $state_name); - return dbInsert($insert, 'state_indexes'); + if (dbFetchRow('SELECT * FROM state_indexes WHERE state_name = ?', array($state_name)) === false) { + $insert = array('state_name' => $state_name); + return dbInsert($insert, 'state_indexes'); + } } function create_sensor_to_state_index($device, $state_name, $index) From f298ccb30fe48ae8cbe6c47326d05523bd9d3912 Mon Sep 17 00:00:00 2001 From: Rosiak Date: Sat, 27 Feb 2016 19:12:13 +0100 Subject: [PATCH 8/8] Scrut fix --- html/pages/device/overview/generic/sensor.inc.php | 12 ++++++------ includes/discovery/sensors/states/cisco.inc.php | 3 +-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/html/pages/device/overview/generic/sensor.inc.php b/html/pages/device/overview/generic/sensor.inc.php index 45619baab..a0cd97187 100644 --- a/html/pages/device/overview/generic/sensor.inc.php +++ b/html/pages/device/overview/generic/sensor.inc.php @@ -78,16 +78,16 @@ if (count($sensors)) { break; } echo ' - '.overlib_link($link, shorten_interface_type($sensor['sensor_descr']), $overlib_content).' - '.overlib_link($link, $sensor_minigraph, $overlib_content).' - '.overlib_link($link, ''.$state_translation['0']['state_descr'].'', $overlib_content).' + '.overlib_link($link, shorten_interface_type($sensor['sensor_descr']), $overlib_content, $sensor_class).' + '.overlib_link($link, $sensor_minigraph, $overlib_content, $sensor_class).' + '.overlib_link($link, ''.$state_translation['0']['state_descr'].'', $overlib_content, $sensor_class).' '; } else { echo ' - '.overlib_link($link, shorten_interface_type($sensor['sensor_descr']), $overlib_content).' - '.overlib_link($link, $sensor_minigraph, $overlib_content).' - '.overlib_link($link, ' $sensor['sensor_limit'] ? "style='color: red'" : '').'>'.$sensor['sensor_current'].$sensor_unit.'', $overlib_content).' + '.overlib_link($link, shorten_interface_type($sensor['sensor_descr']), $overlib_content, $sensor_class).' + '.overlib_link($link, $sensor_minigraph, $overlib_content, $sensor_class).' + '.overlib_link($link, ' $sensor['sensor_limit'] ? "style='color: red'" : '').'>'.$sensor['sensor_current'].$sensor_unit.'', $overlib_content, $sensor_class).' '; } }//end foreach diff --git a/includes/discovery/sensors/states/cisco.inc.php b/includes/discovery/sensors/states/cisco.inc.php index 1fb11c251..a3478c63d 100644 --- a/includes/discovery/sensors/states/cisco.inc.php +++ b/includes/discovery/sensors/states/cisco.inc.php @@ -24,13 +24,12 @@ if ($device['os_group'] == 'cisco') { $cur_oid = $tablevalue[1]; if (is_array($temp)) { - //Create State Index $state_name = $tablevalue[2]; $state_index_id = create_state_index($state_name); //Create State Translation - if ($state_index_id) { + if ($state_index_id !== null) { $states = array( array($state_index_id,'normal',0,1,0) , array($state_index_id,'warning',0,2,1) ,