From 2978aef87c7de6922575403272d44bf681acd50a Mon Sep 17 00:00:00 2001 From: SourceDoctor Date: Sat, 4 Apr 2020 16:43:46 +0200 Subject: [PATCH 1/7] Widget Eventlog - Sensors link and overlib Image --- LibreNMS/Util/Url.php | 71 +++++++++++++++++++ .../Controllers/Table/EventlogController.php | 13 ++++ html/css/styles.css | 16 +++++ includes/polling/functions.inc.php | 4 +- 4 files changed, 102 insertions(+), 2 deletions(-) diff --git a/LibreNMS/Util/Url.php b/LibreNMS/Util/Url.php index d60f6284a6..061ed2f43a 100644 --- a/LibreNMS/Util/Url.php +++ b/LibreNMS/Util/Url.php @@ -171,6 +171,53 @@ class Url return Rewrite::normalizeIfName($text); } + /** + * @param Sensor $sensor + * @param string $text + * @param string $type + * @param boolean $overlib + * @param boolean $single_graph + * @return mixed|string + */ + public static function sensorLink($sensor, $text = null, $type = null, $overlib = true, $single_graph = false) + { + + $label = $sensor->sensor_descr; + if (!$text) { + $text = $label; + } + + $content = '
' . addslashes(htmlentities($sensor->device->displayName() . ' - ' . $label)) . '
'; + + $content .= "
"; + $graph_array = [ + 'type' => $type ?: 'sensor_' . $sensor->sensor_class, + 'legend' => 'yes', + 'height' => 100, + 'width' => 340, + 'to' => Carbon::now()->timestamp, + 'from' => Carbon::now()->subDay()->timestamp, + 'id' => $sensor->sensor_id, + ]; + + $content .= self::graphTag($graph_array); + if (!$single_graph) { + $graph_array['from'] = Carbon::now()->subWeek()->timestamp; + $content .= self::graphTag($graph_array); + $graph_array['from'] = Carbon::now()->subMonth()->timestamp; + $content .= self::graphTag($graph_array); + $graph_array['from'] = Carbon::now()->subYear()->timestamp; + $content .= self::graphTag($graph_array); + } + + $content .= '
'; + + if (!$overlib) { + return $content; + } + return self::overlibLink(self::sensorUrl($sensor), $text, $content, self::sensorLinkDisplayClass($sensor)); + } + public static function deviceUrl($device, $vars = []) { return self::generate(['page' => 'device', 'device' => $device->device_id], $vars); @@ -181,6 +228,11 @@ class Url return self::generate(['page' => 'device', 'device' => $port->device_id, 'tab' => 'port', 'port' => $port->port_id], $vars); } + public static function sensorUrl($sensor, $vars = []) + { + return self::generate(['page' => 'device', 'device' => $sensor->device_id, 'tab' => 'health' , 'metric' => $sensor->sensor_class], $vars); + } + /** * @param Port $port * @return string @@ -369,6 +421,25 @@ class Url return "interface-upup"; } + /** + * Get html class for a sensor + * + * @param Sensor $sensor + * @return string + */ + public static function sensorLinkDisplayClass($sensor) + { + if ($sensor->sensor_current >> $sensor->sensor_limit) { + return "sensor-high"; + } + + if ($sensor->sensor_current << $sensor->sensor_limit_low) { + return "sensor-low"; + } + + return 'sensor-ok'; + } + /** * @param string $os * @param string $feature diff --git a/app/Http/Controllers/Table/EventlogController.php b/app/Http/Controllers/Table/EventlogController.php index c58041ff40..0550c9bc85 100644 --- a/app/Http/Controllers/Table/EventlogController.php +++ b/app/Http/Controllers/Table/EventlogController.php @@ -26,6 +26,7 @@ namespace App\Http\Controllers\Table; use App\Models\Eventlog; +use App\Models\Sensor; use Carbon\Carbon; use LibreNMS\Config; use LibreNMS\Util\Url; @@ -80,6 +81,11 @@ class EventlogController extends TableController ]; } + private function getSensorType($eventlog) { + # generic search if eventlog happens by a sensor + return Sensor::where('sensor_id', $eventlog->reference)->first(); + } + private function formatType($eventlog) { if ($eventlog->type == 'interface') { @@ -89,6 +95,13 @@ class EventlogController extends TableController return '' . Url::portLink($port, $port->getShortLabel()) . ''; } } + } elseif ($sensor = $this->getSensorType($eventlog)) { + // not using polimorpic method 'related' to match every Sensor Class which causes an Event + if (is_numeric($eventlog->reference)) { + if (isset($sensor)) { + return '' . Url::sensorLink($sensor, $sensor->sensor_descr) . ''; + } + } } return $eventlog->type; diff --git a/html/css/styles.css b/html/css/styles.css index 285a90d67c..73aee95d52 100644 --- a/html/css/styles.css +++ b/html/css/styles.css @@ -822,6 +822,22 @@ a.interface-upup:hover, a.interface-updown:hover, a.interface-admindown:hover { color: #999999; } +.sensor-low, a.sensor-low, a.sensor-low:visited { + color: #c11; +} + +.sensor-high, a.sensor-high, a.sensor-high:visited { + color: #c11; +} + +.sensor-ok, a.sensor-ok, a.sensor-ok:visited { + color: #11a; +} + +a.sensor-ok:hover, a.sensor-low:hover, a.sensor-high:hover { + color: #990099; +} + #top { height:17px; padding:2px 21px 0px 21px; diff --git a/includes/polling/functions.inc.php b/includes/polling/functions.inc.php index b879387efb..f5ab7598f3 100644 --- a/includes/polling/functions.inc.php +++ b/includes/polling/functions.inc.php @@ -199,10 +199,10 @@ function record_sensor_data($device, $all_sensors) // FIXME also warn when crossing WARN level! if ($sensor['sensor_limit_low'] != '' && $prev_sensor_value > $sensor['sensor_limit_low'] && $sensor_value < $sensor['sensor_limit_low'] && $sensor['sensor_alert'] == 1) { echo 'Alerting for '.$device['hostname'].' '.$sensor['sensor_descr']."\n"; - log_event("$class {$sensor['sensor_descr']} under threshold: $sensor_value $unit (< {$sensor['sensor_limit_low']} $unit)", $device, $class, 4, $sensor['sensor_id']); + log_event("$class under threshold: $sensor_value $unit (< {$sensor['sensor_limit_low']} $unit)", $device, $class, 4, $sensor['sensor_id']); } elseif ($sensor['sensor_limit'] != '' && $prev_sensor_value < $sensor['sensor_limit'] && $sensor_value > $sensor['sensor_limit'] && $sensor['sensor_alert'] == 1) { echo 'Alerting for '.$device['hostname'].' '.$sensor['sensor_descr']."\n"; - log_event("$class {$sensor['sensor_descr']} above threshold: $sensor_value $unit (> {$sensor['sensor_limit']} $unit)", $device, $class, 4, $sensor['sensor_id']); + log_event("$class above threshold: $sensor_value $unit (> {$sensor['sensor_limit']} $unit)", $device, $class, 4, $sensor['sensor_id']); } if ($sensor['sensor_class'] == 'state' && $prev_sensor_value != $sensor_value) { $trans = array_column( From 66de8621b11b580bc41027c8b1504ad088197d3d Mon Sep 17 00:00:00 2001 From: SourceDoctor Date: Sat, 4 Apr 2020 19:44:34 +0200 Subject: [PATCH 2/7] travis fix --- app/Http/Controllers/Table/EventlogController.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Table/EventlogController.php b/app/Http/Controllers/Table/EventlogController.php index 0550c9bc85..9cb519db18 100644 --- a/app/Http/Controllers/Table/EventlogController.php +++ b/app/Http/Controllers/Table/EventlogController.php @@ -81,7 +81,8 @@ class EventlogController extends TableController ]; } - private function getSensorType($eventlog) { + private function getSensorType($eventlog) + { # generic search if eventlog happens by a sensor return Sensor::where('sensor_id', $eventlog->reference)->first(); } From 285c22ee2da3ad8dceb99856916c39b63fc079ef Mon Sep 17 00:00:00 2001 From: SourceDoctor Date: Sun, 5 Apr 2020 16:55:50 +0200 Subject: [PATCH 3/7] handling via AppServiceProvider --- app/Http/Controllers/Table/EventlogController.php | 11 ++--------- app/Models/Sensor.php | 5 +++++ app/Providers/AppServiceProvider.php | 9 +++++++-- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/app/Http/Controllers/Table/EventlogController.php b/app/Http/Controllers/Table/EventlogController.php index 9cb519db18..6a2dcc39b3 100644 --- a/app/Http/Controllers/Table/EventlogController.php +++ b/app/Http/Controllers/Table/EventlogController.php @@ -26,7 +26,6 @@ namespace App\Http\Controllers\Table; use App\Models\Eventlog; -use App\Models\Sensor; use Carbon\Carbon; use LibreNMS\Config; use LibreNMS\Util\Url; @@ -81,12 +80,6 @@ class EventlogController extends TableController ]; } - private function getSensorType($eventlog) - { - # generic search if eventlog happens by a sensor - return Sensor::where('sensor_id', $eventlog->reference)->first(); - } - private function formatType($eventlog) { if ($eventlog->type == 'interface') { @@ -96,9 +89,9 @@ class EventlogController extends TableController return '' . Url::portLink($port, $port->getShortLabel()) . ''; } } - } elseif ($sensor = $this->getSensorType($eventlog)) { - // not using polimorpic method 'related' to match every Sensor Class which causes an Event + } elseif (get_class($eventlog->related) == 'App\Models\Sensor') { if (is_numeric($eventlog->reference)) { + $sensor = $eventlog->related; if (isset($sensor)) { return '' . Url::sensorLink($sensor, $sensor->sensor_descr) . ''; } diff --git a/app/Models/Sensor.php b/app/Models/Sensor.php index b763b5ef44..21f5ac10c8 100644 --- a/app/Models/Sensor.php +++ b/app/Models/Sensor.php @@ -54,6 +54,11 @@ class Sensor extends DeviceRelatedModel return collect(self::$icons)->get($this->sensor_class, 'delicius'); } + public static function getTypes() + { + return self::groupBy('sensor_class')->pluck('sensor_class')->toArray(); + } + // for the legacy menu public static function getIconMap() { diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index d3b8bb9293..e194634226 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -6,6 +6,7 @@ use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Support\Facades\Blade; use Illuminate\Support\Facades\Log; use Illuminate\Support\ServiceProvider; +use App\Models\Sensor; use LibreNMS\Config; use LibreNMS\Permissions; use LibreNMS\Util\IP; @@ -74,12 +75,16 @@ class AppServiceProvider extends ServiceProvider private function configureMorphAliases() { - Relation::morphMap([ + $sensor_types = []; + foreach (Sensor::getTypes() as $type) { + $sensor_types[ucwords($type)] = \App\Models\Sensor::class; + }; + Relation::morphMap(array_merge([ 'interface' => \App\Models\Port::class, 'sensor' => \App\Models\Sensor::class, 'device' => \App\Models\Device::class, 'device_group' => \App\Models\DeviceGroup::class, - ]); + ], $sensor_types)); } private function registerFacades() From d04e4fca9e620e87e2e39d86caca4143a6319816 Mon Sep 17 00:00:00 2001 From: SourceDoctor Date: Thu, 9 Apr 2020 00:47:04 +0200 Subject: [PATCH 4/7] collect function --- app/Models/Sensor.php | 2 +- app/Providers/AppServiceProvider.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Models/Sensor.php b/app/Models/Sensor.php index 21f5ac10c8..1725e248a2 100644 --- a/app/Models/Sensor.php +++ b/app/Models/Sensor.php @@ -56,7 +56,7 @@ class Sensor extends DeviceRelatedModel public static function getTypes() { - return self::groupBy('sensor_class')->pluck('sensor_class')->toArray(); + return collect(self::groupBy('sensor_class')->pluck('sensor_class')->toArray()); } // for the legacy menu diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index e194634226..476d03c1fe 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -76,7 +76,7 @@ class AppServiceProvider extends ServiceProvider private function configureMorphAliases() { $sensor_types = []; - foreach (Sensor::getTypes() as $type) { + foreach (collect(Sensor::getTypes()) as $type) { $sensor_types[ucwords($type)] = \App\Models\Sensor::class; }; Relation::morphMap(array_merge([ From 49bf5842b15bc5cd1fab57305fbb9a9c63e5cdbe Mon Sep 17 00:00:00 2001 From: SourceDoctor Date: Sat, 11 Apr 2020 17:15:40 +0200 Subject: [PATCH 5/7] Travis ... --- LibreNMS/Util/Url.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/LibreNMS/Util/Url.php b/LibreNMS/Util/Url.php index 061ed2f43a..84b11c4377 100644 --- a/LibreNMS/Util/Url.php +++ b/LibreNMS/Util/Url.php @@ -413,7 +413,6 @@ class Url if ($port->ifAdminStatus == "down") { return "interface-admindown"; } - if ($port->ifAdminStatus == "up" && $port->ifOperStatus != "up") { return "interface-updown"; } @@ -432,7 +431,6 @@ class Url if ($sensor->sensor_current >> $sensor->sensor_limit) { return "sensor-high"; } - if ($sensor->sensor_current << $sensor->sensor_limit_low) { return "sensor-low"; } From b11c7fd27249dbc6b482ed4920e7b26a7a6a47d1 Mon Sep 17 00:00:00 2001 From: SourceDoctor Date: Sat, 11 Apr 2020 20:42:09 +0200 Subject: [PATCH 6/7] static list of Sensor Types --- LibreNMS/Util/Url.php | 2 ++ app/Http/Controllers/Table/EventlogController.php | 2 +- app/Models/Sensor.php | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/LibreNMS/Util/Url.php b/LibreNMS/Util/Url.php index 84b11c4377..061ed2f43a 100644 --- a/LibreNMS/Util/Url.php +++ b/LibreNMS/Util/Url.php @@ -413,6 +413,7 @@ class Url if ($port->ifAdminStatus == "down") { return "interface-admindown"; } + if ($port->ifAdminStatus == "up" && $port->ifOperStatus != "up") { return "interface-updown"; } @@ -431,6 +432,7 @@ class Url if ($sensor->sensor_current >> $sensor->sensor_limit) { return "sensor-high"; } + if ($sensor->sensor_current << $sensor->sensor_limit_low) { return "sensor-low"; } diff --git a/app/Http/Controllers/Table/EventlogController.php b/app/Http/Controllers/Table/EventlogController.php index 6a2dcc39b3..8f4e744a17 100644 --- a/app/Http/Controllers/Table/EventlogController.php +++ b/app/Http/Controllers/Table/EventlogController.php @@ -89,7 +89,7 @@ class EventlogController extends TableController return '' . Url::portLink($port, $port->getShortLabel()) . ''; } } - } elseif (get_class($eventlog->related) == 'App\Models\Sensor') { + } elseif (in_array($eventlog->type, \App\Models\Sensor::getTypes())) { if (is_numeric($eventlog->reference)) { $sensor = $eventlog->related; if (isset($sensor)) { diff --git a/app/Models/Sensor.php b/app/Models/Sensor.php index 1725e248a2..e1526735f2 100644 --- a/app/Models/Sensor.php +++ b/app/Models/Sensor.php @@ -56,7 +56,7 @@ class Sensor extends DeviceRelatedModel public static function getTypes() { - return collect(self::groupBy('sensor_class')->pluck('sensor_class')->toArray()); + return ['Voltage', 'Temperature', 'Fanspeed']; } // for the legacy menu From 8efd7e73725229cecc11b5e7083c4b9b732375f2 Mon Sep 17 00:00:00 2001 From: SourceDoctor Date: Sat, 11 Apr 2020 23:33:14 +0200 Subject: [PATCH 7/7] adding all sensor graph_types --- .../Controllers/Table/EventlogController.php | 2 +- app/Models/Sensor.php | 27 ++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Table/EventlogController.php b/app/Http/Controllers/Table/EventlogController.php index 8f4e744a17..c42fcef457 100644 --- a/app/Http/Controllers/Table/EventlogController.php +++ b/app/Http/Controllers/Table/EventlogController.php @@ -89,7 +89,7 @@ class EventlogController extends TableController return '' . Url::portLink($port, $port->getShortLabel()) . ''; } } - } elseif (in_array($eventlog->type, \App\Models\Sensor::getTypes())) { + } elseif (in_array(strtolower($eventlog->type), \App\Models\Sensor::getTypes())) { if (is_numeric($eventlog->reference)) { $sensor = $eventlog->related; if (isset($sensor)) { diff --git a/app/Models/Sensor.php b/app/Models/Sensor.php index e1526735f2..5a5ca21404 100644 --- a/app/Models/Sensor.php +++ b/app/Models/Sensor.php @@ -56,7 +56,32 @@ class Sensor extends DeviceRelatedModel public static function getTypes() { - return ['Voltage', 'Temperature', 'Fanspeed']; + return ['airflow', + 'ber', + 'chromatic_dispersion', + 'cooling', + 'count', + 'current', + 'dbm', + 'delay', + 'eer', + 'fanspeed', + 'frequency', + 'humidity', + 'load', + 'power_consumed', + 'power_factor', + 'power', + 'pressure', + 'quality_factor', + 'runtime', + 'signal', + 'snr', + 'state', + 'temperature', + 'voltage', + 'waterflow', + ]; } // for the legacy menu