diff --git a/404.html b/404.html index c81cdeff..7016d993 100644 --- a/404.html +++ b/404.html @@ -1 +1 @@ - LibreNMS Docs

404 - Not found

\ No newline at end of file + LibreNMS Docs

404 - Not found

\ No newline at end of file diff --git a/API/ARP/index.html b/API/ARP/index.html index dd1d8616..7f0f70e8 100644 --- a/API/ARP/index.html +++ b/API/ARP/index.html @@ -1,4 +1,4 @@ - ARP - LibreNMS Docs
Skip to content

ARP

list_arp

Retrieve a specific ARP entry or all ARP entries for a device

Route: /api/v0/resources/ip/arp/:query

Query can be: - An IP address - A MAC address - A CIDR network (192.168.1.0/24) - all and set ?device=hostname (or device id)

Input:

  • device if you specify all for the query then you need to populate this with the hostname or id of the device.

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/arp/1.1.1.1
+ ARP - LibreNMS Docs       

ARP

list_arp

Retrieve a specific ARP entry or all ARP entries for a device

Route: /api/v0/resources/ip/arp/:query

Query can be: - An IP address - A MAC address - A CIDR network (192.168.1.0/24) - all and set ?device=hostname (or device id)

Input:

  • device if you specify all for the query then you need to populate this with the hostname or id of the device.

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/arp/1.1.1.1
 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/arp/192.168.1.0/24
 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/arp/all?device=localhost
 

Output:

{
diff --git a/API/Alerts/index.html b/API/Alerts/index.html
index 986c028b..29f63ecc 100644
--- a/API/Alerts/index.html
+++ b/API/Alerts/index.html
@@ -1,4 +1,4 @@
- Alerts - LibreNMS Docs       

Alerts

get_alert

Get details of an alert

Route: /api/v0/alerts/:id

  • id is the alert id, you can obtain a list of alert ids from list_alerts.

Input:

-

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts/1
+ Alerts - LibreNMS Docs       

Alerts

get_alert

Get details of an alert

Route: /api/v0/alerts/:id

  • id is the alert id, you can obtain a list of alert ids from list_alerts.

Input:

-

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts/1
 

Output:

{
  "status": "ok",
  "message": "",
diff --git a/API/Bills/index.html b/API/Bills/index.html
index f94cb277..7aa94f53 100644
--- a/API/Bills/index.html
+++ b/API/Bills/index.html
@@ -1,4 +1,4 @@
- Bills - LibreNMS Docs       

Bills

list_bills

Retrieve the list of bills currently in the system.

Route: /api/v0/bills /api/v0/bills?period=previous

Input:

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills
+ Bills - LibreNMS Docs       

Bills

list_bills

Retrieve the list of bills currently in the system.

Route: /api/v0/bills /api/v0/bills?period=previous

Input:

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills
 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills?period=previous
 

Output:

{
  "status": "ok",
diff --git a/API/DeviceGroups/index.html b/API/DeviceGroups/index.html
index 3bc832f1..01fec93d 100644
--- a/API/DeviceGroups/index.html
+++ b/API/DeviceGroups/index.html
@@ -1,4 +1,4 @@
- DeviceGroups - LibreNMS Docs       

DeviceGroups

get_devicegroups

List all device groups.

Route: /api/v0/devicegroups

Input (JSON):

-

Examples:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devicegroups
+ DeviceGroups - LibreNMS Docs       

DeviceGroups

get_devicegroups

List all device groups.

Route: /api/v0/devicegroups

Input (JSON):

-

Examples:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devicegroups
 

Output:

[
     {
         "status": "ok",
diff --git a/API/Devices/index.html b/API/Devices/index.html
index 46e6faf6..09e05926 100644
--- a/API/Devices/index.html
+++ b/API/Devices/index.html
@@ -1,4 +1,4 @@
- Devices - LibreNMS Docs       

Devices

del_device

Delete a given device.

Route: /api/v0/devices/:hostname

  • hostname can be either the device hostname or id

Input:

-

Example:

curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost
+ Devices - LibreNMS Docs       

Devices

del_device

Delete a given device.

Route: /api/v0/devices/:hostname

  • hostname can be either the device hostname or id

Input:

-

Example:

curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost
 

Output:

{
     "status": "ok",
     "message": "Removed device localhost",
diff --git a/API/Inventory/index.html b/API/Inventory/index.html
index 8243843d..170adf09 100644
--- a/API/Inventory/index.html
+++ b/API/Inventory/index.html
@@ -1,4 +1,4 @@
- Inventory - LibreNMS Docs       

Inventory

get_inventory

Retrieve the inventory for a device. If you call this without any parameters then you will only get part of the inventory. This is because a lot of devices nest each component, for instance you may initially have the chassis, within this the ports - 1 being an sfp cage, then the sfp itself. The way this API call is designed is to enable a recursive lookup. The first call will retrieve the root entry, included within this response will be entPhysicalIndex, you can then call for entPhysicalContainedIn which will then return the next layer of results. To retrieve all items together, see get_inventory_for_device.

Route: /api/v0/inventory/:hostname

  • hostname can be either the device hostname or the device id

Input:

  • entPhysicalClass: This is used to restrict the class of the inventory, for example you can specify chassis to only return items in the inventory that are labelled as chassis.
  • entPhysicalContainedIn: This is used to retrieve items within the inventory assigned to a previous component, for example specifying the chassis (entPhysicalIndex) will retrieve all items where the chassis is the parent.

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/inventory/localhost?entPhysicalContainedIn=65536
+ Inventory - LibreNMS Docs       

Inventory

get_inventory

Retrieve the inventory for a device. If you call this without any parameters then you will only get part of the inventory. This is because a lot of devices nest each component, for instance you may initially have the chassis, within this the ports - 1 being an sfp cage, then the sfp itself. The way this API call is designed is to enable a recursive lookup. The first call will retrieve the root entry, included within this response will be entPhysicalIndex, you can then call for entPhysicalContainedIn which will then return the next layer of results. To retrieve all items together, see get_inventory_for_device.

Route: /api/v0/inventory/:hostname

  • hostname can be either the device hostname or the device id

Input:

  • entPhysicalClass: This is used to restrict the class of the inventory, for example you can specify chassis to only return items in the inventory that are labelled as chassis.
  • entPhysicalContainedIn: This is used to retrieve items within the inventory assigned to a previous component, for example specifying the chassis (entPhysicalIndex) will retrieve all items where the chassis is the parent.

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/inventory/localhost?entPhysicalContainedIn=65536
 

Output:

{
     "status": "ok",
     "message": "",
diff --git a/API/Locations/index.html b/API/Locations/index.html
index 038dd9be..0829eecf 100644
--- a/API/Locations/index.html
+++ b/API/Locations/index.html
@@ -1,4 +1,4 @@
- Locations - LibreNMS Docs       

Locations

list_locations

Return a list of locations.

Route: /api/v0/resources/locations

Input:

-

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/locations
+ Locations - LibreNMS Docs       

Locations

list_locations

Return a list of locations.

Route: /api/v0/resources/locations

Input:

-

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/locations
 

Output:

{
     "status": "ok",
     "locations": [
diff --git a/API/Logs/index.html b/API/Logs/index.html
index 9e5ae7bb..da872403 100644
--- a/API/Logs/index.html
+++ b/API/Logs/index.html
@@ -1,4 +1,4 @@
- Logs - LibreNMS Docs       

Logs

All the list_*logs calls are aliased to list_logs.

Retrieve all logs or logs for a specific device.

  • id or hostname is the specific device

Input:

  • start: The page number to request.
  • limit: The limit of results to be returned.
  • from: The date and time or the event id to search from.
  • to: The data and time or the event id to search to.

list_eventlog

Route: /api/v0/logs/eventlog/:hostname

list_syslog

Route: /api/v0/logs/syslog/:hostname

list_alertlog

Route: /api/v0/logs/alertlog/:hostname

list_authlog

Route: /api/v0/logs/authlog/:hostname

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/eventlog/:hostname
+ Logs - LibreNMS Docs       

Logs

All the list_*logs calls are aliased to list_logs.

Retrieve all logs or logs for a specific device.

  • id or hostname is the specific device

Input:

  • start: The page number to request.
  • limit: The limit of results to be returned.
  • from: The date and time or the event id to search from.
  • to: The data and time or the event id to search to.

list_eventlog

Route: /api/v0/logs/eventlog/:hostname

list_syslog

Route: /api/v0/logs/syslog/:hostname

list_alertlog

Route: /api/v0/logs/alertlog/:hostname

list_authlog

Route: /api/v0/logs/authlog/:hostname

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/eventlog/:hostname
 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/syslog/:hostname?limit=20
 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/eventlog/:hostname?limit=20&start=5&from=2017-07-22%2023:00:00
 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/eventlog/:hostname?sortorder=DESC
diff --git a/API/PollerGroups/index.html b/API/PollerGroups/index.html
index 27239678..49e88d92 100644
--- a/API/PollerGroups/index.html
+++ b/API/PollerGroups/index.html
@@ -1,4 +1,4 @@
- PollerGroups - LibreNMS Docs       

PollerGroups

get_poller_group

Gets a specific poller group or all if none is specified

Route: /api/v0/poller_group/:poller_group

  • poller_group: optional name or id of the poller group to get

Output:

{
+ PollerGroups - LibreNMS Docs       

PollerGroups

get_poller_group

Gets a specific poller group or all if none is specified

Route: /api/v0/poller_group/:poller_group

  • poller_group: optional name or id of the poller group to get

Output:

{
     "status": "ok",
     "get_poller_group": [
         {
diff --git a/API/PortGroups/index.html b/API/PortGroups/index.html
index 21bc6fe6..98d3579a 100644
--- a/API/PortGroups/index.html
+++ b/API/PortGroups/index.html
@@ -1,3 +1,3 @@
- PortGroups - LibreNMS Docs       

PortGroups

get_graph_by_portgroup

Get the graph based on the group type.

Route: /api/v0/portgroups/:group

  • group is the type of port group graph you want, I.e Transit, Peering, etc. You can specify multiple types comma separated.

Input:

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/portgroups/transit,peering
+ PortGroups - LibreNMS Docs       

PortGroups

get_graph_by_portgroup

Get the graph based on the group type.

Route: /api/v0/portgroups/:group

  • group is the type of port group graph you want, I.e Transit, Peering, etc. You can specify multiple types comma separated.

Input:

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/portgroups/transit,peering
 

Output:

Output is an image.

get_graph_by_portgroup_multiport_bits

Get the graph based on the multiple port id separated by commas ,.

Route: /api/v0/portgroups/multiport/bits/:id

  • id is a comma separated list of port ids you want, I.e 1,2,3,4, etc. You can specify multiple IDs comma separated.

Input:

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/portgroups/multiport/bits/1,2,3
 

Output:

Output is an image.

\ No newline at end of file diff --git a/API/Port_Groups/index.html b/API/Port_Groups/index.html index ca4ba259..33356e30 100644 --- a/API/Port_Groups/index.html +++ b/API/Port_Groups/index.html @@ -1,4 +1,4 @@ - Port_Groups - LibreNMS Docs

Port_Groups

get_port_groups

List all port groups.

Route: /api/v0/port_groups

Examples:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/port_groups
+ Port_Groups - LibreNMS Docs       

Port_Groups

get_port_groups

List all port groups.

Route: /api/v0/port_groups

Examples:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/port_groups
 

Output:

[
     {
         "status": "ok",
diff --git a/API/Ports/index.html b/API/Ports/index.html
index c43ed097..0fc29deb 100644
--- a/API/Ports/index.html
+++ b/API/Ports/index.html
@@ -1,4 +1,4 @@
- Ports - LibreNMS Docs       

Ports

get_all_ports

Get info for all ports on all devices. Strongly recommend that you use the columns parameter to avoid pulling too much data.

Route: /api/v0/ports

-

Input:

  • columns: Comma separated list of columns you want returned.

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports?columns=ifName%2Cport_id
+ Ports - LibreNMS Docs       

Ports

get_all_ports

Get info for all ports on all devices. Strongly recommend that you use the columns parameter to avoid pulling too much data.

Route: /api/v0/ports

-

Input:

  • columns: Comma separated list of columns you want returned.

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports?columns=ifName%2Cport_id
 

Output:

{
   "status": "ok",
   "message": "",
diff --git a/API/Routing/index.html b/API/Routing/index.html
index a88024c2..eaf2609f 100644
--- a/API/Routing/index.html
+++ b/API/Routing/index.html
@@ -1,4 +1,4 @@
- Routing - LibreNMS Docs       

Routing

list_bgp

List the current BGP sessions.

Route: /api/v0/bgp

Input:

  • hostname = Either the devices hostname or id.
  • asn = The local ASN you would like to filter by
  • remote_asn = Filter by remote peer ASN
  • remote_address = Filter by remote peer address
  • local_address = Filter by local address
  • bgp_descr = Filter by BGP neighbor description
  • bgp_state = Filter by BGP session state (like established,idle...)
  • bgp_state = Filter by BGP admin state (start,stop,running...)
  • bgp_family = Filter by BGP address Family (4,6)

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp
+ Routing - LibreNMS Docs       

Routing

list_bgp

List the current BGP sessions.

Route: /api/v0/bgp

Input:

  • hostname = Either the devices hostname or id.
  • asn = The local ASN you would like to filter by
  • remote_asn = Filter by remote peer ASN
  • remote_address = Filter by remote peer address
  • local_address = Filter by local address
  • bgp_descr = Filter by BGP neighbor description
  • bgp_state = Filter by BGP session state (like established,idle...)
  • bgp_state = Filter by BGP admin state (start,stop,running...)
  • bgp_family = Filter by BGP address Family (4,6)

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp
 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?hostname=host.example.com
 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?asn=1234
 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?remote_asn=1234
diff --git a/API/Services/index.html b/API/Services/index.html
index c2db1559..391fe3c6 100644
--- a/API/Services/index.html
+++ b/API/Services/index.html
@@ -1,4 +1,4 @@
- Services - LibreNMS Docs       

Services

list_services

Retrieve all services

Route: /api/v0/services

Input:

  • state: only which have a certain state (valid options are 0=Ok, 1=Warning, 2=Critical).
  • type: service type, used sql LIKE to find services, so for tcp, use type=tcp for http use type=http

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services
+ Services - LibreNMS Docs       

Services

list_services

Retrieve all services

Route: /api/v0/services

Input:

  • state: only which have a certain state (valid options are 0=Ok, 1=Warning, 2=Critical).
  • type: service type, used sql LIKE to find services, so for tcp, use type=tcp for http use type=http

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services
 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services?state=2
 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services?state=0&type=tcp
 

Output:

{
diff --git a/API/Switching/index.html b/API/Switching/index.html
index bcf6fb37..52a7189a 100644
--- a/API/Switching/index.html
+++ b/API/Switching/index.html
@@ -1,4 +1,4 @@
- Switching - LibreNMS Docs       

Switching

list_vlans

Get a list of all VLANs.

Route: /api/v0/resources/vlans

Input:

-

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/vlans
+ Switching - LibreNMS Docs       

Switching

list_vlans

Get a list of all VLANs.

Route: /api/v0/resources/vlans

Input:

-

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/vlans
 

Output:

{
     "status": "ok",
     "vlans": [
diff --git a/API/System/index.html b/API/System/index.html
index b1fe5da8..873e61d9 100644
--- a/API/System/index.html
+++ b/API/System/index.html
@@ -1,4 +1,4 @@
- System - LibreNMS Docs       

System

system

Display Librenms instance information.

Route: /api/v0/system

Input:

-

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/system
+ System - LibreNMS Docs       

System

system

Display Librenms instance information.

Route: /api/v0/system

Input:

-

Example:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/system
 

Output:

{
     "status": "ok",
     "system": [
diff --git a/API/index.html b/API/index.html
index 272ce648..1769680a 100644
--- a/API/index.html
+++ b/API/index.html
@@ -1,4 +1,4 @@
- Using the API - LibreNMS Docs       

Using the API

Versioning

Versioning an API is a minefield which saw us looking at numerous options on how to do this.

We have currently settled on using versioning within the API end point itself /api/v0. As the API itself is new and still in active development we also decided that v0 would be the best starting point to indicate it's in development.

Tokens

To access any of the token end points you will be required to authenticate using a token. Tokens can be created directly from within the LibreNMS web interface by going to /api-access/.

  • Click on 'Create API access token'.
  • Select the user you would like to generate the token for.
  • Enter an optional description.
  • Click Create API Token.

Endpoints

Whilst this documentation will describe and show examples of the end points, we've designed the API so you should be able to traverse through it without knowing any of the available API routes.

You can do this by first calling /api/v0:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0
+ Using the API - LibreNMS Docs       

Using the API

Versioning

Versioning an API is a minefield which saw us looking at numerous options on how to do this.

We have currently settled on using versioning within the API end point itself /api/v0. As the API itself is new and still in active development we also decided that v0 would be the best starting point to indicate it's in development.

Tokens

To access any of the token end points you will be required to authenticate using a token. Tokens can be created directly from within the LibreNMS web interface by going to /api-access/.

  • Click on 'Create API access token'.
  • Select the user you would like to generate the token for.
  • Enter an optional description.
  • Click Create API Token.

Endpoints

Whilst this documentation will describe and show examples of the end points, we've designed the API so you should be able to traverse through it without knowing any of the available API routes.

You can do this by first calling /api/v0:

curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0
 

Output:

{
  "list_bgp": "https://librenms.org/api/v0/bgp",
   ...
diff --git a/Alerting/Creating-Transport/index.html b/Alerting/Creating-Transport/index.html
index 2e72bf11..27ae896a 100644
--- a/Alerting/Creating-Transport/index.html
+++ b/Alerting/Creating-Transport/index.html
@@ -1 +1 @@
- Creating Transports - LibreNMS Docs       

Creating a new Transport

File location

All transports are located in LibreNMS\Alert\Transport and the files are named after the Transport name. I.e Discord.php for Discord.

Transport structure

The following functions are required for a new transport to pass the unit tests:

deliverAlert() - This is function called within alerts to invoke the transport. Here you should do any post processing of the transport config to get it ready for use.

contact$Transport() - This is named after the transport so for Discord it would be contactDiscord(). This is what actually interacts with the 3rd party API, invokes the mail command or whatever you want your alert to do.

configTemplate() - This is used to define the form that will accept the transport config in the webui and then what data should be validated and how. Validation is done using Laravel validation

The following function is not required for new Transports and is for legacy reasons only. deliverAlertOld().

Documentation

Please don't forget to update the Transport file to include details of your new transport.

A table should be provided to indicate the form values that we ask for and examples. I.e:

Config Example
Discord URL https://discordapp.com/api/webhooks/4515489001665127664/82-sf4385ysuhfn34u2fhfsdePGLrg8K7cP9wl553Fg6OlZuuxJGaa1d54fe
Options username=myname
\ No newline at end of file + Creating Transports - LibreNMS Docs

Creating a new Transport

File location

All transports are located in LibreNMS\Alert\Transport and the files are named after the Transport name. I.e Discord.php for Discord.

Transport structure

The following functions are required for a new transport to pass the unit tests:

deliverAlert() - This is function called within alerts to invoke the transport. Here you should do any post processing of the transport config to get it ready for use.

contact$Transport() - This is named after the transport so for Discord it would be contactDiscord(). This is what actually interacts with the 3rd party API, invokes the mail command or whatever you want your alert to do.

configTemplate() - This is used to define the form that will accept the transport config in the webui and then what data should be validated and how. Validation is done using Laravel validation

The following function is not required for new Transports and is for legacy reasons only. deliverAlertOld().

Documentation

Please don't forget to update the Transport file to include details of your new transport.

A table should be provided to indicate the form values that we ask for and examples. I.e:

Config Example
Discord URL https://discordapp.com/api/webhooks/4515489001665127664/82-sf4385ysuhfn34u2fhfsdePGLrg8K7cP9wl553Fg6OlZuuxJGaa1d54fe
Options username=myname
\ No newline at end of file diff --git a/Alerting/Device-Dependencies/index.html b/Alerting/Device-Dependencies/index.html index 88888366..1dcf4ded 100644 --- a/Alerting/Device-Dependencies/index.html +++ b/Alerting/Device-Dependencies/index.html @@ -1 +1 @@ - Device Dependencies - LibreNMS Docs

Device Dependencies

It is possible to set one or more parents for a device. The aim for that is, if all parent devices are down, alert contacts will not receive redundant alerts for dependent devices. This is very useful when you have an outage, say in a branch office, where normally you'd receive hundreds of alerts, but when this is properly configured, you'd only receive an alert for the parent hosts.

There are three ways to configure this feature. First one is from general settings of a device. The other two can be done in the 'Device Dependencies' item under 'Devices' menu. In this page, you can see all devices and with its parents. Clicking on the 'bin' icon will clear the dependency setting. Clicking on the 'pen' icon will let you edit or change the current setting for chosen device. There's also a 'Manage Device Dependencies' button on the top. This will let you set parents for multiple devices at once.

For an intro on getting started with Device Dependencies, take a look at our Youtube video

\ No newline at end of file + Device Dependencies - LibreNMS Docs

Device Dependencies

It is possible to set one or more parents for a device. The aim for that is, if all parent devices are down, alert contacts will not receive redundant alerts for dependent devices. This is very useful when you have an outage, say in a branch office, where normally you'd receive hundreds of alerts, but when this is properly configured, you'd only receive an alert for the parent hosts.

There are three ways to configure this feature. First one is from general settings of a device. The other two can be done in the 'Device Dependencies' item under 'Devices' menu. In this page, you can see all devices and with its parents. Clicking on the 'bin' icon will clear the dependency setting. Clicking on the 'pen' icon will let you edit or change the current setting for chosen device. There's also a 'Manage Device Dependencies' button on the top. This will let you set parents for multiple devices at once.

For an intro on getting started with Device Dependencies, take a look at our Youtube video

\ No newline at end of file diff --git a/Alerting/Entities/index.html b/Alerting/Entities/index.html index b9752c92..690cba6c 100644 --- a/Alerting/Entities/index.html +++ b/Alerting/Entities/index.html @@ -1 +1 @@ - Entities - LibreNMS Docs

Entities

Entities as described earlier are based on the table and column names within the database, if you are unsure of what the entity is you want then have a browse around inside MySQL using show tables and desc <tablename>.

Below are some common entities that you can use within the alerting system. This list is not exhaustive and you should look at the MySQL database schema for the full list.

Devices

Entity Description
devices.hostname The device hostname
devices.sysName The device sysName
devices.sysDescr The device sysDescr
devices.hardware The device hardware
devices.version The device os version
devices.location The device location
devices.status The status of the device, 1
devices.status_reason The reason the device was detected as down (icmp or snmp)
devices.ignore If the device is ignored this will be set to 1
devices.disabled If the device is disabled this will be set to 1
devices.last_polled The the last polled datetime (yyyy-mm-dd hh:mm:ss)
devices.type The device type such as network, server, firewall, etc.

BGP Peers

Entity Description
bgpPeers.astext This is the description of the BGP Peer
bgpPeers.bgpPeerIdentifier The IP address of the BGP Peer
bgpPeers.bgpPeerRemoteAs The AS number of the BGP Peer
bgpPeers.bgpPeerState The operational state of the BGP session
bgpPeers.bgpPeerAdminStatus The administrative state of the BGP session
bgpPeers.bgpLocalAddr The local address of the BGP session.

IPSec Tunnels

Entity Description
ipsec_tunnels.peer_addr The remote VPN peer address
ipsec_tunnels.local_addr The local VPN address
ipsec_tunnels.tunnel_status The VPN tunnels operational status.

Memory pools

Entity | Description |---|---| mempools.mempool_type | The memory pool type such as hrstorage, cmp and cemp mempools.mempool_descr | The description of the pool such as Physical memory, Virtual memory and System memory mempools.mempool_perc | The used percentage of the memory pool.

Ports

Entity Description
ports.ifDescr The interface description
ports.ifName The interface name
ports.ifSpeed The port speed in bps
ports.ifHighSpeed The port speed in mbps
ports.ifOperStatus The operational status of the port (up or down)
ports.ifAdminStatus The administrative status of the port (up or down)
ports.ifDuplex Duplex setting of the port
ports.ifMtu The MTU setting of the port.

Processors

Entity Description
processors.processor_usage The usage of the processor as a percentage
processors.processor_descr The description of the processor.

Storage

Entity Description
storage.storage_descr The description of the storage
storage.storage_perc The usage of the storage as a percentage.

Health / Sensors

Entity Description
sensors.sensor_desc The sensors description.
sensors.sensor_current The current sensors value.
sensors.sensor_prev The previous sensor value.
sensors.lastupdate The sensors last updated datetime stamp.
\ No newline at end of file + Entities - LibreNMS Docs

Entities

Entities as described earlier are based on the table and column names within the database, if you are unsure of what the entity is you want then have a browse around inside MySQL using show tables and desc <tablename>.

Below are some common entities that you can use within the alerting system. This list is not exhaustive and you should look at the MySQL database schema for the full list.

Devices

Entity Description
devices.hostname The device hostname
devices.sysName The device sysName
devices.sysDescr The device sysDescr
devices.hardware The device hardware
devices.version The device os version
devices.location The device location
devices.status The status of the device, 1
devices.status_reason The reason the device was detected as down (icmp or snmp)
devices.ignore If the device is ignored this will be set to 1
devices.disabled If the device is disabled this will be set to 1
devices.last_polled The the last polled datetime (yyyy-mm-dd hh:mm:ss)
devices.type The device type such as network, server, firewall, etc.

BGP Peers

Entity Description
bgpPeers.astext This is the description of the BGP Peer
bgpPeers.bgpPeerIdentifier The IP address of the BGP Peer
bgpPeers.bgpPeerRemoteAs The AS number of the BGP Peer
bgpPeers.bgpPeerState The operational state of the BGP session
bgpPeers.bgpPeerAdminStatus The administrative state of the BGP session
bgpPeers.bgpLocalAddr The local address of the BGP session.

IPSec Tunnels

Entity Description
ipsec_tunnels.peer_addr The remote VPN peer address
ipsec_tunnels.local_addr The local VPN address
ipsec_tunnels.tunnel_status The VPN tunnels operational status.

Memory pools

Entity | Description |---|---| mempools.mempool_type | The memory pool type such as hrstorage, cmp and cemp mempools.mempool_descr | The description of the pool such as Physical memory, Virtual memory and System memory mempools.mempool_perc | The used percentage of the memory pool.

Ports

Entity Description
ports.ifDescr The interface description
ports.ifName The interface name
ports.ifSpeed The port speed in bps
ports.ifHighSpeed The port speed in mbps
ports.ifOperStatus The operational status of the port (up or down)
ports.ifAdminStatus The administrative status of the port (up or down)
ports.ifDuplex Duplex setting of the port
ports.ifMtu The MTU setting of the port.

Processors

Entity Description
processors.processor_usage The usage of the processor as a percentage
processors.processor_descr The description of the processor.

Storage

Entity Description
storage.storage_descr The description of the storage
storage.storage_perc The usage of the storage as a percentage.

Health / Sensors

Entity Description
sensors.sensor_desc The sensors description.
sensors.sensor_current The current sensors value.
sensors.sensor_prev The previous sensor value.
sensors.lastupdate The sensors last updated datetime stamp.
\ No newline at end of file diff --git a/Alerting/Macros/index.html b/Alerting/Macros/index.html index a74fd3b8..0307c5c7 100644 --- a/Alerting/Macros/index.html +++ b/Alerting/Macros/index.html @@ -1,3 +1,3 @@ - Macros - LibreNMS Docs

Macros

Macros are shorthands to either portion of rules or pure SQL enhanced with placeholders.

You can define your own macros in your config.php.

Example macro-implementation of Debian-Devices

$config['alert']['macros']['rule']['is_debian'] = 'devices.features ~ "@debian@"';
+ Macros - LibreNMS Docs       

Macros

Macros are shorthands to either portion of rules or pure SQL enhanced with placeholders.

You can define your own macros in your config.php.

Example macro-implementation of Debian-Devices

$config['alert']['macros']['rule']['is_debian'] = 'devices.features ~ "@debian@"';
 

And in the Rule:

...  macros.is_debian = 1 ...
 

This Example-macro is a Boolean-macro, it applies a form of filter to the set of results defined by the rule.

All macros that are not unary should return Boolean.

Device (Boolean)

Entity: macros.device

Description: Only select devices that aren't deleted, ignored or disabled.

Source: (devices.disabled = 0 AND devices.ignore = 0)

Device is up (Boolean)

Entity: macros.device_up

Description: Only select devices that are up.

Implies: macros.device

Source: (devices.status = 1 AND macros.device)

Device is down (Boolean)

Entity: macros.device_down

Description: Only select devices that are down.

Implies: macros.device

Source: (devices.status = 0 AND macros.device)

Port (Boolean)

Entity: macros.port

Description: Only select ports that aren't deleted, ignored or disabled.

Source: (ports.deleted = 0 AND ports.ignore = 0 AND ports.disabled = 0)

Port is up (Boolean)

Entity: macros.port_up

Description: Only select ports that are up and also should be up.

Implies: macros.port

Source: (ports.ifOperStatus = up AND ports.ifAdminStatus = up AND macros.port)

Port is down (Boolean)

Entity: macros.port_down

Description: Only select ports that are down.

Implies: macros.port

Source: (ports.ifOperStatus != "up" AND ports.ifAdminStatus != "down" AND macros.port)

Port-Usage in Percent (Decimal)

Entity: macros.port_usage_perc

Description: Return port-usage (max value of in and out) in percent.

Source: ((SELECT IF(ports.ifOutOctets_rate>ports.ifInOctets_rate, ports.ifOutOctets_rate, ports.ifInOctets_rate)*8) / ports.ifSpeed)*100

Time

Now (Datetime)

Entity: macros.now

Description: Alias of MySQL's NOW()

Source: NOW()

Past N Minutes (Datetime)

Entity: macros.past_$m

Description: Returns a MySQL Timestamp dated $ Minutes in the past. $ can only be a supported Resolution.

Example: macros.past_5m is Last 5 Minutes.

Resolution: 5,10,15,30,60

Source: DATE_SUB(NOW(),INTERVAL $ MINUTE)

Sensors (Boolean)

Entity: macros.sensor

Description: Only select sensors that aren't ignored.

Source: (sensors.sensor_alert = 1)

Entity: macros.sensor_port_link = 1

Description: Only selects sensors that have a port linked to them, the port is up and the device is up.

Source: (sensors.entity_link_type = "port" AND sensors.entity_link_index = ports.ifIndex AND macros.port_up AND macros.device_up))

State Sensors (Boolean)

Entity: macros.state_sensor_ok, macros.state_sensor_warning, macros.state_sensor_critical, macros.state_sensor_unknown

Description: Select state sensors by their generic status ok (0), warning (1), critical (2), unknown (3)

Source: (sensors.sensor_current = state_translations.state_value AND state_translations.state_generic_value = 2)

Misc (Boolean)

Packet Loss

Entity: (macros.packet_loss_5m)

Description: Packet loss % value for the device within the last 5 minutes.

Example: macros.packet_loss_5m > 50

Entity: (macros.packet_loss_15m)

Description: Packet loss % value for the device within the last 15 minutes.

Example: macros.packet_loss_15m > 50

Ports in usage perc (Int)

Entity: ((ports.ifInOctets_rate*8)/ports.ifSpeed)*100

Description: Port in used more than 50%

Example: `macros.port_in_usage_perc > 50

Ports out usage perc (Int)

Entity: ((ports.ifOutOctets_rate*8)/ports.ifSpeed)*100

Description: Port out used more than 50%

Example: `macros.port_out_usage_perc > 50

Ports now down (Boolean)

Entity: ports.ifOperStatus != ports.ifOperStatus_prev AND ports.ifOperStatus_prev = "up" AND ports.ifAdminStatus = "up"

Description: Ports that were previously up and have now gone down.

Example: macros.port_now_down = 1

Port has xDP neighbour (Boolean)

Entity: %macros.port AND %links.local_port_id = %ports.port_id

Description: Ports that have an xDP (lldp, cdp, etc) neighbour.

Example: macros.port_has_xdp_neighbours = 1

Port has xDP neighbour already known in LibreNMS (Boolean)

Entity: %macros.port_has_neighbours AND (%links.remote_port_id IS NOT NULL)

Description: Ports that have an xDP (lldp, cdp, etc) neighbour that is already known in libreNMS.

Example: macros.port_has_xdp_neighbours_device = 1

Device component down [JunOS]

Entity: sensors.sensor_class = "state" AND sensors.sensor_current != "6" AND sensors.sensor_type = "jnxFruState" AND sensors.sensor_current != "2"

Description: Device component is down such as Fan, PSU, etc for JunOS devices.

Example: macros.device_component_down_junos = 1

Device component down [Cisco]

Entity: sensors.sensor_current != 1 AND sensors.sensor_current != 5 AND sensors.sensor_type ~ "^cisco.*State$"

Description: Device component is down such as Fan, PSU, etc for Cisco devices.

Example: macros.device_component_down_cisco = 1

PDU over amperage [APC]

Entity: sensors.sensor_class = "current" AND sensors.sensor_descr = "Bank Total" AND sensors.sensor_current > sensors.sensor_limit AND devices.os = "apc"

Description: APC PDU over amperage

Example: macros.pdu_over_amperage_apc = 1

\ No newline at end of file diff --git a/Alerting/Rules/index.html b/Alerting/Rules/index.html index e07477dc..b5ea1a2c 100644 --- a/Alerting/Rules/index.html +++ b/Alerting/Rules/index.html @@ -1,4 +1,4 @@ - Rules - LibreNMS Docs

Rules

Rules are defined using a logical language.

The GUI provides a simple way of creating rules.

Creating more complicated rules which may include maths calculations and MySQL queries can be done using macros

Syntax

Rules must consist of at least 3 elements: An Entity, a Condition and a Value. Rules can contain braces and Glues. Entities are provided from Table and Field from the database. For Example: ports.ifOperStatus.

Conditions can be any of:

  • Equals =
  • Not Equals !=
  • In IN
  • Not In NOT IN
  • Begins with LIKE ('...%')
  • Doesn't begin with NOT LIKE ('...%')
  • Contains LIKE ('%...%')
  • Doesn't Contain NOT LIKE ('%...%')
  • Ends with LIKE ('%...')
  • Doesn't end with NOT LIKE ('%...')
  • Between BETWEEN
  • Not Between NOT BETWEEN
  • Is Empty = ''
  • Is Not Empty != '''
  • Is Null IS NULL
  • Is Not Null IS NOT NULL
  • Greater >
  • Greater or Equal >=
  • Less <
  • Less or Equal <=
  • Regex REGEXP

Values can be an entity or any data. If using macros as value you must include the macro name into backticks. i.e. `macros.past_60m`

Note: Regex supports MySQL Regular expressions.

Arithmetics are allowed as well.

Options

Here are some of the other options available when adding an alerting rule:

  • Rule name: The name associated with the rule.
  • Severity: How "important" the rule is.
  • Max alerts: The maximum number of alerts sent for the event. -1 means unlimited.
  • Delay: The amount of time in seconds to wait after a rule is matched before sending an alert out transport.
  • Interval: The interval of time in seconds between alerts for an event until Max alert is reached.
  • Mute alerts: Disables sending alert rule through alert transport. But will still show the alert in the Web UI.
  • Invert match: Invert the matching rule (ie. alert on items that _don't match the rule).
  • Recovery alerts: This will disable the recovery notification from being sent if turned off.

Advanced

On the Advanced tab, you can specify some additional options for the alert rule:

  • Override SQL: Enable this if you using a custom query
  • Query: The query to be used for the alert.

  • An example of this would be an average rule for all CPUs over 10%

SELECT devices.device_id, devices.status, devices.disabled, devices.ignore, 
+ Rules - LibreNMS Docs       

Rules

Rules are defined using a logical language.

The GUI provides a simple way of creating rules.

Creating more complicated rules which may include maths calculations and MySQL queries can be done using macros

Syntax

Rules must consist of at least 3 elements: An Entity, a Condition and a Value. Rules can contain braces and Glues. Entities are provided from Table and Field from the database. For Example: ports.ifOperStatus.

Conditions can be any of:

  • Equals =
  • Not Equals !=
  • In IN
  • Not In NOT IN
  • Begins with LIKE ('...%')
  • Doesn't begin with NOT LIKE ('...%')
  • Contains LIKE ('%...%')
  • Doesn't Contain NOT LIKE ('%...%')
  • Ends with LIKE ('%...')
  • Doesn't end with NOT LIKE ('%...')
  • Between BETWEEN
  • Not Between NOT BETWEEN
  • Is Empty = ''
  • Is Not Empty != '''
  • Is Null IS NULL
  • Is Not Null IS NOT NULL
  • Greater >
  • Greater or Equal >=
  • Less <
  • Less or Equal <=
  • Regex REGEXP

Values can be an entity or any data. If using macros as value you must include the macro name into backticks. i.e. `macros.past_60m`

Note: Regex supports MySQL Regular expressions.

Arithmetics are allowed as well.

Options

Here are some of the other options available when adding an alerting rule:

  • Rule name: The name associated with the rule.
  • Severity: How "important" the rule is.
  • Max alerts: The maximum number of alerts sent for the event. -1 means unlimited.
  • Delay: The amount of time in seconds to wait after a rule is matched before sending an alert out transport.
  • Interval: The interval of time in seconds between alerts for an event until Max alert is reached.
  • Mute alerts: Disables sending alert rule through alert transport. But will still show the alert in the Web UI.
  • Invert match: Invert the matching rule (ie. alert on items that _don't match the rule).
  • Recovery alerts: This will disable the recovery notification from being sent if turned off.

Advanced

On the Advanced tab, you can specify some additional options for the alert rule:

  • Override SQL: Enable this if you using a custom query
  • Query: The query to be used for the alert.

  • An example of this would be an average rule for all CPUs over 10%

SELECT devices.device_id, devices.status, devices.disabled, devices.ignore, 
 AVG(processors.processor_usage) AS cpu_avg  FROM 
 devices INNER JOIN processors ON devices.device_id 
 = processors.device_id WHERE devices.device_id 
diff --git a/Alerting/Templates/index.html b/Alerting/Templates/index.html
index b0e83b0e..c5079ab7 100644
--- a/Alerting/Templates/index.html
+++ b/Alerting/Templates/index.html
@@ -1,4 +1,4 @@
- Templates - LibreNMS Docs       

Templates

This page is for installs running version 1.42 or later. You can find the older docs here

Templates can be assigned to a single or a group of rules and can contain any kind of text. There is also a default template which is used for any rule that isn't associated with a template. This template can be found under Alert Templates page and can be edited. It also has an option revert it back to its default content.

To attach a template to a rule just open the Alert Templates settings page, choose the template to assign and click the yellow button in the Actions column. In the appearing popupbox select the rule(s) you want the template to be assigned to and click the Attach button. You might hold down the CTRL key to select multiple rules at once.

The templating engine in use is Laravel Blade. We will cover some of the basics here, however the official Laravel docs will have more information here

Syntax

Controls:

  • if-else (Else can be omitted): @if ($alert->placeholder == 'value') Some Text @else Other Text @endif
  • foreach-loop: @foreach ($alert->faults as $key => $value) Key: $key Value: $value @endforeach

Placeholders:

Placeholders are special variables that if used within the template will be replaced with the relevant data, I.e:

The device {{ $alert->hostname }} has been up for {{ $alert->uptime }} seconds would result in the following The device localhost has been up for 30344 seconds.

When using placeholders to echo data, you need to wrap the placeholder in {{ }}. I.e {{ $alert->hostname }}.

  • Device ID: $alert->device_id
  • Hostname of the Device: $alert->hostname
  • sysName of the Device: $alert->sysName
  • sysDescr of the Device: $alert->sysDescr
  • display name of the Device: $alert->display
  • sysContact of the Device: $alert->sysContact
  • OS of the Device: $alert->os
  • Type of Device: $alert->type
  • IP of the Device: $alert->ip
  • Hardware of the Device: $alert->hardware
  • Software version of the Device: $alert->version
  • Features of the Device: $alert->features
  • Serial number of the Device: $alert->serial
  • Location of the Device: $alert->location
  • uptime of the Device (in seconds): $alert->uptime
  • Short uptime of the Device (28d 22h 30m 7s): $alert->uptime_short
  • Long uptime of the Device (28 days, 22h 30m 7s): $alert->uptime_long
  • Description (purpose db field) of the Device: $alert->description
  • Notes of the Device: $alert->notes
  • Notes of the alert (ack notes): $alert->alert_notes
  • ping timestamp (if icmp enabled): $alert->ping_timestamp
  • ping loss (if icmp enabled): $alert->ping_loss
  • ping min (if icmp enabled): $alert->ping_min
  • ping max (if icmp enabled): $alert->ping_max
  • ping avg (if icmp enabled): $alert->ping_avg
  • debug (array)
  • poller_name - name of poller (for distributed setups)
  • If $config['debug']['run_trace] = true; is set then this will contain:
  • traceroute (if enabled you will receive traceroute output): $alert->debug['traceroute']
  • traceroute_output (if the traceroute fails this will contain why): $alert->debug['traceroute_output']
  • Title for the Alert: $alert->title
  • Time Elapsed, Only available on recovery ($alert->state == 0): $alert->elapsed
  • Rule Builder (the actual rule) (use {!! $alert->builder !!}): $alert->builder
  • Alert-ID: $alert->id
  • Unique-ID: $alert->uid
  • Faults, Only available on alert ($alert->state != 0), must be iterated in a foreach (@foreach ($alert->faults as $key => $value) @endforeach). Holds all available information about the Fault, accessible in the format $value['Column'], for example: $value['ifDescr']. Special field $value['string'] has most Identification-information (IDs, Names, Descrs) as single string, this is the equivalent of the default used and must be encased in {{ }}
  • State: $alert->state
  • Severity: $alert->severity
  • Rule: $alert->rule
  • Rule-Name: $alert->name
  • Procedure URL: $alert->proc
  • Timestamp: $alert->timestamp
  • Transport type: $alert->transport
  • Transport name: $alert->transport_name
  • Contacts, must be iterated in a foreach, $key holds email and $value holds name: $alert->contacts

Placeholders can be used within the subjects for templates as well although $faults is most likely going to be worthless.

The Default Template is a 'one-size-fit-all'. We highly recommend defining your own templates for your rules to include more specific information.

Base Templates

If you'd like to reuse a common template for your alerts follow below

A default file is located in resources/views/alerts/templates/default.blade.php Displays the following:

<html>
+ Templates - LibreNMS Docs       

Templates

This page is for installs running version 1.42 or later. You can find the older docs here

Templates can be assigned to a single or a group of rules and can contain any kind of text. There is also a default template which is used for any rule that isn't associated with a template. This template can be found under Alert Templates page and can be edited. It also has an option revert it back to its default content.

To attach a template to a rule just open the Alert Templates settings page, choose the template to assign and click the yellow button in the Actions column. In the appearing popupbox select the rule(s) you want the template to be assigned to and click the Attach button. You might hold down the CTRL key to select multiple rules at once.

The templating engine in use is Laravel Blade. We will cover some of the basics here, however the official Laravel docs will have more information here

Syntax

Controls:

  • if-else (Else can be omitted): @if ($alert->placeholder == 'value') Some Text @else Other Text @endif
  • foreach-loop: @foreach ($alert->faults as $key => $value) Key: $key Value: $value @endforeach

Placeholders:

Placeholders are special variables that if used within the template will be replaced with the relevant data, I.e:

The device {{ $alert->hostname }} has been up for {{ $alert->uptime }} seconds would result in the following The device localhost has been up for 30344 seconds.

When using placeholders to echo data, you need to wrap the placeholder in {{ }}. I.e {{ $alert->hostname }}.

  • Device ID: $alert->device_id
  • Hostname of the Device: $alert->hostname
  • sysName of the Device: $alert->sysName
  • sysDescr of the Device: $alert->sysDescr
  • display name of the Device: $alert->display
  • sysContact of the Device: $alert->sysContact
  • OS of the Device: $alert->os
  • Type of Device: $alert->type
  • IP of the Device: $alert->ip
  • Hardware of the Device: $alert->hardware
  • Software version of the Device: $alert->version
  • Features of the Device: $alert->features
  • Serial number of the Device: $alert->serial
  • Location of the Device: $alert->location
  • uptime of the Device (in seconds): $alert->uptime
  • Short uptime of the Device (28d 22h 30m 7s): $alert->uptime_short
  • Long uptime of the Device (28 days, 22h 30m 7s): $alert->uptime_long
  • Description (purpose db field) of the Device: $alert->description
  • Notes of the Device: $alert->notes
  • Notes of the alert (ack notes): $alert->alert_notes
  • ping timestamp (if icmp enabled): $alert->ping_timestamp
  • ping loss (if icmp enabled): $alert->ping_loss
  • ping min (if icmp enabled): $alert->ping_min
  • ping max (if icmp enabled): $alert->ping_max
  • ping avg (if icmp enabled): $alert->ping_avg
  • debug (array)
  • poller_name - name of poller (for distributed setups)
  • If $config['debug']['run_trace] = true; is set then this will contain:
  • traceroute (if enabled you will receive traceroute output): $alert->debug['traceroute']
  • traceroute_output (if the traceroute fails this will contain why): $alert->debug['traceroute_output']
  • Title for the Alert: $alert->title
  • Time Elapsed, Only available on recovery ($alert->state == 0): $alert->elapsed
  • Rule Builder (the actual rule) (use {!! $alert->builder !!}): $alert->builder
  • Alert-ID: $alert->id
  • Unique-ID: $alert->uid
  • Faults, Only available on alert ($alert->state != 0), must be iterated in a foreach (@foreach ($alert->faults as $key => $value) @endforeach). Holds all available information about the Fault, accessible in the format $value['Column'], for example: $value['ifDescr']. Special field $value['string'] has most Identification-information (IDs, Names, Descrs) as single string, this is the equivalent of the default used and must be encased in {{ }}
  • State: $alert->state
  • Severity: $alert->severity
  • Rule: $alert->rule
  • Rule-Name: $alert->name
  • Procedure URL: $alert->proc
  • Timestamp: $alert->timestamp
  • Transport type: $alert->transport
  • Transport name: $alert->transport_name
  • Contacts, must be iterated in a foreach, $key holds email and $value holds name: $alert->contacts

Placeholders can be used within the subjects for templates as well although $faults is most likely going to be worthless.

The Default Template is a 'one-size-fit-all'. We highly recommend defining your own templates for your rules to include more specific information.

Base Templates

If you'd like to reuse a common template for your alerts follow below

A default file is located in resources/views/alerts/templates/default.blade.php Displays the following:

<html>
     <head>
         <title>LibreNMS Alert</title>
     </head>
diff --git a/Alerting/Testing/index.html b/Alerting/Testing/index.html
index f288edab..8ff61ff6 100644
--- a/Alerting/Testing/index.html
+++ b/Alerting/Testing/index.html
@@ -1 +1 @@
- Testing - LibreNMS Docs       

Rules

The simplest way of testing if an alert rule will match a device is by going to the device, clicking edit (the cog), select Capture. From this new screen choose Alerts and click run.

The output will cycle through all alerts applicable to this device and show you the Rule name, rule, MySQL query and if the rule matches.

See Device Troubleshooting


Transports

You can test your transports by forcing an actual active alert to run regardless of the interval or delay values.

./scripts/test-alert.php. This script accepts -r for the rule id, -h for the device id or hostname and -d for debug.


Templates

It's possible to test your new template before assigning it to a rule. To do so you can run ./scripts/test-template.php. The script will provide the help info when ran without any parameters.

As an example, if you wanted to test template ID 10 against localhost running rule ID 2 then you would run:

./scripts/test-template.php -t 10 -d -h localhost -r 2

If the rule is currently alerting for localhost then you will get the full template as expected to see on email, if it's not then you will just see the template without any fault information.

\ No newline at end of file + Testing - LibreNMS Docs

Rules

The simplest way of testing if an alert rule will match a device is by going to the device, clicking edit (the cog), select Capture. From this new screen choose Alerts and click run.

The output will cycle through all alerts applicable to this device and show you the Rule name, rule, MySQL query and if the rule matches.

See Device Troubleshooting


Transports

You can test your transports by forcing an actual active alert to run regardless of the interval or delay values.

./scripts/test-alert.php. This script accepts -r for the rule id, -h for the device id or hostname and -d for debug.


Templates

It's possible to test your new template before assigning it to a rule. To do so you can run ./scripts/test-template.php. The script will provide the help info when ran without any parameters.

As an example, if you wanted to test template ID 10 against localhost running rule ID 2 then you would run:

./scripts/test-template.php -t 10 -d -h localhost -r 2

If the rule is currently alerting for localhost then you will get the full template as expected to see on email, if it's not then you will just see the template without any fault information.

\ No newline at end of file diff --git a/Alerting/Transports/index.html b/Alerting/Transports/index.html index e9bc8863..4e05f637 100644 --- a/Alerting/Transports/index.html +++ b/Alerting/Transports/index.html @@ -1,4 +1,4 @@ - Transports - LibreNMS Docs

Transports

Transports are located within LibreNMS/Alert/Transport/ and can be configured within the WebUI under Alerts -> Alert Transports.

Contacts will be gathered automatically and passed to the configured transports. By default the Contacts will be only gathered when the alert triggers and will ignore future changes in contacts for the incident. If you want contacts to be re-gathered before each dispatch, please set 'Updates to contact email addresses not honored' to Off in the WebUI.

The contacts will always include the SysContact defined in the Device's SNMP configuration and also every LibreNMS user that has at least read-permissions on the entity that is to be alerted.

At the moment LibreNMS only supports Port or Device permissions.

You can exclude the SysContact by toggling 'Issue alerts to sysContact'.

To include users that have Global-Read, Administrator or Normal-User permissions it is required to toggle the options:

  • Issue alerts to admins.
  • Issue alerts to read only users
  • Issue alerts to normal users.

Using a Proxy

Proxy Configuration

Using a AMQP based Transport

You need to install an additional php module : bcmath

Alerta

The alerta monitoring system is a tool used to consolidate and de-duplicate alerts from multiple sources for quick ‘at-a-glance’ visualisation. With just one system you can monitor alerts from many other monitoring tools on a single screen.

Example:

Config Example
API Endpoint http://alerta.example.com/api/alert
Environment Production
Apy key api key with write permission
Alert state critical
Recover state cleared

Alertmanager

Alertmanager is an alert handling software, initially developed for alert processing sent by Prometheus.

It has built-in functionality for deduplicating, grouping and routing alerts based on configurable criteria.

LibreNMS uses alert grouping by alert rule, which can produce an array of alerts of similar content for an array of hosts, whereas Alertmanager can group them by alert meta, ideally producing one single notice in case an issue occurs.

It is possible to configure as many label values as required in Alertmanager Options section. Every label and its value should be entered as a new line.

Labels can be a fixed string or a dynamic variable from the alert. To set a dynamic variable your label must start with extra_ then complete with the name of your label (only characters, figures and underscore are allowed here). The value must be the name of the variable you want to get (you can see all the variables in Alerts->Notifications by clicking on the Details icon of your alert when it is pending). If the variable's name does not match with an existing value the label's value will be the string you provided just as it was a fixed string.

Multiple Alertmanager URLs (comma separated) are supported. Each URL will be tried and the search will stop at the first success.

Basic HTTP authentication with a username and a password is supported. If you let those value blank, no authentication will be used.

Alertmanager Docs

Example:

Config Example
Alertmanager URL(s) http://alertmanager1.example.com,http://alertmanager2.example.com
Alertmanager Username myUsername
Alertmanager Password myPassword
Alertmanager Options: source=librenms
customlabel=value
extra_dynamic_value=variable_name

API

The API transport allows to reach any service provider using POST, PUT or GET URLs (Like SMS provider, etc). It can be used in multiple ways:

  • The same text built from the Alert template is available in the variable

$msg, which can then be sent as an option to the API. Be carefull that HTTP GET requests are usually limited in length.

  • The API-Option fields can be directly built from the variables defined in Template-Syntax but without the 'alert->' prefix. For instance, $alert->uptime is available as $uptime in the API transport

  • The API-Headers allows you to add the headers that the api endpoint requires.

  • The API-body allow sending data in the format required by the API endpoint.

A few variables commonly used :

Variable Description
{{ $hostname }} Hostname
{{ $sysName }} SysName
{{ $sysDescr }} SysDescr
{{ $os }} OS of device (librenms defined)
{{ $type }} Type of device (librenms defined)
{{ $ip }} IP Address
{{ $hardware }} Hardware
{{ $version }} Version
{{ $uptime }} Uptime in seconds
{{ $uptime_short }} Uptime in human-readable format
{{ $timestamp }} Timestamp of alert
{{ $description }} Description of device
{{ $title }} Title (as built from the Alert Template)
{{ $msg }} Body text (as built from the Alert Template)

Example:

The example below will use the API named sms-api of my.example.com and send the title of the alert to the provided number using the provided service key. Refer to your service documentation to configure it properly.

Config Example
API Method GET
API URL http://my.example.com/sms-api
API Options rcpt=0123456789
key=0987654321abcdef
msg=(LNMS) {{ $title }}
API Username myUsername
API Password myPassword

The example below will use the API named wall-display of my.example.com and send the title and text of the alert to a screen in the Network Operation Center.

Config Example
API Method POST
API URL http://my.example.com/wall-display
API Options title={{ $title }}
msg={{ $msg }}

The example below will use the API named component of my.example.com with id 1, body as json status value and headers send token authentication and content type required.

Config Example
API Method PUT
API URL http://my.example.com/comonent/1
API Headers X-Token=HASH
Content-Type=application/json
API Body { "status": 2 }

aspSMS

aspSMS is a SMS provider that can be configured by using the generic API Transport. You need a token you can find on your personnal space.

aspSMS docs

Example:

Config Example
Transport type Api
API Method POST
API URL https://soap.aspsms.com/aspsmsx.asmx/SimpleTextSMS
Options UserKey=USERKEY
Password=APIPASSWORD
Recipient=RECIPIENT
Originator=ORIGINATOR
MessageText={{ $msg }}

Browser Push

Browser push notifications can send a notification to the user's device even when the browser is not open. This requires HTTPS, the PHP GMP extension, Push API support, and permissions on each device to send alerts.

Simply configure an alert transport and allow notification permission on the device(s) you wish to receive alerts on. You may disable alerts on a browser on the user preferences page.

Canopsis

Canopsis is a hypervision tool. LibreNMS can send alerts to Canopsis which are then converted to canopsis events.

Canopsis Docs

Example:

Config Example
Hostname www.xxx.yyy.zzz
Port Number 5672
User admin
Password my_password
Vhost canopsis

Cisco Spark (aka Webex Teams)

Cisco Spark (now known as Webex Teams). LibreNMS can send alerts to a Cisco Spark room. To make this possible you need to have a RoomID and a token. You can also choose to send alerts using Markdown syntax. Enabling this option provides for more richly formatted alerts, but be sure to adjust your alert template to account for the Markdown syntax.

For more information about Cisco Spark RoomID and token, take a look here :

Example:

Config Example
API Token ASd23r23edewda
RoomID 34243243251
Use Markdown? x

Clickatell

Clickatell provides a REST-API requiring an Authorization-Token and at least one Cellphone number.

Clickatell Docs

Here an example using 3 numbers, any amount of numbers is supported:

Example:

Config Example
Token dsaWd3rewdwea
Mobile Numbers +1234567890,+1234567891,+1234567892

Discord

The Discord transport will POST the alert message to your Discord Incoming WebHook. Simple html tags are stripped from the message.

The only required value is for url, without this no call to Discord will be made. The Options field supports the JSON/Form Params listed in the Discord Docs below.

Discord Docs

Example:

Config Example
Discord URL https://discordapp.com/api/webhooks/4515489001665127664/82-sf4385ysuhfn34u2fhfsdePGLrg8K7cP9wl553Fg6OlZuuxJGaa1d54fe
Options username=myname

Elasticsearch

You can have LibreNMS send alerts to an elasticsearch database. Each fault will be sent as a separate document.

Example:

Config Example
Host 127.0.0.1
Port 9200
Index Pattern \l\i\b\r\e\n\m\s-Y.m.d

GitLab

LibreNMS will create issues for warning and critical level alerts however only title and description are set. Uses Personal access tokens to authenticate with GitLab and will store the token in cleartext.

Example:

Config Example
Host http://gitlab.host.tld
Project ID 1
Personal Access Token AbCdEf12345

Grafana Oncall

Send alerts to Grafana Oncall using a Formatted Webhook

Example:

Config Example
Webhook URL https://a-prod-us-central-0.grafana.net/integrations/v1/formatted_webhook/m12xmIjOcgwH74UF8CN4dk0Dh/

HipChat

See the HipChat API Documentation for rooms/message for details on acceptable values.

You may notice that the link points at the "deprecated" v1 API. This is because the v2 API is still in beta.

Example:

Config Example
API URL https://api.hipchat.com/v1/rooms/message?auth_token=109jawregoaihj
Room ID 7654321
From Name LibreNMS
Options color=red

At present the following options are supported: color.

Note: The default message format for HipChat messages is HTML. It is recommended that you specify the text message format to prevent unexpected results, such as HipChat attempting to interpret angled brackets (< and >).

IRC

The IRC transports only works together with the LibreNMS IRC-Bot. Configuration of the LibreNMS IRC-Bot is described here.

Example:

Config Example
IRC enabled

JIRA

You can have LibreNMS create issues on a Jira instance for critical and warning alerts using either the Jira REST API or webhooks. Custom fields allow you to add any required fields beyond summary and description fields in case mandatory fields are required by your Jira project/issue type configuration. Custom fields are defined in JSON format but ustom fields allow you to add any required fields beyond summary and description fields in case mandatory fields are required by your Jira project/issue type configuration. Custom fields are defined in JSON format. Currently http authentication is used to access Jira and Jira username and password will be stored as cleartext in the LibreNMS database.

REST API

The config fields that need to set for Jira REST API are: Jira Open URL, Jira username, Jira password, Project key, and issue type.

Note: REST API is that it is only able to open new tickets.

Webhooks

The config fields that need to set for webhooks are: Jira Open URL, Jira Close URL, Jira username, Jira password and webhook ID.

Note: Webhooks allow more control over how alerts are handled in Jira. With webhooks, recovery messages can be sent to a different URL than alerts. Additionally, a custom conditional logic can be built using the webhook payload and ID to automatically close an open ticket if predefined conditions are met.

Jira Issue Types Jira Webhooks

Example:

Config Example
Project Key JIRAPROJECTKEY
Issue Type Myissuetype
Open URL https://myjira.mysite.com / https://webhook-open-url
Close URL https://webhook-close-url
Jira Username myjirauser
Jira Password myjirapass
Enable webhook ON/OFF
Webhook ID alert_id
Custom Fileds {"components":[{"id":"00001"}], "source": "LibrenNMS"}

Jira Service Management

Using Jira Service Management LibreNMS integration, LibreNMS forwards alerts to Jira Service Management with detailed information. Jira Service Management acts as a dispatcher for LibreNMS alerts, determines the right people to notify based on on-call schedules and notifies via email, text messages (SMS), phone calls and iOS & Android push notifications. Then escalates alerts until the alert is acknowledged or closed.

:warning: If the feature isn’t available on your site, keep checking Jira Service Management for updates.

Example:

Config Example
WebHook URL https://url/path/to/webhook

LINE Messaging API

LINE Messaging API Docs

Here is the step for setup a LINE bot and using it in LibreNMS.

  1. Use your real LINE account register in developer protal.

  2. Add a new channel, choose Messaging API and continue fill up the forms, note that Channel name cannot edit later.

  3. Go to "Messaging API" tab of your channel, here listing some important value.

    • Bot basic ID and QR code is your LINE bot's ID and QR code.
    • Channel access token (long-lived), will use it in LibreNMS, keep it safe.
  4. Use your real Line account add your LINE bot as a friend.

  5. Recipient ID can be groupID, userID or roomID, it will be used in LibreNMS to send message to a group or a user. Use the following NodeJS program and ngrok for temporally https webhook to listen it.

    LINE-bot-RecipientFetcher

  6. Run the program and using ngrok expose port to public

    $ node index.js
    + Transports - LibreNMS Docs       

    Transports

    Transports are located within LibreNMS/Alert/Transport/ and can be configured within the WebUI under Alerts -> Alert Transports.

    Contacts will be gathered automatically and passed to the configured transports. By default the Contacts will be only gathered when the alert triggers and will ignore future changes in contacts for the incident. If you want contacts to be re-gathered before each dispatch, please set 'Updates to contact email addresses not honored' to Off in the WebUI.

    The contacts will always include the SysContact defined in the Device's SNMP configuration and also every LibreNMS user that has at least read-permissions on the entity that is to be alerted.

    At the moment LibreNMS only supports Port or Device permissions.

    You can exclude the SysContact by toggling 'Issue alerts to sysContact'.

    To include users that have Global-Read, Administrator or Normal-User permissions it is required to toggle the options:

    • Issue alerts to admins.
    • Issue alerts to read only users
    • Issue alerts to normal users.

    Using a Proxy

    Proxy Configuration

    Using a AMQP based Transport

    You need to install an additional php module : bcmath

    Alerta

    The alerta monitoring system is a tool used to consolidate and de-duplicate alerts from multiple sources for quick ‘at-a-glance’ visualisation. With just one system you can monitor alerts from many other monitoring tools on a single screen.

    Example:

    Config Example
    API Endpoint http://alerta.example.com/api/alert
    Environment Production
    Apy key api key with write permission
    Alert state critical
    Recover state cleared

    Alertmanager

    Alertmanager is an alert handling software, initially developed for alert processing sent by Prometheus.

    It has built-in functionality for deduplicating, grouping and routing alerts based on configurable criteria.

    LibreNMS uses alert grouping by alert rule, which can produce an array of alerts of similar content for an array of hosts, whereas Alertmanager can group them by alert meta, ideally producing one single notice in case an issue occurs.

    It is possible to configure as many label values as required in Alertmanager Options section. Every label and its value should be entered as a new line.

    Labels can be a fixed string or a dynamic variable from the alert. To set a dynamic variable your label must start with extra_ then complete with the name of your label (only characters, figures and underscore are allowed here). The value must be the name of the variable you want to get (you can see all the variables in Alerts->Notifications by clicking on the Details icon of your alert when it is pending). If the variable's name does not match with an existing value the label's value will be the string you provided just as it was a fixed string.

    Multiple Alertmanager URLs (comma separated) are supported. Each URL will be tried and the search will stop at the first success.

    Basic HTTP authentication with a username and a password is supported. If you let those value blank, no authentication will be used.

    Alertmanager Docs

    Example:

    Config Example
    Alertmanager URL(s) http://alertmanager1.example.com,http://alertmanager2.example.com
    Alertmanager Username myUsername
    Alertmanager Password myPassword
    Alertmanager Options: source=librenms
    customlabel=value
    extra_dynamic_value=variable_name

    API

    The API transport allows to reach any service provider using POST, PUT or GET URLs (Like SMS provider, etc). It can be used in multiple ways:

    • The same text built from the Alert template is available in the variable

    $msg, which can then be sent as an option to the API. Be carefull that HTTP GET requests are usually limited in length.

    • The API-Option fields can be directly built from the variables defined in Template-Syntax but without the 'alert->' prefix. For instance, $alert->uptime is available as $uptime in the API transport

    • The API-Headers allows you to add the headers that the api endpoint requires.

    • The API-body allow sending data in the format required by the API endpoint.

    A few variables commonly used :

    Variable Description
    {{ $hostname }} Hostname
    {{ $sysName }} SysName
    {{ $sysDescr }} SysDescr
    {{ $os }} OS of device (librenms defined)
    {{ $type }} Type of device (librenms defined)
    {{ $ip }} IP Address
    {{ $hardware }} Hardware
    {{ $version }} Version
    {{ $uptime }} Uptime in seconds
    {{ $uptime_short }} Uptime in human-readable format
    {{ $timestamp }} Timestamp of alert
    {{ $description }} Description of device
    {{ $title }} Title (as built from the Alert Template)
    {{ $msg }} Body text (as built from the Alert Template)

    Example:

    The example below will use the API named sms-api of my.example.com and send the title of the alert to the provided number using the provided service key. Refer to your service documentation to configure it properly.

    Config Example
    API Method GET
    API URL http://my.example.com/sms-api
    API Options rcpt=0123456789
    key=0987654321abcdef
    msg=(LNMS) {{ $title }}
    API Username myUsername
    API Password myPassword

    The example below will use the API named wall-display of my.example.com and send the title and text of the alert to a screen in the Network Operation Center.

    Config Example
    API Method POST
    API URL http://my.example.com/wall-display
    API Options title={{ $title }}
    msg={{ $msg }}

    The example below will use the API named component of my.example.com with id 1, body as json status value and headers send token authentication and content type required.

    Config Example
    API Method PUT
    API URL http://my.example.com/comonent/1
    API Headers X-Token=HASH
    Content-Type=application/json
    API Body { "status": 2 }

    aspSMS

    aspSMS is a SMS provider that can be configured by using the generic API Transport. You need a token you can find on your personnal space.

    aspSMS docs

    Example:

    Config Example
    Transport type Api
    API Method POST
    API URL https://soap.aspsms.com/aspsmsx.asmx/SimpleTextSMS
    Options UserKey=USERKEY
    Password=APIPASSWORD
    Recipient=RECIPIENT
    Originator=ORIGINATOR
    MessageText={{ $msg }}

    Browser Push

    Browser push notifications can send a notification to the user's device even when the browser is not open. This requires HTTPS, the PHP GMP extension, Push API support, and permissions on each device to send alerts.

    Simply configure an alert transport and allow notification permission on the device(s) you wish to receive alerts on. You may disable alerts on a browser on the user preferences page.

    Canopsis

    Canopsis is a hypervision tool. LibreNMS can send alerts to Canopsis which are then converted to canopsis events.

    Canopsis Docs

    Example:

    Config Example
    Hostname www.xxx.yyy.zzz
    Port Number 5672
    User admin
    Password my_password
    Vhost canopsis

    Cisco Spark (aka Webex Teams)

    Cisco Spark (now known as Webex Teams). LibreNMS can send alerts to a Cisco Spark room. To make this possible you need to have a RoomID and a token. You can also choose to send alerts using Markdown syntax. Enabling this option provides for more richly formatted alerts, but be sure to adjust your alert template to account for the Markdown syntax.

    For more information about Cisco Spark RoomID and token, take a look here :

    Example:

    Config Example
    API Token ASd23r23edewda
    RoomID 34243243251
    Use Markdown? x

    Clickatell

    Clickatell provides a REST-API requiring an Authorization-Token and at least one Cellphone number.

    Clickatell Docs

    Here an example using 3 numbers, any amount of numbers is supported:

    Example:

    Config Example
    Token dsaWd3rewdwea
    Mobile Numbers +1234567890,+1234567891,+1234567892

    Discord

    The Discord transport will POST the alert message to your Discord Incoming WebHook. Simple html tags are stripped from the message.

    The only required value is for url, without this no call to Discord will be made. The Options field supports the JSON/Form Params listed in the Discord Docs below.

    Discord Docs

    Example:

    Config Example
    Discord URL https://discordapp.com/api/webhooks/4515489001665127664/82-sf4385ysuhfn34u2fhfsdePGLrg8K7cP9wl553Fg6OlZuuxJGaa1d54fe
    Options username=myname

    Elasticsearch

    You can have LibreNMS send alerts to an elasticsearch database. Each fault will be sent as a separate document.

    Example:

    Config Example
    Host 127.0.0.1
    Port 9200
    Index Pattern \l\i\b\r\e\n\m\s-Y.m.d

    GitLab

    LibreNMS will create issues for warning and critical level alerts however only title and description are set. Uses Personal access tokens to authenticate with GitLab and will store the token in cleartext.

    Example:

    Config Example
    Host http://gitlab.host.tld
    Project ID 1
    Personal Access Token AbCdEf12345

    Grafana Oncall

    Send alerts to Grafana Oncall using a Formatted Webhook

    Example:

    Config Example
    Webhook URL https://a-prod-us-central-0.grafana.net/integrations/v1/formatted_webhook/m12xmIjOcgwH74UF8CN4dk0Dh/

    HipChat

    See the HipChat API Documentation for rooms/message for details on acceptable values.

    You may notice that the link points at the "deprecated" v1 API. This is because the v2 API is still in beta.

    Example:

    Config Example
    API URL https://api.hipchat.com/v1/rooms/message?auth_token=109jawregoaihj
    Room ID 7654321
    From Name LibreNMS
    Options color=red

    At present the following options are supported: color.

    Note: The default message format for HipChat messages is HTML. It is recommended that you specify the text message format to prevent unexpected results, such as HipChat attempting to interpret angled brackets (< and >).

    IRC

    The IRC transports only works together with the LibreNMS IRC-Bot. Configuration of the LibreNMS IRC-Bot is described here.

    Example:

    Config Example
    IRC enabled

    JIRA

    You can have LibreNMS create issues on a Jira instance for critical and warning alerts using either the Jira REST API or webhooks. Custom fields allow you to add any required fields beyond summary and description fields in case mandatory fields are required by your Jira project/issue type configuration. Custom fields are defined in JSON format but ustom fields allow you to add any required fields beyond summary and description fields in case mandatory fields are required by your Jira project/issue type configuration. Custom fields are defined in JSON format. Currently http authentication is used to access Jira and Jira username and password will be stored as cleartext in the LibreNMS database.

    REST API

    The config fields that need to set for Jira REST API are: Jira Open URL, Jira username, Jira password, Project key, and issue type.

    Note: REST API is that it is only able to open new tickets.

    Webhooks

    The config fields that need to set for webhooks are: Jira Open URL, Jira Close URL, Jira username, Jira password and webhook ID.

    Note: Webhooks allow more control over how alerts are handled in Jira. With webhooks, recovery messages can be sent to a different URL than alerts. Additionally, a custom conditional logic can be built using the webhook payload and ID to automatically close an open ticket if predefined conditions are met.

    Jira Issue Types Jira Webhooks

    Example:

    Config Example
    Project Key JIRAPROJECTKEY
    Issue Type Myissuetype
    Open URL https://myjira.mysite.com / https://webhook-open-url
    Close URL https://webhook-close-url
    Jira Username myjirauser
    Jira Password myjirapass
    Enable webhook ON/OFF
    Webhook ID alert_id
    Custom Fileds {"components":[{"id":"00001"}], "source": "LibrenNMS"}

    Jira Service Management

    Using Jira Service Management LibreNMS integration, LibreNMS forwards alerts to Jira Service Management with detailed information. Jira Service Management acts as a dispatcher for LibreNMS alerts, determines the right people to notify based on on-call schedules and notifies via email, text messages (SMS), phone calls and iOS & Android push notifications. Then escalates alerts until the alert is acknowledged or closed.

    :warning: If the feature isn’t available on your site, keep checking Jira Service Management for updates.

    Example:

    Config Example
    WebHook URL https://url/path/to/webhook

    LINE Messaging API

    LINE Messaging API Docs

    Here is the step for setup a LINE bot and using it in LibreNMS.

    1. Use your real LINE account register in developer protal.

    2. Add a new channel, choose Messaging API and continue fill up the forms, note that Channel name cannot edit later.

    3. Go to "Messaging API" tab of your channel, here listing some important value.

      • Bot basic ID and QR code is your LINE bot's ID and QR code.
      • Channel access token (long-lived), will use it in LibreNMS, keep it safe.
    4. Use your real Line account add your LINE bot as a friend.

    5. Recipient ID can be groupID, userID or roomID, it will be used in LibreNMS to send message to a group or a user. Use the following NodeJS program and ngrok for temporally https webhook to listen it.

      LINE-bot-RecipientFetcher

    6. Run the program and using ngrok expose port to public

      $ node index.js
       $ ngrok http 3000
       
    7. Go to "Messaging API" tab of your channel, fill up Webhook URL to https://<your ngrok domain>/webhook

    8. If you want to let LINE bot send message to a yourself, use your real account to send a message to your LINE bot. Program will print out the userID in console.

      sample value:

      {"type":"user","userId":"U527xxxxxxxxxxxxxxxxxxxxxxxxxc0ee"}
       
    9. If you want to let LINE bot send message to a group, do the following steps.

      • Add your LINE bot into group
      • Use your real account to send a message to group

      Program will print out the groupID in console, it will be Recipient ID, keep it safe.

      sample value:

      {"type":"group","groupId":"Ce51xxxxxxxxxxxxxxxxxxxxxxxxxx6ef","userId":"U527xxxxxxxxxxxxxxxxxxxxxxxxxc0ee"} ```
      diff --git a/Alerting/index.html b/Alerting/index.html
      index cc92f513..37eaeac5 100644
      --- a/Alerting/index.html
      +++ b/Alerting/index.html
      @@ -1 +1 @@
      - Introduction - LibreNMS Docs       

      Introduction

      To get started, you first need some alert rules which will react to changes with your devices before raising an alert.

      Creating alert rules

      After that you also need to tell LibreNMS how to notify you when an alert is raised, this is done using Alert Transports.

      Configuring alert transports

      The next step is not strictly required but most people find it useful. Creating custom alert templates will help you get the benefit out of the alert system in general. Whilst we include a default template, it is limited in the data that you will receive in the alerts.

      Configuring alert templates

      Managing alerts

      When an alert has triggered you will see these in the Alerts -> Notifications page within the Web UI.

      This list has a couple of options available to it and we'll explain what these are here.

      ACK

      This column provides you visibility on the status of the alert:

      ack alert This alert is currently active and sending alerts. Click this icon to acknowledge the alert.

      unack alert This alert is currently acknowledged until the alert clears. Click this icon to un-acknowledge the alert.

      unack alert until fault worsens This alert is currently acknowledged until the alert worsens or gets better, at which stage it will be automatically unacknowledged and alerts will resume. Click this icon to un-acknowledge the alert.

      Notes

      alert notes This column will allow you access to the acknowledge/unacknowledge notes for this alert.

      \ No newline at end of file + Introduction - LibreNMS Docs

      Introduction

      To get started, you first need some alert rules which will react to changes with your devices before raising an alert.

      Creating alert rules

      After that you also need to tell LibreNMS how to notify you when an alert is raised, this is done using Alert Transports.

      Configuring alert transports

      The next step is not strictly required but most people find it useful. Creating custom alert templates will help you get the benefit out of the alert system in general. Whilst we include a default template, it is limited in the data that you will receive in the alerts.

      Configuring alert templates

      Managing alerts

      When an alert has triggered you will see these in the Alerts -> Notifications page within the Web UI.

      This list has a couple of options available to it and we'll explain what these are here.

      ACK

      This column provides you visibility on the status of the alert:

      ack alert This alert is currently active and sending alerts. Click this icon to acknowledge the alert.

      unack alert This alert is currently acknowledged until the alert clears. Click this icon to un-acknowledge the alert.

      unack alert until fault worsens This alert is currently acknowledged until the alert worsens or gets better, at which stage it will be automatically unacknowledged and alerts will resume. Click this icon to un-acknowledge the alert.

      Notes

      alert notes This column will allow you access to the acknowledge/unacknowledge notes for this alert.

      \ No newline at end of file diff --git a/Developing/Application-Notes/index.html b/Developing/Application-Notes/index.html index 43f53492..c950589d 100644 --- a/Developing/Application-Notes/index.html +++ b/Developing/Application-Notes/index.html @@ -1,4 +1,4 @@ - Applications - LibreNMS Docs

      Notes On Application Development

      LibreNMS JSON SNMP Extends

      The polling function json_app_get makes it easy to poll complex data using SNMP extends and JSON.

      The following exceptions are provided by it.

      It takes three parameters, in order in the list below.

      • Integer :: Device ID to fetch it for.
      • String :: The extend name. For example, if 'zfs' is passed it will be converted to 'nsExtendOutputFull.3.122.102.115'.
      • Integer :: Minimum expected version of the JSON return.

      The required keys for the returned JSON are as below.

      • version :: The version of the snmp extend script. Should be numeric and at least 1.
      • error :: Error code from the snmp extend script. Should be > 0 (0 will be ignored and negatives are reserved)
      • errorString :: Text to describe the error.
      • data :: An key with an array with the data to be used.

      The supported exceptions are as below.

      • JsonAppPollingFailedException :: Empty return from SNMP.
      • JsonAppParsingFailedException :: Could not parse the JSON
      • JsonAppBlankJsonException :: Blank JSON.
      • JsonAppMissingKeysException :: Missing required keys.
      • JsonAppWrongVersionException :: Older version than supported.
      • JsonAppExtendErroredException :: Polling and parsing was good, but the returned data has an error set. This may be checked via $e->getParsedJson() and then checking the keys error and errorString.

      The error value can be accessed via $e->getCode(). The output can be accessed via $->getOutput() Only returned JsonAppParsingFailedException. The parsed JSON can be access via $e->getParsedJson().

      An example below from includes/polling/applications/zfs.inc.php...

      try {
      + Applications - LibreNMS Docs       

      Notes On Application Development

      LibreNMS JSON SNMP Extends

      The polling function json_app_get makes it easy to poll complex data using SNMP extends and JSON.

      The following exceptions are provided by it.

      It takes three parameters, in order in the list below.

      • Integer :: Device ID to fetch it for.
      • String :: The extend name. For example, if 'zfs' is passed it will be converted to 'nsExtendOutputFull.3.122.102.115'.
      • Integer :: Minimum expected version of the JSON return.

      The required keys for the returned JSON are as below.

      • version :: The version of the snmp extend script. Should be numeric and at least 1.
      • error :: Error code from the snmp extend script. Should be > 0 (0 will be ignored and negatives are reserved)
      • errorString :: Text to describe the error.
      • data :: An key with an array with the data to be used.

      The supported exceptions are as below.

      • JsonAppPollingFailedException :: Empty return from SNMP.
      • JsonAppParsingFailedException :: Could not parse the JSON
      • JsonAppBlankJsonException :: Blank JSON.
      • JsonAppMissingKeysException :: Missing required keys.
      • JsonAppWrongVersionException :: Older version than supported.
      • JsonAppExtendErroredException :: Polling and parsing was good, but the returned data has an error set. This may be checked via $e->getParsedJson() and then checking the keys error and errorString.

      The error value can be accessed via $e->getCode(). The output can be accessed via $->getOutput() Only returned JsonAppParsingFailedException. The parsed JSON can be access via $e->getParsedJson().

      An example below from includes/polling/applications/zfs.inc.php...

      try {
           $zfs = json_app_get($device, $name, 1)['data'];
       } catch (JsonAppMissingKeysException $e) {
           //old version with out the data key
      diff --git a/Developing/Code-Structure/index.html b/Developing/Code-Structure/index.html
      index ce891fbf..a1814c29 100644
      --- a/Developing/Code-Structure/index.html
      +++ b/Developing/Code-Structure/index.html
      @@ -1,4 +1,4 @@
      - Code Structure - LibreNMS Docs       

      Code structure

      This document will try and provide a good overview of how the code is structured within LibreNMS. We will go through the main directories and provide information on how and when they are used. LibreNMS now uses Laravel for much of it's frontend (webui) and database code. Much of the Laravel documentation applies: https://laravel.com/docs/structure

      Directories from the (filtered) structure tree below are some of the directories that will be most interesting during development:

      .
      + Code Structure - LibreNMS Docs       

      Code structure

      This document will try and provide a good overview of how the code is structured within LibreNMS. We will go through the main directories and provide information on how and when they are used. LibreNMS now uses Laravel for much of it's frontend (webui) and database code. Much of the Laravel documentation applies: https://laravel.com/docs/structure

      Directories from the (filtered) structure tree below are some of the directories that will be most interesting during development:

      .
       ├─ app
       ├─ database
       │  └─ migrations
      diff --git a/Developing/Creating-Documentation/index.html b/Developing/Creating-Documentation/index.html
      index 15296eaf..11e0cc92 100644
      --- a/Developing/Creating-Documentation/index.html
      +++ b/Developing/Creating-Documentation/index.html
      @@ -1,4 +1,4 @@
      - Creating Documentation - LibreNMS Docs       

      Creating Documentation

      One of the goals of the LibreNMS project is to enable users to get all of the help they need from our documentation.

      The documentation uses the markdown markup language and is generated with mkdocs. To edit or create markdown you only need a text editor, but it is recommended to build your docs before submitting, in order to check them visually. The section on this page has instructions for this step.

      Writing docs

      When you are adding a new feature or extension, we need to have full documentation to go along with it. It's quite simple to do this:

      • Find the relevant directory to store your new document in, General, Support and Extensions are the most likely choices.
      • Think of a descriptive name that's not too long, it should match what they may be looking for or describes the feature.
      • Add the new document into the nav section of mkdocs.yml if it needs to appear in the table of contents
      • Ensure the first line contains: source: path/to/file.md - don't include the initial doc/.
      • In the body of the document, be descriptive but keep things simple. Some tips:
      • If the document could cover different distros like CentOS and Ubuntu please try and include the information for them all. If that's not possible then at least put a placeholder in asking for contributions.
      • Ensure you use the correct formatting for commands and code blocks by wrapping one liners in backticks or blocks in ```.
      • Put content into sub-headings where possible to organise the content.
      • If you rename a file, please add a redirect for the old file in mkdocs.yml like so:
          - redirects:
        + Creating Documentation - LibreNMS Docs       

        Creating Documentation

        One of the goals of the LibreNMS project is to enable users to get all of the help they need from our documentation.

        The documentation uses the markdown markup language and is generated with mkdocs. To edit or create markdown you only need a text editor, but it is recommended to build your docs before submitting, in order to check them visually. The section on this page has instructions for this step.

        Writing docs

        When you are adding a new feature or extension, we need to have full documentation to go along with it. It's quite simple to do this:

        • Find the relevant directory to store your new document in, General, Support and Extensions are the most likely choices.
        • Think of a descriptive name that's not too long, it should match what they may be looking for or describes the feature.
        • Add the new document into the nav section of mkdocs.yml if it needs to appear in the table of contents
        • Ensure the first line contains: source: path/to/file.md - don't include the initial doc/.
        • In the body of the document, be descriptive but keep things simple. Some tips:
        • If the document could cover different distros like CentOS and Ubuntu please try and include the information for them all. If that's not possible then at least put a placeholder in asking for contributions.
        • Ensure you use the correct formatting for commands and code blocks by wrapping one liners in backticks or blocks in ```.
        • Put content into sub-headings where possible to organise the content.
        • If you rename a file, please add a redirect for the old file in mkdocs.yml like so:
            - redirects:
                 redirect_maps:
                   'old/page.md': 'new/page.md'
           

        Please ensure you add the document to the relevant section within pages of mkdocs.yml so that it's in the correct menu and is built. Forgetting this step will result in your document never seeing the light of day :)

        Formatting docs

        Our docs are based on Markdown using mkdocs which adheres to markdown specs and nothing more, because of that we also import a couple of extra libraries:

        • pymdownx.tasklist
        • pymdownx.tilde

        This means you can use:

        • ~~strikethrough~~ to perform strikethrough
        • - [X] List items
        • Url's can be made [like this](https://www.librenms.org) like this
        • Code can be placed in `` for single line or ``` for multiline.
        • # Can be used for main headings which translates to a <h1> tag, increasing the #'s will increase the hX tags.
        • ### Can be used for sub-headings which will appear in the TOC to the left.
        • Settings should be prefixed with !!! setting "<webui setting path>"

        Markdown CheatSheet Link

        Building docs

        This is achieved with mkdocs, a python package.

        1. Install the required packages.

        pip install mkdocs mkdocs-exclude mkdocs-material mkdocs-macros-plugin mkdocs-minify-plugin mkdocs-redirects
        diff --git a/Developing/Creating-Release/index.html b/Developing/Creating-Release/index.html
        index 9b56a54f..fec7cd36 100644
        --- a/Developing/Creating-Release/index.html
        +++ b/Developing/Creating-Release/index.html
        @@ -1,2 +1,2 @@
        - Creating Release - LibreNMS Docs       

        Creating a release

        GitHub

        You can create a new release on GitHub.

        Enter the tag version that month, i.e for September 2016 you would enter 201609.

        Enter a title, we usually use August 2016 Release

        Enter a placeholder for the body, we will edit this later.

        Create changelog

        For this, we assume you are using the master branch to create the release against.

        We now generate the changelog using the GitHub API itself so it shouldn't matter what state your local branch is in so long as it has the code to generate the changelog itself.

        Using the GitHub API means we can use the labels associated with merged pull requests to categorise the changelog. We also then record who made the pull request to thank them in the changelog itself.

        You will be asked for a GitHub personal access token. You can generate this here. No permissions should be needed so just give it a name and click Generate Token. You can then export the token as an environment variable GH_TOKEN or place it in your .env file.

        The basic command to run is by using artisan. Here you pass new tag (1.41) and previous tag (1.40). For further help run php artisan release:tag --help. This will generate a changelog up to the latest master branch, if you want it to be done against something else then pass the latest pull request number with --pr $PR_NUMBER.

        php artisan release:tag 1.41 1.40
        + Creating Release - LibreNMS Docs       

        Creating a release

        GitHub

        You can create a new release on GitHub.

        Enter the tag version that month, i.e for September 2016 you would enter 201609.

        Enter a title, we usually use August 2016 Release

        Enter a placeholder for the body, we will edit this later.

        Create changelog

        For this, we assume you are using the master branch to create the release against.

        We now generate the changelog using the GitHub API itself so it shouldn't matter what state your local branch is in so long as it has the code to generate the changelog itself.

        Using the GitHub API means we can use the labels associated with merged pull requests to categorise the changelog. We also then record who made the pull request to thank them in the changelog itself.

        You will be asked for a GitHub personal access token. You can generate this here. No permissions should be needed so just give it a name and click Generate Token. You can then export the token as an environment variable GH_TOKEN or place it in your .env file.

        The basic command to run is by using artisan. Here you pass new tag (1.41) and previous tag (1.40). For further help run php artisan release:tag --help. This will generate a changelog up to the latest master branch, if you want it to be done against something else then pass the latest pull request number with --pr $PR_NUMBER.

        php artisan release:tag 1.41 1.40
         
        • Now commit and push the change that has been made to doc/General/Changelog.md.
        • Once the pull request has been merged in for the Changelog, you can create a new release on GitHub.
        • Create two threads on the community site:
        • A changelog thread example
        • An info thread example
        • Tweet it
        • Facebook it
        • Google Plus it
        • LinkedIn it
        \ No newline at end of file diff --git a/Developing/Dynamic-Config/index.html b/Developing/Dynamic-Config/index.html index 79388f78..651c86de 100644 --- a/Developing/Dynamic-Config/index.html +++ b/Developing/Dynamic-Config/index.html @@ -1,4 +1,4 @@ - Dynamic Config - LibreNMS Docs

        Adding new config settings

        Adding support for users to update a new config option via the WebUI is now a lot easier for general options. This document shows you how to add a new config option and even section to the WebUI.

        Config settings are defined in misc/config_definitions.json

        You should give a little thought to the name of your config setting. For example: a good setting for snmp community, would be snmp.community. The dot notation is path and when the config is hydrated, it is converted to a nested array. If the user is overriding the option in config.php it would use the format $config['snmp']['community']

        Translation

        The config definition system inherently supports translation. You must add the English names in the resoures/lang/en/settings.php file (and other languages if you can).

        To update the javascript translation files, run:

        ./lnms translation:generate
        + Dynamic Config - LibreNMS Docs       

        Adding new config settings

        Adding support for users to update a new config option via the WebUI is now a lot easier for general options. This document shows you how to add a new config option and even section to the WebUI.

        Config settings are defined in misc/config_definitions.json

        You should give a little thought to the name of your config setting. For example: a good setting for snmp community, would be snmp.community. The dot notation is path and when the config is hydrated, it is converted to a nested array. If the user is overriding the option in config.php it would use the format $config['snmp']['community']

        Translation

        The config definition system inherently supports translation. You must add the English names in the resoures/lang/en/settings.php file (and other languages if you can).

        To update the javascript translation files, run:

        ./lnms translation:generate
         

        Definition Format

        For snmp.community, this is the definition:

        "snmp.community": {
             "group": "poller",
             "section": "snmp",
        diff --git a/Developing/Getting-Started/index.html b/Developing/Getting-Started/index.html
        index b2fa82dd..b2d12b82 100644
        --- a/Developing/Getting-Started/index.html
        +++ b/Developing/Getting-Started/index.html
        @@ -1,4 +1,4 @@
        - Getting Started - LibreNMS Docs       

        Get ready to contribute to LibreNMS

        This document is intended to help you get your local environment set up to contribute code to the LibreNMS project.

        Setting up a development environment

        When starting to develop, it may be tempting to just make changes on your production server, but that will make things harder for you. Taking a little time to set up somewhere to work on code changes can really help.

        Possible options:

        • A Linux computer, VM, or container
        • Another directory on your LibreNMS server
        • Windows Subsystem for Linux

        Set up your development git clone

        1. Follow the documentation on using git

        2. Install development dependencies ./scripts/composer_wrapper.php install

        3. Set variables in .env, including database settings. Which could be a local or remote MySQL server including your production DB.

        APP_ENV=local
        + Getting Started - LibreNMS Docs       

        Get ready to contribute to LibreNMS

        This document is intended to help you get your local environment set up to contribute code to the LibreNMS project.

        Setting up a development environment

        When starting to develop, it may be tempting to just make changes on your production server, but that will make things harder for you. Taking a little time to set up somewhere to work on code changes can really help.

        Possible options:

        • A Linux computer, VM, or container
        • Another directory on your LibreNMS server
        • Windows Subsystem for Linux

        Set up your development git clone

        1. Follow the documentation on using git

        2. Install development dependencies ./scripts/composer_wrapper.php install

        3. Set variables in .env, including database settings. Which could be a local or remote MySQL server including your production DB.

        APP_ENV=local
         APP_DEBUG=true
         ...
         
        1. Start a development webserver ./lnms serve

        2. Access the Web UI at http://localhost:8000

        Automated testing

        LibreNMS uses continuous integration to test code changes to help reduce bugs. This also helps guarantee the changes you contribute won't be broken in the future. You can find out more in our Validating Code Documentation

        The default database connection for automated testing is testing.

        To override the database parameters for unit tests, configure your .env file accordingly. The defaults (from config/database.php) are:

        DB_TEST_DRIVER="mysql"   # PDO driver
        diff --git a/Developing/Merging-Pull-Requests/index.html b/Developing/Merging-Pull-Requests/index.html
        index 7b547289..dc583d90 100644
        --- a/Developing/Merging-Pull-Requests/index.html
        +++ b/Developing/Merging-Pull-Requests/index.html
        @@ -1 +1 @@
        - Merging Pull Requests - LibreNMS Docs       

        Merging Pull Requests

        GitHub

        We will now build the monthly change log from our GitHub commits. When merging a commit, please ensure you:

        • Click the Merge pull request button
        • Give the merge a descriptive but short title
        • For the commit message prepend it with one of the following tags for the pull request to appear in the changelog:
        • devices: or newdevice: For new device support.
        • feature: or feat: To indicate this is a new or updated feature
        • webui: or web: To indicate this is an update to the WebUI
        • fix: or bugfix: To show this is a bug fix.
        • refactoring: or refactor: When the changes are refactoring a large portion of code
        • You can reference an issue number with #xyz, i.e #1234
        • Use the Confirm squash and merge button to merge.

        Example commits

        Feature

        feature: Added new availability map #4401

        New device

        newdevice: Added support for Cisco ASA #4402

        \ No newline at end of file + Merging Pull Requests - LibreNMS Docs

        Merging Pull Requests

        GitHub

        We will now build the monthly change log from our GitHub commits. When merging a commit, please ensure you:

        • Click the Merge pull request button
        • Give the merge a descriptive but short title
        • For the commit message prepend it with one of the following tags for the pull request to appear in the changelog:
        • devices: or newdevice: For new device support.
        • feature: or feat: To indicate this is a new or updated feature
        • webui: or web: To indicate this is an update to the WebUI
        • fix: or bugfix: To show this is a bug fix.
        • refactoring: or refactor: When the changes are refactoring a large portion of code
        • You can reference an issue number with #xyz, i.e #1234
        • Use the Confirm squash and merge button to merge.

        Example commits

        Feature

        feature: Added new availability map #4401

        New device

        newdevice: Added support for Cisco ASA #4402

        \ No newline at end of file diff --git a/Developing/SNMP-Traps/index.html b/Developing/SNMP-Traps/index.html index 150d59ab..d12a3688 100644 --- a/Developing/SNMP-Traps/index.html +++ b/Developing/SNMP-Traps/index.html @@ -1,4 +1,4 @@ - SNMP Traps - LibreNMS Docs

        Creating snmp trap handlers

        You must have a working snmptrapd. See SNMP TRAP HANDLER

        Make sure the MIB is loaded from the trap you are adding. Edit /etc/systemd/system/snmptrapd.service.d/mibs.conf to add it then restart snmptrapd.

        MIBDIRS option is not recursive, so you need to specify each directory individually.

        Create a new class in LibreNMS\Snmptrap\Handlers that implements the LibreNMS\Interfaces\SnmptrapHandler interface. For example:

        <?php
        + SNMP Traps - LibreNMS Docs       

        Creating snmp trap handlers

        You must have a working snmptrapd. See SNMP TRAP HANDLER

        Make sure the MIB is loaded from the trap you are adding. Edit /etc/systemd/system/snmptrapd.service.d/mibs.conf to add it then restart snmptrapd.

        MIBDIRS option is not recursive, so you need to specify each directory individually.

        Create a new class in LibreNMS\Snmptrap\Handlers that implements the LibreNMS\Interfaces\SnmptrapHandler interface. For example:

        <?php
         /**
          * ColdBoot.php
          *
        diff --git a/Developing/Sensor-State-Support/index.html b/Developing/Sensor-State-Support/index.html
        index 49037642..6ffdbb7a 100644
        --- a/Developing/Sensor-State-Support/index.html
        +++ b/Developing/Sensor-State-Support/index.html
        @@ -1,4 +1,4 @@
        - Sensor State Support - LibreNMS Docs       

        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 are derived from Nagios:

        0 = OK
        + Sensor State Support - LibreNMS Docs       

        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 are derived from Nagios:

        0 = OK
         1 = Warning
         2 = Critical
         3 = Unknown
        diff --git a/Developing/Support-New-OS/index.html b/Developing/Support-New-OS/index.html
        index 10276c9b..cf2171e2 100644
        --- a/Developing/Support-New-OS/index.html
        +++ b/Developing/Support-New-OS/index.html
        @@ -1 +1 @@
        - Intro - LibreNMS Docs      

        Intro

        This document is broken down into the relevant sections depending on what support you are adding. During all of these examples we will be using the OS of pulse as the example OS we will add.

        We currently have a script in pre-beta stages that can help speed up the process of deploying a new OS. It has support for add sensors in a basic form (except state sensors).

        In this example, we will add a new OS called test-os using the device ID 101 that has already been added. It will be of the type network and belongs to the vendor, Cisco:

        ./scripts/new-os.php -h 101 -o test-os -t network -v cisco

        The process will then step you through the process with some more questions. Please be warned, this is currently pre-beta and may cause some issues. Please let us know of any on Discord.

        \ No newline at end of file + Intro - LibreNMS Docs

        Intro

        This document is broken down into the relevant sections depending on what support you are adding. During all of these examples we will be using the OS of pulse as the example OS we will add.

        We currently have a script in pre-beta stages that can help speed up the process of deploying a new OS. It has support for add sensors in a basic form (except state sensors).

        In this example, we will add a new OS called test-os using the device ID 101 that has already been added. It will be of the type network and belongs to the vendor, Cisco:

        ./scripts/new-os.php -h 101 -o test-os -t network -v cisco

        The process will then step you through the process with some more questions. Please be warned, this is currently pre-beta and may cause some issues. Please let us know of any on Discord.

        \ No newline at end of file diff --git a/Developing/Using-Git/index.html b/Developing/Using-Git/index.html index d58d7037..9b2979c9 100644 --- a/Developing/Using-Git/index.html +++ b/Developing/Using-Git/index.html @@ -1,4 +1,4 @@ - Using Git - LibreNMS Docs

        Using Git

        Git can have a bit of a steep learning curve, stick with it as it is worth learning the basics2 at least.

        If you want to help develop LibreNMS and haven't really used Git before then this quick primer will help you get started.

        Some assumptions:

        Replace yourusername with your GitHub username.

        Fork LibreNMS repo

        You do this directly within GitHub, click the 'Fork' button near the top right.

        If you are associated with multiple organisations within GitHub then you might need to select which account you want to push the fork to.

        Prepare your git environment

        These are the defaults that are recommended.

        git config branch.autosetupmerge true
        + Using Git - LibreNMS Docs       

        Using Git

        Git can have a bit of a steep learning curve, stick with it as it is worth learning the basics2 at least.

        If you want to help develop LibreNMS and haven't really used Git before then this quick primer will help you get started.

        Some assumptions:

        Replace yourusername with your GitHub username.

        Fork LibreNMS repo

        You do this directly within GitHub, click the 'Fork' button near the top right.

        If you are associated with multiple organisations within GitHub then you might need to select which account you want to push the fork to.

        Prepare your git environment

        These are the defaults that are recommended.

        git config branch.autosetupmerge true
         git config --global user.name "John Doe"
         git config --global user.email johndoe@example.com
         

        Clone the repo

        Ok so now that you have forked the repo, you now need to clone it to your local install where you can then make the changes you need and submit them back.

        cd /opt/
        diff --git a/Developing/Validating-Code/index.html b/Developing/Validating-Code/index.html
        index 5b71ef99..bfabbdd1 100644
        --- a/Developing/Validating-Code/index.html
        +++ b/Developing/Validating-Code/index.html
        @@ -1,3 +1,3 @@
        - Validating Code - LibreNMS Docs       

        Validating Code

        Validating Code

        As part of the pull request process with GitHub we run some automated build tests to ensure that the code is error free, standards compliant and our test suite builds successfully.

        Rather than submit a pull request and wait for the results, you can run these checks yourself to ensure a more seamless merge.

        All of these commands should be run from within the librenms directory and can be run as the librenms user unless otherwise noted.

        Install composer (you can skip this if composer is already installed).

        curl -sS https://getcomposer.org/installer | php

        Composer will now be installed into /opt/librenms/composer.phar.

        Now install the dependencies we require:

        ./composer.phar install

        Once composer is installed you can now run the code validation script:

        ./lnms dev:check

        If you see Tests ok, submit away :) then all is well. If you see other output then it should contain what you need to resolve the issues and re-test.

        Git Hooks

        Git has a hook system which you can use to trigger checks at various stages. Utilising the ./lnms dev:check you can make this part of your commit process.

        Add ./lnms dev:check to your .git/hooks/pre-commit:

        echo "/opt/librenms/lnms dev:check" >> /opt/librenms/.git/hooks/pre-commit
        + Validating Code - LibreNMS Docs       

        Validating Code

        Validating Code

        As part of the pull request process with GitHub we run some automated build tests to ensure that the code is error free, standards compliant and our test suite builds successfully.

        Rather than submit a pull request and wait for the results, you can run these checks yourself to ensure a more seamless merge.

        All of these commands should be run from within the librenms directory and can be run as the librenms user unless otherwise noted.

        Install composer (you can skip this if composer is already installed).

        curl -sS https://getcomposer.org/installer | php

        Composer will now be installed into /opt/librenms/composer.phar.

        Now install the dependencies we require:

        ./composer.phar install

        Once composer is installed you can now run the code validation script:

        ./lnms dev:check

        If you see Tests ok, submit away :) then all is well. If you see other output then it should contain what you need to resolve the issues and re-test.

        Git Hooks

        Git has a hook system which you can use to trigger checks at various stages. Utilising the ./lnms dev:check you can make this part of your commit process.

        Add ./lnms dev:check to your .git/hooks/pre-commit:

        echo "/opt/librenms/lnms dev:check" >> /opt/librenms/.git/hooks/pre-commit
         chmod +x /opt/librenms/.git/hooks/pre-commit
         
        \ No newline at end of file diff --git a/Developing/os/Custom-Graphs/index.html b/Developing/os/Custom-Graphs/index.html index 4d9f8d12..9b447c63 100644 --- a/Developing/os/Custom-Graphs/index.html +++ b/Developing/os/Custom-Graphs/index.html @@ -1,4 +1,4 @@ - Custom Graphs - LibreNMS Docs

        Custom Graphs

        First we define our graphs in includes/definitions.inc.php to share our work and contribute in the development of LibreNMS. :-) (or place in config.php if you don't plan to contribute)

        // Pulse Secure Graphs
        + Custom Graphs - LibreNMS Docs       

        Custom Graphs

        First we define our graphs in includes/definitions.inc.php to share our work and contribute in the development of LibreNMS. :-) (or place in config.php if you don't plan to contribute)

        // Pulse Secure Graphs
         $config['graph_types']['device']['pulse_sessions'] = ['section' => 'firewall', 'order' => 0, 'descr' => 'Active Sessions'];
         $config['graph_types']['device']['pulse_users'] = ['section' => 'firewall', 'order' => 0, 'descr' => 'Active Users'];
         

        Polling OS

        OS polling is not necessarily where custom polling should be done, please speak to one of the core devs in Discord for guidance.

        Let's update our example file to add additional polling:

        includes/polling/os/pulse.inc.php
        diff --git a/Developing/os/Health-Information/index.html b/Developing/os/Health-Information/index.html
        index 04f3c6e4..e1c21483 100644
        --- a/Developing/os/Health-Information/index.html
        +++ b/Developing/os/Health-Information/index.html
        @@ -1,4 +1,4 @@
        - Health Information - LibreNMS Docs       

        Health Information

        Sensors

        This document will guide you through adding health / sensor information for your new device.

        Currently, we have support for the following health metrics along with the values we expect to see the data in:

        Class Measurement
        airflow cfm
        ber ratio
        charge %
        chromatic_dispersion ps/nm
        cooling W
        count #
        current A
        dbm dBm
        delay s
        eer eer
        fanspeed rpm
        frequency Hz
        humidity %
        load %
        loss %
        power W
        power_consumed kWh
        power_factor ratio
        pressure kPa
        quality_factor dB
        runtime Min
        signal dBm
        snr SNR
        state #
        temperature C
        tv_signal dBmV
        bitrate bps
        voltage V
        waterflow l/m
        percent %

        Simple health discovery

        We have support for defining health / sensor discovery using YAML files so that you don't need to know how to write PHP.

        Please note that DISPLAY-HINTS are disabled so ensure you use the correct divisor / multiplier if applicable.

        All yaml files are located in includes/definitions/discovery/$os.yaml. Defining the information here is not always possible and is heavily reliant on vendors being sensible with the MIBs they generate. Only snmp walks are supported, and you must provide a sane table that can be traversed and contains all the data you need. We will use netbotz as an example here.

        includes/definitions/discovery/netbotz.yaml

        mib: NETBOTZV2-MIB
        + Health Information - LibreNMS Docs       

        Health Information

        Sensors

        This document will guide you through adding health / sensor information for your new device.

        Currently, we have support for the following health metrics along with the values we expect to see the data in:

        Class Measurement
        airflow cfm
        ber ratio
        charge %
        chromatic_dispersion ps/nm
        cooling W
        count #
        current A
        dbm dBm
        delay s
        eer eer
        fanspeed rpm
        frequency Hz
        humidity %
        load %
        loss %
        power W
        power_consumed kWh
        power_factor ratio
        pressure kPa
        quality_factor dB
        runtime Min
        signal dBm
        snr SNR
        state #
        temperature C
        tv_signal dBmV
        bitrate bps
        voltage V
        waterflow l/m
        percent %

        Simple health discovery

        We have support for defining health / sensor discovery using YAML files so that you don't need to know how to write PHP.

        Please note that DISPLAY-HINTS are disabled so ensure you use the correct divisor / multiplier if applicable.

        All yaml files are located in includes/definitions/discovery/$os.yaml. Defining the information here is not always possible and is heavily reliant on vendors being sensible with the MIBs they generate. Only snmp walks are supported, and you must provide a sane table that can be traversed and contains all the data you need. We will use netbotz as an example here.

        includes/definitions/discovery/netbotz.yaml

        mib: NETBOTZV2-MIB
         modules:
             sensors:
                 airflow:
        diff --git a/Developing/os/Initial-Detection/index.html b/Developing/os/Initial-Detection/index.html
        index 10307fb1..badb65a0 100644
        --- a/Developing/os/Initial-Detection/index.html
        +++ b/Developing/os/Initial-Detection/index.html
        @@ -1,4 +1,4 @@
        - Initial Detection - LibreNMS Docs       

        Initial Detection

        This document will provide the information you should need to add basic detection for a new OS.

        Discovery

        OS discovery is how LibreNMS detects which OS should be used for a device. Generally detection should use sysObjectID or sysDescr, but you can also snmpget an oid and check for a value. snmpget is discouraged because it slows down all os detections, not just the added os.

        To begin, create the new OS file which should be called includes/definitions/pulse.yaml. Here is a working example:

        os: pulse
        + Initial Detection - LibreNMS Docs       

        Initial Detection

        This document will provide the information you should need to add basic detection for a new OS.

        Discovery

        OS discovery is how LibreNMS detects which OS should be used for a device. Generally detection should use sysObjectID or sysDescr, but you can also snmpget an oid and check for a value. snmpget is discouraged because it slows down all os detections, not just the added os.

        To begin, create the new OS file which should be called includes/definitions/pulse.yaml. Here is a working example:

        os: pulse
         text: 'Pulse Secure'
         type: firewall
         icon: pulse
        diff --git a/Developing/os/Mem-CPU-Information/index.html b/Developing/os/Mem-CPU-Information/index.html
        index ceba4b63..2be7e469 100644
        --- a/Developing/os/Mem-CPU-Information/index.html
        +++ b/Developing/os/Mem-CPU-Information/index.html
        @@ -1,4 +1,4 @@
        - Mem/CPU Information - LibreNMS Docs       

        Mem/CPU Information

        This document will guide you through adding detection for Memory / Processor for your new device.

        Memory

        LibreNMS will attempt to detect memory statistics using the standard HOST-RESOURCES-MIB and UCD-SNMP-MIB MIBs. To detect non-standard MIBs, they can be defined via Yaml.

        YAML

        In order to successfully detect memory amount and usage, two of the for keys below are required. Some OS only provide a usage percentage, which will work, but a total RAM amount will not be displayed.

        • total
        • used
        • free
        • percent_used

        includes/definitions/discovery/mempools/arubaos.yaml

        mempools:
        + Mem/CPU Information - LibreNMS Docs       

        Mem/CPU Information

        This document will guide you through adding detection for Memory / Processor for your new device.

        Memory

        LibreNMS will attempt to detect memory statistics using the standard HOST-RESOURCES-MIB and UCD-SNMP-MIB MIBs. To detect non-standard MIBs, they can be defined via Yaml.

        YAML

        In order to successfully detect memory amount and usage, two of the for keys below are required. Some OS only provide a usage percentage, which will work, but a total RAM amount will not be displayed.

        • total
        • used
        • free
        • percent_used

        includes/definitions/discovery/mempools/arubaos.yaml

        mempools:
             data:
                 -
                     total: WLSX-SWITCH-MIB::sysXMemorySize
        diff --git a/Developing/os/Settings/index.html b/Developing/os/Settings/index.html
        index 4436a725..0ca7f093 100644
        --- a/Developing/os/Settings/index.html
        +++ b/Developing/os/Settings/index.html
        @@ -1,4 +1,4 @@
        - Settings - LibreNMS Docs       

        Optional OS Settings

        This page documents settings that can be set in the os yaml files or in config.php. All settings listed here are optional. If they are not set, the global default will be used.

        User override in config.php

        Users can override these settings in their config.php.

        For example, to set an alternate icon for ios:

        $config['os']['ios']['icon'] = 'fuzzybunny';
        + Settings - LibreNMS Docs       

        Optional OS Settings

        This page documents settings that can be set in the os yaml files or in config.php. All settings listed here are optional. If they are not set, the global default will be used.

        User override in config.php

        Users can override these settings in their config.php.

        For example, to set an alternate icon for ios:

        $config['os']['ios']['icon'] = 'fuzzybunny';
         

        Ignoring Sensors

        It is possible to filter some sensors from the configuration:

        • Filter all 'current' sensors for Operating System 'vrp'.
        $config['os']['vrp']['disabled_sensors']['current'] = true;
         
        • Filter all sensors with description matching regexp '/PEM Iout/' for Operating System iosxe.
        $config['os']['iosxe']['disabled_sensors_regex'][] = '/PEM Iout/';
         
        • Filter all 'power' sensors with description matching regexp '/ Power [TR]x /' for Operating System iosxr.
        $config['os']['iosxr']['disabled_sensors_regex']['power'][] = '/ Power [TR]x /';
        diff --git a/Developing/os/Test-Units/index.html b/Developing/os/Test-Units/index.html
        index 3dd0901b..88344183 100644
        --- a/Developing/os/Test-Units/index.html
        +++ b/Developing/os/Test-Units/index.html
        @@ -1,4 +1,4 @@
        - Test Units - LibreNMS Docs       

        Tests

        Tests ensure LibreNMS works as expected, now and in the future. New OS should provide as much test data as needed and added test data for existing OS is welcome.

        Saved snmp data can be found in tests/snmpsim/*.snmprec and saved database data can be found in tests/data/*.json. Please review this for any sensitive data before submitting. When replacing data, make sure it is modified in a consistent manner.

        We utilise snmpsim to do unit testing. For OS discovery, we can mock snmpsim, but for other tests you will need it installed and functioning. We run snmpsim during our integration tests, but not by default when running lnms dev:check. You can install snmpsim with the command pip3 install snmpsim.

        Capturing test data

        If test data already exists

        If test data already exists, but is for a different device/configuration with the same OS. Then you should use the --variant (-v) option to specify a different variant of the OS, this will be tested completely separate from other variants. If there is only one variant, please do not specify one.

        1. Collect SNMP data

        ./scripts/collect-snmp-data.php is provided to make it easy to collect data for tests. Running collect-snmp-data.php with the --hostname (-h) allows you to capture all data used to discover and poll a device already added to LibreNMS. Make sure to re-run the script if you add additional support. Check the command-line help for more options.

        2. Save test data

        After you have collected snmp data, run ./scripts/save-test-data.php with the --os (-o) option to dump the post discovery and post poll database entries to json files. This step requires snmpsim, if you are having issues, the maintainers may help you generate it from the snmprec you created in the previous step.

        Generally, you will only need to collect data once. After you have the data you need in the snmprec file, you can just use save-test-data.php to update the database dump (json) after that.

        Running tests

        Note: To run tests, ensure you have executed ./scripts/composer_wrapper.php install from your LibreNMS root directory. This will read composer.json and install any dependencies required.

        After you have saved your test data, you should run lnms dev:check verify they pass.

        To run the full suite of tests enable database and snmpsim reliant tests: lnms dev:check unit --db --snmpsim

        Specific OS

        lnms dev:check unit -o osname

        Specific Module

        lnms dev:check unit -m modulename

        Using snmpsim for testing

        You can run snmpsim to access test data by running

        lnms dev:simulate
        + Test Units - LibreNMS Docs       

        Tests

        Tests ensure LibreNMS works as expected, now and in the future. New OS should provide as much test data as needed and added test data for existing OS is welcome.

        Saved snmp data can be found in tests/snmpsim/*.snmprec and saved database data can be found in tests/data/*.json. Please review this for any sensitive data before submitting. When replacing data, make sure it is modified in a consistent manner.

        We utilise snmpsim to do unit testing. For OS discovery, we can mock snmpsim, but for other tests you will need it installed and functioning. We run snmpsim during our integration tests, but not by default when running lnms dev:check. You can install snmpsim with the command pip3 install snmpsim.

        Capturing test data

        If test data already exists

        If test data already exists, but is for a different device/configuration with the same OS. Then you should use the --variant (-v) option to specify a different variant of the OS, this will be tested completely separate from other variants. If there is only one variant, please do not specify one.

        1. Collect SNMP data

        ./scripts/collect-snmp-data.php is provided to make it easy to collect data for tests. Running collect-snmp-data.php with the --hostname (-h) allows you to capture all data used to discover and poll a device already added to LibreNMS. Make sure to re-run the script if you add additional support. Check the command-line help for more options.

        2. Save test data

        After you have collected snmp data, run ./scripts/save-test-data.php with the --os (-o) option to dump the post discovery and post poll database entries to json files. This step requires snmpsim, if you are having issues, the maintainers may help you generate it from the snmprec you created in the previous step.

        Generally, you will only need to collect data once. After you have the data you need in the snmprec file, you can just use save-test-data.php to update the database dump (json) after that.

        Running tests

        Note: To run tests, ensure you have executed ./scripts/composer_wrapper.php install from your LibreNMS root directory. This will read composer.json and install any dependencies required.

        After you have saved your test data, you should run lnms dev:check verify they pass.

        To run the full suite of tests enable database and snmpsim reliant tests: lnms dev:check unit --db --snmpsim

        Specific OS

        lnms dev:check unit -o osname

        Specific Module

        lnms dev:check unit -m modulename

        Using snmpsim for testing

        You can run snmpsim to access test data by running

        lnms dev:simulate
         

        You may then run snmp queries against it using the os (and variant) as the community and 127.1.6.1:1161 as the host.

        snmpget -v 2c -c ios_c3560e 127.1.6.1:1161 sysDescr.0
         

        Snmprec format

        Snmprec files are simple files that store the snmp data. The data format is simple with three columns: numeric oid, type code, and data. Here is an example snippet.

        1.3.6.1.2.1.1.1.0|4|Pulse Secure,LLC,MAG-2600,8.0R14 (build 41869)
         1.3.6.1.2.1.1.2.0|6|1.3.6.1.4.1.12532.254.1.1
        diff --git a/Developing/os/Wireless-Sensors/index.html b/Developing/os/Wireless-Sensors/index.html
        index 75f9da0a..73bc11a8 100644
        --- a/Developing/os/Wireless-Sensors/index.html
        +++ b/Developing/os/Wireless-Sensors/index.html
        @@ -1,4 +1,4 @@
        - Wireless Sensors - LibreNMS Docs      

        Wireless Sensors

        This document will guide you through adding wireless sensors for your new wireless device.

        Currently we have support for the following wireless metrics along with the values we expect to see the data in:

        Type Measurement Interface Description
        ap-count % WirelessApCountDiscovery The number of APs attached to this controller
        capacity % WirelessCapacityDiscovery The % of operating rate vs theoretical max
        ccq % WirelessCcqDiscovery The Client Connection Quality
        channel count WirelessChannelDiscovery The channel, use of frequency is preferred
        cell count WirelessCellDiscovery The cell in a multicell technology
        clients count WirelessClientsDiscovery The number of clients connected to/managed by this device
        distance km WirelessDistanceDiscovery The distance of a radio link in Kilometers
        error-rate bps WirelessErrorRateDiscovery The rate of errored packets or bits, etc
        error-ratio % WirelessErrorRatioDiscovery The percent of errored packets or bits, etc
        errors count WirelessErrorsDiscovery The total bits of errored packets or bits, etc
        frequency MHz WirelessFrequencyDiscovery The frequency of the radio in MHz, channels can be converted
        mse dB WirelessMseDiscovery The Mean Square Error
        noise-floor dBm WirelessNoiseFloorDiscovery The amount of noise received by the radio
        power dBm WirelessPowerDiscovery The power of transmit or receive, including signal level
        quality % WirelessQualityDiscovery The % of quality of the link, 100% = perfect link
        rate bps WirelessRateDiscovery The negotiated rate of the connection (not data transfer)
        rssi dBm WirelessRssiDiscovery The Received Signal Strength Indicator
        snr dB WirelessSnrDiscovery The Signal to Noise ratio, which is signal - noise floor
        sinr dB WirelessSinrDiscovery The Signal-to-Interference-plus-Noise Ratio
        rsrq dB WirelessRsrqDiscovery The Reference Signal Received Quality
        rsrp dBm WirelessRsrpDiscovery The Reference Signals Received Power
        xpi dBm WirelessXpiDiscovery The Cross Polar Interference values
        ssr dB WirelessSsrDiscovery The Signal strength ratio, the ratio(or difference) of Vertical rx power to Horizontal rx power
        utilization % WirelessUtilizationDiscovery The % of utilization compared to the current rate

        You will need to create a new OS class for your os if one doesn't exist under LibreNMS/OS. The name of this file should be the os name in camel case for example airos -> Airos, ios-wlc -> IosWlc.

        Your new OS class should extend LibreNMS\OS and implement the interfaces for the sensors your os supports.

        namespace LibreNMS\OS;
        + Wireless Sensors - LibreNMS Docs      

        Wireless Sensors

        This document will guide you through adding wireless sensors for your new wireless device.

        Currently we have support for the following wireless metrics along with the values we expect to see the data in:

        Type Measurement Interface Description
        ap-count % WirelessApCountDiscovery The number of APs attached to this controller
        capacity % WirelessCapacityDiscovery The % of operating rate vs theoretical max
        ccq % WirelessCcqDiscovery The Client Connection Quality
        channel count WirelessChannelDiscovery The channel, use of frequency is preferred
        cell count WirelessCellDiscovery The cell in a multicell technology
        clients count WirelessClientsDiscovery The number of clients connected to/managed by this device
        distance km WirelessDistanceDiscovery The distance of a radio link in Kilometers
        error-rate bps WirelessErrorRateDiscovery The rate of errored packets or bits, etc
        error-ratio % WirelessErrorRatioDiscovery The percent of errored packets or bits, etc
        errors count WirelessErrorsDiscovery The total bits of errored packets or bits, etc
        frequency MHz WirelessFrequencyDiscovery The frequency of the radio in MHz, channels can be converted
        mse dB WirelessMseDiscovery The Mean Square Error
        noise-floor dBm WirelessNoiseFloorDiscovery The amount of noise received by the radio
        power dBm WirelessPowerDiscovery The power of transmit or receive, including signal level
        quality % WirelessQualityDiscovery The % of quality of the link, 100% = perfect link
        rate bps WirelessRateDiscovery The negotiated rate of the connection (not data transfer)
        rssi dBm WirelessRssiDiscovery The Received Signal Strength Indicator
        snr dB WirelessSnrDiscovery The Signal to Noise ratio, which is signal - noise floor
        sinr dB WirelessSinrDiscovery The Signal-to-Interference-plus-Noise Ratio
        rsrq dB WirelessRsrqDiscovery The Reference Signal Received Quality
        rsrp dBm WirelessRsrpDiscovery The Reference Signals Received Power
        xpi dBm WirelessXpiDiscovery The Cross Polar Interference values
        ssr dB WirelessSsrDiscovery The Signal strength ratio, the ratio(or difference) of Vertical rx power to Horizontal rx power
        utilization % WirelessUtilizationDiscovery The % of utilization compared to the current rate

        You will need to create a new OS class for your os if one doesn't exist under LibreNMS/OS. The name of this file should be the os name in camel case for example airos -> Airos, ios-wlc -> IosWlc.

        Your new OS class should extend LibreNMS\OS and implement the interfaces for the sensors your os supports.

        namespace LibreNMS\OS;
         
         use LibreNMS\Device\WirelessSensor;
         use LibreNMS\Interfaces\Discovery\Sensors\WirelessClientsDiscovery;
        diff --git a/Extensions/Agent-Setup/index.html b/Extensions/Agent-Setup/index.html
        index 02e3e703..bd98f623 100644
        --- a/Extensions/Agent-Setup/index.html
        +++ b/Extensions/Agent-Setup/index.html
        @@ -1,4 +1,4 @@
        - Check_MK Setup - LibreNMS Docs       

        Check_MK Setup

        The agent can be used to gather data from remote systems you can use LibreNMS in combination with check_mk (found here). The agent can be extended to include data about applications on the remote system.

        Installation

        Linux / BSD

        Make sure that systemd or xinetd is installed on the host you want to run the agent on.

        The agent uses TCP-Port 6556, please allow access from the LibreNMS host and poller nodes if you're using the Distributed Polling setup.

        On each of the hosts you would like to use the agent on, you need to do the following:

        1: Clone the librenms-agent repository:

        cd /opt/
        + Check_MK Setup - LibreNMS Docs       

        Check_MK Setup

        The agent can be used to gather data from remote systems you can use LibreNMS in combination with check_mk (found here). The agent can be extended to include data about applications on the remote system.

        Installation

        Linux / BSD

        Make sure that systemd or xinetd is installed on the host you want to run the agent on.

        The agent uses TCP-Port 6556, please allow access from the LibreNMS host and poller nodes if you're using the Distributed Polling setup.

        On each of the hosts you would like to use the agent on, you need to do the following:

        1: Clone the librenms-agent repository:

        cd /opt/
         git clone https://github.com/librenms/librenms-agent.git
         cd librenms-agent
         

        2: Copy the relevant check_mk_agent to /usr/bin:

        linux freebsd
        cp check_mk_agent /usr/bin/check_mk_agent cp check_mk_agent_freebsd /usr/bin/check_mk_agent
        chmod +x /usr/bin/check_mk_agent
        diff --git a/Extensions/Applications/index.html b/Extensions/Applications/index.html
        index a5414e61..957d3aaf 100644
        --- a/Extensions/Applications/index.html
        +++ b/Extensions/Applications/index.html
        @@ -1,4 +1,4 @@
        - Applications - LibreNMS Docs       

        Applications

        You can use Application support to graph performance statistics of many applications.

        Different applications support a variety of ways to collect data:

        1. By direct connection to the application
        2. snmpd extend
        3. The agent.

        The monitoring of applications could be added before or after the hosts have been added to LibreNMS.

        If multiple methods of collection are listed you only need to enable one.

        SNMP Extend

        When using the snmp extend method, the application discovery module will pick up which applications you have set up for monitoring automatically, even if the device is already in LibreNMS. The application discovery module is enabled by default for most *nix operating systems, but in some cases you will need to manually enable the application discovery module.

        SUDO

        One major thing to keep in mind when using SNMP extend is these run as the snmpd user that can be an unprivileged user. In these situations you need to use sudo.

        To test if you need sudo, first check the user snmpd is running as. Then test if you can run the extend script as that user without issue. For example if snmpd is running as 'Debian-snmp' and we want to run the extend for proxmox, we check that the following run without error:

        sudo -u Debian-snmp /usr/local/bin/proxmox
        + Applications - LibreNMS Docs       

        Applications

        You can use Application support to graph performance statistics of many applications.

        Different applications support a variety of ways to collect data:

        1. By direct connection to the application
        2. snmpd extend
        3. The agent.

        The monitoring of applications could be added before or after the hosts have been added to LibreNMS.

        If multiple methods of collection are listed you only need to enable one.

        SNMP Extend

        When using the snmp extend method, the application discovery module will pick up which applications you have set up for monitoring automatically, even if the device is already in LibreNMS. The application discovery module is enabled by default for most *nix operating systems, but in some cases you will need to manually enable the application discovery module.

        SUDO

        One major thing to keep in mind when using SNMP extend is these run as the snmpd user that can be an unprivileged user. In these situations you need to use sudo.

        To test if you need sudo, first check the user snmpd is running as. Then test if you can run the extend script as that user without issue. For example if snmpd is running as 'Debian-snmp' and we want to run the extend for proxmox, we check that the following run without error:

        sudo -u Debian-snmp /usr/local/bin/proxmox
         

        If it doesn't work, then you will need to use sudo with the extend command. For the example above, that would mean adding the line below to the sudoers file:

        Debian-snmp ALL = NOPASSWD: /usr/local/bin/proxmox
         

        Finally we would need to add sudo to the extend command, which would look like that for proxmox:

        extend proxmox /usr/bin/sudo /usr/local/bin/proxmox
         

        JSON Return Optimization Using librenms_return_optimizer

        While the json_app_get does allow for more complex and larger data to be easily returned by a extend and the data to then be worked with, this can also sometimes result in large returns that occasionally don't play nice with SNMP on some networks.

        librenms_return_optimizer fixes this via taking the extend output piped to it, gzipping it, and then converting it to base64. The later is needed as net-snmp does not play that nice with binary data, converting most of the non-printable characters to .. This does add a bit of additional overhead to the gzipped data, but still tends to be result in a return that is usually a third of the size for JSONs items.

        The change required is fairly simply. So for the portactivity example below...

        extend portactivity /etc/snmp/extends/portactivity smtps,http,imap,imaps,postgresql,https,ldap,ldaps,nfsd,syslog-conn,ssh,matrix,gitea
        diff --git a/Extensions/Authentication/index.html b/Extensions/Authentication/index.html
        index d813861d..4a7094a1 100644
        --- a/Extensions/Authentication/index.html
        +++ b/Extensions/Authentication/index.html
        @@ -1,4 +1,4 @@
        - Authentication Options - LibreNMS Docs       

        Authentication Options

        LibreNMS supports multiple authentication modules along with Two Factor Auth. Here we will provide configuration details for these modules. Alternatively, you can use Socialite Providers which supports a wide variety of social/OAuth/SAML authentication methods.

        Available authentication modules

        ⚠️ When enabling a new authentication module, the local users will no longer be available to log in.

        Enable authentication module

        To enable a particular authentication module you need to set this up in config.php. Please note that only ONE module can be enabled. LibreNMS doesn't support multiple authentication mechanisms at the same time.

        auth/general

        lnms config:set auth_mechanism mysql
        + Authentication Options - LibreNMS Docs       

        Authentication Options

        LibreNMS supports multiple authentication modules along with Two Factor Auth. Here we will provide configuration details for these modules. Alternatively, you can use Socialite Providers which supports a wide variety of social/OAuth/SAML authentication methods.

        Available authentication modules

        ⚠️ When enabling a new authentication module, the local users will no longer be available to log in.

        Enable authentication module

        To enable a particular authentication module you need to set this up in config.php. Please note that only ONE module can be enabled. LibreNMS doesn't support multiple authentication mechanisms at the same time.

        auth/general

        lnms config:set auth_mechanism mysql
         

        User levels and User account type

        • 1: Normal User: You will need to assign device / port permissions for users at this level.

        • 5: Global Read: Read only Administrator.

        • 10: Administrator: This is a global read/write admin account.

        • 11: Demo Account: Provides full read/write with certain restrictions (i.e can't delete devices).

        Note Oxidized configs can often contain sensitive data. Because of that only Administrator account type can see configs.

        Note for SELinux users

        When using SELinux on the LibreNMS server, you need to allow Apache (httpd) to connect LDAP/Active Directory server, this is disabled by default. You can use SELinux Booleans to allow network access to LDAP resources with this command:

        setsebool -P httpd_can_connect_ldap=1
         

        Testing authentication

        You can test authentication with this script:

        ./scripts/auth_test.php
         

        Enable debug output to troubleshoot issues

        MySQL Authentication

        auth/general

        lnms config:set auth_mechanism mysql
        diff --git a/Extensions/Auto-Discovery/index.html b/Extensions/Auto-Discovery/index.html
        index d211386b..aff3c7aa 100644
        --- a/Extensions/Auto-Discovery/index.html
        +++ b/Extensions/Auto-Discovery/index.html
        @@ -1,4 +1,4 @@
        - Auto-discovery Setup - LibreNMS Docs       

        Auto Discovery Support

        Getting Started

        LibreNMS provides the ability to automatically add devices on your network, we can do this via a few methods which will be explained below and also indicate if they are enabled by default.

        All discovery methods run when discovery runs (every 6 hours by default and within 5 minutes for new devices).

        Please note that you need at least ONE device added before auto-discovery will work.

        The first thing to do though is add the required configuration options to config.php.

        SNMP Details

        To add devices automatically we need to know your snmp details, examples of SNMP v1, v2c and v3 are below:

        // v1 or v2c
        + Auto-discovery Setup - LibreNMS Docs       

        Auto Discovery Support

        Getting Started

        LibreNMS provides the ability to automatically add devices on your network, we can do this via a few methods which will be explained below and also indicate if they are enabled by default.

        All discovery methods run when discovery runs (every 6 hours by default and within 5 minutes for new devices).

        Please note that you need at least ONE device added before auto-discovery will work.

        The first thing to do though is add the required configuration options to config.php.

        SNMP Details

        To add devices automatically we need to know your snmp details, examples of SNMP v1, v2c and v3 are below:

        // v1 or v2c
         $config['snmp']['community'][] = "my_custom_community";
         $config['snmp']['community'][] = "another_community";
         
        diff --git a/Extensions/Availability-Map/index.html b/Extensions/Availability-Map/index.html
        index dcfce0db..de8f8cf7 100644
        --- a/Extensions/Availability-Map/index.html
        +++ b/Extensions/Availability-Map/index.html
        @@ -1,4 +1,4 @@
        - Availability Map - LibreNMS Docs       

        Availability Map

        LibreNMS has the following page to show an availability map:

        • Overview -> Maps -> Availability

        This map will show all devices on a single page, with each device having either a box or a coloured square representing its status.

        Widget

        There is an availability map widget that can be added to a dashboard to give a quick overview of the status of all devices on the network.

        Settings

        # Set the compact view mode for the availability map
        + Availability Map - LibreNMS Docs       

        Availability Map

        LibreNMS has the following page to show an availability map:

        • Overview -> Maps -> Availability

        This map will show all devices on a single page, with each device having either a box or a coloured square representing its status.

        Widget

        There is an availability map widget that can be added to a dashboard to give a quick overview of the status of all devices on the network.

        Settings

        # Set the compact view mode for the availability map
         lnms config:set webui.availability_map_compact false
         
         # Size of the box for each device in the availability map (not compact)
        diff --git a/Extensions/Billing-Module/index.html b/Extensions/Billing-Module/index.html
        index 612ad121..69187517 100644
        --- a/Extensions/Billing-Module/index.html
        +++ b/Extensions/Billing-Module/index.html
        @@ -1,4 +1,4 @@
        - Billing Module - LibreNMS Docs       

        Billing Module

        With the billing module you can create a bill, assign a quota to it and add ports to it. It then tracks the ports usage and shows you the usage in the bill, including any overage. Accounting by both total transferred data and 95th percentile is supported.

        To enable and use the billing module you need to perform the following steps:

        Edit config.php and add (or enable) the following line near the end of the config

        $config['enable_billing'] = 1; # Enable Billing
        + Billing Module - LibreNMS Docs       

        Billing Module

        With the billing module you can create a bill, assign a quota to it and add ports to it. It then tracks the ports usage and shows you the usage in the bill, including any overage. Accounting by both total transferred data and 95th percentile is supported.

        To enable and use the billing module you need to perform the following steps:

        Edit config.php and add (or enable) the following line near the end of the config

        $config['enable_billing'] = 1; # Enable Billing
         

        Edit /etc/cron.d/librenms and add the following:

        */5 * * * * librenms /opt/librenms/poll-billing.php >> /dev/null 2>&1
         01  * * * * librenms /opt/librenms/billing-calculate.php >> /dev/null 2>&1
         

        Create billing graphs as required.

        Data Retention

        Billing data is stored in the MySQL database, and you may wish to purge the detailed stats for old data (per-month totals will always be kept). To enable this, add the following to config.php:

        $config['billing_data_purge'] = 12;     // Number of months to retain
        diff --git a/Extensions/Component/index.html b/Extensions/Component/index.html
        index e14b4d53..29cea02a 100644
        --- a/Extensions/Component/index.html
        +++ b/Extensions/Component/index.html
        @@ -1,4 +1,4 @@
        - Component - LibreNMS Docs       

        About

        The Component extension provides a generic database storage mechanism for discovery and poller modules. The Driver behind this extension was to provide the features of ports, in a generic manner to discovery/poller modules.

        It provides a status (Nagios convention), the ability to Disable (do not poll), or Ignore (do not Alert).

        Database Structure

        The database structure contains the component table:

        mysql> select * from component limit 1;
        + Component - LibreNMS Docs       

        About

        The Component extension provides a generic database storage mechanism for discovery and poller modules. The Driver behind this extension was to provide the features of ports, in a generic manner to discovery/poller modules.

        It provides a status (Nagios convention), the ability to Disable (do not poll), or Ignore (do not Alert).

        Database Structure

        The database structure contains the component table:

        mysql> select * from component limit 1;
         +----+-----------+------+------------+--------+----------+--------+-------+
         | id | device_id | type | label      | status | disabled | ignore | error |
         +----+-----------+------+------------+--------+----------+--------+-------+
        diff --git a/Extensions/Custom-Map/index.html b/Extensions/Custom-Map/index.html
        index 77909d25..8b794b88 100644
        --- a/Extensions/Custom-Map/index.html
        +++ b/Extensions/Custom-Map/index.html
        @@ -1 +1 @@
        - Custom Map - LibreNMS Docs       

        Custom Map

        LibreNMS has the ability to create custom maps to give a quick overview of parts of the network including up/down status of devices and link utilisation. These are also referred to as weather maps.

        Viewer

        Once some maps have been created, they will be visible to any users who have read access to all devices on a given map. Custom maps are available through the Overview -> Maps -> Custom Maps menu.

        Some key points about the viewer are:

        • Nodes will change colour if they are down or disabled
        • Links are only associated with a single network interface
        • Link utilisation can only be shown if the link speed is known
        • Link speed is decoded from SNMP if possible (Upload/Download) and defaults to the physical speed if SNMP data is not available, or cannot be decoded
        • Links will change colour as follows:
        • Black if the link is down, or the max speed is unknown
        • Green at 0% utilisation, with a gradual change to
        • Yellow at 50% utilisation, with a gradual change to
        • Orange at 75% utilisation, with a gradual change to
        • Red at 100% utilisation, with a gradual change to
        • Purple at 150% utilisation and above

        Viewer URL options

        You can manually add the following parameters to a URL to alter the display of a custom map.

        The following URL options are available:

        • bare=yes : Removes the control bar from the top of the page.
        • screenshot=yes : Removes all labels from the nodes and links

        e.g. If you want bare and screenshot enabled, https://nmsserver/maps/custom/2 becomes https://nmsserver/maps/custom/2?bare=yes&screenshot=yes

        Editor

        To access the custom map editor, a user must be an admin. The editor is accessed through the Overview -> Maps -> Custom Map Editor menu.

        Once you are in the editor, you will be given a drop-down list of all the custom maps so you can choose one to edit, or select "Create New Map" to create a new map.

        Map Settings

        When you create a new map, you will be presented with a page to set some global map settings. These are:

        • Name: The name for the map
        • Width: The width of the map in pixels
        • Height: The height of the map in pixels
        • Node Alignment: When devices are added to the map, this will align the devices to an invisible grid this many pixels wide, which can help to make the maps look better. This can be set to 0 to disable.
        • Background: An image (PNG/JPG) up to 2MB can be uploaded as a background.

        These settings can be changed at any stage by clicking on the "Edit Map Settings" button in the top-left of the editor.

        Nodes

        Once you have a map, you can start by adding "nodes" to the map. A node represents a device, or an external point in the network (e.g. the internet) To add a node, you click on the "Add Node" button in the control bar, then click on the map area where you want to add the node. You will then be aked for the following information:

        • Label: The text to display on this point in the network
        • Device: If this node represents a device, you can select the device from the drop-down. This will overwrite the label, which you can then change if you want to.
        • Style: You can select the style of the node. If a device has been selected you can choose the LibreNMS icon by choosing "Device Image". You can also choose "Icon" to select an image for the device.
        • Icon: If you choose "Icon" in the style box, you can select from a list of images to represent this node

        There are also options to choose the size and colour of the node and the font.

        Once you have finished choosing the options for the node, you can press Save to add it to the map. NOTE: This does not save anything to the database immediately. You need to click on the "Save Map" button in the top-right to save your changes to the database.

        You can edit a node at any time by selecting it on the map and clicking on the "Edit Node" button in the control bar.

        You can also modify the default settings for all new nodes by clicking on the "Edit Node Default" button at the top of the page.

        Edges

        Once you have 2 or more nodes, you can add links between the nodes. These are called edges in the editor. To add a link, click on the "Add Edge" button in the control bar, then click on one of the nodes you want to link and drag the cursor to the second node that you want to link. You will then be prompted for the following information:

        • From: The node that the link runs from (it will default to first node you selected)
        • To: The node that the link runs to (it will default to the second node you selected)
        • Port: If the From or To node is linked to a device, you can select an interface from one of the devices and the custom map will show traffic utilisation for the selected interface.
        • Reverse Port Direction: If the selected port displays data in the wrong direction for the link, you can reverse it by toggling this option.
        • Line Style: You can try different line styles, especially if you are running multiple links between the same 2 nodes
        • Show percent usage: Choose whether to have text on the lines showing the link utilisation as a percentage
        • Recenter Line: If you tick this box, the centre point of the line will be moved back to half way between the 2 nodes when you click on the save button.

        Once you have finished choosing the options for the node, you can press Save to add it to the map. NOTE: This does not save anything to the database immediately. You need to click on the "Save Map" button in the top-right to save your changes to the database.

        Once you press save, you it will create 3 objects on the screen, 2 arrows and a round node in the middle. Having the 3 objects allows you to move the mid point of the line off centre, and also allows us to display bandwidth information for both directions of the link.

        You can edit an edge at any time by selecting it on the map and clicking on the "Edit Edge" button in the control bar.

        You can also modify the default settings for all new edges by clicking on the "Edit Edge Default" button at the top of the page.

        Re-Render

        When you drag items around the map, some of the lines will bend. This will cause a "Re-Render Map" button to appear at the top-right of the page. This button can be clicked on to cause all lines to be re-drawn the way they will be shown in the viewer.

        Save Map

        Once you are happy with a set of changes that you have made, you can click on the "Save Map" button in the top-right of the page to commit changes to the database. This will cause anyone viewing the map to see the new version the next time their page refreshes.

        Adding Images

        You can add your own images to use on the custom map by copying files into the html/images/custommap/icons/ directory. Any files with a .svg, .png or .jpg extension will be shown in the image selection drop-down in the custom map editor.

        \ No newline at end of file + Custom Map - LibreNMS Docs

        Custom Map

        LibreNMS has the ability to create custom maps to give a quick overview of parts of the network including up/down status of devices and link utilisation. These are also referred to as weather maps.

        Viewer

        Once some maps have been created, they will be visible to any users who have read access to all devices on a given map. Custom maps are available through the Overview -> Maps -> Custom Maps menu.

        Some key points about the viewer are:

        • Nodes will change colour if they are down or disabled
        • Links are only associated with a single network interface
        • Link utilisation can only be shown if the link speed is known
        • Link speed is decoded from SNMP if possible (Upload/Download) and defaults to the physical speed if SNMP data is not available, or cannot be decoded
        • Links will change colour as follows:
        • Black if the link is down, or the max speed is unknown
        • Green at 0% utilisation, with a gradual change to
        • Yellow at 50% utilisation, with a gradual change to
        • Orange at 75% utilisation, with a gradual change to
        • Red at 100% utilisation, with a gradual change to
        • Purple at 150% utilisation and above

        Viewer URL options

        You can manually add the following parameters to a URL to alter the display of a custom map.

        The following URL options are available:

        • bare=yes : Removes the control bar from the top of the page.
        • screenshot=yes : Removes all labels from the nodes and links

        e.g. If you want bare and screenshot enabled, https://nmsserver/maps/custom/2 becomes https://nmsserver/maps/custom/2?bare=yes&screenshot=yes

        Editor

        To access the custom map editor, a user must be an admin. The editor is accessed through the Overview -> Maps -> Custom Map Editor menu.

        Once you are in the editor, you will be given a drop-down list of all the custom maps so you can choose one to edit, or select "Create New Map" to create a new map.

        Map Settings

        When you create a new map, you will be presented with a page to set some global map settings. These are:

        • Name: The name for the map
        • Width: The width of the map in pixels
        • Height: The height of the map in pixels
        • Node Alignment: When devices are added to the map, this will align the devices to an invisible grid this many pixels wide, which can help to make the maps look better. This can be set to 0 to disable.
        • Background: An image (PNG/JPG) up to 2MB can be uploaded as a background.

        These settings can be changed at any stage by clicking on the "Edit Map Settings" button in the top-left of the editor.

        Nodes

        Once you have a map, you can start by adding "nodes" to the map. A node represents a device, or an external point in the network (e.g. the internet) To add a node, you click on the "Add Node" button in the control bar, then click on the map area where you want to add the node. You will then be aked for the following information:

        • Label: The text to display on this point in the network
        • Device: If this node represents a device, you can select the device from the drop-down. This will overwrite the label, which you can then change if you want to.
        • Style: You can select the style of the node. If a device has been selected you can choose the LibreNMS icon by choosing "Device Image". You can also choose "Icon" to select an image for the device.
        • Icon: If you choose "Icon" in the style box, you can select from a list of images to represent this node

        There are also options to choose the size and colour of the node and the font.

        Once you have finished choosing the options for the node, you can press Save to add it to the map. NOTE: This does not save anything to the database immediately. You need to click on the "Save Map" button in the top-right to save your changes to the database.

        You can edit a node at any time by selecting it on the map and clicking on the "Edit Node" button in the control bar.

        You can also modify the default settings for all new nodes by clicking on the "Edit Node Default" button at the top of the page.

        Edges

        Once you have 2 or more nodes, you can add links between the nodes. These are called edges in the editor. To add a link, click on the "Add Edge" button in the control bar, then click on one of the nodes you want to link and drag the cursor to the second node that you want to link. You will then be prompted for the following information:

        • From: The node that the link runs from (it will default to first node you selected)
        • To: The node that the link runs to (it will default to the second node you selected)
        • Port: If the From or To node is linked to a device, you can select an interface from one of the devices and the custom map will show traffic utilisation for the selected interface.
        • Reverse Port Direction: If the selected port displays data in the wrong direction for the link, you can reverse it by toggling this option.
        • Line Style: You can try different line styles, especially if you are running multiple links between the same 2 nodes
        • Show percent usage: Choose whether to have text on the lines showing the link utilisation as a percentage
        • Recenter Line: If you tick this box, the centre point of the line will be moved back to half way between the 2 nodes when you click on the save button.

        Once you have finished choosing the options for the node, you can press Save to add it to the map. NOTE: This does not save anything to the database immediately. You need to click on the "Save Map" button in the top-right to save your changes to the database.

        Once you press save, you it will create 3 objects on the screen, 2 arrows and a round node in the middle. Having the 3 objects allows you to move the mid point of the line off centre, and also allows us to display bandwidth information for both directions of the link.

        You can edit an edge at any time by selecting it on the map and clicking on the "Edit Edge" button in the control bar.

        You can also modify the default settings for all new edges by clicking on the "Edit Edge Default" button at the top of the page.

        Re-Render

        When you drag items around the map, some of the lines will bend. This will cause a "Re-Render Map" button to appear at the top-right of the page. This button can be clicked on to cause all lines to be re-drawn the way they will be shown in the viewer.

        Save Map

        Once you are happy with a set of changes that you have made, you can click on the "Save Map" button in the top-right of the page to commit changes to the database. This will cause anyone viewing the map to see the new version the next time their page refreshes.

        Adding Images

        You can add your own images to use on the custom map by copying files into the html/images/custommap/icons/ directory. Any files with a .svg, .png or .jpg extension will be shown in the image selection drop-down in the custom map editor.

        \ No newline at end of file diff --git a/Extensions/Customizing-the-Web-UI/index.html b/Extensions/Customizing-the-Web-UI/index.html index 8ffda414..ceb684f1 100644 --- a/Extensions/Customizing-the-Web-UI/index.html +++ b/Extensions/Customizing-the-Web-UI/index.html @@ -1,4 +1,4 @@ - Customizing the Web UI - LibreNMS Docs

        Customizing the Web UI

        Custom menu entry

        Create the file resources/views/menu/custom.blade.php

        Example contents:

        <li class="dropdown">
        + Customizing the Web UI - LibreNMS Docs       

        Customizing the Web UI

        Custom menu entry

        Create the file resources/views/menu/custom.blade.php

        Example contents:

        <li class="dropdown">
             <a href="#" class="dropdown-toggle" data-hover="dropdown" data-toggle="dropdown"><i class="fa fa-star fa-fw fa-lg fa-nav-icons hidden-md" aria-hidden="true"></i>
                 <span class="hidden-sm">Custom Menu</span></a>
             <ul class="dropdown-menu">
        diff --git a/Extensions/Dashboards/index.html b/Extensions/Dashboards/index.html
        index 9343d004..d0cec684 100644
        --- a/Extensions/Dashboards/index.html
        +++ b/Extensions/Dashboards/index.html
        @@ -1,4 +1,4 @@
        - Dashboards - LibreNMS Docs       

        Dashboards

        Create customised dashboards in LibreNMS per user. You can share dashboards with other users. You can also make a custom dashboard and default it for all users in LibreNMS.

        Example Dashboard Example Dashboard

        Widgets

        LibreNMS has a whole list of Widgets to select from.

        • Alerts Widget: Displays all alert notifications.
        • Availability Map: Displays all devices with colored tiles, green up, yellow for warning (device has been restarted in last 24 hours), red for down. You can also list all services and ignored/disabled devices in this widget.
        • Components Status: List all components Ok state, Warning state, Critical state.
        • Device Summary horizontal: List device totals, up, down, ignored, disabled. Same for ports and services.
        • Device Summary vertical: List device totals, up, down, ignored, disabled. Same for ports and services.
        • Eventlog: Displays all events with your devices and LibreNMS.
        • External Image: can be used to show external images on your dashboard. Or images from inside LibreNMS.
        • Globe Map: Will display map of the globe.
        • Graph: Can be used to display graphs from devices.
        • Graylog: Displays all Graylog's syslog entries.
        • Notes: use for html tags, embed links and external web pages. Or just notes in general.
        • Server Stats: Will display gauges for CPU, Memory, Storage usage. Note the device type has to be listed as "Server".
        • Syslog: Displays all syslog entries.
        • Top Devices: By Traffic, or Uptime, or Response time, or Poller Duration, or Processor load, or Memory Usage, or Storage Usage.
        • Top Interfaces: Lists top interfaces by traffic utilization.
        • World Map: displays all your devices locations. From syslocation or from override sysLocation.

        List of Widgets:

        List of Widgets

        Dashboard Permissions

        • Private: Sets the dashboard to only the user that created the dashboard can view and edit.
        • Shared Read: Sets the dashboard to allow other users to view the dashboard, but cant make changes to the dashboard.
        • Shared: Allows all users to view the dashboard and make changes.

        Setting a global default dashboard

        Step 1: Set the dashboard to either shared read or shared, depending on what you want the users access to change.

        Step 2: Then go to Settings -> WebUI settings -> Dashboard Settings and set the global default dashboard.

        Setting embedded webpage

        Using the Notes Widget.

        <iframe src="your_url" frameBorder="0" width="100%" height = "100%">
        + Dashboards - LibreNMS Docs       

        Dashboards

        Create customised dashboards in LibreNMS per user. You can share dashboards with other users. You can also make a custom dashboard and default it for all users in LibreNMS.

        Example Dashboard Example Dashboard

        Widgets

        LibreNMS has a whole list of Widgets to select from.

        • Alerts Widget: Displays all alert notifications.
        • Availability Map: Displays all devices with colored tiles, green up, yellow for warning (device has been restarted in last 24 hours), red for down. You can also list all services and ignored/disabled devices in this widget.
        • Components Status: List all components Ok state, Warning state, Critical state.
        • Device Summary horizontal: List device totals, up, down, ignored, disabled. Same for ports and services.
        • Device Summary vertical: List device totals, up, down, ignored, disabled. Same for ports and services.
        • Eventlog: Displays all events with your devices and LibreNMS.
        • External Image: can be used to show external images on your dashboard. Or images from inside LibreNMS.
        • Globe Map: Will display map of the globe.
        • Graph: Can be used to display graphs from devices.
        • Graylog: Displays all Graylog's syslog entries.
        • Notes: use for html tags, embed links and external web pages. Or just notes in general.
        • Server Stats: Will display gauges for CPU, Memory, Storage usage. Note the device type has to be listed as "Server".
        • Syslog: Displays all syslog entries.
        • Top Devices: By Traffic, or Uptime, or Response time, or Poller Duration, or Processor load, or Memory Usage, or Storage Usage.
        • Top Interfaces: Lists top interfaces by traffic utilization.
        • World Map: displays all your devices locations. From syslocation or from override sysLocation.

        List of Widgets:

        List of Widgets

        Dashboard Permissions

        • Private: Sets the dashboard to only the user that created the dashboard can view and edit.
        • Shared Read: Sets the dashboard to allow other users to view the dashboard, but cant make changes to the dashboard.
        • Shared: Allows all users to view the dashboard and make changes.

        Setting a global default dashboard

        Step 1: Set the dashboard to either shared read or shared, depending on what you want the users access to change.

        Step 2: Then go to Settings -> WebUI settings -> Dashboard Settings and set the global default dashboard.

        Setting embedded webpage

        Using the Notes Widget.

        <iframe src="your_url" frameBorder="0" width="100%" height = "100%">
           <p>Your browser does not support iframes.</p>
         </iframe>
         

        Note you may need to play with the width and height and also size your widget properly.

        src="url" needs to be URL to webpage you are linking to. Also some web pages may not support html embedded or iframe. Example embed webpage

        How to create ports graph

        In the dashboard, you want to create an interface graph select the widget called

        'Graph' then select "Port" -> "Bits" port-bits-graph

        Note: you can map the port by description or the alias or by port id. You will need to know this in order to map the port to the graph.

        port-bits-graph

        Dimension parameter replacement for Generic-image widget

        When using the Generic-image widget you can provide the width and height of the widget with your request. This will ensure that the image will fit nicely with the dimensions if the Generic-image widget. You can add @AUTO_HEIGHT@ and @AUTO_WIDTH@ to the Image URL as parameters.

        Examples:

        \ No newline at end of file diff --git a/Extensions/Dell-OpenManage/index.html b/Extensions/Dell-OpenManage/index.html index a49adf63..d2e8bf79 100644 --- a/Extensions/Dell-OpenManage/index.html +++ b/Extensions/Dell-OpenManage/index.html @@ -1,4 +1,4 @@ - Dell OpenManage - LibreNMS Docs

        Dell OpenManage Support

        For Dell OpenManage support you will need to install Dell OpenManage (yeah - really :)) (minimum 5.1) onto the device you want to monitor. Ensure that net-snmp is using srvadmin, you should see something similar to:

        master agentx
        + Dell OpenManage - LibreNMS Docs       

        Dell OpenManage Support

        For Dell OpenManage support you will need to install Dell OpenManage (yeah - really :)) (minimum 5.1) onto the device you want to monitor. Ensure that net-snmp is using srvadmin, you should see something similar to:

        master agentx
         view all included .1
         access notConfigGroup "" any noauth exact all none none
         smuxpeer .1.3.6.1.4.1.674.10892.1
        diff --git a/Extensions/Dependency-Map/index.html b/Extensions/Dependency-Map/index.html
        index daae68dc..5ed44c80 100644
        --- a/Extensions/Dependency-Map/index.html
        +++ b/Extensions/Dependency-Map/index.html
        @@ -1 +1 @@
        - Dependency Map - LibreNMS Docs       

        Dependency Map

        LibreNMS has the ability to show you a dynamic network map based on device dependencies that have been configure. These maps are accessed through the following menu options:

        • Overview -> Maps -> Device Dependency
        • Overview -> Maps -> Device Groups Dependencies

        Settings

        The map display can be configured by altering the VisJS-Config.md

        \ No newline at end of file + Dependency Map - LibreNMS Docs

        Dependency Map

        LibreNMS has the ability to show you a dynamic network map based on device dependencies that have been configure. These maps are accessed through the following menu options:

        • Overview -> Maps -> Device Dependency
        • Overview -> Maps -> Device Groups Dependencies

        Settings

        The map display can be configured by altering the VisJS-Config.md

        \ No newline at end of file diff --git a/Extensions/Device-Groups/index.html b/Extensions/Device-Groups/index.html index a3741d05..98a3afc0 100644 --- a/Extensions/Device-Groups/index.html +++ b/Extensions/Device-Groups/index.html @@ -1 +1 @@ - Grouping Devices - LibreNMS Docs

        Grouping Devices

        LibreNMS supports grouping your devices together in much the same way as you can configure alerts. This document will hopefully help you get started.

        Dynamic Groups

        Rule Editor

        The rule is based on the MySQL structure your data is in. Such as tablename.columnname. If you already know the entity you want, you can browse around inside MySQL using show tables and desc <tablename>.

        As a working example and a common question, let's assume you want to group devices by hostname. If your hostname format is dcX.[devicetype].example.com. You would use the field devices.hostname.

        If you want to group them by device type, you would add a rule for routers of devices.hostname endswith rtr.example.com.

        If you want to group them by DC, you could use the rule devices.hostname regex dc1\..*\.example\.com (Don't forget to escape periods in the regex)

        Static Groups

        You can create static groups (and convert dynamic groups to static) to put specific devices in a group. Just select static as the type and select the devices you want in the group.

        Device Groups

        You can now select this group from the Devices -> All Devices link in the navigation at the top. You can also use the group to map alert rules to by creating an alert mapping Overview -> Alerts -> Rule Mapping.

        \ No newline at end of file + Grouping Devices - LibreNMS Docs

        Grouping Devices

        LibreNMS supports grouping your devices together in much the same way as you can configure alerts. This document will hopefully help you get started.

        Dynamic Groups

        Rule Editor

        The rule is based on the MySQL structure your data is in. Such as tablename.columnname. If you already know the entity you want, you can browse around inside MySQL using show tables and desc <tablename>.

        As a working example and a common question, let's assume you want to group devices by hostname. If your hostname format is dcX.[devicetype].example.com. You would use the field devices.hostname.

        If you want to group them by device type, you would add a rule for routers of devices.hostname endswith rtr.example.com.

        If you want to group them by DC, you could use the rule devices.hostname regex dc1\..*\.example\.com (Don't forget to escape periods in the regex)

        Static Groups

        You can create static groups (and convert dynamic groups to static) to put specific devices in a group. Just select static as the type and select the devices you want in the group.

        Device Groups

        You can now select this group from the Devices -> All Devices link in the navigation at the top. You can also use the group to map alert rules to by creating an alert mapping Overview -> Alerts -> Rule Mapping.

        \ No newline at end of file diff --git a/Extensions/Dispatcher-Service/index.html b/Extensions/Dispatcher-Service/index.html index 50648cab..aece971d 100644 --- a/Extensions/Dispatcher-Service/index.html +++ b/Extensions/Dispatcher-Service/index.html @@ -1,4 +1,4 @@ - Dispatcher Service (RC) - LibreNMS Docs

        Dispatcher Service

        Status: Release Candidate

        The LibreNMS dispatcher service (librenms-service.py) is a new method of running the poller service at set times. It does not replace the php scripts, just the cron entries running them.

        External Requirements

        A recent version of Python

        The LibreNMS service requires Python 3 and some features require behaviour only found in Python3.4+.

        Python modules

        • PyMySQL is recommended as it requires no C compiler to install. MySQLclient can also be used, but does require compilation.
        • python-dotenv .env loader
        • redis-py 4.0+ and Redis 5.0+ server (if using distributed polling)
        • psutil

        These can be obtained from your OS package manager, or from PyPI with the below commands.

        pip3 install -r requirements.txt
        + Dispatcher Service (RC) - LibreNMS Docs       

        Dispatcher Service

        Status: Release Candidate

        The LibreNMS dispatcher service (librenms-service.py) is a new method of running the poller service at set times. It does not replace the php scripts, just the cron entries running them.

        External Requirements

        A recent version of Python

        The LibreNMS service requires Python 3 and some features require behaviour only found in Python3.4+.

        Python modules

        • PyMySQL is recommended as it requires no C compiler to install. MySQLclient can also be used, but does require compilation.
        • python-dotenv .env loader
        • redis-py 4.0+ and Redis 5.0+ server (if using distributed polling)
        • psutil

        These can be obtained from your OS package manager, or from PyPI with the below commands.

        pip3 install -r requirements.txt
         

        Redis (distributed polling)

        If you want to use distributed polling, you'll need a Redis instance to coordinate the nodes. It's recommended that you do not share the Redis database with any other system - by default, Redis supports up to 16 databases (numbered 0-15). You can also use Redis on a single host if you want

        It's strongly recommended that you deploy a resilient cluster of redis systems, and use redis-sentinel.

        You should not rely on the password for the security of your system. See https://redis.io/topics/security

        Memcached (distributed polling)

        LibreNMS can still use memcached as a locking mechanism when using distributed polling. So you can configure memcached for this purpose unless you have updates disabled.

        See Locking Mechanisms at https://docs.librenms.org/Extensions/Distributed-Poller/

        MySQL

        You should already have this, but the pollers do need access to the SQL database. The LibreNMS service runs faster and more aggressively than the standard poller, so keep an eye on the number of open connections and other important health metrics.

        Configuration

        Connection settings are required in .env. The .env file is generated after composer install and APP_KEY and NODE_ID are set. Remember that the APP_KEY value must be the same on all your pollers.

        #APP_KEY=   #Required, generated by composer install
         #NODE_ID=   #Required, generated by composer install
         
        diff --git a/Extensions/Distributed-Poller/index.html b/Extensions/Distributed-Poller/index.html
        index df8db4b3..d006429b 100644
        --- a/Extensions/Distributed-Poller/index.html
        +++ b/Extensions/Distributed-Poller/index.html
        @@ -1,4 +1,4 @@
        - Scaling LibreNMS - LibreNMS Docs       

        Distributed Poller

        A normal install contains all parts of LibreNMS:

        • Poller/Discovery/etc workers
        • RRD (Time series data store) *
        • Database *
        • Webserver (Web UI/API) *

        * may only be installed on one server (however, some can be clustered)

        Distributed Polling allows the workers to be spread across additional servers for horizontal scaling. Distributed polling is not intended for remote polling.

        Devices can be grouped together into a poller_group to pin these devices to a single or a group of designated pollers.

        All pollers need to write to the same set of RRD files, preferably via RRDcached.

        It is also a requirement that at least one locking service is in place to which all pollers can connect. There are currently three locking mechanisms available

        • memcached
        • redis (preferred)
        • sql locks (default)

        All of the above locking mechanisms are natively supported in LibreNMS. If none are specified, it will default to using SQL.

        Requirements for distributed polling

        These requirements are above the normal requirements for a full LibreNMS install.

        • rrdtool version 1.4 or above
        • At least one locking mechanism configured
        • a rrdcached install

        By default, all hosts are shared and have the poller_group = 0. To pin a device to a poller, set it to a value greater than 0 and set the same value in the poller's config with distributed_poller_group. One can also specify a comma separated string of poller groups in distributed_poller_group. The poller will then poll devices from any of the groups listed. If new devices get added from the poller they will be assigned to the first poller group in the list unless the group is specified when adding the device.

        The following is a standard config, combined with a locking mechanism below:

        poller/distributed

        lnms config:set distributed_poller true
        + Scaling LibreNMS - LibreNMS Docs       

        Distributed Poller

        A normal install contains all parts of LibreNMS:

        • Poller/Discovery/etc workers
        • RRD (Time series data store) *
        • Database *
        • Webserver (Web UI/API) *

        * may only be installed on one server (however, some can be clustered)

        Distributed Polling allows the workers to be spread across additional servers for horizontal scaling. Distributed polling is not intended for remote polling.

        Devices can be grouped together into a poller_group to pin these devices to a single or a group of designated pollers.

        All pollers need to write to the same set of RRD files, preferably via RRDcached.

        It is also a requirement that at least one locking service is in place to which all pollers can connect. There are currently three locking mechanisms available

        • memcached
        • redis (preferred)
        • sql locks (default)

        All of the above locking mechanisms are natively supported in LibreNMS. If none are specified, it will default to using SQL.

        Requirements for distributed polling

        These requirements are above the normal requirements for a full LibreNMS install.

        • rrdtool version 1.4 or above
        • At least one locking mechanism configured
        • a rrdcached install

        By default, all hosts are shared and have the poller_group = 0. To pin a device to a poller, set it to a value greater than 0 and set the same value in the poller's config with distributed_poller_group. One can also specify a comma separated string of poller groups in distributed_poller_group. The poller will then poll devices from any of the groups listed. If new devices get added from the poller they will be assigned to the first poller group in the list unless the group is specified when adding the device.

        The following is a standard config, combined with a locking mechanism below:

        poller/distributed

        lnms config:set distributed_poller true
         lnms config:set distributed_poller_group 0
         

        If you want to customise the hostname for the poller then you will need to set this in config.php:

        $config['distributed_poller_name']           = php_uname('n');
         

        Locking mechanisms

        Pick one of the following setups, do not use all of them at the same time.

        Using REDIS

        In your .env file you will need to specify a redis server, port and the driver.

        REDIS_HOST=HOSTNAME or IP
        diff --git a/Extensions/Fast-Ping-Check/index.html b/Extensions/Fast-Ping-Check/index.html
        index 5affa4f2..e88f0903 100644
        --- a/Extensions/Fast-Ping-Check/index.html
        +++ b/Extensions/Fast-Ping-Check/index.html
        @@ -1,4 +1,4 @@
        - Fast Ping Checking - LibreNMS Docs       

        Fast up/down checking

        Normally, LibreNMS sends an ICMP ping to the device before polling to check if it is up or down. This check is tied to the poller frequency, which is normally 5 minutes. This means it may take up to 5 minutes to find out if a device is down.

        Some users may want to know if devices stop responding to ping more quickly than that. LibreNMS offers a ping.php script to run ping checks as quickly as possible without increasing snmp load on your devices by switching to 1 minute polling.

        WARNING: If you do not have an alert rule that alerts on device status, enabling this will be a waste of resources. You can find one in the Alert Rules Collection.

        Setting the ping check to 1 minute

        1: If you are using RRDCached, stop the service.

        - This will flush all pending writes so that the rrdstep.php script can change the steps.
        + Fast Ping Checking - LibreNMS Docs       

        Fast up/down checking

        Normally, LibreNMS sends an ICMP ping to the device before polling to check if it is up or down. This check is tied to the poller frequency, which is normally 5 minutes. This means it may take up to 5 minutes to find out if a device is down.

        Some users may want to know if devices stop responding to ping more quickly than that. LibreNMS offers a ping.php script to run ping checks as quickly as possible without increasing snmp load on your devices by switching to 1 minute polling.

        WARNING: If you do not have an alert rule that alerts on device status, enabling this will be a waste of resources. You can find one in the Alert Rules Collection.

        Setting the ping check to 1 minute

        1: If you are using RRDCached, stop the service.

        - This will flush all pending writes so that the rrdstep.php script can change the steps.
         

        2: Change the ping_rrd_step setting in config.php

        poller/rrdtool

        lnms config:set ping_rrd_step 60
         

        3: Update the rrd files to change the step (step is hardcoded at file creation in rrd files)

        ./scripts/rrdstep.php -h all
         

        4: Add the following line to /etc/cron.d/librenms to allow 1 minute ping checks

        *    *    * * *   librenms    /opt/librenms/ping.php >> /dev/null 2>&1
        diff --git a/Extensions/Galera-Cluster/index.html b/Extensions/Galera-Cluster/index.html
        index 212a7a3b..2c9f660d 100644
        --- a/Extensions/Galera-Cluster/index.html
        +++ b/Extensions/Galera-Cluster/index.html
        @@ -1,4 +1,4 @@
        - Galera Database Cluster - LibreNMS Docs       

        MariaDB Galera Cluster

        This is currently being tested, use at your own risk.

        LibreNMS can be used with a MariaDB Galera Cluster. This is a Multi Master cluster, meaning each node in the cluster can read and write to the database. They all have the same ability. LibreNMS will randomly choose a working node to read and write requests to.

        For more information see https://laravel.com/docs/database#read-and-write-connections

        Getting Started

        • It is best practice to have a minimum of 3 nodes in the cluster, A odd number of nodes is recommended in the event nodes have a disagreement on data, they will have a tie breaker.
        • It's recommended that all servers be similar in hardware performance, cluster performance can be affected by the slowest server in the cluster.
        • Backup the database before starting, and backing up the database regularly is still recommended even in a working cluster environment.

        Install and Configure Galera

        Install Galera4 and MariaDB Server

        These can be obtained from your OS package manager. For example in Ubuntu.

        sudo apt-get install mariadb-server mariadb-client galera-4
        + Galera Database Cluster - LibreNMS Docs       

        MariaDB Galera Cluster

        This is currently being tested, use at your own risk.

        LibreNMS can be used with a MariaDB Galera Cluster. This is a Multi Master cluster, meaning each node in the cluster can read and write to the database. They all have the same ability. LibreNMS will randomly choose a working node to read and write requests to.

        For more information see https://laravel.com/docs/database#read-and-write-connections

        Getting Started

        • It is best practice to have a minimum of 3 nodes in the cluster, A odd number of nodes is recommended in the event nodes have a disagreement on data, they will have a tie breaker.
        • It's recommended that all servers be similar in hardware performance, cluster performance can be affected by the slowest server in the cluster.
        • Backup the database before starting, and backing up the database regularly is still recommended even in a working cluster environment.

        Install and Configure Galera

        Install Galera4 and MariaDB Server

        These can be obtained from your OS package manager. For example in Ubuntu.

        sudo apt-get install mariadb-server mariadb-client galera-4
         

        Create Galera Config

        Create a new file /etc/mysql/conf.d/galera.conf on each node

        [mysqld]
         binlog_format=ROW
         default-storage-engine=innodb
        diff --git a/Extensions/Gateone/index.html b/Extensions/Gateone/index.html
        index f4029e55..6172c2e5 100644
        --- a/Extensions/Gateone/index.html
        +++ b/Extensions/Gateone/index.html
        @@ -1,3 +1,3 @@
        - Gateone - LibreNMS Docs       

        GateOne integration

        We have simple integration for GateOne, you will be redirected to your Gateone command line frontend to access your equipment. (Currently this only works with SSH)

        GateOne itself isn't included within LibreNMS, you will need to install this separately either on the same infrastructure as LibreNMS or as a totally standalone appliance. The installation is beyond the scope of this document.

        Config is simple, include the following in your config.php:

        $config['gateone']['server'] = 'http://<your_gateone_url/';
        + Gateone - LibreNMS Docs       

        GateOne integration

        We have simple integration for GateOne, you will be redirected to your Gateone command line frontend to access your equipment. (Currently this only works with SSH)

        GateOne itself isn't included within LibreNMS, you will need to install this separately either on the same infrastructure as LibreNMS or as a totally standalone appliance. The installation is beyond the scope of this document.

        Config is simple, include the following in your config.php:

        $config['gateone']['server'] = 'http://<your_gateone_url/';
         

        Note: You must use the full url including the trailing /!

        We also support prefixing the currently logged in Librenms user to the SSH connection URL that is created, eg. ssh://admin@localhost To enable this, put the following in your config.php:

        $config['gateone']['use_librenms_user'] = true;
         
        \ No newline at end of file diff --git a/Extensions/Graylog/index.html b/Extensions/Graylog/index.html index d82e04dd..896e7182 100644 --- a/Extensions/Graylog/index.html +++ b/Extensions/Graylog/index.html @@ -1,4 +1,4 @@ - Graylog - LibreNMS Docs

        Graylog integration

        We have simple integration for Graylog, you will be able to view any logs from within LibreNMS that have been parsed by the syslog input from within Graylog itself. This includes logs from devices which aren't in LibreNMS still, you can also see logs for a specific device under the logs section for the device.

        Currently, LibreNMS does not associate shortnames from Graylog with full FQDNS. If you have your devices in LibreNMS using full FQDNs, such as hostname.example.com, be aware that rsyslogd, by default, sends the shortname only. To fix this, add

        $PreserveFQDN on

        to your rsyslog config to send the full FQDN so device logs will be associated correctly in LibreNMS. Also see near the bottom of this document for tips on how to enable/suppress the domain part of hostnames in syslog-messages for some platforms.

        Graylog itself isn't included within LibreNMS, you will need to install this separately either on the same infrastructure as LibreNMS or as a totally standalone appliance.

        Config is simple, here's an example based on Graylog 2.4:

        external/graylog

        lnms config:set graylog.server 'http://127.0.0.1'
        + Graylog - LibreNMS Docs       

        Graylog integration

        We have simple integration for Graylog, you will be able to view any logs from within LibreNMS that have been parsed by the syslog input from within Graylog itself. This includes logs from devices which aren't in LibreNMS still, you can also see logs for a specific device under the logs section for the device.

        Currently, LibreNMS does not associate shortnames from Graylog with full FQDNS. If you have your devices in LibreNMS using full FQDNs, such as hostname.example.com, be aware that rsyslogd, by default, sends the shortname only. To fix this, add

        $PreserveFQDN on

        to your rsyslog config to send the full FQDN so device logs will be associated correctly in LibreNMS. Also see near the bottom of this document for tips on how to enable/suppress the domain part of hostnames in syslog-messages for some platforms.

        Graylog itself isn't included within LibreNMS, you will need to install this separately either on the same infrastructure as LibreNMS or as a totally standalone appliance.

        Config is simple, here's an example based on Graylog 2.4:

        external/graylog

        lnms config:set graylog.server 'http://127.0.0.1'
         lnms config:set graylog.port 9000
         lnms config:set graylog.username admin
         lnms config:set graylog.password 'admin'
        diff --git a/Extensions/IRC-Bot-Extensions/index.html b/Extensions/IRC-Bot-Extensions/index.html
        index f88de8c2..ca05815f 100644
        --- a/Extensions/IRC-Bot-Extensions/index.html
        +++ b/Extensions/IRC-Bot-Extensions/index.html
        @@ -1,4 +1,4 @@
        - IRC Bot Extensions - LibreNMS Docs       

        IRC Bot Extensions

        Okay this is a very quick walk-through in writing your own commands for the IRC-Bot.

        First of all, create a file in includes/ircbot, the file-name should be in this format: command.inc.php.

        When editing the file, do not open nor close PHP-tags. Any variable you assign will be discarded as soon as your command returns. Some variables, specially all listed under $this->, have special meanings or effects. Before a command is executed, the IRC-Bot ensures that the MySQL-Socket is working, that $this->user points to the right user and that the user is authenticated. Below you will find a table with related functions and attributes. You can chain-load any built-in command by calling $this->_command("My Parameters"). You cannot chain-load external commands.

        To enable your command, edit your config.php and add something like this:

           ...
        + IRC Bot Extensions - LibreNMS Docs       

        IRC Bot Extensions

        Okay this is a very quick walk-through in writing your own commands for the IRC-Bot.

        First of all, create a file in includes/ircbot, the file-name should be in this format: command.inc.php.

        When editing the file, do not open nor close PHP-tags. Any variable you assign will be discarded as soon as your command returns. Some variables, specially all listed under $this->, have special meanings or effects. Before a command is executed, the IRC-Bot ensures that the MySQL-Socket is working, that $this->user points to the right user and that the user is authenticated. Below you will find a table with related functions and attributes. You can chain-load any built-in command by calling $this->_command("My Parameters"). You cannot chain-load external commands.

        To enable your command, edit your config.php and add something like this:

           ...
            $config['irc_external'][] = "mycommand";
            ...
         

        See: Example

        Functions and Attributes

        ... that are accessible from within an extension

        Functions

        Function( (Type) $Variable [= Default] [,...] ) Returns Description
        $this->getChan( ) String Returns channel of current event.
        $this->getData( (boolean) $Block = false ) String/Boolean Returns a line from the IRC-Buffer if it's not matched against any other command. If $Block is true, wait until a suitable line is returned.
        $this->getUser( ) String Returns nick of current user. Not to confuse with $this->user!
        $this->get_user( ) Array See $this->user in Attributes.
        $this->irc_raw( (string) $Protocol ) Boolean Sends raw IRC-Protocol.
        $this->isAuthd( ) Boolean true if the user is authenticated.
        $this->joinChan( (string) $Channel ) Boolean Joins given $Channel.
        $this->log( (string) $Message ) Boolean Logs given $Message into STDOUT.
        $this->read( (string) $Buffer ) String/Boolean Returns a line from given $Buffer or false if there's nothing suitable inside the Buffer. Please use $this->getData() for handler-safe data retrieval.
        $this->respond( (string) $Message ) Boolean Responds to the request auto-detecting channel or private message.

        Attributes

        Attribute Type Description
        $params String Contains all arguments that are passed to the .command.
        $this->chan Array Channels that are configured.
        $this->commands Array Contains accessible commands.
        $this->config Array Contains $config from config.php.
        $this->data String Contains raw IRC-Protocol.
        $this->debug Boolean Debug-Flag.
        $this->external Array Contains loaded extra commands.
        $this->nick String Bot's nick on the IRC.
        $this->pass String IRC-Server's passphrase.
        $this->port Int IRC-Server's port-number.
        $this->server String IRC-Server's hostname.
        $this->ssl Boolean SSL-Flag.
        $this->tick Int Interval to check buffers in microseconds.
        $this->user Array Array containing details about the user that sent the request.

        Example

        includes/ircbot/join-ng.inc.php

           if( $this->user['level'] != 10 ) {
        diff --git a/Extensions/IRC-Bot/index.html b/Extensions/IRC-Bot/index.html
        index a8940700..292bff87 100644
        --- a/Extensions/IRC-Bot/index.html
        +++ b/Extensions/IRC-Bot/index.html
        @@ -1,4 +1,4 @@
        - IRC Bot - LibreNMS Docs       

        IRC Bot

        LibreNMS has an easy to use IRC-Interface for basic tasks like viewing last log-entry, current device/port status and such.

        By default the IRC-Bot will not start when executed and will return an error until at least $config['irc_host'] and $config['irc_port'] has been specified inside config.php. (To start the IRC-Bot run ./irc.php )

        If no channel has been specified with $config['irc_chan'], ##librenms will be used. The default Nick for the bot is LibreNMS.

        The Bot will reply the same way it's being called. If you send it the commands via Query, it will respond in the Query. If you send the commands via a Channel, then it will respond in the Channel.

        Configuration & Defaults

        Option Default-Value Notes
        $config['irc_alert'] false Optional; Enables Alerting-Socket. EXPERIMENTAL
        $config['irc_alert_chan'] false Optional; Multiple channels can be defined as Array or delimited with ,. EXPERIMENTAL
        $config['irc_alert_utf8'] false Optional; Enables use of strikethrough in alerts via UTF-8 encoded characters. Might cause trouble for some clients.
        $config['irc_alert_short'] false Optional; Send a one line alert summary instead of multi-line detailed alert.
        $config['irc_authtime'] 3 Optional; Defines how long in Hours an auth-session is valid.
        $config['irc_chan'] ##librenms Optional; Multiple channels can be defined as Array or delimited with ,. Passwords are defined after a space-character.
        $config['irc_debug'] false Optional; Enables debug output (Wall of text)
        $config['irc_external'] Optional; Array or , delimited string with commands to include from includes/ircbot/*.inc.php
        $config['irc_host'] Required; Domain or IP to connect. If it's an IPv6 Address, embed it in []. (Example: [::1])
        $config['irc_maxretry'] 5 Optional; How many connection attempts should be made before giving up
        $config['irc_nick'] LibreNMS Optional;
        $config['irc_pass'] Optional; This sends the IRC-PASS Sequence to IRC-Servers that require Password on Connect
        $config['irc_port'] 6667 Required; To enable SSL append a + before the Port. (Example: +6697)
        $config['irc_ctcp'] false Optional; Enable/disable ctcp-replies from the bot (currently VERSION, PING and TIME).
        $config['irc_ctcp_version'] LibreNMS IRCbot. https://www.librenms.org/ Optional; Reply-string to CTCP VERSION requests
        $config['irc_auth'] Optional; Array of hostmasks that are automatically authenticated.

        IRC-Commands

        Command Description
        .auth <User/Token> If <user>: Request an Auth-Token. If <token>: Authenticate session.
        .device <hostname> Prints basic information about given hostname.
        .down List hostnames that are down, if any.
        .help List available commands.
        .join <channel> Joins <channel> if user has admin-level.
        .listdevices Lists the hostnames of all known devices.
        .log [<N>] Prints N lines or last line of the eventlog.
        .port <hostname> <ifname> Prints Port-related information from ifname on given hostname.
        .quit Disconnect from IRC and exit.
        .reload Reload configuration.
        .status <type> Prints status information for given type. Type can be devices, services, ports. Shorthands are: dev,srv,prt
        .version Prints $this->config['project_name_version'].

        ( /!\ All commands are case-insensitive but their arguments are case-sensitive)

        Examples

        Server examples

        Unencrypted Connection to irc.libera.chat:

           ...
        + IRC Bot - LibreNMS Docs       

        IRC Bot

        LibreNMS has an easy to use IRC-Interface for basic tasks like viewing last log-entry, current device/port status and such.

        By default the IRC-Bot will not start when executed and will return an error until at least $config['irc_host'] and $config['irc_port'] has been specified inside config.php. (To start the IRC-Bot run ./irc.php )

        If no channel has been specified with $config['irc_chan'], ##librenms will be used. The default Nick for the bot is LibreNMS.

        The Bot will reply the same way it's being called. If you send it the commands via Query, it will respond in the Query. If you send the commands via a Channel, then it will respond in the Channel.

        Configuration & Defaults

        Option Default-Value Notes
        $config['irc_alert'] false Optional; Enables Alerting-Socket. EXPERIMENTAL
        $config['irc_alert_chan'] false Optional; Multiple channels can be defined as Array or delimited with ,. EXPERIMENTAL
        $config['irc_alert_utf8'] false Optional; Enables use of strikethrough in alerts via UTF-8 encoded characters. Might cause trouble for some clients.
        $config['irc_alert_short'] false Optional; Send a one line alert summary instead of multi-line detailed alert.
        $config['irc_authtime'] 3 Optional; Defines how long in Hours an auth-session is valid.
        $config['irc_chan'] ##librenms Optional; Multiple channels can be defined as Array or delimited with ,. Passwords are defined after a space-character.
        $config['irc_debug'] false Optional; Enables debug output (Wall of text)
        $config['irc_external'] Optional; Array or , delimited string with commands to include from includes/ircbot/*.inc.php
        $config['irc_host'] Required; Domain or IP to connect. If it's an IPv6 Address, embed it in []. (Example: [::1])
        $config['irc_maxretry'] 5 Optional; How many connection attempts should be made before giving up
        $config['irc_nick'] LibreNMS Optional;
        $config['irc_pass'] Optional; This sends the IRC-PASS Sequence to IRC-Servers that require Password on Connect
        $config['irc_port'] 6667 Required; To enable SSL append a + before the Port. (Example: +6697)
        $config['irc_ctcp'] false Optional; Enable/disable ctcp-replies from the bot (currently VERSION, PING and TIME).
        $config['irc_ctcp_version'] LibreNMS IRCbot. https://www.librenms.org/ Optional; Reply-string to CTCP VERSION requests
        $config['irc_auth'] Optional; Array of hostmasks that are automatically authenticated.

        IRC-Commands

        Command Description
        .auth <User/Token> If <user>: Request an Auth-Token. If <token>: Authenticate session.
        .device <hostname> Prints basic information about given hostname.
        .down List hostnames that are down, if any.
        .help List available commands.
        .join <channel> Joins <channel> if user has admin-level.
        .listdevices Lists the hostnames of all known devices.
        .log [<N>] Prints N lines or last line of the eventlog.
        .port <hostname> <ifname> Prints Port-related information from ifname on given hostname.
        .quit Disconnect from IRC and exit.
        .reload Reload configuration.
        .status <type> Prints status information for given type. Type can be devices, services, ports. Shorthands are: dev,srv,prt
        .version Prints $this->config['project_name_version'].

        ( /!\ All commands are case-insensitive but their arguments are case-sensitive)

        Examples

        Server examples

        Unencrypted Connection to irc.libera.chat:

           ...
            $config['irc_host'] = "irc.libera.chat";
            $config['irc_port'] = 6667;
            ...
        diff --git a/Extensions/InfluxDBv2/index.html b/Extensions/InfluxDBv2/index.html
        new file mode 100644
        index 00000000..46e79930
        --- /dev/null
        +++ b/Extensions/InfluxDBv2/index.html
        @@ -0,0 +1,15 @@
        +
        +
        +
        +
        +    
        +    Redirecting...
        +    
        +    
        +    
        +    
        +
        +
        +Redirecting...
        +
        +
        diff --git a/Extensions/Interface-Description-Parsing/index.html b/Extensions/Interface-Description-Parsing/index.html
        index 99afe10f..964f97de 100644
        --- a/Extensions/Interface-Description-Parsing/index.html
        +++ b/Extensions/Interface-Description-Parsing/index.html
        @@ -1,4 +1,4 @@
        - Interface Description Parsing - LibreNMS Docs       

        Interface Description Parsing

        Librenms can interpret, display and group certain additional information on ports. This is done based on the format that the port description is written although it's possible to customise the parser to be specific for your setup.

        Keywords

        See examples for formats.

        • Keywords
        • Cust - Customer
        • Transit - Transit link
        • Peering - Peering link
        • Core - Infrastructure link (non-customer)
        • Info-keywords
        • () contains a note
        • {} contains your circuit id
        • [] contains the service type or speed

        Examples

        Cisco IOS / NXOS / IOSXR:

        interface Gi0/1
        + Interface Description Parsing - LibreNMS Docs       

        Interface Description Parsing

        Librenms can interpret, display and group certain additional information on ports. This is done based on the format that the port description is written although it's possible to customise the parser to be specific for your setup.

        Keywords

        See examples for formats.

        • Keywords
        • Cust - Customer
        • Transit - Transit link
        • Peering - Peering link
        • Core - Infrastructure link (non-customer)
        • Info-keywords
        • () contains a note
        • {} contains your circuit id
        • [] contains the service type or speed

        Examples

        Cisco IOS / NXOS / IOSXR:

        interface Gi0/1
         descr Transit: Example Provider (AS65000)
         interface Gi0/2
         descr Peering: Peering Exchange
        diff --git a/Extensions/Metric-Storage/index.html b/Extensions/Metric-Storage/index.html
        index 014fa750..924eac7d 100644
        --- a/Extensions/Metric-Storage/index.html
        +++ b/Extensions/Metric-Storage/index.html
        @@ -1 +1 @@
        - Intro - LibreNMS Docs       

        Metric storage

        By default we ship all metrics to RRD files, either directly or via RRDCached. On top of this you can ship metrics to Graphite, InfluxDB, OpenTSDB or Prometheus. At present you can't use these backends to display graphs within LibreNMS and will need to use something like Grafana.

        For further information on configuring LibreNMS to ship data to one of the other backends then please see the documentation below.

        \ No newline at end of file + Intro - LibreNMS Docs

        Metric storage

        By default we ship all metrics to RRD files, either directly or via RRDCached. On top of this you can ship metrics to Graphite, InfluxDB (v1 or v2 API), OpenTSDB or Prometheus. At present you can't use these backends to display graphs within LibreNMS and will need to use something like Grafana.

        For further information on configuring LibreNMS to ship data to one of the other backends then please see the documentation below.

        \ No newline at end of file diff --git a/Extensions/NFSen/index.html b/Extensions/NFSen/index.html index 760e27d8..c4065bca 100644 --- a/Extensions/NFSen/index.html +++ b/Extensions/NFSen/index.html @@ -1,4 +1,4 @@ - NFSen - LibreNMS Docs

        NFSen

        The installation of NFSen is out of scope for this document / LibreNMS

        Configuration

        The following is the configuration that can be used:

        external/nfsen

        lnms config:set nfsen_enable true
        + NFSen - LibreNMS Docs       

        NFSen

        The installation of NFSen is out of scope for this document / LibreNMS

        Configuration

        The following is the configuration that can be used:

        external/nfsen

        lnms config:set nfsen_enable true
         lnms config:set nfsen_split_char '_'
         lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat/live/'
         lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat'
        diff --git a/Extensions/Network-Map/index.html b/Extensions/Network-Map/index.html
        index 13170a57..d9977f1f 100644
        --- a/Extensions/Network-Map/index.html
        +++ b/Extensions/Network-Map/index.html
        @@ -1,2 +1,2 @@
        - Network Map - LibreNMS Docs       

        Network Map

        LibreNMS has the ability to show you a dynamic network map based on data collected from devices. These maps are accessed through the following menu options:

        • Overview -> Maps -> Network
        • Overview -> Maps -> Device Group Maps
        • The Neighbours -> Map tab when viewing a single device (the Neighbours tab will only show if a device has xDP neighbours)

        These network maps can be based on:

        • xDP Discovery
        • MAC addresses (ARP entries matching interface IP and MAC)

        By default, both are are included but you can enable / disable either one using the following config option:

        lnms config:set 'network_map_items' "('mac','xdp')"
        + Network Map - LibreNMS Docs       

        Network Map

        LibreNMS has the ability to show you a dynamic network map based on data collected from devices. These maps are accessed through the following menu options:

        • Overview -> Maps -> Network
        • Overview -> Maps -> Device Group Maps
        • The Neighbours -> Map tab when viewing a single device (the Neighbours tab will only show if a device has xDP neighbours)

        These network maps can be based on:

        • xDP Discovery
        • MAC addresses (ARP entries matching interface IP and MAC)

        By default, both are are included but you can enable / disable either one using the following config option:

        lnms config:set 'network_map_items' "('mac','xdp')"
         

        Either remove mac or xdp depending on which you want. XDP is based on FDP, CDP and LLDP support based on the device type.

        It is worth noting that the global map could lead to a large network map that is slow to render and interact with. The network map on the device neighbour page, or building device groups and using the device group maps will be more usable on large networks.

        Settings

        The map display can be configured by altering the VisJS-Config.md

        \ No newline at end of file diff --git a/Extensions/OAuth-SAML/index.html b/Extensions/OAuth-SAML/index.html index 5e289f45..a3e29af9 100644 --- a/Extensions/OAuth-SAML/index.html +++ b/Extensions/OAuth-SAML/index.html @@ -1,4 +1,4 @@ - Oauth/SAML support - LibreNMS Docs

        OAuth and SAML Support

        Introduction

        LibreNMS has support for Laravel Socialite to try and simplify the use of OAuth 1 or 2 providers such as using GitHub, Microsoft, Twitter + many more and SAML.

        Socialite Providers supports more than 100+ 3rd parties so you will most likely find support for the SAML or OAuth provider you need without too much trouble.

        Please do note however, these providers are not maintained by LibreNMS so we cannot add support for new ones and we can only provide you basic help with general configuration. See the Socialite Providers website for more information on adding a new OAuth provider.

        Below we will guide you on how to install SAML or some of these OAth providers, you should be able to use these as a guide on how to install any others you may need but please, please, ensure you read the Socialite Providers documentation carefully.

        GitHub Provider Microsoft Provider Okta Provider SAML2

        Requirements

        LibreNMS version 22.3.0 or later.

        Please ensure you set APP_URL within your .env file so that callback URLs work correctly with the identify provider.

        Note

        Once you have configured your OAuth or SAML2 provider, please ensure you check the Post configuration settings section at the end.

        GitHub and Microsoft Examples

        Install plugin

        Note

        First we need to install the plugin itself. The plugin name can be slightly different so be sure to check the Socialite Providers documentation and look for this line, composer require socialiteproviders/github which will give you the name you need for the command, i.e: socialiteproviders/github.

        lnms plugin:add socialiteproviders/github

        lnms plugin:add socialiteproviders/microsoft

        lnms plugin:add socialiteproviders/okta

        Find the provider name

        Next we need to find the provider name and writing it down

        Note

        It's almost always the name of the provider in lowercase but can be different so check the Socialite Providers documentation and look for this line, github => [ which will give you the name you need for the above command: github.

        For GitHub we can find the line:

        'github' => [
        + Oauth/SAML support - LibreNMS Docs       

        OAuth and SAML Support

        Introduction

        LibreNMS has support for Laravel Socialite to try and simplify the use of OAuth 1 or 2 providers such as using GitHub, Microsoft, Twitter + many more and SAML.

        Socialite Providers supports more than 100+ 3rd parties so you will most likely find support for the SAML or OAuth provider you need without too much trouble.

        Please do note however, these providers are not maintained by LibreNMS so we cannot add support for new ones and we can only provide you basic help with general configuration. See the Socialite Providers website for more information on adding a new OAuth provider.

        Below we will guide you on how to install SAML or some of these OAth providers, you should be able to use these as a guide on how to install any others you may need but please, please, ensure you read the Socialite Providers documentation carefully.

        GitHub Provider Microsoft Provider Okta Provider SAML2

        Requirements

        LibreNMS version 22.3.0 or later.

        Please ensure you set APP_URL within your .env file so that callback URLs work correctly with the identify provider.

        Note

        Once you have configured your OAuth or SAML2 provider, please ensure you check the Post configuration settings section at the end.

        GitHub and Microsoft Examples

        Install plugin

        Note

        First we need to install the plugin itself. The plugin name can be slightly different so be sure to check the Socialite Providers documentation and look for this line, composer require socialiteproviders/github which will give you the name you need for the command, i.e: socialiteproviders/github.

        lnms plugin:add socialiteproviders/github

        lnms plugin:add socialiteproviders/microsoft

        lnms plugin:add socialiteproviders/okta

        Find the provider name

        Next we need to find the provider name and writing it down

        Note

        It's almost always the name of the provider in lowercase but can be different so check the Socialite Providers documentation and look for this line, github => [ which will give you the name you need for the above command: github.

        For GitHub we can find the line:

        'github' => [
           'client_id' => env('GITHUB_CLIENT_ID'),
           'client_secret' => env('GITHUB_CLIENT_SECRET'),
           'redirect' => env('GITHUB_REDIRECT_URI')
        diff --git a/Extensions/Oxidized/index.html b/Extensions/Oxidized/index.html
        index 0ebb2c0b..04414f9b 100644
        --- a/Extensions/Oxidized/index.html
        +++ b/Extensions/Oxidized/index.html
        @@ -1,4 +1,4 @@
        - Oxidized - LibreNMS Docs       

        Oxidized

        Integrating LibreNMS with Oxidized brings the following benefits:

        • Config viewing: Current, History, and Diffs all under the Configs tab of each device
        • Automatic addition of devices to Oxidized: Including filtering and grouping to ease credential management
        • Configuration searching (Requires oxidized-web 0.8.0 or newer)

        First you will need to install Oxidized following their documentation.

        Then you can procede to the LibreNMS Web UI and go to Oxidized Settings in the External Settings section of Global Settings. Enable it and enter the url to your oxidized instance.

        To have devices automatically added, you will need to configure oxidized to pull them from LibreNMS Feeding Oxidized Note: this means devices will be controlled by the LibreNMS API, and not router.db, passwords will still need to be in the oxidized config file.

        LibreNMS will automatically map the OS to the Oxidized model name if they don't match. this means you shouldn't need to use the model_map config option within Oxidized.

        Detailed integration information

        This is a straight forward use of Oxidized, it relies on you having a working Oxidized setup which is already taking config snapshots for your devices. When you have that, you only need the following config to enable the display of device configs within the device page itself:

        external/oxidized

        lnms config:set oxidized.enabled true
        + Oxidized - LibreNMS Docs       

        Oxidized

        Integrating LibreNMS with Oxidized brings the following benefits:

        • Config viewing: Current, History, and Diffs all under the Configs tab of each device
        • Automatic addition of devices to Oxidized: Including filtering and grouping to ease credential management
        • Configuration searching (Requires oxidized-web 0.8.0 or newer)

        First you will need to install Oxidized following their documentation.

        Then you can procede to the LibreNMS Web UI and go to Oxidized Settings in the External Settings section of Global Settings. Enable it and enter the url to your oxidized instance.

        To have devices automatically added, you will need to configure oxidized to pull them from LibreNMS Feeding Oxidized Note: this means devices will be controlled by the LibreNMS API, and not router.db, passwords will still need to be in the oxidized config file.

        LibreNMS will automatically map the OS to the Oxidized model name if they don't match. this means you shouldn't need to use the model_map config option within Oxidized.

        Detailed integration information

        This is a straight forward use of Oxidized, it relies on you having a working Oxidized setup which is already taking config snapshots for your devices. When you have that, you only need the following config to enable the display of device configs within the device page itself:

        external/oxidized

        lnms config:set oxidized.enabled true
         lnms config:set oxidized.url http://127.0.0.1:8888
         

        LibreNMS supports config versioning if Oxidized does. This is known to work with the git output module.

        external/oxidized

        lnms config:set oxidized.features.versioning true
         

        Oxidized supports various ways to utilise credentials to login to devices, you can specify global username/password within Oxidized, Group level username/password or per device. LibreNMS currently supports sending groups back to Oxidized so that you can then define group credentials within Oxidized. To enable this support please switch on 'Enable the return of groups to Oxidized':

        external/oxidized

        lnms config:set oxidized.group_support true
        diff --git a/Extensions/PeeringDB/index.html b/Extensions/PeeringDB/index.html
        index b702640f..80a615c9 100644
        --- a/Extensions/PeeringDB/index.html
        +++ b/Extensions/PeeringDB/index.html
        @@ -1,2 +1,2 @@
        - PeeringDB - LibreNMS Docs       

        PeeringDB Support

        LibreNMS has integration with PeeringDB to match up your BGP sessions with the peering exchanges you are connected to.

        To enable the integration please do so within the WebUI

        external/peeringdb

        lnms config:set peeringdb.enabled true
        + PeeringDB - LibreNMS Docs       

        PeeringDB Support

        LibreNMS has integration with PeeringDB to match up your BGP sessions with the peering exchanges you are connected to.

        To enable the integration please do so within the WebUI

        external/peeringdb

        lnms config:set peeringdb.enabled true
         

        Data will be collated the next time daily.sh is run or you can manually force this by running php daily.php -f peeringdb, the initial collection is delayed for a random amount of time to avoid overloading the PeeringDB API.

        Once enabled you will have an additional menu item under Routing -> PeeringDB

        \ No newline at end of file diff --git a/Extensions/Plugin-System/index.html b/Extensions/Plugin-System/index.html index 67c396b9..c75dc7da 100644 --- a/Extensions/Plugin-System/index.html +++ b/Extensions/Plugin-System/index.html @@ -1,4 +1,4 @@ - Plugin System - LibreNMS Docs

        Developing for the Plugin System

        With plugins you can extend LibreNMS with special functions that are specific to your setup or are not relevant or interesting for all community members.

        You are able to intervene in defined places in the behavior of the website, without it coming to problems with future updates.

        This documentation will give you a basis for writing a plugin for LibreNMS. An example plugin is included in the LibreNMS distribution.

        Version 2 Plugin System structure

        Plugins in version 2 need to be installed into app/Plugins

        Note: Plugins are disabled when the have an error, to show errors instead set plugins.show_errors

        The structure of a plugin is follows:

        app/Plugins
        + Plugin System - LibreNMS Docs       

        Developing for the Plugin System

        With plugins you can extend LibreNMS with special functions that are specific to your setup or are not relevant or interesting for all community members.

        You are able to intervene in defined places in the behavior of the website, without it coming to problems with future updates.

        This documentation will give you a basis for writing a plugin for LibreNMS. An example plugin is included in the LibreNMS distribution.

        Version 2 Plugin System structure

        Plugins in version 2 need to be installed into app/Plugins

        Note: Plugins are disabled when the have an error, to show errors instead set plugins.show_errors

        The structure of a plugin is follows:

        app/Plugins
                     /PluginName
                                /DeviceOverview.php
                                /Menu.php
        diff --git a/Extensions/Proxmox/index.html b/Extensions/Proxmox/index.html
        index 8f8782a6..fb928371 100644
        --- a/Extensions/Proxmox/index.html
        +++ b/Extensions/Proxmox/index.html
        @@ -1,4 +1,4 @@
        - Proxmox - LibreNMS Docs       

        Proxmox graphing

        It is possible to create graphs of the Proxmox VMs that run on your monitored machines. Currently, only traffic graphs are created. One for each interface on each VM. Possibly, IO graphs will be added later on.

        The ultimate goal is to be able to create traffic bills for VMs, no matter on which physical machine that VM runs.

        Enabling Proxmox graphs

        To enable Proxmox graphs, do the following:

        In config.php, enable Proxmox:

        $config['enable_proxmox'] = 1;
        + Proxmox - LibreNMS Docs       

        Proxmox graphing

        It is possible to create graphs of the Proxmox VMs that run on your monitored machines. Currently, only traffic graphs are created. One for each interface on each VM. Possibly, IO graphs will be added later on.

        The ultimate goal is to be able to create traffic bills for VMs, no matter on which physical machine that VM runs.

        Enabling Proxmox graphs

        To enable Proxmox graphs, do the following:

        In config.php, enable Proxmox:

        $config['enable_proxmox'] = 1;
         

        Then, install git and librenms-agent on the machines running Proxmox and enable the Proxmox-script using:

        cp /opt/librenms-agent/agent-local/proxmox /usr/lib/check_mk_agent/local/proxmox
         chmod +x /usr/lib/check_mk_agent/local/proxmox
         

        Then, enable and start the check_mk service using systemd

        cp /opt/librenms-agent/check_mk@.service /opt/librenms-agent/check_mk.socket /etc/systemd/system
        diff --git a/Extensions/RRDCached/index.html b/Extensions/RRDCached/index.html
        index 1802caa9..4a3fdef3 100644
        --- a/Extensions/RRDCached/index.html
        +++ b/Extensions/RRDCached/index.html
        @@ -1,4 +1,4 @@
        - RRDCached - LibreNMS Docs       

        Setting up RRDCached

        This document will explain how to set up RRDCached for LibreNMS.

        Since version 1.5, rrdtool / rrdcached now supports creating rrd files over rrdcached. If you have rrdcached 1.5.5 or above, you can also tune over rrdcached. To enable this set the following config:

        poller/rrdtool

        lnms config:set rrdtool_version '1.5.5'
        + RRDCached - LibreNMS Docs       

        Setting up RRDCached

        This document will explain how to set up RRDCached for LibreNMS.

        Since version 1.5, rrdtool / rrdcached now supports creating rrd files over rrdcached. If you have rrdcached 1.5.5 or above, you can also tune over rrdcached. To enable this set the following config:

        poller/rrdtool

        lnms config:set rrdtool_version '1.5.5'
         

        This setting has to be the exact version of rrdtool you are running.

        NOTE: This feature requires your client version of rrdtool to be 1.5.5 or newer, in addition to your rrdcached version.

        Distributed Poller Support Matrix

        Shared FS: Is a shared filesystem required?

        Features: Supported features in the version indicated.

        G = Graphs.
         C = Create RRD files.
         U = Update RRD files.
        diff --git a/Extensions/RRDTune/index.html b/Extensions/RRDTune/index.html
        index 22c02b8f..4d11a1a9 100644
        --- a/Extensions/RRDTune/index.html
        +++ b/Extensions/RRDTune/index.html
        @@ -1 +1 @@
        - RRDTune - LibreNMS Docs       

        RRDTune

        When we create rrd files for ports, we currently do so with a max value of 12500000000 (100G). Because of this if a device sends us bad data back then it can appear as though a 100M port is doing 40G+ which is impossible. To counter this you can enable the rrdtool tune option which will fix the max value to the interfaces physical speed (minimum of 10M).

        To enable this you can do so in three ways!

        • Globally under Global Settings -> Poller -> Datastore: RRDTool
        • For the actual device, Edit Device -> Misc
        • For each port, Edit Device -> Port Settings

        Now when a port interface speed changes (this can happen because of a physical change or just because the device has misreported) the max value is set. If you don't want to wait until a port speed changes then you can run the included script:

        ./scripts/tune_port.php -h <hostname> -p <ifName>

        Wildcards are supported using *, i.e:

        ./scripts/tune_port.php -h local* -p eth*

        This script will then perform the rrdtool tune on each port found using the provided ifSpeed for that port.

        Run ./scripts/tune_port.php to see help page.

        \ No newline at end of file + RRDTune - LibreNMS Docs

        RRDTune

        When we create rrd files for ports, we currently do so with a max value of 12500000000 (100G). Because of this if a device sends us bad data back then it can appear as though a 100M port is doing 40G+ which is impossible. To counter this you can enable the rrdtool tune option which will fix the max value to the interfaces physical speed (minimum of 10M).

        To enable this you can do so in three ways!

        • Globally under Global Settings -> Poller -> Datastore: RRDTool
        • For the actual device, Edit Device -> Misc
        • For each port, Edit Device -> Port Settings

        Now when a port interface speed changes (this can happen because of a physical change or just because the device has misreported) the max value is set. If you don't want to wait until a port speed changes then you can run the included script:

        ./scripts/tune_port.php -h <hostname> -p <ifName>

        Wildcards are supported using *, i.e:

        ./scripts/tune_port.php -h local* -p eth*

        This script will then perform the rrdtool tune on each port found using the provided ifSpeed for that port.

        Run ./scripts/tune_port.php to see help page.

        \ No newline at end of file diff --git a/Extensions/Rancid/index.html b/Extensions/Rancid/index.html index 4841f436..73c1fc7c 100644 --- a/Extensions/Rancid/index.html +++ b/Extensions/Rancid/index.html @@ -1,4 +1,4 @@ - Rancid - LibreNMS Docs

        Rancid

        Librenms can generate a list of hosts that can be monitored by RANCID. We assume you have currently a running Rancid, and you just need to create and update the file 'router.db'

        Included Rancid script

        To generate the config file (maybe even add a cron to schedule this). We've assumed a few locations for Rancid, the config file you want to call it and where LibreNMS is:

        cd /opt/librenms/scripts/
        + Rancid - LibreNMS Docs       

        Rancid

        Librenms can generate a list of hosts that can be monitored by RANCID. We assume you have currently a running Rancid, and you just need to create and update the file 'router.db'

        Included Rancid script

        To generate the config file (maybe even add a cron to schedule this). We've assumed a few locations for Rancid, the config file you want to call it and where LibreNMS is:

        cd /opt/librenms/scripts/
         php ./gen_rancid.php > /the/path/where/is/rancid/core/router.db
         

        Sample cron:

        15   0    * * * root cd /opt/librenms/scripts && php ./gen_rancid.php > /the/path/where/is/rancid/core/router.db
         

        Now configure LibreNMS (make sure you point dir to your rancid data directory):

        $config['rancid_configs']['core'] = '/the/path/where/is/rancid/core';
        diff --git a/Extensions/SNMP-Proxy/index.html b/Extensions/SNMP-Proxy/index.html
        index fafdd7af..215835d9 100644
        --- a/Extensions/SNMP-Proxy/index.html
        +++ b/Extensions/SNMP-Proxy/index.html
        @@ -1,4 +1,4 @@
        - SNMP Proxy - LibreNMS Docs       

        SNMP Proxy

        If you have machines that you want to monitor but are not reachable directly, you can use SNMPD Proxy. This will use the reachable SNMPD to proxy requests to the unreachable SNMPD.

        Example configuration

        We want to poll 'unreachable.example.com' via

        'hereweare.example.com'. Use the following config:

        On 'hereweare.example.com':

                view all included .1
        + SNMP Proxy - LibreNMS Docs       

        SNMP Proxy

        If you have machines that you want to monitor but are not reachable directly, you can use SNMPD Proxy. This will use the reachable SNMPD to proxy requests to the unreachable SNMPD.

        Example configuration

        We want to poll 'unreachable.example.com' via

        'hereweare.example.com'. Use the following config:

        On 'hereweare.example.com':

                view all included .1
                 com2sec -Cn ctx_unreachable readonly <poller-ip> unreachable
                 access MyROGroup ctx_unreachable any noauth prefix all none none
                 proxy -Cn ctx_unreachable -v 2c -c private unreachable.example.com  .1.3
        diff --git a/Extensions/SNMP-Trap-Handler/index.html b/Extensions/SNMP-Trap-Handler/index.html
        index 2f573de3..c3ebf827 100644
        --- a/Extensions/SNMP-Trap-Handler/index.html
        +++ b/Extensions/SNMP-Trap-Handler/index.html
        @@ -1,4 +1,4 @@
        - SNMP Trap Handler - LibreNMS Docs       

        SNMP trap handling

        Currently, LibreNMS supports a lot of trap handlers. You can check them on GitHub here. To add more see Adding new SNMP Trap handlers. Traps are handled via snmptrapd.

        snmptrapd is an SNMP application that receives and logs SNMP TRAP and INFORM messages.

        The default is to listen on UDP port 162 on all IPv4 interfaces. Since 162 is a privileged port, snmptrapd must typically be run as root.

        Configure snmptrapd

        Install snmptrapd via your package manager.

        For example (Debian based systems):

        sudo apt install snmptrapd -y
        + SNMP Trap Handler - LibreNMS Docs       

        SNMP trap handling

        Currently, LibreNMS supports a lot of trap handlers. You can check them on GitHub here. To add more see Adding new SNMP Trap handlers. Traps are handled via snmptrapd.

        snmptrapd is an SNMP application that receives and logs SNMP TRAP and INFORM messages.

        The default is to listen on UDP port 162 on all IPv4 interfaces. Since 162 is a privileged port, snmptrapd must typically be run as root.

        Configure snmptrapd

        Install snmptrapd via your package manager.

        For example (Debian based systems):

        sudo apt install snmptrapd -y
         

        In /etc/snmp/snmptrapd.conf, add :

        disableAuthorization yes
         authCommunity log,execute,net COMMUNITYSTRING
         traphandle default /opt/librenms/snmptrap.php
        diff --git a/Extensions/Services/index.html b/Extensions/Services/index.html
        index 2535f608..d69c2025 100644
        --- a/Extensions/Services/index.html
        +++ b/Extensions/Services/index.html
        @@ -1,4 +1,4 @@
        - Nagios Plugins - LibreNMS Docs       

        Nagios Plugins - Services

        Services within LibreNMS provides the ability to leverage Nagios plugins to perform additional monitoring outside of SNMP. Services can also be used in conjunction with your SNMP monitoring for larger monitoring functionality.

        Setting up Services

        Services must be tied to a device to function properly. A good generic option is to use localhost, but it is suggested to attach the check to the device you are monitoring.

        Nagios plugins source

        Plugins come from two main sources:

        Note: Plugins will only load if they are prefixed with check_. The check_ prefix is stripped out when displaying in the "Add Service" GUI "Type" dropdown list.

        Service Templates

        Service Templates within LibreNMS provides the same ability as Nagios does with Host Groups. Known as Device Groups in LibreNMS. They are applied devices that belong to the specified Device Group.

        Use the Apply buttons to manually create or update Services for the Service Template. Use the Remove buttons to manually remove Services for the Service Template.

        After you Edit a Service Template, and then use Apply, all relevant changes are pushed to existing Services previously created.

        You can also enable Service Templates Auto Discovery to have Services added / removed / updated on regular discover intervals.

        When a Device is a member of multiple Device Groups, templates from all of those Device Groups are applied.

        If a Device is added or removed from a Device Group, when the Apply button is used or Auto Discovery runs Services will be added / removed as appropriate.

        Service Templates are tied into Device Groups, you need at least one Device Group to be able to add Service Templates - You can define a dummy one. The Device Group does not need members to add Service Templates.

        Service Auto Discovery

        To automatically create services for devices with available checks.

        You need to enable the discover services within config.php with the following:

        $config['discover_services']           = true;
        + Nagios Plugins - LibreNMS Docs       

        Nagios Plugins - Services

        Services within LibreNMS provides the ability to leverage Nagios plugins to perform additional monitoring outside of SNMP. Services can also be used in conjunction with your SNMP monitoring for larger monitoring functionality.

        Setting up Services

        Services must be tied to a device to function properly. A good generic option is to use localhost, but it is suggested to attach the check to the device you are monitoring.

        Nagios plugins source

        Plugins come from two main sources:

        Note: Plugins will only load if they are prefixed with check_. The check_ prefix is stripped out when displaying in the "Add Service" GUI "Type" dropdown list.

        Service Templates

        Service Templates within LibreNMS provides the same ability as Nagios does with Host Groups. Known as Device Groups in LibreNMS. They are applied devices that belong to the specified Device Group.

        Use the Apply buttons to manually create or update Services for the Service Template. Use the Remove buttons to manually remove Services for the Service Template.

        After you Edit a Service Template, and then use Apply, all relevant changes are pushed to existing Services previously created.

        You can also enable Service Templates Auto Discovery to have Services added / removed / updated on regular discover intervals.

        When a Device is a member of multiple Device Groups, templates from all of those Device Groups are applied.

        If a Device is added or removed from a Device Group, when the Apply button is used or Auto Discovery runs Services will be added / removed as appropriate.

        Service Templates are tied into Device Groups, you need at least one Device Group to be able to add Service Templates - You can define a dummy one. The Device Group does not need members to add Service Templates.

        Service Auto Discovery

        To automatically create services for devices with available checks.

        You need to enable the discover services within config.php with the following:

        $config['discover_services']           = true;
         

        Service Templates Auto Discovery

        To automatically create services for devices with configured Service Templates.

        You need to enable the discover services within config.php with the following:

        $config['discover_services_templates']           = true;
         

        Setup

        Service checks are now distributable if you run a distributed setup. To leverage this, use the dispatch service. Alternatively, you could also replace check-services.php with services-wrapper.py in cron instead to run across all polling nodes.

        If you need to debug the output of services-wrapper.py then you can add -d to the end of the command - it is NOT recommended to do this in cron.

        Firstly, install Nagios plugins.

        Debian / Ubuntu: sudo apt install monitoring-plugins Centos: yum install nagios-plugins-all

        Note: The plugins are bundled with the pre-build VM and Docker images.

        Next, you need to enable the services within config.php with the following:

        $config['show_services']           = 1;
         

        This will enable a new service menu within your navbar.

        Debian/Ubuntu:

        $config['nagios_plugins']   = "/usr/lib/nagios/plugins";
        diff --git a/Extensions/Smokeping/index.html b/Extensions/Smokeping/index.html
        index c4109f54..6339f9da 100644
        --- a/Extensions/Smokeping/index.html
        +++ b/Extensions/Smokeping/index.html
        @@ -1,4 +1,4 @@
        - Smokeping - LibreNMS Docs       

        Smokeping integration

        SmokePing is a tool which lets us keep track of network latency, and visualise this through RRD graphs.

        LibreNMS has support for both new and pre-existing SmokePing installations.

        For new installations, we can use the lnms cli to generate a Smokeping configuration file.

        Pre-Existing Smokeping Installation

        If you have an existing smokeping server, follow the instructions, you only need to look at Configure LibreNMS - All Operating Systems.

        New Installation

        All installation steps assume a clean configuration - if you have an existing smokeping setup, you'll need to adapt these steps somewhat.

        Install and integrate Smokeping Backend - RHEL, CentOS and alike

        Smokeping is available via EPEL, which if you're running LibreNMS, you probably already have. If you want to do something like run Smokeping on a seperate host and ship data via RRCached though, here's the install command:

        sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
        + Smokeping - LibreNMS Docs       

        Smokeping integration

        SmokePing is a tool which lets us keep track of network latency, and visualise this through RRD graphs.

        LibreNMS has support for both new and pre-existing SmokePing installations.

        For new installations, we can use the lnms cli to generate a Smokeping configuration file.

        Pre-Existing Smokeping Installation

        If you have an existing smokeping server, follow the instructions, you only need to look at Configure LibreNMS - All Operating Systems.

        New Installation

        All installation steps assume a clean configuration - if you have an existing smokeping setup, you'll need to adapt these steps somewhat.

        Install and integrate Smokeping Backend - RHEL, CentOS and alike

        Smokeping is available via EPEL, which if you're running LibreNMS, you probably already have. If you want to do something like run Smokeping on a seperate host and ship data via RRCached though, here's the install command:

        sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
         sudo yum install smokeping
         

        Once installed, you should need a cron script installed to make sure that the configuration file is updated. You can find an example in misc/librenms-smokeping-rhel.example. Put this into /etc/cron.d/hourly, and mark it executable:

        sudo cp /opt/librenms/misc/smokeping-rhel.example /etc/cron.hourly/librenms-smokeping
         sudo chmod +x /etc/cron.hourly/librenms-smokeping
        diff --git a/Extensions/Sub-Directory/index.html b/Extensions/Sub-Directory/index.html
        index c96412a9..44c39df2 100644
        --- a/Extensions/Sub-Directory/index.html
        +++ b/Extensions/Sub-Directory/index.html
        @@ -1,4 +1,4 @@
        - Sub-directory Support - LibreNMS Docs      

        Sub-directory Support

        To run LibreNMS under a subdirectory on your Apache server, the directives for the LibreNMS directory are placed in the base server configuration, or in a virtual host container of your choosing. If using a virtual host, place the directives in the file where the virtual host is configured. If using the base server on RHEL distributions (CentOS, Scientific Linux, etc.) the directives can be placed in /etc/httpd/conf.d/librenms.conf. For Debian distributions (Ubuntu, etc.) place the directives in /etc/apache2/sites-available/default.

        #These directives can be inside a virtual host or in the base server configuration
        + Sub-directory Support - LibreNMS Docs      

        Sub-directory Support

        To run LibreNMS under a subdirectory on your Apache server, the directives for the LibreNMS directory are placed in the base server configuration, or in a virtual host container of your choosing. If using a virtual host, place the directives in the file where the virtual host is configured. If using the base server on RHEL distributions (CentOS, Scientific Linux, etc.) the directives can be placed in /etc/httpd/conf.d/librenms.conf. For Debian distributions (Ubuntu, etc.) place the directives in /etc/apache2/sites-available/default.

        #These directives can be inside a virtual host or in the base server configuration
         AllowEncodedSlashes On
         Alias /librenms /opt/librenms/html
         
        diff --git a/Extensions/Supermicro/index.html b/Extensions/Supermicro/index.html
        index 5d9c5df0..f40d7902 100644
        --- a/Extensions/Supermicro/index.html
        +++ b/Extensions/Supermicro/index.html
        @@ -1,3 +1,3 @@
        - Supermicro - LibreNMS Docs       

        Supermicro

        For some Supermicro information to show up in LibreNMS, you will need to install an agent.

        Supermicro SuperDoctor

        Install Supermicro SuperDoctor onto the device you want to monitor.

        Then add the following to /etc/snmp/snmpd.conf:

        pass .1.3.6.1.4.1.10876 /usr/bin/sudo /opt/Supermicro/SuperDoctor5/libs/native/snmpagent
        + Supermicro - LibreNMS Docs       

        Supermicro

        For some Supermicro information to show up in LibreNMS, you will need to install an agent.

        Supermicro SuperDoctor

        Install Supermicro SuperDoctor onto the device you want to monitor.

        Then add the following to /etc/snmp/snmpd.conf:

        pass .1.3.6.1.4.1.10876 /usr/bin/sudo /opt/Supermicro/SuperDoctor5/libs/native/snmpagent
         

        Restart net-snmp:

        service snmpd restart
         
        \ No newline at end of file diff --git a/Extensions/Syslog/index.html b/Extensions/Syslog/index.html index a9684b2c..fbdb897f 100644 --- a/Extensions/Syslog/index.html +++ b/Extensions/Syslog/index.html @@ -1,4 +1,4 @@ - Syslog - LibreNMS Docs

        Syslog support

        Syslog integration variants

        This section explain different ways to recieve and process syslog with LibreNMS. Except of graylog, all Syslogs variants store their logs in the LibreNMS database. You need to enable the Syslog extension in config.php:

        $config['enable_syslog'] = 1;
        + Syslog - LibreNMS Docs       

        Syslog support

        Syslog integration variants

        This section explain different ways to recieve and process syslog with LibreNMS. Except of graylog, all Syslogs variants store their logs in the LibreNMS database. You need to enable the Syslog extension in config.php:

        $config['enable_syslog'] = 1;
         
        A Syslog integration gives you a centralized view of information within the LibreNMS (device view, traps, event). Further more you can trigger alerts based on syslog messages (see rule collections).

        Traditional Syslog server

        syslog-ng

        apt-get install syslog-ng-core
         
        yum install syslog-ng
         

        Once syslog-ng is installed, create the config file (/etc/syslog-ng/conf.d/librenms.conf) and paste the following:

        source s_net {
        diff --git a/Extensions/Two-Factor-Auth/index.html b/Extensions/Two-Factor-Auth/index.html
        index 72299ba0..af9c11e0 100644
        --- a/Extensions/Two-Factor-Auth/index.html
        +++ b/Extensions/Two-Factor-Auth/index.html
        @@ -1 +1 @@
        - Two-Factor Auth - LibreNMS Docs       

        Two-Factor Authentication

        Over the last couple of years, the primary attack vector for internet accounts has been static passwords. Therefore static passwords are no longer sufficient to protect unauthorized access to accounts. Two Factor Authentication adds a variable part in authentication procedures. A user is now required to supply a changing 6-digit passcode in addition to their password to obtain access to the account.

        LibreNMS has a RFC4226 conformant implementation of both Time and Counter based One-Time-Passwords. It also allows the administrator to configure a throttle time to enforce after 3 failures exceeded. Unlike RFC4226 suggestions, this throttle time will not stack on the amount of failures.

        Types

        In general, these two types do not differ in algorithmic terms. The types only differ in the variable being used to derive the passcodes from. The underlying HMAC-SHA1 remains the same for both types, security advantages or disadvantages of each are discussed further down.

        Timebased One-Time-Password (TOTP)

        Like the name suggests, this type uses the current Time or a subset of it to generate the passcodes. These passcodes solely rely on the secrecy of their Secretkey in order to provide passcodes. An attacker only needs to guess that Secretkey and the other variable part is any given time, presumably the time upon login. RFC4226 suggests a resynchronization attempt in case the passcode mismatches, providing the attacker a range of up to +/- 3 Minutes to create passcodes.

        Counterbased One-Time-Password (HOTP)

        This type uses an internal counter that needs to be in sync with the server's counter to successfully authenticate the passcodes. The main advantage over timebased OTP is the attacker doesn't only need to know the Secretkey but also the server's Counter in order to create valid passcodes. RFC4226 suggests a resynchronization attempt in case the passcode mismatches, providing the attacker a range of up to +4 increments from the actual counter to create passcodes.

        Configuration

        WebUI

        Enable 'Two-Factor' Via Global Settings in the Web UI under Authentication -> General Authentication Settings.

        Optionally enter a throttle timer in seconds. This will unlock an account after this time once it has failed 3 attempt to authenticate. Set to 0 (default) to disable this feature, meaning accounts will remain locked after 3 attempts and will need an administrator to clear.

        CLI

        Enable Two-Factor:

        ./lnms config:set twofactor true

        Set throttle-time (in seconds):

        ./lnms config:set twofactor_lock 300

        User Administation

        If Two-Factor is enabled, the Settings -> Manage Users grid will show a '2FA' column containing a green tick for users with active 2FA.

        There is no functionality to mandate 2FA for users.

        If a user has failed 3 attempts, their account can be unlocked or 2FA disabled by editing the user from the Manage Users table.

        If a throttle timer is set, it will unlock accounts after this time. If set to the default of 0, accounts will need to be manually unlocked by an administrator after 3 failed attempts.

        Locked accounts will report to the user stating to wait for the throttle time period, or to contact the administrator if no timer set.

        End-User Enrolment

        These steps imply that Two-Factor has been enabled system wide as above under Configuration.

        2FA is enabled by each user once they are logged in normally:

        • Go to 'My Settings' (/preferences/)
        • Choose TwoFactor type
        • Click on 'Generate TwoFactor Secret Key'
        • If your browser didn't reload, reload manually
        • Scan provided QR or click on 'Manual' to see the Key

        Google Authenticator

        Installation guides for Google Authenticator can be found here.

        Usage:

        • Create a key as described above
        • Scan provided QR or click on 'Manual' and enter the Secret
        • On next login, enter the passcode that the App provides

        LastPass Authenticator

        LastPass Authenticator is confirmed to work with Timebased One-Time Passwords (TOTP).

        Installation guide for LastPass Authenticator can be found here.

        Usage:

        • Create a Timerbased key as described above
        • Click Add (+) and scan provided QR or click on 'NO QR CODE?' and enter naming details and the Secret
        • On next login, enter the passcode that the App provides
        \ No newline at end of file + Two-Factor Auth - LibreNMS Docs

        Two-Factor Authentication

        Over the last couple of years, the primary attack vector for internet accounts has been static passwords. Therefore static passwords are no longer sufficient to protect unauthorized access to accounts. Two Factor Authentication adds a variable part in authentication procedures. A user is now required to supply a changing 6-digit passcode in addition to their password to obtain access to the account.

        LibreNMS has a RFC4226 conformant implementation of both Time and Counter based One-Time-Passwords. It also allows the administrator to configure a throttle time to enforce after 3 failures exceeded. Unlike RFC4226 suggestions, this throttle time will not stack on the amount of failures.

        Types

        In general, these two types do not differ in algorithmic terms. The types only differ in the variable being used to derive the passcodes from. The underlying HMAC-SHA1 remains the same for both types, security advantages or disadvantages of each are discussed further down.

        Timebased One-Time-Password (TOTP)

        Like the name suggests, this type uses the current Time or a subset of it to generate the passcodes. These passcodes solely rely on the secrecy of their Secretkey in order to provide passcodes. An attacker only needs to guess that Secretkey and the other variable part is any given time, presumably the time upon login. RFC4226 suggests a resynchronization attempt in case the passcode mismatches, providing the attacker a range of up to +/- 3 Minutes to create passcodes.

        Counterbased One-Time-Password (HOTP)

        This type uses an internal counter that needs to be in sync with the server's counter to successfully authenticate the passcodes. The main advantage over timebased OTP is the attacker doesn't only need to know the Secretkey but also the server's Counter in order to create valid passcodes. RFC4226 suggests a resynchronization attempt in case the passcode mismatches, providing the attacker a range of up to +4 increments from the actual counter to create passcodes.

        Configuration

        WebUI

        Enable 'Two-Factor' Via Global Settings in the Web UI under Authentication -> General Authentication Settings.

        Optionally enter a throttle timer in seconds. This will unlock an account after this time once it has failed 3 attempt to authenticate. Set to 0 (default) to disable this feature, meaning accounts will remain locked after 3 attempts and will need an administrator to clear.

        CLI

        Enable Two-Factor:

        ./lnms config:set twofactor true

        Set throttle-time (in seconds):

        ./lnms config:set twofactor_lock 300

        User Administation

        If Two-Factor is enabled, the Settings -> Manage Users grid will show a '2FA' column containing a green tick for users with active 2FA.

        There is no functionality to mandate 2FA for users.

        If a user has failed 3 attempts, their account can be unlocked or 2FA disabled by editing the user from the Manage Users table.

        If a throttle timer is set, it will unlock accounts after this time. If set to the default of 0, accounts will need to be manually unlocked by an administrator after 3 failed attempts.

        Locked accounts will report to the user stating to wait for the throttle time period, or to contact the administrator if no timer set.

        End-User Enrolment

        These steps imply that Two-Factor has been enabled system wide as above under Configuration.

        2FA is enabled by each user once they are logged in normally:

        • Go to 'My Settings' (/preferences/)
        • Choose TwoFactor type
        • Click on 'Generate TwoFactor Secret Key'
        • If your browser didn't reload, reload manually
        • Scan provided QR or click on 'Manual' to see the Key

        Google Authenticator

        Installation guides for Google Authenticator can be found here.

        Usage:

        • Create a key as described above
        • Scan provided QR or click on 'Manual' and enter the Secret
        • On next login, enter the passcode that the App provides

        LastPass Authenticator

        LastPass Authenticator is confirmed to work with Timebased One-Time Passwords (TOTP).

        Installation guide for LastPass Authenticator can be found here.

        Usage:

        • Create a Timerbased key as described above
        • Click Add (+) and scan provided QR or click on 'NO QR CODE?' and enter naming details and the Secret
        • On next login, enter the passcode that the App provides
        \ No newline at end of file diff --git a/Extensions/Varnish/index.html b/Extensions/Varnish/index.html index bdbc124d..02a0fb74 100644 --- a/Extensions/Varnish/index.html +++ b/Extensions/Varnish/index.html @@ -1,4 +1,4 @@ - Varnish - LibreNMS Docs

        Varnish Installation Guide

        This document explains how to install Varnish Reverse Proxy for LibreNMS.

        Varnish is caching software that sits logically between an HTTP client and an HTTP server. Varnish caches HTTP responses from the HTTP server. If an HTTP request can not be responded to by the Varnish cache it directs the request to the HTTP Server. This type of HTTP caching is called a reverse proxy server. Caching your HTTP server can decrease page load times significantly.

        Architecture

        Simplified block diagram of an Apache HTTP server with Varnish 4.0 Reverse Proxy

        Block Diagram 1

        CentOS 7 Varnish Installation

        In this example we will assume your Apache 2.4.X HTTP server is working and configured to process HTTP requests on port 80. If not, please see Installing LibreNMS

        Install Varnish 4.0 RPM

        • Enable the Varnish CentOS 7 repo and install
        rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el7.rpm
        + Varnish - LibreNMS Docs       

        Varnish Installation Guide

        This document explains how to install Varnish Reverse Proxy for LibreNMS.

        Varnish is caching software that sits logically between an HTTP client and an HTTP server. Varnish caches HTTP responses from the HTTP server. If an HTTP request can not be responded to by the Varnish cache it directs the request to the HTTP Server. This type of HTTP caching is called a reverse proxy server. Caching your HTTP server can decrease page load times significantly.

        Architecture

        Simplified block diagram of an Apache HTTP server with Varnish 4.0 Reverse Proxy

        Block Diagram 1

        CentOS 7 Varnish Installation

        In this example we will assume your Apache 2.4.X HTTP server is working and configured to process HTTP requests on port 80. If not, please see Installing LibreNMS

        Install Varnish 4.0 RPM

        • Enable the Varnish CentOS 7 repo and install
        rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el7.rpm
         yum install varnish
         

        By default Varnish listens for HTTP requests on port 6081.

        • Temporarily add a firewalld rule for testing Varnish.
        firewall-cmd --zone=public --add-port=6081/tcp
         

        Test Varnish

        • Start Varnish
        systemctl start varnish
        diff --git a/Extensions/VisJS-Config/index.html b/Extensions/VisJS-Config/index.html
        index eb9af756..26f05935 100644
        --- a/Extensions/VisJS-Config/index.html
        +++ b/Extensions/VisJS-Config/index.html
        @@ -1,4 +1,4 @@
        - VisJS Config - LibreNMS Docs       

        Vis JS Configuration

        The Network Maps and Dependency Maps all use a common configuration for the vis.js library, which affects the way the maps are rendered, as well as the way that users can interact with the maps. This configuration can be adjusted by following the instructions below.

        This link will show you all the options and explain what they do.

        You may also access the dynamic configuration interface example here from within LibreNMS by adding the following to config.php

        $config['network_map_vis_options'] = '{
        + VisJS Config - LibreNMS Docs       

        Vis JS Configuration

        The Network Maps and Dependency Maps all use a common configuration for the vis.js library, which affects the way the maps are rendered, as well as the way that users can interact with the maps. This configuration can be adjusted by following the instructions below.

        This link will show you all the options and explain what they do.

        You may also access the dynamic configuration interface example here from within LibreNMS by adding the following to config.php

        $config['network_map_vis_options'] = '{
           "configure": { "enabled": true},
         }';
         

        Note

        You may want to disable the automatic page refresh while you're tweaking your configuration, as the refresh will reset the dynamic configuration UI to the values currently saved in config.php This can be done by clicking on the Settings Icon then Refresh Pause.

        Configurator Output

        Once you've achieved your desired map appearance, click the generate options button at the bottom to be given the necessary parameters to add to your config.php file. You will need to paste the generated config into config.php the format will need to look something like this. Note that the configurator will output the config with var options you will need to strip them out and at the end of the config you need to add an }'; see the example below.

        $config['network_map_vis_options'] = '{
        diff --git a/Extensions/Weathermap/index.html b/Extensions/Weathermap/index.html
        index 686b657e..89e22ac9 100644
        --- a/Extensions/Weathermap/index.html
        +++ b/Extensions/Weathermap/index.html
        @@ -1,4 +1,4 @@
        - Weathermap - LibreNMS Docs       

        Network-WeatherMap with LibreNMS

        Integrating LibreNMS with Network-Weathermap, allows you to build network maps to help visulaize network traffic flow rates.

        Prerequisites

        Network-WeatherMap requires php pear to work.

        Installing Network-WeatherMap

        Step 1

        Extract to your LibreNMS plugins directory /opt/librenms/html/plugins so you should see something like /opt/librenms/html/plugins/Weathermap/ The best way to do this is via git. Go to your install directory and then /opt/librenms/html/plugins enter:

        git clone https://github.com/librenms-plugins/Weathermap.git
        + Weathermap - LibreNMS Docs       

        Network-WeatherMap with LibreNMS

        Integrating LibreNMS with Network-Weathermap, allows you to build network maps to help visulaize network traffic flow rates.

        Prerequisites

        Network-WeatherMap requires php pear to work.

        Installing Network-WeatherMap

        Step 1

        Extract to your LibreNMS plugins directory /opt/librenms/html/plugins so you should see something like /opt/librenms/html/plugins/Weathermap/ The best way to do this is via git. Go to your install directory and then /opt/librenms/html/plugins enter:

        git clone https://github.com/librenms-plugins/Weathermap.git
         

        Step 2

        Inside the html/plugins directory, change the ownership of the Weathermap directory by typing

        chown -R librenms:librenms Weathermap/
         

        Make the configs directory writeable.

        chmod 775 /opt/librenms/html/plugins/Weathermap/configs
         

        Note if you are using SELinux you need to input the following command

        chcon -R -t httpd_cache_t Weathermap/
        diff --git a/Extensions/World-Map/index.html b/Extensions/World-Map/index.html
        index edc66ce7..70ea82f9 100644
        --- a/Extensions/World-Map/index.html
        +++ b/Extensions/World-Map/index.html
        @@ -1,4 +1,4 @@
        - World Map - LibreNMS Docs       

        World Map Configuration

        LibreNMS comes with a configurable Geo Map based on World Map Widget to visualize where your equipment is located geographically.

        World Map Widget

        World Map Widget, requires you to have properly formatted addresses in sysLocation or sysLocation override. As part of the standard poller these addresses will be Geocoded by Google and stored in the database.

        Location resolution happens as follows

        1. If device['location'] contains [lat, lng] (note the square brackets), that is used
        2. If there is a location overide for the device in the WebUI and it contains [lat, lng] (note the square brackets), that is used.
        3. Attempt to resolve lat, lng using lnms config:set geoloc.engine
        4. Properly formatted addresses in sysLocation or sysLocation override, under device settings.

        Example:

        [40.424521, -86.912755]
        + World Map - LibreNMS Docs       

        World Map Configuration

        LibreNMS comes with a configurable Geo Map based on World Map Widget to visualize where your equipment is located geographically.

        World Map Widget

        World Map Widget, requires you to have properly formatted addresses in sysLocation or sysLocation override. As part of the standard poller these addresses will be Geocoded by Google and stored in the database.

        Location resolution happens as follows

        1. If device['location'] contains [lat, lng] (note the square brackets), that is used
        2. If there is a location overide for the device in the WebUI and it contains [lat, lng] (note the square brackets), that is used.
        3. Attempt to resolve lat, lng using lnms config:set geoloc.engine
        4. Properly formatted addresses in sysLocation or sysLocation override, under device settings.

        Example:

        [40.424521, -86.912755]
         

        or

        1100 Congress Ave, Austin, TX 78701 (3rd floor cabinet)
         
        Information inside parentheses is ignored during GEO lookup

        We have two current mapping engines available:

        • Leaflet (default)
        • Jquery-Mapael

        World Map Widget Settings

        • Initial Latitude / Longitude: The map will be centered on those coordinates.
        • Initial Zoom: Initial zoom of the map. More information about zoom levels.
        • Grouping radius: Markers are grouped by area. This value define the maximum size of grouping areas.
        • Show devices: Show devices based on status.

        Example Settings:

        Example World Map Settings

        Device Overview World Map Settings

        If a device has a location with a valid latitude and logitude, the device overview page will have a panel showing the device on a world map. The following settings affect this map:

        # Does the world map start opened, or does the user need to clivk to view
         lnms config:set device_location_map_open false
        diff --git a/Extensions/metrics/Graphite/index.html b/Extensions/metrics/Graphite/index.html
        index ad8e146f..d6eab1f5 100644
        --- a/Extensions/metrics/Graphite/index.html
        +++ b/Extensions/metrics/Graphite/index.html
        @@ -1,4 +1,4 @@
        - Graphite - LibreNMS Docs       

        Enabling support for Graphite

        This module sends all metrics to a remote graphite service. You need something like Grafana for graphing.

        What you don't get

        • Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana.

        RRD will continue to function as normal so LibreNMS itself should continue to function as normal.

        Configuration

        poller/graphite

        lnms config:set graphite.enable true
        + Graphite - LibreNMS Docs       

        Enabling support for Graphite

        This module sends all metrics to a remote graphite service. You need something like Grafana for graphing.

        What you don't get

        • Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana.

        RRD will continue to function as normal so LibreNMS itself should continue to function as normal.

        Configuration

        poller/graphite

        lnms config:set graphite.enable true
         lnms config:set graphite.host 'your.graphite.server'
         lnms config:set graphite.port 2003
         lnms config:set graphite.prefix 'your.metric.prefix'
        diff --git a/Extensions/metrics/InfluxDB/index.html b/Extensions/metrics/InfluxDB/index.html
        index e7ecf7d7..95d3ed2c 100644
        --- a/Extensions/metrics/InfluxDB/index.html
        +++ b/Extensions/metrics/InfluxDB/index.html
        @@ -1,4 +1,4 @@
        - InfluxDB - LibreNMS Docs       

        Enabling support for InfluxDB

        Before we get started it is important that you know and understand that InfluxDB support is currently alpha at best. All it provides is the sending of data to a InfluxDB install. Due to the current changes that are constantly being made to InfluxDB itself then we cannot guarantee that your data will be ok so enabling this support is at your own risk!

        Requirements

        • InfluxDB >= 0.94 < 2.0
        • Grafana

        The setup of the above is completely out of scope here and we aren't really able to provide any help with this side of things.

        What you don't get

        • Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana.
        • Support for InfluxDB or Grafana, we would highly recommend that you have some level of experience with these.

        RRD will continue to function as normal so LibreNMS itself should continue to function as normal.

        Configuration

        poller/influxdb

        lnms config:set influxdb.enable true
        + InfluxDB - LibreNMS Docs       

        Enabling support for InfluxDB

        Before we get started it is important that you know and understand that InfluxDB support is currently alpha at best. All it provides is the sending of data to a InfluxDB install. Due to the current changes that are constantly being made to InfluxDB itself then we cannot guarantee that your data will be ok so enabling this support is at your own risk!

        Requirements

        • InfluxDB >= 0.94 < 2.0
        • Grafana

        The setup of the above is completely out of scope here and we aren't really able to provide any help with this side of things.

        What you don't get

        • Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana.
        • Support for InfluxDB or Grafana, we would highly recommend that you have some level of experience with these.

        RRD will continue to function as normal so LibreNMS itself should continue to function as normal.

        Configuration

        poller/influxdb

        lnms config:set influxdb.enable true
         lnms config:set influxdb.transport http
         lnms config:set influxdb.host '127.0.0.1'
         lnms config:set influxdb.port 8086
        @@ -7,4 +7,4 @@
         lnms config:set influxdb.password 'admin'
         lnms config:set influxdb.timeout 0
         lnms config:set influxdb.verifySSL false
        -

        No credentials are needed if you don't use InfluxDB authentication.

        The same data then stored within rrd will be sent to InfluxDB and recorded. You can then create graphs within Grafana to display the information you need.

        \ No newline at end of file +

        No credentials are needed if you don't use InfluxDB authentication.

        The same data then stored within rrd will be sent to InfluxDB and recorded. You can then create graphs within Grafana to display the information you need.

        \ No newline at end of file diff --git a/Extensions/metrics/InfluxDBv2/index.html b/Extensions/metrics/InfluxDBv2/index.html new file mode 100644 index 00000000..18735451 --- /dev/null +++ b/Extensions/metrics/InfluxDBv2/index.html @@ -0,0 +1,9 @@ + InfluxDBv2 - LibreNMS Docs

        Enabling support for InfluxDBv2

        Before we get started it is important that you know and understand that InfluxDBv2 support is currently alpha at best. All it provides is the sending of data to a InfluxDBv2 bucket. Due to the current changes that are constantly being made to InfluxDB itself then we cannot guarantee that your data will be ok so enabling this support is at your own risk!

        It is also important to understand that InfluxDBv2 only supports the InfluxDBv2 API used in InfluxDB version 2.0 or higher. If you are looking to send data to any other version of InfluxDB than you should use the InfluxDB datastore instead.

        Requirements

        • InfluxDB >= 2.0

        The setup of the above is completely out of scope here and we aren't really able to provide any help with this side of things.

        What you don't get

        • Support for InfluxDB, we would highly recommend that you have some level of experience with these.

        RRD will continue to function as normal so LibreNMS itself should continue to function as normal.

        Configuration

        poller/influxdbv2

        lnms config:set influxdbv2.enable true
        +lnms config:set influxdbv2.transport http
        +lnms config:set influxdbv2.host '127.0.0.1'
        +lnms config:set influxdbv2.port 8086
        +lnms config:set influxdbv2.bucket 'librenms'
        +lnms config:set influxdbv2.token 'admin'
        +lnms config:set influxdbv2.allow_redirect true
        +lmns config:set influxdbv2.organization 'librenms'
        +

        The same data stored within rrd will be sent to InfluxDB and recorded. You can then create graphs within Grafana or InfluxDB to display the information you need.

        \ No newline at end of file diff --git a/Extensions/metrics/OpenTSDB/index.html b/Extensions/metrics/OpenTSDB/index.html index 6e2dfd78..e0a67a2f 100644 --- a/Extensions/metrics/OpenTSDB/index.html +++ b/Extensions/metrics/OpenTSDB/index.html @@ -1,4 +1,4 @@ - OpenTSDB - LibreNMS Docs

        Enabling support for OpenTSDB

        This module sends all metrics to OpenTSDB server. You need something like Grafana for graphing.

        Requirements

        • OpenTSDB
        • Grafana

        What you don't get

        Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana.

        RRD will continue to function normally so LibreNMS itself should continue to function normally.

        You can add the following to your config:

        Configuration

        poller/opentsdb

        lnms config:set opentsdb.enable true
        + OpenTSDB - LibreNMS Docs       

        Enabling support for OpenTSDB

        This module sends all metrics to OpenTSDB server. You need something like Grafana for graphing.

        Requirements

        • OpenTSDB
        • Grafana

        What you don't get

        Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana.

        RRD will continue to function normally so LibreNMS itself should continue to function normally.

        You can add the following to your config:

        Configuration

        poller/opentsdb

        lnms config:set opentsdb.enable true
         lnms config:set opentsdb.host '127.0.0.1'
         lnms config:set opentsdb.port 4242
        -

        The same data than the one stored within rrd will be sent to OpenTSDB and recorded. You can then create graphs within Grafana to display the information you need.

        \ No newline at end of file +

        The same data than the one stored within rrd will be sent to OpenTSDB and recorded. You can then create graphs within Grafana to display the information you need.

        \ No newline at end of file diff --git a/Extensions/metrics/Prometheus/index.html b/Extensions/metrics/Prometheus/index.html index ba9b7c6e..38030c89 100644 --- a/Extensions/metrics/Prometheus/index.html +++ b/Extensions/metrics/Prometheus/index.html @@ -1,4 +1,4 @@ - Prometheus - LibreNMS Docs

        Enabling support for Prometheus

        Please be aware Prometheus support is alpha at best, It hasn't been extensively tested and is still in development All it provides is the sending of data to a a Prometheus PushGateway. Please be careful when enabling this support you use it at your own risk!

        Requirements (Older versions may work but haven't been tested

        • Prometheus >= 2.0
        • PushGateway >= 0.4.0
        • Grafana
        • PHP-CURL

        The setup of the above is completely out of scope here and we aren't really able to provide any help with this side of things.

        What you don't get

        • Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana.
        • Support for Prometheus or Grafana, we would highly recommend that you have some level of experience with these.

        RRD will continue to function as normal so LibreNMS itself should continue to function as normal.

        Configuration

        poller/prometheus

        lnms config:set prometheus.enable true
        + Prometheus - LibreNMS Docs       

        Enabling support for Prometheus

        Please be aware Prometheus support is alpha at best, It hasn't been extensively tested and is still in development All it provides is the sending of data to a a Prometheus PushGateway. Please be careful when enabling this support you use it at your own risk!

        Requirements (Older versions may work but haven't been tested

        • Prometheus >= 2.0
        • PushGateway >= 0.4.0
        • Grafana
        • PHP-CURL

        The setup of the above is completely out of scope here and we aren't really able to provide any help with this side of things.

        What you don't get

        • Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana.
        • Support for Prometheus or Grafana, we would highly recommend that you have some level of experience with these.

        RRD will continue to function as normal so LibreNMS itself should continue to function as normal.

        Configuration

        poller/prometheus

        lnms config:set prometheus.enable true
         lnms config:set prometheus.url 'http://127.0.0.1:9091'
         lnms config:set prometheus.job 'librenms'
         lnms config:set prometheus.prefix 'librenms'
        diff --git a/General/Acknowledgement/index.html b/General/Acknowledgement/index.html
        index f6ee3f3d..83881d4f 100644
        --- a/General/Acknowledgement/index.html
        +++ b/General/Acknowledgement/index.html
        @@ -1 +1 @@
        - 3rd Party Libraries - LibreNMS Docs       

        Acknowledgements

        LibreNMS wouldn't be what it is today without the use of some other amazing projects. We list below what we make use of including the license compliance.

        3rd Party GPLv3 Compliant

        3rd Party GPLv3 Non-compliant

        • JpGraph (html/includes/jpgraph): QPL 1.0 license
        • MIBS (mibs): unknown/various
        • html/graph-realtime.php: BSD (original?)
        • html/includes/collectd/: GPLv2 only
        • overLIB (html/js/overlib_mini.js): modified Artistic 1.0?
        \ No newline at end of file + 3rd Party Libraries - LibreNMS Docs

        Acknowledgements

        LibreNMS wouldn't be what it is today without the use of some other amazing projects. We list below what we make use of including the license compliance.

        3rd Party GPLv3 Compliant

        3rd Party GPLv3 Non-compliant

        • JpGraph (html/includes/jpgraph): QPL 1.0 license
        • MIBS (mibs): unknown/various
        • html/graph-realtime.php: BSD (original?)
        • html/includes/collectd/: GPLv2 only
        • overLIB (html/js/overlib_mini.js): modified Artistic 1.0?
        \ No newline at end of file diff --git a/General/Callback-Stats-and-Privacy/index.html b/General/Callback-Stats-and-Privacy/index.html index d79d2bff..27e3f598 100644 --- a/General/Callback-Stats-and-Privacy/index.html +++ b/General/Callback-Stats-and-Privacy/index.html @@ -1 +1 @@ - Submitting stats - LibreNMS Docs

        Submitting Stats

        Stats data and your privacy

        This document has been put together to explain what LibreNMS does when it calls back home to report some anonymous statistics.

        Let's start off by saying, all of the code that processes the data and submits it is included in the standard LibreNMS branch you've installed, the code that accepts this data and in turn generates some pretty graphs is all open source and available on GitHub. Please feel free to review the code, comment on it and suggest changes / improvements. Also, don't forget - by default installations DO NOT call back home, you need to opt into this.

        Above all we respect users privacy which is why this system has been designed like it has.

        Now onto the bit you're interested in, what is submitted and what we do with that data.

        What is submitted

        • All data is anonymous.
        • Generic statistics are taken from the database, these include things like device count, device type, device OS, port types, port speeds, port count and BGP peer count. Take a look at the code for full details.
        • Pairs of sysDescr and sysObjectID from devices with a small amount of sanitation to prevent things like hostnames from being submitted.
        • We record version numbers of php, mysql, net-snmp and rrdtool
        • A random UUID is generated on your own install.
        • That's it!
        • Your IP isn't logged, even via our web service accepting the data. We don't need to know who you are so we don't ask.

        What we do with the data

        • We store it, not for long - 3 months at the moment although this could change.
        • We use it to generate pretty graphs for people to see.
        • We use it to help prioritise issues and features that need to be worked on.
        • We use sysDescr and sysObjectID to create unit tests and improve OS discovery

        How do I enable stats submission?

        If you're happy with all of this - please consider switching the call back system on, you can do this within the About LibreNMS page within your control panel. In the Statistics section you will find a toggle switch to enable / disable the feature. If you've previously had it switched on and want to opt out and remove your data, click the 'Clear remote stats' button and on the next submission all the data you've sent us will be removed!

        Questions?

        How often is data submitted?

        We submit the data once a day according to running daily.sh via cron. If you disable this then opting in will not have any affect.

        Where can I see the data I submitted?

        You can't see the data raw, but we collate all of the data together and provide a dynamic site so you can see the results of all contributed stats here

        I want my data removed.

        That's easy, simply press 'Clear remote stats' in the About LibreNMS page of your control panel, the next time the call back script is run it will remove all the data we have.

        I clicked the 'Clear remote stats' button by accident.

        No problem, before daily.sh runs again - just opt back in, all of your existing data will stay.

        Hopefully this answers the questions you might have on why and what we are doing here, if not, please pop into our discord server or community forum and ask any questions you like.

        \ No newline at end of file + Submitting stats - LibreNMS Docs

        Submitting Stats

        Stats data and your privacy

        This document has been put together to explain what LibreNMS does when it calls back home to report some anonymous statistics.

        Let's start off by saying, all of the code that processes the data and submits it is included in the standard LibreNMS branch you've installed, the code that accepts this data and in turn generates some pretty graphs is all open source and available on GitHub. Please feel free to review the code, comment on it and suggest changes / improvements. Also, don't forget - by default installations DO NOT call back home, you need to opt into this.

        Above all we respect users privacy which is why this system has been designed like it has.

        Now onto the bit you're interested in, what is submitted and what we do with that data.

        What is submitted

        • All data is anonymous.
        • Generic statistics are taken from the database, these include things like device count, device type, device OS, port types, port speeds, port count and BGP peer count. Take a look at the code for full details.
        • Pairs of sysDescr and sysObjectID from devices with a small amount of sanitation to prevent things like hostnames from being submitted.
        • We record version numbers of php, mysql, net-snmp and rrdtool
        • A random UUID is generated on your own install.
        • That's it!
        • Your IP isn't logged, even via our web service accepting the data. We don't need to know who you are so we don't ask.

        What we do with the data

        • We store it, not for long - 3 months at the moment although this could change.
        • We use it to generate pretty graphs for people to see.
        • We use it to help prioritise issues and features that need to be worked on.
        • We use sysDescr and sysObjectID to create unit tests and improve OS discovery

        How do I enable stats submission?

        If you're happy with all of this - please consider switching the call back system on, you can do this within the About LibreNMS page within your control panel. In the Statistics section you will find a toggle switch to enable / disable the feature. If you've previously had it switched on and want to opt out and remove your data, click the 'Clear remote stats' button and on the next submission all the data you've sent us will be removed!

        Questions?

        How often is data submitted?

        We submit the data once a day according to running daily.sh via cron. If you disable this then opting in will not have any affect.

        Where can I see the data I submitted?

        You can't see the data raw, but we collate all of the data together and provide a dynamic site so you can see the results of all contributed stats here

        I want my data removed.

        That's easy, simply press 'Clear remote stats' in the About LibreNMS page of your control panel, the next time the call back script is run it will remove all the data we have.

        I clicked the 'Clear remote stats' button by accident.

        No problem, before daily.sh runs again - just opt back in, all of your existing data will stay.

        Hopefully this answers the questions you might have on why and what we are doing here, if not, please pop into our discord server or community forum and ask any questions you like.

        \ No newline at end of file diff --git a/General/Changelog/index.html b/General/Changelog/index.html index 12c30e4e..9bebdc35 100644 --- a/General/Changelog/index.html +++ b/General/Changelog/index.html @@ -1 +1 @@ - Changelog - LibreNMS Docs

        Changelog

        24.2.0

        (2024-02-27)

        A big thank you to the following 46 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Graphs

        • Fixed graphs for icmp service showing PL 4 times (#15856) - VoipTelCH
        • Socket Statistic Application cleanup and application page graph fixes. (#15845) - bnerickson

        Applications

        Billing

        • Updated bill_data table, alter indexes and add new column (#15751) - laf

        Api

        Settings

        Discovery

        • Fall back to IPV6-MIB IPv6 address discovery if IP-MIB IPv6 address discovery doesn't return any valid addresses (#15714) - gunkaaa

        Oxidized

        Bug

        Refactor

        Documentation

        Misc

        Mibs

        Dependencies

        24.1.0

        (2024-01-07)

        A big thank you to the following 37 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Device

        Webui

        Graphs

        Api

        Discovery

        • Set array before use to stop discovery erroring (#15604) - laf

        Authentication

        Bug

        Documentation

        Misc

        Internal Features

        Mibs

        Dependencies

        24.1.0

        (2024-01-07)

        A big thank you to the following 37 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Device

        Webui

        Graphs

        Api

        Discovery

        • Set array before use to stop discovery erroring (#15604) - laf

        Authentication

        Bug

        Documentation

        Misc

        Internal Features

        Mibs

        Dependencies

        23.11.0

        (2023-11-17)

        A big thank you to the following 37 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Breaking Change

        Security

        Device

        Webui

        • Device links formatting changes (#15580) - eskyuu
        • Only set user roles if they are defined (#15577) - murrant
        • Fix Down/Up time error if device is unpolled (#15545) - murrant
        • Fix health temperature degree display (#15541) - murrant
        • Fixed BGP Remote peer link and graph in Routing Overview, or just static text when not a device in LibreNMS (#15535) - tim427
        • Added BGP Remote peer link and graph in Routing Overview (#15532) - tim427
        • Respect web_mouseover setting in popup component (#15530) - murrant
        • Prefetch devices in group to avoid cost of subquery (#15511) - slalomsk8er

        Alerting

        Applications

        • [bugfix] Passing $device into data_update_helper functions instead of declaring it as global. (#15542) - bnerickson

        Api

        Discovery

        • UCD buffers and cache discovered with inverted free/used values (#15538) - murrant

        Polling

        Authentication

        Bug

        Cleanup

        Documentation

        Translation

        Misc

        • Update renamehost to include more logging if a folder already exists# (#15280) - jaannnis

        Internal Features

        Dependencies

        23.10.0

        (2023-10-26)

        A big thank you to the following 30 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Graphs

        Applications

        • Unix Agent and Application fixes (#15460) - murrant
        • Adding Socket Statistics Application Support (#15307) - bnerickson
        • Update docs for osupdate when being used as a script for the agent (#15099) - VVelox

        Api

        Settings

        Polling

        Bug

        Refactor

        Cleanup

        Documentation

        Translation

        Tests

        • Exclude availability module from default testing (#15462) - murrant

        Misc

        • Fixes check_dns against localhost when a search-domain is configured (#15373) - tim427
        • Added extra ASN-range comments, added Priv eBGP on host details, changed color to light-blue instead of red (#15372) - tim427

        Internal Features

        Dependencies

        23.9.0

        (2023-09-15)

        A big thank you to the following 16 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Applications

        • For the applications table set the defaults for app_instance and app_instance to '' (#15278) - VVelox
        • Application Soft Delete (#15270) - VVelox

        Api

        Settings

        • Add ui description for reporting dump_errors (#15264) - murrant

        Polling

        Authentication

        Bug

        Cleanup

        • Return an 5XX error when an exception is raise (#15285) - Pelt10

        Documentation

        • Note the package install command for dhcpd-pools for FreeBSD (#15247) - VVelox
        • Update severity colours in SNMP-Traps.md (#15244) - adamsweet

        Misc

        23.8.0

        (2023-08-19)

        A big thank you to the following 32 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        • Fix unsanitized input injection (#15184) - murrant
        • Fix some xss injection for sysLocation and some other fields (#15183) - murrant

        Device

        Webui

        Alerting

        Graphs

        • Fix Memmory spelling (#15231) - arjenz
        • Add generic stats graph munging support and make uptime display as days again (#15097) - VVelox

        Applications

        Billing

        • Fixed a zero value data insertion for billing (#15194) - laf
        • Updated poll-billing.php to only query for data via snmp when the device and port are both up (#15164) - laf
        • Added basic support for distributing billing (#15156) - laf

        Api

        Discovery

        Polling

        Authentication

        Bug

        Refactor

        Cleanup

        Documentation

        Tests

        Misc

        Internal Features

        Dependencies

        23.7.0

        (2023-07-16)

        A big thank you to the following 19 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Device

        Webui

        Alerting

        Applications

        Api

        • Adding human readable version of /api/v0/fdb/{mac}/detail (#15045) - sjtarik

        Discovery

        • Fix bogus reply from snmpwalk in ipNetToPhysicalPhysAddress (#15142) - PipoCanaja

        Polling

        Bug

        • Skip hostnames which are blank when generating the smokeping config (#15144) - laf
        • Change chunk to chunkById (#15139) - peejaychilds
        • Use lock ports_purge in ports_purge rather than syslog_purge lock (#15135) - peejaychilds
        • Fix validation: memcached required only if it is configured in .env (#15122) - tuxgasy
        • Exit non-zero if composer bin not found (#15120) - tuxgasy

        Documentation

        Translation

        Internal Features

        23.6.0

        (2023-06-23)

        A big thank you to the following 14 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        • Alert transport cleanup, no_proxy support and other proxy cleanups (#14763) - murrant

        Device

        Alerting

        Applications

        • Add ZFS L2 support (#15095) - VVelox
        • Add Linux Softnet Stat app (#15094) - VVelox
        • Add Sneck support, making it very trivial to use Nagios style checks in a NRPE like manner (#13954) - VVelox

        Bug

        • Fixes #14975 Services in Device Groups not displayed correctly in Availability widget (#15076) - ajsiersema
        • Fix Dusk tests after 13626 (#15057) - Jellyfrog

        Cleanup

        Documentation

        Mibs

        Dependencies

        23.5.0

        (2023-05-19)

        A big thank you to the following 37 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Graphs

        Applications

        Api

        Discovery

        Polling

        Bug

        Refactor

        Cleanup

        Documentation

        • Re-add the Ubuntu Image page and links (#15041) - laf
        • Remove references to VM images (#15031) - murrant
        • Updated WebUI config options in docs to support direct linking to installs (#15009) - laf
        • Fix spelling error in Graylog section (#15002) - dscw
        • Update OAuth-SAML.md to prevent http code 419 error (#15000) - fbouynot
        • Update Smokeping.md with better nginx config instructions (#14999) - alchemyx
        • Update Copyright year to 2023 in README.md (#14972) - otkd
        • Update Install-LibreNMS.md (#14949) - alchemyx

        Tests

        Mibs

        Dependencies

        23.5.0

        (2023-05-19)

        A big thank you to the following 37 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Graphs

        Applications

        Api

        Discovery

        Polling

        Bug

        Refactor

        Cleanup

        Documentation

        • Re-add the Ubuntu Image page and links (#15041) - laf
        • Remove references to VM images (#15031) - murrant
        • Updated WebUI config options in docs to support direct linking to installs (#15009) - laf
        • Fix spelling error in Graylog section (#15002) - dscw
        • Update OAuth-SAML.md to prevent http code 419 error (#15000) - fbouynot
        • Update Smokeping.md with better nginx config instructions (#14999) - alchemyx
        • Update Copyright year to 2023 in README.md (#14972) - otkd
        • Update Install-LibreNMS.md (#14949) - alchemyx

        Tests

        Misc

        Mibs

        Dependencies

        23.4.0

        (2023-04-06)

        A big thank you to the following 25 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Webui

        Alerting

        Graphs

        • Add graph_stat_percentile_disable config item to disable percentile lines/value printing (#14887) - VVelox
        • Convert NTP freq to use generic_stats (#14834) - VVelox
        • Update fail2ban to have better stat graphs and and fix generic_stats graph.php (#14818) - VVelox
        • Update various device graphs to to have better stats (#14815) - VVelox

        Applications

        Bug

        Cleanup

        Documentation

        • Fix typo in lnms device:add help (#14937) - arjenz
        • Add Azure example configuration for SAML authentication in documentation (#14870) - fbouynot

        Tests

        Misc

        Dependencies

        22.4.0

        (2023-04-06)

        A big thank you to the following 180 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Graphs

        Snmp Traps

        Applications

        Api

        Discovery

        Polling

        Rancid

        Oxidized

        • Show display name in Oxidized config search (#14800) - electrocret
        • Adding Fortigate switches to Oxidized model mapping config (#14782) - LoveSkylark
        • Fix oxidized web requests unclosed connections or responding fast enough (#14370) - fbouynot
        • Oxidized "allow purpose and notes" (#14352) - LoveSkylark
        • Syslog-notify-oxidized.php now always notifies Oxidized (#14011) - murrant
        • Fix Oxidized syslog change notifier when the change was made via snmp. (#14005) - kruczek8989
        • Oxidized API to return groups based on device purpose or notes (#13976) - sajiby3k

        Authentication

        Bug

        Refactor

        Cleanup

        Documentation

        Translation

        Tests

        Misc

        Internal Features

        Mibs

        Dependencies

        23.2.0

        (2023-02-23)

        A big thank you to the following 20 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Alerting

        Graphs

        • Update HV::Monitor support to use generic_stats.inc.php (#14814) - VVelox
        • Only show Eth errors when Etherlike is enabled (#14784) - electrocret

        Applications

        Api

        • Use Oxidized API client and add support for groups on config get (#14750) - electrocret

        Oxidized

        Bug

        Documentation

        Misc

        Dependencies

        23.1.0

        (2023-01-24)

        A big thank you to the following 19 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Device

        Oxidized

        Bug

        Documentation

        Translation

        Misc

        • Use displayname instead of hostname for Device Maintenance Modal Title (#14681) - electrocret

        Dependencies

        22.12.0

        (2022-12-28)

        A big thank you to the following 21 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Webui

        Alerting

        Graphs

        Applications

        • Update Nvidia application - values in wrong charts (#14736) - fcqpl
        • Removing max polling restriction for wireguard traffic RRD data (#14710) - bnerickson

        Api

        Discovery

        Polling

        Refactor

        Documentation

        Tests

        Misc

        Internal Features

        Mibs

        Dependencies

        22.11.0

        (2022-11-24)

        A big thank you to the following 40 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Graphs

        Snmp Traps

        Applications

        Api

        Discovery

        Polling

        • Don't poll sysDescr, sysObjectID, and sysName so frequently (#14562) - murrant
        • Add connection exception handling to all redis calls (#14467) - Frazew

        Authentication

        • Update Radius auth to accept permissions attributes (#14531) - kimhaak

        Bug

        Refactor

        Cleanup

        Documentation

        Tests

        Misc

        Internal Features

        Dependencies

        22.10.0

        (2022-10-17)

        A big thank you to the following 22 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Security

        Device

        Webui

        Alerting

        Snmp Traps

        • Improve LinkUp and LinkDown trap handling incomplete traps (#14385) - tuomari

        Applications

        Api

        Discovery

        Polling

        • Fix bgp-peers bgpPeerIface bug and update test data (#14420) - murrant

        Oxidized

        • Fix oxidized web requests unclosed connections or responding fast enough (#14370) - fbouynot

        Authentication

        Bug

        Refactor

        Cleanup

        Documentation

        Translation

        Tests

        Misc

        Dependencies

        22.9.0

        (2022-09-21)

        A big thank you to the following 19 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Graphs

        Api

        • Allow delete location by id (#14334) - bp0
        • API update_device, make location field work (as does location_id) (#14325) - bp0

        Polling

        Oxidized

        Bug

        Refactor

        • Cleanup and optimize the availability widget (#14329) - murrant

        Cleanup

        Documentation

        Tests

        Misc

        Dependencies

        22.8.0

        (2022-08-19)

        A big thank you to the following 26 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Webui

        Alerting

        • Correct logic for recurring alert rules that span UTC days (#14145) - gs-kamnas
        • Improvements to PagerDuty alert formatting (#14143) - gs-kamnas
        • Add rich (=html) support for messages via Matrix (#14054) - mwobst

        Graphs

        Applications

        Api

        • Standardize device and device group maintenance API (#14153) - rhinoau
        • Fix maintenance APIs not associating device or group (#14127) - murrant

        Discovery

        Polling

        Authentication

        Bug

        Refactor

        Documentation

        Translation

        Tests

        • Allow save-test-data.php to run all modules explicitely (#14212) - PipoCanaja
        • Increase OS detection time, sometimes it is not ready by 5s (#14133) - murrant

        22.7.0

        (2022-07-20)

        A big thank you to the following 21 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Security

        • Security fixes XSS in oxidized-cfg-check.inc.php and print-customoid.php (#14126) - enferas

        Device

        Webui

        Alerting

        Graphs

        Applications

        Polling

        Authentication

        Bug

        Cleanup

        Documentation

        • Small documentation typos (#14101) - wrongecho
        • Documentation typos (#14099) - wrongecho
        • Add SELinux configuration for SNMPd on Centos8 in the documentation (#14095) - fbouynot
        • Add SELinux configuration for LDAP/AD authentication on Centos8 in the documentation (#14094) - fbouynot
        • Add SELinux configuration for Smokeping on Centos8 in the documentation (#14093) - fbouynot
        • Add SELinux configuration for RRDCached on Centos8 in the documentation (#14092) - fbouynot
        • Corrected API devicegroup curl creation examples (#14081) - rhinoau
        • Minor grammar fixes in doc (#14078) - paulgear
        • Add documentation for Chrony application monitoring (#14066) - ottorei

        Translation

        Tests

        Misc

        Mibs

        Dependencies

        22.6.0

        (2022-06-14)

        A big thank you to the following 22 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        • Bumpver handlebars.js to 4.7.7 to resolve CVE-2021-23369 (#13990) - gs-kamnas

        Device

        Webui

        Alerting

        Applications

        Discovery

        • Fix printer count sensors when extra garbage is returned (#14014) - murrant

        Oxidized

        • Syslog-notify-oxidized.php now always notifies Oxidized (#14011) - murrant
        • Fix Oxidized syslog change notifier when the change was made via snmp. (#14005) - kruczek8989

        Authentication

        • Implement support for usernames coming from reverse proxies (#13894) - HolgerHees

        Bug

        Cleanup

        Documentation

        Tests

        • Fix tests failing when device with IP 127.1.6.1 exists (#14016) - murrant

        Misc

        Mibs

        Dependencies

        22.5.0

        (2022-05-21)

        A big thank you to the following 23 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Webui

        Alerting

        Graphs

        Applications

        • Remove alert keys from component for Suricata (#13959) - VVelox
        • Fix a few issues with variable names for Suricata (#13956) - VVelox
        • Scripts/json-app-tool.php JSON generation fix and add -S for SNMP extend name (#13948) - VVelox
        • Add Suricata monitoring (#13942) - VVelox

        Discovery

        • Fix polling and discovery of FortiGate cluster sensors (#13980) - mkuurstra

        Oxidized

        • Oxidized API to return groups based on device purpose or notes (#13976) - sajiby3k

        Authentication

        • Auth_ldap_skip_group_check when ldap_compare is not supported (#13926) - micko
        • Add LDAP bind and userlist filter support to ldap-authorization (#13788) - pfromme25

        Bug

        Refactor

        Documentation

        Translation

        Misc

        Dependencies

        22.4.0

        (2022-04-21)

        A big thank you to the following 27 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Snmp Traps

        • Add Cisco Err-Disable interface event trap handler (#13855) - bonzo81

        Api

        • Ensure 'add_device' API returns indexed-array (as per doco) (#13887) - claude191

        Polling

        Rancid

        Bug

        Refactor

        Cleanup

        • Better device:add error output (#13913) - murrant
        • Remove non-working Dell specific alert rules from the collection (#13706) - Fehler12

        Documentation

        Translation

        Dependencies

        22.3.0

        (2022-03-17)

        A big thank you to the following 22 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        • Resolved XSS issue from alert rule list modal (#13805) - laf

        Device

        Webui

        Alerting

        • Newer versions of Jira use HTTP code 201 fore created issues (#13852) - MrXermon
        • Add extra dynamic values alerttransport alertmanager (#13828) - geg347

        Snmp Traps

        Api

        Bug

        Refactor

        Tests

        Misc

        22.2.0

        (2022-02-16)

        A big thank you to the following 22 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Snmp Traps

        Discovery

        • Check for empty SLA tags so we skip bad entries (#13679) - laf

        Bug

        Refactor

        Cleanup

        Documentation

        Tests

        Misc

        Dependencies

        22.1.0

        (2022-01-23)

        A big thank you to the following 26 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Webui

        • [WebUI] Removing the colon symbol to the right of a control label (#13698) - ilGino
        • Remove unneccessary Section Description (#13677) - SourceDoctor
        • Device tracepath using wrong variables to check for traceroute output (#13674) - laf
        • Allow filter by display name in device list (#13665) - gdepeyrot
        • Sort Vlan Ports by ifName, ifDescr (#13657) - SourceDoctor
        • Fix horizontal scrollbar in device list always visible (#13653) - efelon

        Alerting

        Graphs

        Applications

        Api

        Polling

        • Added oids.no_bulk os setting (#13666) - Npeca75
        • Add consistent output of name and app_id to Poller for all Applications (fixes #13641) (#13648) - westerterp
        • Fix SnmpQuery bulk boolean backwards (#13636) - murrant

        Rancid

        Bug

        • Use PHP_BINARY directly instead of trying to build path to PHP binary (#13690) - Jellyfrog
        • Small text change for misspelled Virtual (#13686) - ilGino
        • Snmp timeout is a float, allow in config (#13676) - murrant
        • Fix NULL device alert caused by services (#13663) - k0079898
        • Disable VRP VLANs test, seems to be a bug in snmpsim snmpbulkwalk (#13649) - murrant
        • Remove extra rows with duplicate keys in SyncsModels trait (#13632) - murrant

        Documentation

        Translation

        • Fix settings language file to include Distributed Poller labels. (#13511) - thford89

        Dependencies

        21.12.0

        (2021-12-21)

        A big thank you to the following 30 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Graphs

        Snmp Traps

        Applications

        Billing

        Api

        • API 'list_parents_of_host' - mostly doco, but one small code enhancement (#13567) - claude191

        Discovery

        Polling

        Bug

        Refactor

        Cleanup

        Documentation

        Tests

        Mibs

        Dependencies

        21.11.0

        (2021-11-12)

        A big thank you to the following 49 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Graphs

        • Add missing graph definition for pf_matches (pfSense firewall) (#13507) - robje

        Snmp Traps

        Applications

        Api

        Discovery

        Polling

        Rancid

        Oxidized

        • Syslog hook examples and documentation for Procurve devices (#13397) - nq5

        Bug

        Refactor

        • Change how options are handled for SnmpQuery (#13488) - murrant
        • Rename concrete SnmpQuery class to avoid confusion (#13412) - murrant
        • Fully convert core to a modern module (#13347) - murrant
        • New plugin system based on Laravel Package Development (#12998) - mpikzink

        Cleanup

        Documentation

        Tests

        Dependencies

        21.10.0

        (2021-10-16)

        A big thank you to the following 21 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        • Use the same error message for different kind of authentiction errors (#13306) - Jellyfrog

        Device

        Webui

        Alerting

        Graphs

        Snmp Traps

        Api

        Settings

        Discovery

        Polling

        • Dispatcher bugfix queues not being disabled properly (#13364) - murrant
        • Fix for cimc polling on PHP8 (#13357) - murrant
        • Dispatch Service: Don't stop dispatching if master moves to a node with a queue disabled (#13355) - murrant
        • Fix device query when last_polled_timetaken is null (#13331) - murrant
        • Restore accidentally removed code (#13330) - murrant
        • Allow non-snmp modules to run when snmp disabled (#13321) - murrant
        • Fix python config fetch disrupted by stderr output (#13295) - murrant
        • Fix poller wrapper error (#13290) - murrant

        Oxidized

        Authentication

        • Improvements to SSO Authorization and logout handling (#13311) - gs-kamnas

        Bug

        Refactor

        Documentation

        Tests

        Dependencies

        21.9.0

        (2021-09-16)

        A big thank you to the following 20 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        • API alert transport can include Options variables in the Body for POST requests (#13167) - mzacchi
        • Show port speed on port graphs, optionally set scale (#11858) - murrant

        Device

        Webui

        Alerting

        Graphs

        • Change default graph view to zoom in on traffic. (#13173) - murrant

        Settings

        Discovery

        Polling

        Oxidized

        • Add sysobjectid and hardware fields into oxidized maps (#13221) - Negatifff

        Bug

        Refactor

        Documentation

        Misc

        21.8.0

        (2021-08-22)

        A big thank you to the following 40 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Webui

        Api

        Alerting

        • Add EU Service Region to PagerDuty transport (#13154) - ottorei
        • Fix HTML encoded characters in Slack (#13120) - geg347
        • Add SignalWire (Twilio alternative) alert transport support (#13107) - igorek24

        Discovery

        • Full Python code fusion / refactor and hardening (#13094) - deajan
        • Extend REGEX filtering option by sensor_class (#13066) - opalivan

        Oxidized

        Bug

        Documentation

        Translation

        Tests

        Misc

        Mibs

        Dependencies

        21.7.0

        (2021-07-16)

        A big thank you to the following 27 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Webui

        Api

        Discovery

        • Fix an issue which led to duplication of BGP peers. (#12932) - cjsoftuk

        Oxidized

        Bug

        Refactor

        Cleanup

        Documentation

        Misc

        Dependencies

        21.6.0

        (2021-06-17)

        A big thank you to the following 23 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        • New module add juniper rpm support + reimplementation of cisco-sla module (#12799) - geg347
        • ISIS-adjacency polling support (#12461) - ottorei

        Device

        Webui

        Authentication

        • Add number sign to special character handling in ActiveDirectoryAuthorizer (#12943) - paddy01

        Applications

        Api

        Alerting

        Discovery

        • LLDP - ifAlias should be last checked in function find_port_id (#12904) - PipoCanaja
        • LLDP - Extend discovery lldp code to support different subtypes (#12901) - PipoCanaja

        Polling

        Rancid

        Refactor

        Documentation

        21.5.0

        (2021-05-17)

        A big thank you to the following 28 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Graphs

        Applications

        Api

        Alerting

        Discovery

        • Ignore Wrong Type errors in snpm_get and snmp_get_multi_oid (#12800) - murrant
        • Discovery - Compute num_oid to make os development easier (#12576) - PipoCanaja

        Polling

        Bug

        Refactor

        Cleanup

        Documentation

        Tests

        Misc

        • Lnms dev:simulate Snmpsim debug output on failure (#12880) - murrant
        • Enable config:set to set variables inside a nested array of settings (#12772) - murrant

        Dependencies

        21.4.0

        (2021-04-17)

        A big thank you to the following 34 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Graphs

        Alerting

        Discovery

        Polling

        Bug

        Refactor

        Cleanup

        Documentation

        Tests

        Misc

        Dependencies

        21.3.0

        (2021-03-20)

        A big thank you to the following 27 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Webui

        Snmp Traps

        Applications

        Alerting

        Discovery

        • DynamicDiscovery - Guess num_oid if not provided in YAML file (#12570) - PipoCanaja
        • Fix location for devices with broken snmp (#12544) - murrant

        Oxidized

        Bug

        Refactor

        Documentation

        Tests

        Misc

        Dependencies

        21.2.0

        (2021-02-16)

        A big thank you to the following 18 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Authentication

        • Fixes issues with binding and authenticating users in nested groups (#12398) - paddy01

        Applications

        • Add poller feature for RRDCached SNMP to query remote agent. (#12430) - Cupidazul

        Discovery

        Bug

        Cleanup

        Documentation

        Translation

        Tests

        Dependencies

        21.1.0

        (2021-02-02)

        A big thank you to the following 37 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Authentication

        Api

        Bug

        Documentation

        Tests

        Misc

        Dependencies


        Old Changelogs

        \ No newline at end of file + Changelog - LibreNMS Docs

        Changelog

        24.2.0

        (2024-02-27)

        A big thank you to the following 46 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Graphs

        • Fixed graphs for icmp service showing PL 4 times (#15856) - VoipTelCH
        • Socket Statistic Application cleanup and application page graph fixes. (#15845) - bnerickson

        Applications

        Billing

        • Updated bill_data table, alter indexes and add new column (#15751) - laf

        Api

        Settings

        Discovery

        • Fall back to IPV6-MIB IPv6 address discovery if IP-MIB IPv6 address discovery doesn't return any valid addresses (#15714) - gunkaaa

        Oxidized

        Bug

        Refactor

        Documentation

        Misc

        Mibs

        Dependencies

        24.1.0

        (2024-01-07)

        A big thank you to the following 37 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Device

        Webui

        Graphs

        Api

        Discovery

        • Set array before use to stop discovery erroring (#15604) - laf

        Authentication

        Bug

        Documentation

        Misc

        Internal Features

        Mibs

        Dependencies

        24.1.0

        (2024-01-07)

        A big thank you to the following 37 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Device

        Webui

        Graphs

        Api

        Discovery

        • Set array before use to stop discovery erroring (#15604) - laf

        Authentication

        Bug

        Documentation

        Misc

        Internal Features

        Mibs

        Dependencies

        23.11.0

        (2023-11-17)

        A big thank you to the following 37 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Breaking Change

        Security

        Device

        Webui

        • Device links formatting changes (#15580) - eskyuu
        • Only set user roles if they are defined (#15577) - murrant
        • Fix Down/Up time error if device is unpolled (#15545) - murrant
        • Fix health temperature degree display (#15541) - murrant
        • Fixed BGP Remote peer link and graph in Routing Overview, or just static text when not a device in LibreNMS (#15535) - tim427
        • Added BGP Remote peer link and graph in Routing Overview (#15532) - tim427
        • Respect web_mouseover setting in popup component (#15530) - murrant
        • Prefetch devices in group to avoid cost of subquery (#15511) - slalomsk8er

        Alerting

        Applications

        • [bugfix] Passing $device into data_update_helper functions instead of declaring it as global. (#15542) - bnerickson

        Api

        Discovery

        • UCD buffers and cache discovered with inverted free/used values (#15538) - murrant

        Polling

        Authentication

        Bug

        Cleanup

        Documentation

        Translation

        Misc

        • Update renamehost to include more logging if a folder already exists# (#15280) - jaannnis

        Internal Features

        Dependencies

        23.10.0

        (2023-10-26)

        A big thank you to the following 30 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Graphs

        Applications

        • Unix Agent and Application fixes (#15460) - murrant
        • Adding Socket Statistics Application Support (#15307) - bnerickson
        • Update docs for osupdate when being used as a script for the agent (#15099) - VVelox

        Api

        Settings

        Polling

        Bug

        Refactor

        Cleanup

        Documentation

        Translation

        Tests

        • Exclude availability module from default testing (#15462) - murrant

        Misc

        • Fixes check_dns against localhost when a search-domain is configured (#15373) - tim427
        • Added extra ASN-range comments, added Priv eBGP on host details, changed color to light-blue instead of red (#15372) - tim427

        Internal Features

        Dependencies

        23.9.0

        (2023-09-15)

        A big thank you to the following 16 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Applications

        • For the applications table set the defaults for app_instance and app_instance to '' (#15278) - VVelox
        • Application Soft Delete (#15270) - VVelox

        Api

        Settings

        • Add ui description for reporting dump_errors (#15264) - murrant

        Polling

        Authentication

        Bug

        Cleanup

        • Return an 5XX error when an exception is raise (#15285) - Pelt10

        Documentation

        • Note the package install command for dhcpd-pools for FreeBSD (#15247) - VVelox
        • Update severity colours in SNMP-Traps.md (#15244) - adamsweet

        Misc

        23.8.0

        (2023-08-19)

        A big thank you to the following 32 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        • Fix unsanitized input injection (#15184) - murrant
        • Fix some xss injection for sysLocation and some other fields (#15183) - murrant

        Device

        Webui

        Alerting

        Graphs

        • Fix Memmory spelling (#15231) - arjenz
        • Add generic stats graph munging support and make uptime display as days again (#15097) - VVelox

        Applications

        Billing

        • Fixed a zero value data insertion for billing (#15194) - laf
        • Updated poll-billing.php to only query for data via snmp when the device and port are both up (#15164) - laf
        • Added basic support for distributing billing (#15156) - laf

        Api

        Discovery

        Polling

        Authentication

        Bug

        Refactor

        Cleanup

        Documentation

        Tests

        Misc

        Internal Features

        Dependencies

        23.7.0

        (2023-07-16)

        A big thank you to the following 19 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Device

        Webui

        Alerting

        Applications

        Api

        • Adding human readable version of /api/v0/fdb/{mac}/detail (#15045) - sjtarik

        Discovery

        • Fix bogus reply from snmpwalk in ipNetToPhysicalPhysAddress (#15142) - PipoCanaja

        Polling

        Bug

        • Skip hostnames which are blank when generating the smokeping config (#15144) - laf
        • Change chunk to chunkById (#15139) - peejaychilds
        • Use lock ports_purge in ports_purge rather than syslog_purge lock (#15135) - peejaychilds
        • Fix validation: memcached required only if it is configured in .env (#15122) - tuxgasy
        • Exit non-zero if composer bin not found (#15120) - tuxgasy

        Documentation

        Translation

        Internal Features

        23.6.0

        (2023-06-23)

        A big thank you to the following 14 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        • Alert transport cleanup, no_proxy support and other proxy cleanups (#14763) - murrant

        Device

        Alerting

        Applications

        • Add ZFS L2 support (#15095) - VVelox
        • Add Linux Softnet Stat app (#15094) - VVelox
        • Add Sneck support, making it very trivial to use Nagios style checks in a NRPE like manner (#13954) - VVelox

        Bug

        • Fixes #14975 Services in Device Groups not displayed correctly in Availability widget (#15076) - ajsiersema
        • Fix Dusk tests after 13626 (#15057) - Jellyfrog

        Cleanup

        Documentation

        Mibs

        Dependencies

        23.5.0

        (2023-05-19)

        A big thank you to the following 37 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Graphs

        Applications

        Api

        Discovery

        Polling

        Bug

        Refactor

        Cleanup

        Documentation

        • Re-add the Ubuntu Image page and links (#15041) - laf
        • Remove references to VM images (#15031) - murrant
        • Updated WebUI config options in docs to support direct linking to installs (#15009) - laf
        • Fix spelling error in Graylog section (#15002) - dscw
        • Update OAuth-SAML.md to prevent http code 419 error (#15000) - fbouynot
        • Update Smokeping.md with better nginx config instructions (#14999) - alchemyx
        • Update Copyright year to 2023 in README.md (#14972) - otkd
        • Update Install-LibreNMS.md (#14949) - alchemyx

        Tests

        Mibs

        Dependencies

        23.5.0

        (2023-05-19)

        A big thank you to the following 37 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Graphs

        Applications

        Api

        Discovery

        Polling

        Bug

        Refactor

        Cleanup

        Documentation

        • Re-add the Ubuntu Image page and links (#15041) - laf
        • Remove references to VM images (#15031) - murrant
        • Updated WebUI config options in docs to support direct linking to installs (#15009) - laf
        • Fix spelling error in Graylog section (#15002) - dscw
        • Update OAuth-SAML.md to prevent http code 419 error (#15000) - fbouynot
        • Update Smokeping.md with better nginx config instructions (#14999) - alchemyx
        • Update Copyright year to 2023 in README.md (#14972) - otkd
        • Update Install-LibreNMS.md (#14949) - alchemyx

        Tests

        Misc

        Mibs

        Dependencies

        23.4.0

        (2023-04-06)

        A big thank you to the following 25 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Webui

        Alerting

        Graphs

        • Add graph_stat_percentile_disable config item to disable percentile lines/value printing (#14887) - VVelox
        • Convert NTP freq to use generic_stats (#14834) - VVelox
        • Update fail2ban to have better stat graphs and and fix generic_stats graph.php (#14818) - VVelox
        • Update various device graphs to to have better stats (#14815) - VVelox

        Applications

        Bug

        Cleanup

        Documentation

        • Fix typo in lnms device:add help (#14937) - arjenz
        • Add Azure example configuration for SAML authentication in documentation (#14870) - fbouynot

        Tests

        Misc

        Dependencies

        22.4.0

        (2023-04-06)

        A big thank you to the following 180 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Graphs

        Snmp Traps

        Applications

        Api

        Discovery

        Polling

        Rancid

        Oxidized

        • Show display name in Oxidized config search (#14800) - electrocret
        • Adding Fortigate switches to Oxidized model mapping config (#14782) - LoveSkylark
        • Fix oxidized web requests unclosed connections or responding fast enough (#14370) - fbouynot
        • Oxidized "allow purpose and notes" (#14352) - LoveSkylark
        • Syslog-notify-oxidized.php now always notifies Oxidized (#14011) - murrant
        • Fix Oxidized syslog change notifier when the change was made via snmp. (#14005) - kruczek8989
        • Oxidized API to return groups based on device purpose or notes (#13976) - sajiby3k

        Authentication

        Bug

        Refactor

        Cleanup

        Documentation

        Translation

        Tests

        Misc

        Internal Features

        Mibs

        Dependencies

        23.2.0

        (2023-02-23)

        A big thank you to the following 20 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Alerting

        Graphs

        • Update HV::Monitor support to use generic_stats.inc.php (#14814) - VVelox
        • Only show Eth errors when Etherlike is enabled (#14784) - electrocret

        Applications

        Api

        • Use Oxidized API client and add support for groups on config get (#14750) - electrocret

        Oxidized

        Bug

        Documentation

        Misc

        Dependencies

        23.1.0

        (2023-01-24)

        A big thank you to the following 19 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Device

        Oxidized

        Bug

        Documentation

        Translation

        Misc

        • Use displayname instead of hostname for Device Maintenance Modal Title (#14681) - electrocret

        Dependencies

        22.12.0

        (2022-12-28)

        A big thank you to the following 21 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Webui

        Alerting

        Graphs

        Applications

        • Update Nvidia application - values in wrong charts (#14736) - fcqpl
        • Removing max polling restriction for wireguard traffic RRD data (#14710) - bnerickson

        Api

        Discovery

        Polling

        Refactor

        Documentation

        Tests

        Misc

        Internal Features

        Mibs

        Dependencies

        22.11.0

        (2022-11-24)

        A big thank you to the following 40 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Graphs

        Snmp Traps

        Applications

        Api

        Discovery

        Polling

        • Don't poll sysDescr, sysObjectID, and sysName so frequently (#14562) - murrant
        • Add connection exception handling to all redis calls (#14467) - Frazew

        Authentication

        • Update Radius auth to accept permissions attributes (#14531) - kimhaak

        Bug

        Refactor

        Cleanup

        Documentation

        Tests

        Misc

        Internal Features

        Dependencies

        22.10.0

        (2022-10-17)

        A big thank you to the following 22 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Security

        Device

        Webui

        Alerting

        Snmp Traps

        • Improve LinkUp and LinkDown trap handling incomplete traps (#14385) - tuomari

        Applications

        Api

        Discovery

        Polling

        • Fix bgp-peers bgpPeerIface bug and update test data (#14420) - murrant

        Oxidized

        • Fix oxidized web requests unclosed connections or responding fast enough (#14370) - fbouynot

        Authentication

        Bug

        Refactor

        Cleanup

        Documentation

        Translation

        Tests

        Misc

        Dependencies

        22.9.0

        (2022-09-21)

        A big thank you to the following 19 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Graphs

        Api

        • Allow delete location by id (#14334) - bp0
        • API update_device, make location field work (as does location_id) (#14325) - bp0

        Polling

        Oxidized

        Bug

        Refactor

        • Cleanup and optimize the availability widget (#14329) - murrant

        Cleanup

        Documentation

        Tests

        Misc

        Dependencies

        22.8.0

        (2022-08-19)

        A big thank you to the following 26 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Webui

        Alerting

        • Correct logic for recurring alert rules that span UTC days (#14145) - gs-kamnas
        • Improvements to PagerDuty alert formatting (#14143) - gs-kamnas
        • Add rich (=html) support for messages via Matrix (#14054) - mwobst

        Graphs

        Applications

        Api

        • Standardize device and device group maintenance API (#14153) - rhinoau
        • Fix maintenance APIs not associating device or group (#14127) - murrant

        Discovery

        Polling

        Authentication

        Bug

        Refactor

        Documentation

        Translation

        Tests

        • Allow save-test-data.php to run all modules explicitely (#14212) - PipoCanaja
        • Increase OS detection time, sometimes it is not ready by 5s (#14133) - murrant

        22.7.0

        (2022-07-20)

        A big thank you to the following 21 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Security

        • Security fixes XSS in oxidized-cfg-check.inc.php and print-customoid.php (#14126) - enferas

        Device

        Webui

        Alerting

        Graphs

        Applications

        Polling

        Authentication

        Bug

        Cleanup

        Documentation

        • Small documentation typos (#14101) - wrongecho
        • Documentation typos (#14099) - wrongecho
        • Add SELinux configuration for SNMPd on Centos8 in the documentation (#14095) - fbouynot
        • Add SELinux configuration for LDAP/AD authentication on Centos8 in the documentation (#14094) - fbouynot
        • Add SELinux configuration for Smokeping on Centos8 in the documentation (#14093) - fbouynot
        • Add SELinux configuration for RRDCached on Centos8 in the documentation (#14092) - fbouynot
        • Corrected API devicegroup curl creation examples (#14081) - rhinoau
        • Minor grammar fixes in doc (#14078) - paulgear
        • Add documentation for Chrony application monitoring (#14066) - ottorei

        Translation

        Tests

        Misc

        Mibs

        Dependencies

        22.6.0

        (2022-06-14)

        A big thank you to the following 22 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        • Bumpver handlebars.js to 4.7.7 to resolve CVE-2021-23369 (#13990) - gs-kamnas

        Device

        Webui

        Alerting

        Applications

        Discovery

        • Fix printer count sensors when extra garbage is returned (#14014) - murrant

        Oxidized

        • Syslog-notify-oxidized.php now always notifies Oxidized (#14011) - murrant
        • Fix Oxidized syslog change notifier when the change was made via snmp. (#14005) - kruczek8989

        Authentication

        • Implement support for usernames coming from reverse proxies (#13894) - HolgerHees

        Bug

        Cleanup

        Documentation

        Tests

        • Fix tests failing when device with IP 127.1.6.1 exists (#14016) - murrant

        Misc

        Mibs

        Dependencies

        22.5.0

        (2022-05-21)

        A big thank you to the following 23 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Webui

        Alerting

        Graphs

        Applications

        • Remove alert keys from component for Suricata (#13959) - VVelox
        • Fix a few issues with variable names for Suricata (#13956) - VVelox
        • Scripts/json-app-tool.php JSON generation fix and add -S for SNMP extend name (#13948) - VVelox
        • Add Suricata monitoring (#13942) - VVelox

        Discovery

        • Fix polling and discovery of FortiGate cluster sensors (#13980) - mkuurstra

        Oxidized

        • Oxidized API to return groups based on device purpose or notes (#13976) - sajiby3k

        Authentication

        • Auth_ldap_skip_group_check when ldap_compare is not supported (#13926) - micko
        • Add LDAP bind and userlist filter support to ldap-authorization (#13788) - pfromme25

        Bug

        Refactor

        Documentation

        Translation

        Misc

        Dependencies

        22.4.0

        (2022-04-21)

        A big thank you to the following 27 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Snmp Traps

        • Add Cisco Err-Disable interface event trap handler (#13855) - bonzo81

        Api

        • Ensure 'add_device' API returns indexed-array (as per doco) (#13887) - claude191

        Polling

        Rancid

        Bug

        Refactor

        Cleanup

        • Better device:add error output (#13913) - murrant
        • Remove non-working Dell specific alert rules from the collection (#13706) - Fehler12

        Documentation

        Translation

        Dependencies

        22.3.0

        (2022-03-17)

        A big thank you to the following 22 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        • Resolved XSS issue from alert rule list modal (#13805) - laf

        Device

        Webui

        Alerting

        • Newer versions of Jira use HTTP code 201 fore created issues (#13852) - MrXermon
        • Add extra dynamic values alerttransport alertmanager (#13828) - geg347

        Snmp Traps

        Api

        Bug

        Refactor

        Tests

        Misc

        22.2.0

        (2022-02-16)

        A big thank you to the following 22 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Snmp Traps

        Discovery

        • Check for empty SLA tags so we skip bad entries (#13679) - laf

        Bug

        Refactor

        Cleanup

        Documentation

        Tests

        Misc

        Dependencies

        22.1.0

        (2022-01-23)

        A big thank you to the following 26 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Webui

        • [WebUI] Removing the colon symbol to the right of a control label (#13698) - ilGino
        • Remove unneccessary Section Description (#13677) - SourceDoctor
        • Device tracepath using wrong variables to check for traceroute output (#13674) - laf
        • Allow filter by display name in device list (#13665) - gdepeyrot
        • Sort Vlan Ports by ifName, ifDescr (#13657) - SourceDoctor
        • Fix horizontal scrollbar in device list always visible (#13653) - efelon

        Alerting

        Graphs

        Applications

        Api

        Polling

        • Added oids.no_bulk os setting (#13666) - Npeca75
        • Add consistent output of name and app_id to Poller for all Applications (fixes #13641) (#13648) - westerterp
        • Fix SnmpQuery bulk boolean backwards (#13636) - murrant

        Rancid

        Bug

        • Use PHP_BINARY directly instead of trying to build path to PHP binary (#13690) - Jellyfrog
        • Small text change for misspelled Virtual (#13686) - ilGino
        • Snmp timeout is a float, allow in config (#13676) - murrant
        • Fix NULL device alert caused by services (#13663) - k0079898
        • Disable VRP VLANs test, seems to be a bug in snmpsim snmpbulkwalk (#13649) - murrant
        • Remove extra rows with duplicate keys in SyncsModels trait (#13632) - murrant

        Documentation

        Translation

        • Fix settings language file to include Distributed Poller labels. (#13511) - thford89

        Dependencies

        21.12.0

        (2021-12-21)

        A big thank you to the following 30 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Graphs

        Snmp Traps

        Applications

        Billing

        Api

        • API 'list_parents_of_host' - mostly doco, but one small code enhancement (#13567) - claude191

        Discovery

        Polling

        Bug

        Refactor

        Cleanup

        Documentation

        Tests

        Mibs

        Dependencies

        21.11.0

        (2021-11-12)

        A big thank you to the following 49 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Alerting

        Graphs

        • Add missing graph definition for pf_matches (pfSense firewall) (#13507) - robje

        Snmp Traps

        Applications

        Api

        Discovery

        Polling

        Rancid

        Oxidized

        • Syslog hook examples and documentation for Procurve devices (#13397) - nq5

        Bug

        Refactor

        • Change how options are handled for SnmpQuery (#13488) - murrant
        • Rename concrete SnmpQuery class to avoid confusion (#13412) - murrant
        • Fully convert core to a modern module (#13347) - murrant
        • New plugin system based on Laravel Package Development (#12998) - mpikzink

        Cleanup

        Documentation

        Tests

        Dependencies

        21.10.0

        (2021-10-16)

        A big thank you to the following 21 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        • Use the same error message for different kind of authentiction errors (#13306) - Jellyfrog

        Device

        Webui

        Alerting

        Graphs

        Snmp Traps

        Api

        Settings

        Discovery

        Polling

        • Dispatcher bugfix queues not being disabled properly (#13364) - murrant
        • Fix for cimc polling on PHP8 (#13357) - murrant
        • Dispatch Service: Don't stop dispatching if master moves to a node with a queue disabled (#13355) - murrant
        • Fix device query when last_polled_timetaken is null (#13331) - murrant
        • Restore accidentally removed code (#13330) - murrant
        • Allow non-snmp modules to run when snmp disabled (#13321) - murrant
        • Fix python config fetch disrupted by stderr output (#13295) - murrant
        • Fix poller wrapper error (#13290) - murrant

        Oxidized

        Authentication

        • Improvements to SSO Authorization and logout handling (#13311) - gs-kamnas

        Bug

        Refactor

        Documentation

        Tests

        Dependencies

        21.9.0

        (2021-09-16)

        A big thank you to the following 20 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        • API alert transport can include Options variables in the Body for POST requests (#13167) - mzacchi
        • Show port speed on port graphs, optionally set scale (#11858) - murrant

        Device

        Webui

        Alerting

        Graphs

        • Change default graph view to zoom in on traffic. (#13173) - murrant

        Settings

        Discovery

        Polling

        Oxidized

        • Add sysobjectid and hardware fields into oxidized maps (#13221) - Negatifff

        Bug

        Refactor

        Documentation

        Misc

        21.8.0

        (2021-08-22)

        A big thank you to the following 40 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Webui

        Api

        Alerting

        • Add EU Service Region to PagerDuty transport (#13154) - ottorei
        • Fix HTML encoded characters in Slack (#13120) - geg347
        • Add SignalWire (Twilio alternative) alert transport support (#13107) - igorek24

        Discovery

        • Full Python code fusion / refactor and hardening (#13094) - deajan
        • Extend REGEX filtering option by sensor_class (#13066) - opalivan

        Oxidized

        Bug

        Documentation

        Translation

        Tests

        Misc

        Mibs

        Dependencies

        21.7.0

        (2021-07-16)

        A big thank you to the following 27 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Webui

        Api

        Discovery

        • Fix an issue which led to duplication of BGP peers. (#12932) - cjsoftuk

        Oxidized

        Bug

        Refactor

        Cleanup

        Documentation

        Misc

        Dependencies

        21.6.0

        (2021-06-17)

        A big thank you to the following 23 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        • New module add juniper rpm support + reimplementation of cisco-sla module (#12799) - geg347
        • ISIS-adjacency polling support (#12461) - ottorei

        Device

        Webui

        Authentication

        • Add number sign to special character handling in ActiveDirectoryAuthorizer (#12943) - paddy01

        Applications

        Api

        Alerting

        Discovery

        • LLDP - ifAlias should be last checked in function find_port_id (#12904) - PipoCanaja
        • LLDP - Extend discovery lldp code to support different subtypes (#12901) - PipoCanaja

        Polling

        Rancid

        Refactor

        Documentation

        21.5.0

        (2021-05-17)

        A big thank you to the following 28 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Graphs

        Applications

        Api

        Alerting

        Discovery

        • Ignore Wrong Type errors in snpm_get and snmp_get_multi_oid (#12800) - murrant
        • Discovery - Compute num_oid to make os development easier (#12576) - PipoCanaja

        Polling

        Bug

        Refactor

        Cleanup

        Documentation

        Tests

        Misc

        • Lnms dev:simulate Snmpsim debug output on failure (#12880) - murrant
        • Enable config:set to set variables inside a nested array of settings (#12772) - murrant

        Dependencies

        21.4.0

        (2021-04-17)

        A big thank you to the following 34 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Graphs

        Alerting

        Discovery

        Polling

        Bug

        Refactor

        Cleanup

        Documentation

        Tests

        Misc

        Dependencies

        21.3.0

        (2021-03-20)

        A big thank you to the following 27 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Device

        Webui

        Snmp Traps

        Applications

        Alerting

        Discovery

        • DynamicDiscovery - Guess num_oid if not provided in YAML file (#12570) - PipoCanaja
        • Fix location for devices with broken snmp (#12544) - murrant

        Oxidized

        Bug

        Refactor

        Documentation

        Tests

        Misc

        Dependencies

        21.2.0

        (2021-02-16)

        A big thank you to the following 18 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Authentication

        • Fixes issues with binding and authenticating users in nested groups (#12398) - paddy01

        Applications

        • Add poller feature for RRDCached SNMP to query remote agent. (#12430) - Cupidazul

        Discovery

        Bug

        Cleanup

        Documentation

        Translation

        Tests

        Dependencies

        21.1.0

        (2021-02-02)

        A big thank you to the following 37 contributors this last month:

        Thanks to maintainers and others that helped with pull requests this month:

        Feature

        Security

        Device

        Webui

        Authentication

        Api

        Bug

        Documentation

        Tests

        Misc

        Dependencies


        Old Changelogs

        \ No newline at end of file diff --git a/General/Releases/index.html b/General/Releases/index.html index c6919865..ead09376 100644 --- a/General/Releases/index.html +++ b/General/Releases/index.html @@ -1 +1 @@ - Choosing a release - LibreNMS Docs

        Choosing a release

        We try to ensure that breaking changes aren't introduced by utilising various automated code testing, syntax testing and unit testing along with manual code review. However bugs can and do get introduced as well as major refactoring to improve the quality of the code base.

        We have two branches available for you to use. The default is the master branch.

        Development branch

        Our master branch is our dev branch, this is actively commited to and it's not uncommon for multiple commits to be merged in daily. As such sometimes changes will be introduced which will cause unintended issues. If this happens we are usually quick to fix or revert those changes.

        We appreciate everyone that runs this branch as you are in essence secondary testers to the automation and manually testing that is done during the merge stages.

        You can configure your install (this is the default) to use this branch by setting lnms config:set update_channel master and ensuring you switch to the master branch with:

        cd /opt/librenms && git checkout master

        Stable branch

        With this in mind, we provide a monthly stable release which is released on or around the last Sunday of the month. Code pull requests (aside from Bug fixes) are stopped days leading up to the release to ensure that we have a clean working branch at that point.

        The changelog is also updated and will reference the release number and date so you can see what changes have been made since the last release.

        To switch to using stable branches you can set lnms config:set update_channel release

        This will pause updates until the next stable release, at that time LibreNMS will update to the stable release and continue to only update to stable releases. Downgrading is not supported on LibreNMS and will likely cause bugs.

        \ No newline at end of file + Choosing a release - LibreNMS Docs

        Choosing a release

        We try to ensure that breaking changes aren't introduced by utilising various automated code testing, syntax testing and unit testing along with manual code review. However bugs can and do get introduced as well as major refactoring to improve the quality of the code base.

        We have two branches available for you to use. The default is the master branch.

        Development branch

        Our master branch is our dev branch, this is actively commited to and it's not uncommon for multiple commits to be merged in daily. As such sometimes changes will be introduced which will cause unintended issues. If this happens we are usually quick to fix or revert those changes.

        We appreciate everyone that runs this branch as you are in essence secondary testers to the automation and manually testing that is done during the merge stages.

        You can configure your install (this is the default) to use this branch by setting lnms config:set update_channel master and ensuring you switch to the master branch with:

        cd /opt/librenms && git checkout master

        Stable branch

        With this in mind, we provide a monthly stable release which is released on or around the last Sunday of the month. Code pull requests (aside from Bug fixes) are stopped days leading up to the release to ensure that we have a clean working branch at that point.

        The changelog is also updated and will reference the release number and date so you can see what changes have been made since the last release.

        To switch to using stable branches you can set lnms config:set update_channel release

        This will pause updates until the next stable release, at that time LibreNMS will update to the stable release and continue to only update to stable releases. Downgrading is not supported on LibreNMS and will likely cause bugs.

        \ No newline at end of file diff --git a/General/Security/index.html b/General/Security/index.html index 58596a08..a836dba5 100644 --- a/General/Security/index.html +++ b/General/Security/index.html @@ -1 +1 @@ - Security information - LibreNMS Docs

        General

        Like any good software we take security seriously. However, bugs do make it into the software along with the history of the code base we inherited. It's how we deal with identified vulnerabilities that should show that we take things seriously.

        Securing your install

        As with any system of this nature, we highly recommend that you restrict access to the install via a firewall or VPN.

        Please ensure you keep your install up to date.

        Enable HTTPS

        It is also highly recommended that the Web interface is protected with an SSL certificate such as ones provided by LetsEncrypt.

        Secure Session Cookies

        Once you have enabled HTTPS for your install, you should set SESSION_SECURE_COOKIE=true in your .env file. This will require cookies to be transferred by secure protocol and prevent any MiM attacks against it.

        Trusted Proxies

        When using a reverse proxy, you may restrict the hosts allowed to forward headers to LibreNMS. By default this allows all proxies, due to legacy reasons.

        Set APP_TRUSTED_PROXIES in your .env to an empty string or the urls to the proxies allowed to forward.

        Reporting vulnerabilities

        Like anyone, we appreciate the work people put in to find flaws in software and welcome anyone to do so with LibreNMS, this will lead to better quality and more secure software for everyone.

        If you think you've found a vulnerability and want to discuss it with some of the core team then you can contact us on Discord and we will endeavour to get back to as quick as we can, this is usually within 24 hours.

        We are happy to attribute credit to the findings, but we ask that we're given a chance to patch any vulnerability before public disclosure so that our users can update as soon as a fix is available.

        \ No newline at end of file + Security information - LibreNMS Docs

        General

        Like any good software we take security seriously. However, bugs do make it into the software along with the history of the code base we inherited. It's how we deal with identified vulnerabilities that should show that we take things seriously.

        Securing your install

        As with any system of this nature, we highly recommend that you restrict access to the install via a firewall or VPN.

        Please ensure you keep your install up to date.

        Enable HTTPS

        It is also highly recommended that the Web interface is protected with an SSL certificate such as ones provided by LetsEncrypt.

        Secure Session Cookies

        Once you have enabled HTTPS for your install, you should set SESSION_SECURE_COOKIE=true in your .env file. This will require cookies to be transferred by secure protocol and prevent any MiM attacks against it.

        Trusted Proxies

        When using a reverse proxy, you may restrict the hosts allowed to forward headers to LibreNMS. By default this allows all proxies, due to legacy reasons.

        Set APP_TRUSTED_PROXIES in your .env to an empty string or the urls to the proxies allowed to forward.

        Reporting vulnerabilities

        Like anyone, we appreciate the work people put in to find flaws in software and welcome anyone to do so with LibreNMS, this will lead to better quality and more secure software for everyone.

        If you think you've found a vulnerability and want to discuss it with some of the core team then you can contact us on Discord and we will endeavour to get back to as quick as we can, this is usually within 24 hours.

        We are happy to attribute credit to the findings, but we ask that we're given a chance to patch any vulnerability before public disclosure so that our users can update as soon as a fix is available.

        \ No newline at end of file diff --git a/General/Updating/index.html b/General/Updating/index.html index 746387b6..f7c85aa5 100644 --- a/General/Updating/index.html +++ b/General/Updating/index.html @@ -1,4 +1,4 @@ - Updating - LibreNMS Docs

        Updating an Install

        By default, LibreNMS is set to automatically update. If you have disabled this feature then you can perform a manual update.

        Manual update

        If you would like to perform a manual update then you can do this by running the following command as the librenms user:

        ./daily.sh

        This will update both the core LibreNMS files but also update the database structure if updates are available.

        Advanced users

        If you absolutely must update manually without using ./daily.sh then you can do so by running the following commands:

        cd /opt/librenms
        + Updating - LibreNMS Docs       

        Updating an Install

        By default, LibreNMS is set to automatically update. If you have disabled this feature then you can perform a manual update.

        Manual update

        If you would like to perform a manual update then you can do this by running the following command as the librenms user:

        ./daily.sh

        This will update both the core LibreNMS files but also update the database structure if updates are available.

        Advanced users

        If you absolutely must update manually without using ./daily.sh then you can do so by running the following commands:

        cd /opt/librenms
         git pull
         ./scripts/composer_wrapper.php install --no-dev
         ./lnms migrate
        diff --git a/General/Welcome-to-Observium-users/index.html b/General/Welcome-to-Observium-users/index.html
        index 8dbfac4a..f4138237 100644
        --- a/General/Welcome-to-Observium-users/index.html
        +++ b/General/Welcome-to-Observium-users/index.html
        @@ -1 +1 @@
        - Welcome to Observium users - LibreNMS Docs      

        Welcome to Observium users

        LibreNMS is a fork of Observium. The reason for the fork has nothing to do with Observium's move to community vs. paid versions. It is simply that we have different priorities and values to the Observium development team. We decided to fork (reluctantly) because we like using Observium, but we want to collaborate on a community-based project with like-minded IT professionals. See README.md and the references there for more information about the kind of community we're trying to promote.

        LibreNMS was forked from the last GPL-licensed version of Observium.

        Thanks to one of our users, Dan Brown, who has written a migration script, you can easily move your Observium install over to LibreNMS. This also takes care of moving from one CPU architecture to another. Give it a try :)

        How LibreNMS will be different from Observium:

        • We will have an inclusive community, where it's OK to ask stupid questions, and OK to ask for things that aren't on the roadmap. If you'd like to see something added, add or comment on the relevant issue in our Community forum.
        • Development decisions will be community-driven. We want to make software that fulfills its users' needs.
        • There are no plans for a paid version, and we don't anticipate this ever changing.
        • There are no current plans for paid support, but this may be added later if there is sufficient demand.
        • We use git for version control and GitHub for hosting to make it as easy and painless as possible to create forked or private versions.

        Reasons why you might want to use Observium instead of LibreNMS:

        Reasons why you might want to use LibreNMS instead of Observium:

        \ No newline at end of file + Welcome to Observium users - LibreNMS Docs

        Welcome to Observium users

        LibreNMS is a fork of Observium. The reason for the fork has nothing to do with Observium's move to community vs. paid versions. It is simply that we have different priorities and values to the Observium development team. We decided to fork (reluctantly) because we like using Observium, but we want to collaborate on a community-based project with like-minded IT professionals. See README.md and the references there for more information about the kind of community we're trying to promote.

        LibreNMS was forked from the last GPL-licensed version of Observium.

        Thanks to one of our users, Dan Brown, who has written a migration script, you can easily move your Observium install over to LibreNMS. This also takes care of moving from one CPU architecture to another. Give it a try :)

        How LibreNMS will be different from Observium:

        • We will have an inclusive community, where it's OK to ask stupid questions, and OK to ask for things that aren't on the roadmap. If you'd like to see something added, add or comment on the relevant issue in our Community forum.
        • Development decisions will be community-driven. We want to make software that fulfills its users' needs.
        • There are no plans for a paid version, and we don't anticipate this ever changing.
        • There are no current plans for paid support, but this may be added later if there is sufficient demand.
        • We use git for version control and GitHub for hosting to make it as easy and painless as possible to create forked or private versions.

        Reasons why you might want to use Observium instead of LibreNMS:

        Reasons why you might want to use LibreNMS instead of Observium:

        \ No newline at end of file diff --git a/Installation/Docker/index.html b/Installation/Docker/index.html index fb8d30e8..0aa03130 100644 --- a/Installation/Docker/index.html +++ b/Installation/Docker/index.html @@ -1,4 +1,4 @@ - Docker - LibreNMS Docs

        Docker

        An official LibreNMS docker image based on Alpine Linux and Nginx is available on DockerHub.

        Documentation

        Full install and configuration documentation can be found on the GitHub repository.

        Quick install

        1. Install docker: https://docs.docker.com/engine/install/
        2. Download and unzip composer files:
          mkdir librenms
          + Docker - LibreNMS Docs       

          Docker

          An official LibreNMS docker image based on Alpine Linux and Nginx is available on DockerHub.

          Documentation

          Full install and configuration documentation can be found on the GitHub repository.

          Quick install

          1. Install docker: https://docs.docker.com/engine/install/
          2. Download and unzip composer files:
            mkdir librenms
             cd librenms
             wget https://github.com/librenms/docker/archive/refs/heads/master.zip
             unzip master.zip
            diff --git a/Installation/Images/index.html b/Installation/Images/index.html
            index 44e27f3e..8d15161c 100644
            --- a/Installation/Images/index.html
            +++ b/Installation/Images/index.html
            @@ -1 +1 @@
            - Virtual machines - LibreNMS Docs       

            LibreNMS VMs

            NOTE: We highly advise that you change all passwords on this image when you deploy it!!

            NOTE: These images ship with a vagrant user, please remove this user account when you deploy it!!

            NOTE: Read the above note again!

            We have available for download a pre-built image based on Ubuntu 22.04. These images are built using packer.io.

            Details of the image and it's setup are:

            At present we provide the following builds:

            • OVA Built with VirtualBox.
            • OVA Built for VMWare ESXi.
            • Vagrant Box file.

            • Any issues and or help with these images should be reported via Community Forum or our Discord server

            Setup

            • US Keyboard
            • Etc/UTC Timezone
            • 4 Poller Wrapper threads

            Software

            • PHP 8.1
            • MariaDB
            • Syslog-ng

            Features

            • Oxidized installed but not configured
            • Weathermap plugin enabled
            • Billing enabled
            • RRDCached enabled
            • Service checks enabled
            • Syslog enabled

            Download

            All images can be downloaded from GitHub. The tags follow the main LibreNMS repo. When a new LibreNMS release is available we will push new images out running that version. Please do note that if you download an older release with a view to running that specific version, you will need to disable updates lnms config:set update false.

            Access/Credentials

            If you are using the VirtualBox image then to access your newly imported VM, these ports are forwarded from your machine to the VM: 8080 for WebUI and 2023 for SSH. Remember to edit/remove them if you change (and you should) the VM network configuration.

            • WebUI (http://localhost)
            • username: librenms
            • password: D32fwefwef

            • SSH (change the password ssh://localhost:2023)

            • username: librenms
            • password: CDne3fwdfds

            • SSH (remove this account)

            • username: vagrant
            • password; vagrant

            • MySQL/MariaDB

            • username: librenms
            • password: D42nf23rewD

            Contributing

            If you would like to help with these images whether it's add additional features or default software / settings then you can do so on GitHub.

            \ No newline at end of file + Virtual machines - LibreNMS Docs

            LibreNMS VMs

            NOTE: We highly advise that you change all passwords on this image when you deploy it!!

            NOTE: These images ship with a vagrant user, please remove this user account when you deploy it!!

            NOTE: Read the above note again!

            We have available for download a pre-built image based on Ubuntu 22.04. These images are built using packer.io.

            Details of the image and it's setup are:

            At present we provide the following builds:

            • OVA Built with VirtualBox.
            • OVA Built for VMWare ESXi.
            • Vagrant Box file.

            • Any issues and or help with these images should be reported via Community Forum or our Discord server

            Setup

            • US Keyboard
            • Etc/UTC Timezone
            • 4 Poller Wrapper threads

            Software

            • PHP 8.1
            • MariaDB
            • Syslog-ng

            Features

            • Oxidized installed but not configured
            • Weathermap plugin enabled
            • Billing enabled
            • RRDCached enabled
            • Service checks enabled
            • Syslog enabled

            Download

            All images can be downloaded from GitHub. The tags follow the main LibreNMS repo. When a new LibreNMS release is available we will push new images out running that version. Please do note that if you download an older release with a view to running that specific version, you will need to disable updates lnms config:set update false.

            Access/Credentials

            If you are using the VirtualBox image then to access your newly imported VM, these ports are forwarded from your machine to the VM: 8080 for WebUI and 2023 for SSH. Remember to edit/remove them if you change (and you should) the VM network configuration.

            • WebUI (http://localhost)
            • username: librenms
            • password: D32fwefwef

            • SSH (change the password ssh://localhost:2023)

            • username: librenms
            • password: CDne3fwdfds

            • SSH (remove this account)

            • username: vagrant
            • password; vagrant

            • MySQL/MariaDB

            • username: librenms
            • password: D42nf23rewD

            Contributing

            If you would like to help with these images whether it's add additional features or default software / settings then you can do so on GitHub.

            \ No newline at end of file diff --git a/Installation/Install-LibreNMS/index.html b/Installation/Install-LibreNMS/index.html index b2cf22ae..3450a9e9 100644 --- a/Installation/Install-LibreNMS/index.html +++ b/Installation/Install-LibreNMS/index.html @@ -1,4 +1,4 @@ - Installing LibreNMS - LibreNMS Docs

            Install LibreNMS

            Prepare Linux Server

            You should have an installed Linux server running one of the supported OS. Make sure you select your server's OS in the tabbed options below. Choice of web server is your preference, NGINX is recommended.

            Connect to the server command line and follow the instructions below.

            Note

            These instructions assume you are the root user.
            If you are not, prepend sudo to the shell commands (the ones that aren't at mysql> prompts) or temporarily become a user with root privileges with sudo -s or sudo -i.

            Please note the minimum supported PHP version is 8.1

            Install Required Packages

            apt install acl curl fping git graphviz imagemagick mariadb-client mariadb-server mtr-tiny nginx-full nmap php-cli php-curl php-fpm php-gd php-gmp php-json php-mbstring php-mysql php-snmp php-xml php-zip rrdtool snmp snmpd unzip python3-pymysql python3-dotenv python3-redis python3-setuptools python3-systemd python3-pip whois traceroute
            + Installing LibreNMS - LibreNMS Docs       

            Install LibreNMS

            Prepare Linux Server

            You should have an installed Linux server running one of the supported OS. Make sure you select your server's OS in the tabbed options below. Choice of web server is your preference, NGINX is recommended.

            Connect to the server command line and follow the instructions below.

            Note

            These instructions assume you are the root user.
            If you are not, prepend sudo to the shell commands (the ones that aren't at mysql> prompts) or temporarily become a user with root privileges with sudo -s or sudo -i.

            Please note the minimum supported PHP version is 8.1

            Install Required Packages

            apt install acl curl fping git graphviz imagemagick mariadb-client mariadb-server mtr-tiny nginx-full nmap php-cli php-curl php-fpm php-gd php-gmp php-json php-mbstring php-mysql php-snmp php-xml php-zip rrdtool snmp snmpd unzip python3-pymysql python3-dotenv python3-redis python3-setuptools python3-systemd python3-pip whois traceroute
             
            apt install software-properties-common
             add-apt-repository universe
             add-apt-repository ppa:ondrej/php
            diff --git a/Installation/Migrating-from-Observium/index.html b/Installation/Migrating-from-Observium/index.html
            index f3a935ef..b8e735c5 100644
            --- a/Installation/Migrating-from-Observium/index.html
            +++ b/Installation/Migrating-from-Observium/index.html
            @@ -1 +1 @@
            - Migrating from Observium - LibreNMS Docs       

            A LibreNMS user, Dan, has kindly provided full details and scripts to be able to migrate from Observium to LibreNMS.

            We have mirrored the scripts he's provided with consent, these are available in the scripts\Migration folder of your installation..

            Setup:

            First I had to lay out my script requirements:

            • Build the RRD directories on LibreNMS
            • Convert the RRD files on Observium to XML (x86 to x64 move)
            • Copy the RRD/XML files to LibreNMS
            • Convert the XML files back to RRD files
            • Add the device to LibreNMS

            Script:

            There are two versions of the scripts available for you to download: - One converts the RRDs to XML and then back to RRD files when they hit the destination. This is a requirement if you are moving from x86 to x64. - Assuming you’re moving servers that are on the same architecture, we can skip that step and just SCP the original RRD files.

            For everything to work as originally intended, you’ll need four files. Put all four files on both servers, the scripts default to /tmp/:

            • nodelist.txt – this file contains the list of hosts you would like to move. This must match exactly to the hostname Observium uses
            • mkdir.sh – this script creates the necessary directories on your LibreNMS server
            • destwork.sh – depending on the version you choose, this script will add the device to LibreNMS and possibly convert from XML to RRD
            • convert.sh – convert is the main script we’ll be calling. All of the magic happens here.

            Feel free to crack open the scripts and modify them to suit you. Each file has a handful of variables you’ll need to set for your conversion. They should be self-explanatory, but please leave a comment if you have trouble.

            Conversion:

            This section assumes the following:

            • Root access is available on both servers
            • You have SSH access to both servers
            • All four files have been placed in the tmp directory of both servers

            I would strongly suggest you start with just one or two hosts and see how things work. For me, 10 standard sized devices took about 20 minutes with the RRD to XML conversion. Every environment will be different, so start slow and work your way up to full automation.

            SSH Keys

            First thing we will want to do is exchange SSH keys so that we can automate the login process used by the scripts. Perform these steps on your Observium server:

            ssh-keygen -t rsa

            Accept the defaults and enter a passphrase if you wish. Then:

            ssh-copy-id librenms

            Where librenms is the hostname or IP of your destination server.

            Nodelist.txt

            The nodelist.txt file contains a list of hosts we want to migrate from Observium. These names must match the name of the RRD folder on Observium. You can get those names by running the following –

            ls /opt/observium/rrd/

            Also important, the nodelist.txt file must be on both your Observium and LibreNMS server. Once you have your list, edit nodelist.txt with nano:

            nano /tmp/nodelist.txt

            And replace the dummy data with the hosts you are converting. CTRL+X and then Y to save your modifications. Make the same changes on the LibreNMS server.

            Script Variables

            Now that we have nodelist.txt setup correctly, it is time to set the variables in all three shell scripts. We are going to start with convert.sh. Edit it with nano:

            nano /tmp/convert.sh

            and change the variables to suit your environment. Here is a quick list of them:

            • DEST – This should be the IP or hostname of your LibreNMS server
            • L_RRDPATH – This signifies the location of the LibreNMS RRD directory. The default value is the default install location
            • O_RRDPATH – Location of the Observium RRD directory. The default value is the default install location
            • MKDIR – Location of the mkdir.sh script
            • DESTSCRIPT – Location of the destwork.sh script
            • NODELIST – Location of the nodelist.txt file

            Next, edit the destwork.sh script:

            nano /tmp/destwork.sh

            \ No newline at end of file + Migrating from Observium - LibreNMS Docs

            A LibreNMS user, Dan, has kindly provided full details and scripts to be able to migrate from Observium to LibreNMS.

            We have mirrored the scripts he's provided with consent, these are available in the scripts\Migration folder of your installation..

            Setup:

            First I had to lay out my script requirements:

            • Build the RRD directories on LibreNMS
            • Convert the RRD files on Observium to XML (x86 to x64 move)
            • Copy the RRD/XML files to LibreNMS
            • Convert the XML files back to RRD files
            • Add the device to LibreNMS

            Script:

            There are two versions of the scripts available for you to download: - One converts the RRDs to XML and then back to RRD files when they hit the destination. This is a requirement if you are moving from x86 to x64. - Assuming you’re moving servers that are on the same architecture, we can skip that step and just SCP the original RRD files.

            For everything to work as originally intended, you’ll need four files. Put all four files on both servers, the scripts default to /tmp/:

            • nodelist.txt – this file contains the list of hosts you would like to move. This must match exactly to the hostname Observium uses
            • mkdir.sh – this script creates the necessary directories on your LibreNMS server
            • destwork.sh – depending on the version you choose, this script will add the device to LibreNMS and possibly convert from XML to RRD
            • convert.sh – convert is the main script we’ll be calling. All of the magic happens here.

            Feel free to crack open the scripts and modify them to suit you. Each file has a handful of variables you’ll need to set for your conversion. They should be self-explanatory, but please leave a comment if you have trouble.

            Conversion:

            This section assumes the following:

            • Root access is available on both servers
            • You have SSH access to both servers
            • All four files have been placed in the tmp directory of both servers

            I would strongly suggest you start with just one or two hosts and see how things work. For me, 10 standard sized devices took about 20 minutes with the RRD to XML conversion. Every environment will be different, so start slow and work your way up to full automation.

            SSH Keys

            First thing we will want to do is exchange SSH keys so that we can automate the login process used by the scripts. Perform these steps on your Observium server:

            ssh-keygen -t rsa

            Accept the defaults and enter a passphrase if you wish. Then:

            ssh-copy-id librenms

            Where librenms is the hostname or IP of your destination server.

            Nodelist.txt

            The nodelist.txt file contains a list of hosts we want to migrate from Observium. These names must match the name of the RRD folder on Observium. You can get those names by running the following –

            ls /opt/observium/rrd/

            Also important, the nodelist.txt file must be on both your Observium and LibreNMS server. Once you have your list, edit nodelist.txt with nano:

            nano /tmp/nodelist.txt

            And replace the dummy data with the hosts you are converting. CTRL+X and then Y to save your modifications. Make the same changes on the LibreNMS server.

            Script Variables

            Now that we have nodelist.txt setup correctly, it is time to set the variables in all three shell scripts. We are going to start with convert.sh. Edit it with nano:

            nano /tmp/convert.sh

            and change the variables to suit your environment. Here is a quick list of them:

            • DEST – This should be the IP or hostname of your LibreNMS server
            • L_RRDPATH – This signifies the location of the LibreNMS RRD directory. The default value is the default install location
            • O_RRDPATH – Location of the Observium RRD directory. The default value is the default install location
            • MKDIR – Location of the mkdir.sh script
            • DESTSCRIPT – Location of the destwork.sh script
            • NODELIST – Location of the nodelist.txt file

            Next, edit the destwork.sh script:

            nano /tmp/destwork.sh

            \ No newline at end of file diff --git a/Support/1-Minute-Polling/index.html b/Support/1-Minute-Polling/index.html index ce95811d..37d169aa 100644 --- a/Support/1-Minute-Polling/index.html +++ b/Support/1-Minute-Polling/index.html @@ -1 +1 @@ - 1 Minute Polling - LibreNMS Docs

            1-Minute Polling

            We now have support for polling data at intervals to fit your needs.

            Please be aware of the following:

            • If you just want faster up/down alerts, Fast Ping is a much easier path to that goal.
            • You must also change your cron entry for poller-wrapper.py for this to work (if you change from the default 300 seconds).
            • Your polling MUST complete in the time you configure for the heartbeat step value. See /poller in your WebUI for your current value.
            • This will only affect RRD files created from the moment you change your settings.
            • This change will affect all data storage mechanisms such as MySQL, RRD and InfluxDB. If you decrease the values then please be aware of the increase in space use for MySQL and InfluxDB.
            • It's highly recommended to configure some performance optimizations. Keep in mind that all your devices will write all graphs every minute to the disk and that every device has many graphs. The most important thing is probably the RRDCached configuration that can save a lot of write IOPS.

            To make the changes, please navigate to /settings/poller/rrdtool/ within your WebUI. Select RRDTool Setup and then update the two values for step and heartbeat intervals:

            • Step is how often you want to insert data, so if you change to 1 minute polling then this should be 60.
            • Heartbeat is how long to wait for data before registering a null value, i.e 120 seconds.

            Converting existing RRD files

            We provide a basic script to convert the default rrd files we generate to utilise your configured step and heartbeat values. Please do ensure that you backup your RRD files before running this just in case. The script runs on a per device basis or all devices at once.

            The rrd files must be accessible from the server you run this script from.

            ./scripts/rrdstep.php

            This will provide the help information. To run it for localhost just run:

            ./scripts/rrdstep.php -h localhost

            \ No newline at end of file + 1 Minute Polling - LibreNMS Docs

            1-Minute Polling

            We now have support for polling data at intervals to fit your needs.

            Please be aware of the following:

            • If you just want faster up/down alerts, Fast Ping is a much easier path to that goal.
            • You must also change your cron entry for poller-wrapper.py for this to work (if you change from the default 300 seconds).
            • Your polling MUST complete in the time you configure for the heartbeat step value. See /poller in your WebUI for your current value.
            • This will only affect RRD files created from the moment you change your settings.
            • This change will affect all data storage mechanisms such as MySQL, RRD and InfluxDB. If you decrease the values then please be aware of the increase in space use for MySQL and InfluxDB.
            • It's highly recommended to configure some performance optimizations. Keep in mind that all your devices will write all graphs every minute to the disk and that every device has many graphs. The most important thing is probably the RRDCached configuration that can save a lot of write IOPS.

            To make the changes, please navigate to /settings/poller/rrdtool/ within your WebUI. Select RRDTool Setup and then update the two values for step and heartbeat intervals:

            • Step is how often you want to insert data, so if you change to 1 minute polling then this should be 60.
            • Heartbeat is how long to wait for data before registering a null value, i.e 120 seconds.

            Converting existing RRD files

            We provide a basic script to convert the default rrd files we generate to utilise your configured step and heartbeat values. Please do ensure that you backup your RRD files before running this just in case. The script runs on a per device basis or all devices at once.

            The rrd files must be accessible from the server you run this script from.

            ./scripts/rrdstep.php

            This will provide the help information. To run it for localhost just run:

            ./scripts/rrdstep.php -h localhost

            \ No newline at end of file diff --git a/Support/Adding-a-Device/index.html b/Support/Adding-a-Device/index.html index 7f59f547..43f726f8 100644 --- a/Support/Adding-a-Device/index.html +++ b/Support/Adding-a-Device/index.html @@ -1,3 +1,3 @@ - Adding a device - LibreNMS Docs

            Adding Device

            You have two options for adding a new device into LibreNMS. You can add a device via the cli or by using the WebUI.

            Via WebUI

            Using the web interface, go to Devices and click Add Device. Enter the details required for the device that you want to add and then click 'Add Host'. As an example, if your device is configured to use the community my_company using snmp v2c then you would enter: SNMP Port defaults to 161.

            By default Hostname will be used for polling data. If you want to get polling Device data via a specific IP-Address (e.g. Management IP) fill out the optional field Overwrite IP with it's IP-Address.

            Add device

            Via CLI

            Using the command line via ssh you can add a new device by changing to the directory of your LibreNMS install and typing (be sure to put the correct details).

            ./lnms device:add yourhostname [--v1|--v2c] [-c yourSNMPcommunity]
            + Adding a device - LibreNMS Docs       

            Adding Device

            You have two options for adding a new device into LibreNMS. You can add a device via the cli or by using the WebUI.

            Via WebUI

            Using the web interface, go to Devices and click Add Device. Enter the details required for the device that you want to add and then click 'Add Host'. As an example, if your device is configured to use the community my_company using snmp v2c then you would enter: SNMP Port defaults to 161.

            By default Hostname will be used for polling data. If you want to get polling Device data via a specific IP-Address (e.g. Management IP) fill out the optional field Overwrite IP with it's IP-Address.

            Add device

            Via CLI

            Using the command line via ssh you can add a new device by changing to the directory of your LibreNMS install and typing (be sure to put the correct details).

            ./lnms device:add yourhostname [--v1|--v2c] [-c yourSNMPcommunity]
             

            You can use ./lnms device:add --help for a list of available options and defaults.

            As an example, if your device with the name mydevice.example.com is configured to use the community my_company using snmp v2c then you would enter:

            ./lnms device:add --v2c -c my_company mydevice.example.com
             

            Please note that if the community contains special characters such as $ then you will need to wrap it in '. I.e: 'Pa$$w0rd'.

            Ping Only Device

            You can add ping only devices into LibreNMS through the WebUI or CLI. When adding the device switch the SNMP button to "off". Device will be added into LibreNMS as Ping Only Device and will show ICMP Response Graph.

            • Hostname: IP address or DNS name.
            • Hardware: Optional you can type in whatever you like.
            • OS: Optional this will add the Device's OS Icon.

            Via CLI this is done with ./lnms device:add [-P|--ping-only] yourhostname

            Ping Only

            A How-to video can be found here: How to add ping only devices

            Automatic Discovery and API

            If you would like to add devices automatically then you will probably want to read the Auto-discovery Setup guide.

            You may also want to add devices programmatically, if so, take a look at our API documentation

            \ No newline at end of file diff --git a/Support/Bare-Dashboard/index.html b/Support/Bare-Dashboard/index.html index 2144b6c2..ed0ae74e 100644 --- a/Support/Bare-Dashboard/index.html +++ b/Support/Bare-Dashboard/index.html @@ -1 +1 @@ - Bare Dashboard - LibreNMS Docs

            Bare Dashboard

            Settings to assist with wall/monitor displays.

            Hide Menubar

            To hide Menubar e.g. for Monitoring TV Screens attach ?bare=yes on URL

            No Search Fields in Dashboard Widgets

            To hide Search Field in Dashboard Widgets take a look into Widget Settings.

            \ No newline at end of file + Bare Dashboard - LibreNMS Docs

            Bare Dashboard

            Settings to assist with wall/monitor displays.

            Hide Menubar

            To hide Menubar e.g. for Monitoring TV Screens attach ?bare=yes on URL

            No Search Fields in Dashboard Widgets

            To hide Search Field in Dashboard Widgets take a look into Widget Settings.

            \ No newline at end of file diff --git a/Support/CLI-Tools/index.html b/Support/CLI-Tools/index.html index 8afe5dfd..046d471c 100644 --- a/Support/CLI-Tools/index.html +++ b/Support/CLI-Tools/index.html @@ -1,4 +1,4 @@ - CLI Scripts - LibreNMS Docs

            Command line tools

            Here's a brief list of command line tools, some might be missing. If you think something is missing, feel free to ask us or send a pull request :-)

            purge-ports.php

            This script provides CLI access to the "delete port" function of the WebUI. This might come in handy when trying to clean up old ports after large changes within the network or when hacking on the poller/discovery functions.

            LibreNMS Port purge tool
            + CLI Scripts - LibreNMS Docs       

            Command line tools

            Here's a brief list of command line tools, some might be missing. If you think something is missing, feel free to ask us or send a pull request :-)

            purge-ports.php

            This script provides CLI access to the "delete port" function of the WebUI. This might come in handy when trying to clean up old ports after large changes within the network or when hacking on the poller/discovery functions.

            LibreNMS Port purge tool
             -p port_id  Purge single port by it's port-id
             -f file     Purge a list of ports, read port-ids from _file_, one on each line
                         A filename of - means reading from STDIN.
            diff --git a/Support/Cleanup-options/index.html b/Support/Cleanup-options/index.html
            index fdf42a72..f71959b3 100644
            --- a/Support/Cleanup-options/index.html
            +++ b/Support/Cleanup-options/index.html
            @@ -1,4 +1,4 @@
            - Cleanup Options - LibreNMS Docs       

            Cleanup Options

            As the number of devices starts to grow in your LibreNMS install, so will things such as the RRD files, MySQL database containing eventlogs, Syslogs and performance data etc. Your LibreNMS install could become quite large so it becomes necessary to clean up those entries. With Cleanup Options, you can stay in control.

            These options rely on daily.sh running from cron as per the installation instructions.

            system/cleanup

            lnms config:set eventlog_purge 30
            + Cleanup Options - LibreNMS Docs       

            Cleanup Options

            As the number of devices starts to grow in your LibreNMS install, so will things such as the RRD files, MySQL database containing eventlogs, Syslogs and performance data etc. Your LibreNMS install could become quite large so it becomes necessary to clean up those entries. With Cleanup Options, you can stay in control.

            These options rely on daily.sh running from cron as per the installation instructions.

            system/cleanup

            lnms config:set eventlog_purge 30
             lnms config:set syslog_purge 30
             lnms config:set route_purge 10
             lnms config:set alert_log_purge 365
            diff --git a/Support/Configuration/index.html b/Support/Configuration/index.html
            index 509a5fb3..f169b4d6 100644
            --- a/Support/Configuration/index.html
            +++ b/Support/Configuration/index.html
            @@ -1,4 +1,4 @@
            - Configuration Docs - LibreNMS Docs       

            Configuration Docs

            LibreNMS configuration is a set of key values.

            The config is stored in two places: Database: This applies to all pollers and can be set with either lnms config:set or in the Web UI. Database config takes precedence over config.php. config.php: This applies to the local poller only. Configs set here will be disabled in the Web UI to prevent unexpected behaviour.

            The LibreNMS uses dot notation for config items:

            Database config.php
            snmp.community $config['snmp']['community']
            snmp.community.+ $config['snmp']['community'][]
            snmp.v3.0.authalgo $config['snmp']['v3'][0]['authalgo']

            The documentation has not been updated to reflect using lnms config:set to set config items, but it will work for all settings. Not all settings have been defined in LibreNMS, but they can still be set with the --ignore-checks option. Without that option input is checked for correctness, that does not mean it is not possible to set bad values. Please report missing settings.

            CLI

            lnms config:get will fetch the current config settings (composite of database, config.php, and defaults).
            lnms config:set will set the config setting in the database. Calling lnms config:set on a setting with no value will reset it to the default value.

            If you set up bash completion, you can use tab completion to find config settings.

            Getting a list of all current values

            To get a complete list of all the current values, you can use the command lnms config:get --dump. The output may not be desirable, so you can use the jq package to pretty print it. Then it would be lnms config:get --dump | jq.

            Example output:

            librenms@librenms:~$ lnms config:get --dump | jq 
            + Configuration Docs - LibreNMS Docs       

            Configuration Docs

            LibreNMS configuration is a set of key values.

            The config is stored in two places: Database: This applies to all pollers and can be set with either lnms config:set or in the Web UI. Database config takes precedence over config.php. config.php: This applies to the local poller only. Configs set here will be disabled in the Web UI to prevent unexpected behaviour.

            The LibreNMS uses dot notation for config items:

            Database config.php
            snmp.community $config['snmp']['community']
            snmp.community.+ $config['snmp']['community'][]
            snmp.v3.0.authalgo $config['snmp']['v3'][0]['authalgo']

            The documentation has not been updated to reflect using lnms config:set to set config items, but it will work for all settings. Not all settings have been defined in LibreNMS, but they can still be set with the --ignore-checks option. Without that option input is checked for correctness, that does not mean it is not possible to set bad values. Please report missing settings.

            CLI

            lnms config:get will fetch the current config settings (composite of database, config.php, and defaults).
            lnms config:set will set the config setting in the database. Calling lnms config:set on a setting with no value will reset it to the default value.

            If you set up bash completion, you can use tab completion to find config settings.

            Getting a list of all current values

            To get a complete list of all the current values, you can use the command lnms config:get --dump. The output may not be desirable, so you can use the jq package to pretty print it. Then it would be lnms config:get --dump | jq.

            Example output:

            librenms@librenms:~$ lnms config:get --dump | jq 
             {
               "install_dir": "/opt/librenms",
               "active_directory": {
            diff --git a/Support/Device-Notes/AsuswrtMerlin/index.html b/Support/Device-Notes/AsuswrtMerlin/index.html
            index bd535e1c..069a566a 100644
            --- a/Support/Device-Notes/AsuswrtMerlin/index.html
            +++ b/Support/Device-Notes/AsuswrtMerlin/index.html
            @@ -1,4 +1,4 @@
            - Asuswrt-Merlin - LibreNMS Docs       

            To use Wireless Sensors on AsuswrtMerlin, an agent of sorts is required. The purpose of the agent is to execute on the client (AsuswrtMerlin) side, to ensure that the needed Wireless Sensor information is returned for SNMP queries (from LibreNMS).

            Installation

            AsuswrtMerlin

            Two items are required on the AsuswrtMerlin side - scripts to generate the necessary information (for SNMP replies), and an SNMP extend configuration update (to return the information vs. the expected query).

            1: Install the scripts:

            Copy the scripts from librenms-agent/snmp/Openwrt - preferably inside /etc/librenms on AsuswrtMerlin (and add this directory to /etc/sysupgrade.conf, to survive firmware updates).

            The only file that needs to be edited is wlInterfaces.txt, which is a mapping from the wireless interfaces, to the desired display name in LibreNMS. For example,

            wlan0,wl-2.4G
            + Asuswrt-Merlin - LibreNMS Docs       

            To use Wireless Sensors on AsuswrtMerlin, an agent of sorts is required. The purpose of the agent is to execute on the client (AsuswrtMerlin) side, to ensure that the needed Wireless Sensor information is returned for SNMP queries (from LibreNMS).

            Installation

            AsuswrtMerlin

            Two items are required on the AsuswrtMerlin side - scripts to generate the necessary information (for SNMP replies), and an SNMP extend configuration update (to return the information vs. the expected query).

            1: Install the scripts:

            Copy the scripts from librenms-agent/snmp/Openwrt - preferably inside /etc/librenms on AsuswrtMerlin (and add this directory to /etc/sysupgrade.conf, to survive firmware updates).

            The only file that needs to be edited is wlInterfaces.txt, which is a mapping from the wireless interfaces, to the desired display name in LibreNMS. For example,

            wlan0,wl-2.4G
             wlan1,wl-5.0G
             

            2: Update the AsuswrtMerlin SNMP configuration, adding extend support for the Wireless Sensor queries:

            vi /etc/config/snmpd, adding the following entries (assuming the scripts are installed in /etc/librenms, and are executable), and update the network interfaces as needed to match the hardware,

            config extend
                     option name     interfaces
            diff --git a/Support/Device-Notes/Carel-pCOweb-Devices/index.html b/Support/Device-Notes/Carel-pCOweb-Devices/index.html
            index b0a185fc..2ff66830 100644
            --- a/Support/Device-Notes/Carel-pCOweb-Devices/index.html
            +++ b/Support/Device-Notes/Carel-pCOweb-Devices/index.html
            @@ -1 +1 @@
            - Carel pCOweb - LibreNMS Docs       

            Carel pCOweb Devices

            The pCOWeb card is used to interface the pCO system to networks that use the HVAC protocols based on the Ethernet physical standard such as SNMP. The problem with this card is that the implementation is based on the final manufacturer of the HVAC (Heating, Ventilation and Air Conditioning) and not based on a standard given by Carel. So each pCOweb card has a different configuration that needs a different MIB depending on the manufacturers implementation.

            The main problem is that LibreNMS will by default discover this card as pCOweb and not as your real manufacturer like it should. A solution was found to bypass this issue, but it's LibreNMS independent and you need to first configure your pCOWeb through the admin interface.

            Accessing the pCOWeb card

            Log on to the configuration page of the pCOWeb card. The pCOWeb interface is not always found when accessing the ip directly but rather a subdirectory. If you cant directly reach the configuration page try <ip address>/config. The default username and password is admin/fadmin. Modern browsers require you to enter this 2 or 3 times.

            Configuring the pCOweb card SNMP for LibreNMS

            First you need to configure your SNMP card using the admin interface. An SNMP tab in the configuration menu leaves you the choice to choose a System OID and a Enterprise OID. This is a little tricky but based on this information we defined a "standard" for all implementation of Carel products with LibreNMS.

            pCOweb

            The base Carel OID is 1.3.6.1.4.1.9839. To this OID we will add the final manufacturer Enterprise OID. You can find all enterprise OID following this link. This will allow us to create a specific support for this device. Librenms uses this value to detect which HVAC device is connected to the pCOWeb card.

            Example for the Rittal IT Chiller that uses a pCOweb card:

            1. Base Carel OID : 1.3.6.1.4.1.9839
            2. Rittal (the manufacturer) base enterprise OID : 2606
            3. Adding value to identify this device in LibreNMS : 1
            4. Complete System OID for a Rittal Chiller using a Carel pCOweb card: 1.3.6.1.4.1.9839.2606.1
            5. Use 9839 as Enterprise OID

            The way this works is that the pCOWeb card pretends to be another device. In reality the pCOWeb card just inserts the "enterprise OID" in place of the vendor id in the OID.

            In the table below you can find the values needed for devices which are already supported.

            Supported devices

            LibreNMS is ready for the devices listed in this table. You only need to configure your pCOweb card with the accorded System OID and Enterprise OID:

            Manufacturer Description System OID Enterprise OID
            Rittal IT Chiller 1.3.6.1.4.1.9839.2606.1 9839
            Rittal LCP DX 3311 1.3.6.1.4.1.9839.2606.3311 9839.2606

            Unsupported devices

            After constructing the correct System OID for your SNMP card, you can start the LibreNMS new OS implementation and use this new OID as sysObjectID for the YAML definition file.

            \ No newline at end of file + Carel pCOweb - LibreNMS Docs

            Carel pCOweb Devices

            The pCOWeb card is used to interface the pCO system to networks that use the HVAC protocols based on the Ethernet physical standard such as SNMP. The problem with this card is that the implementation is based on the final manufacturer of the HVAC (Heating, Ventilation and Air Conditioning) and not based on a standard given by Carel. So each pCOweb card has a different configuration that needs a different MIB depending on the manufacturers implementation.

            The main problem is that LibreNMS will by default discover this card as pCOweb and not as your real manufacturer like it should. A solution was found to bypass this issue, but it's LibreNMS independent and you need to first configure your pCOWeb through the admin interface.

            Accessing the pCOWeb card

            Log on to the configuration page of the pCOWeb card. The pCOWeb interface is not always found when accessing the ip directly but rather a subdirectory. If you cant directly reach the configuration page try <ip address>/config. The default username and password is admin/fadmin. Modern browsers require you to enter this 2 or 3 times.

            Configuring the pCOweb card SNMP for LibreNMS

            First you need to configure your SNMP card using the admin interface. An SNMP tab in the configuration menu leaves you the choice to choose a System OID and a Enterprise OID. This is a little tricky but based on this information we defined a "standard" for all implementation of Carel products with LibreNMS.

            pCOweb

            The base Carel OID is 1.3.6.1.4.1.9839. To this OID we will add the final manufacturer Enterprise OID. You can find all enterprise OID following this link. This will allow us to create a specific support for this device. Librenms uses this value to detect which HVAC device is connected to the pCOWeb card.

            Example for the Rittal IT Chiller that uses a pCOweb card:

            1. Base Carel OID : 1.3.6.1.4.1.9839
            2. Rittal (the manufacturer) base enterprise OID : 2606
            3. Adding value to identify this device in LibreNMS : 1
            4. Complete System OID for a Rittal Chiller using a Carel pCOweb card: 1.3.6.1.4.1.9839.2606.1
            5. Use 9839 as Enterprise OID

            The way this works is that the pCOWeb card pretends to be another device. In reality the pCOWeb card just inserts the "enterprise OID" in place of the vendor id in the OID.

            In the table below you can find the values needed for devices which are already supported.

            Supported devices

            LibreNMS is ready for the devices listed in this table. You only need to configure your pCOweb card with the accorded System OID and Enterprise OID:

            Manufacturer Description System OID Enterprise OID
            Rittal IT Chiller 1.3.6.1.4.1.9839.2606.1 9839
            Rittal LCP DX 3311 1.3.6.1.4.1.9839.2606.3311 9839.2606

            Unsupported devices

            After constructing the correct System OID for your SNMP card, you can start the LibreNMS new OS implementation and use this new OID as sysObjectID for the YAML definition file.

            \ No newline at end of file diff --git a/Support/Device-Notes/Openwrt/index.html b/Support/Device-Notes/Openwrt/index.html index 8cb7129d..25c8efdc 100644 --- a/Support/Device-Notes/Openwrt/index.html +++ b/Support/Device-Notes/Openwrt/index.html @@ -1,4 +1,4 @@ - OpenWRT - LibreNMS Docs

            To use Wireless Sensors on Openwrt, an agent of sorts is required. The purpose of the agent is to execute on the client (Openwrt) side, to ensure that the needed Wireless Sensor information is returned for SNMP queries (from LibreNMS).

            Installation

            Openwrt

            Two items are required on the Openwrt side - scripts to generate the necessary information (for SNMP replies), and an SNMP extend configuration update (to return the information vs. the expected query).

            1: Install the scripts:

            Copy the scripts from librenms-agent repository - preferably inside /etc/librenms on Openwrt (and add this directory to /etc/sysupgrade.conf, to survive firmware updates):

            wget -O /etc/librenms/wlClients.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlClients.sh
            + OpenWRT - LibreNMS Docs       

            To use Wireless Sensors on Openwrt, an agent of sorts is required. The purpose of the agent is to execute on the client (Openwrt) side, to ensure that the needed Wireless Sensor information is returned for SNMP queries (from LibreNMS).

            Installation

            Openwrt

            Two items are required on the Openwrt side - scripts to generate the necessary information (for SNMP replies), and an SNMP extend configuration update (to return the information vs. the expected query).

            1: Install the scripts:

            Copy the scripts from librenms-agent repository - preferably inside /etc/librenms on Openwrt (and add this directory to /etc/sysupgrade.conf, to survive firmware updates):

            wget -O /etc/librenms/wlClients.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlClients.sh
             wget -O /etc/librenms/wlFrequency.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlFrequency.sh
             wget -O /etc/librenms/wlInterfaces.txt https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlInterfaces.txt
             wget -O /etc/librenms/wlNoiseFloor.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlNoiseFloor.sh
            diff --git a/Support/Device-Notes/Routeros/index.html b/Support/Device-Notes/Routeros/index.html
            index 91c70c1b..4a3ef6cf 100644
            --- a/Support/Device-Notes/Routeros/index.html
            +++ b/Support/Device-Notes/Routeros/index.html
            @@ -1 +1 @@
            - RouterOS - LibreNMS Docs       

            RouterOS

            This agent script will allow LibreNMS to run a script on a Mikrotik / RouterOS device to gather the vlan information from both /interface/vlan/ and /interface/bridge/vlan/

            Installation

            • Go to https://github.com/librenms/librenms-agent/tree/master/snmp/Routeros
            • Copy and paste the contents of LNMS_vlans.scr file into a script within a RouterOS device. Name this script LNMS_vlans. (This is NOT the same thing as creating a txt file and importing it into the Files section of the device)
            • If you're unsure how to create the script. Download the LNMS_vlans.scr file. Rename to remove the .scr extension. Copy this file onto all the Mikrotik devices you want to monitor.
            • Open a Terminal / CLI on each tik and run this. { :global txtContent [/file get LNMS_vlans contents]; /system/script/add name=LNMS_vlans owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=$txtContent ;} This will import the contents of that txt file into a script named LNMS_vlans
            • Enable an SNMP community that has both READ and WRITE capabilities. This is important, otherwise, LibreNMS will not be able to run the above script. It is recommended to use SNMP v3 for this.
            • Discover / Force rediscover your Mikrotik devices. After discovery has been completed the vlans menu should appear within LibreNMS for the device.

            IMPORTANT NOTE

            It is strongly recommended that SNMP service only be allowed to be communicated on a very limited set of IP addresses that LibreNMS and related systems will be coming from. (usually /32 address for each) because the write permission could allow an attack on a device. (such as dropping all firewall filters or changing the admin credentials)

            Theory of operation:

            Mikrotik vlan discovery plugin using the ability of ROS to "fire up" a script through SNMP.

            At first, LibreNMS check for the existence of the script, and if it is present, it will start the LNMS_vlans script.

            The script will gather information from: - /interface/bridge/vlan for tagged ports inside bridge - /interface/bridge/vlan for currently untagged ports inside bridge - /interface/bridge/port for ports PVID (untagged) inside bridge - /interface/vlan for vlan interfaces

            after the information is gathered, it is transmitted to LibreNMS over SNMP

            protocol is: type,vlanId,ifName

            i.e: T,254,ether1 is translated to Tagged vlan 254 on port ether1

            U,100,wlan2 is translated to Untagged vlan 100 on port wlan2

            \ No newline at end of file + RouterOS - LibreNMS Docs

            RouterOS

            This agent script will allow LibreNMS to run a script on a Mikrotik / RouterOS device to gather the vlan information from both /interface/vlan/ and /interface/bridge/vlan/

            Installation

            • Go to https://github.com/librenms/librenms-agent/tree/master/snmp/Routeros
            • Copy and paste the contents of LNMS_vlans.scr file into a script within a RouterOS device. Name this script LNMS_vlans. (This is NOT the same thing as creating a txt file and importing it into the Files section of the device)
            • If you're unsure how to create the script. Download the LNMS_vlans.scr file. Rename to remove the .scr extension. Copy this file onto all the Mikrotik devices you want to monitor.
            • Open a Terminal / CLI on each tik and run this. { :global txtContent [/file get LNMS_vlans contents]; /system/script/add name=LNMS_vlans owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=$txtContent ;} This will import the contents of that txt file into a script named LNMS_vlans
            • Enable an SNMP community that has both READ and WRITE capabilities. This is important, otherwise, LibreNMS will not be able to run the above script. It is recommended to use SNMP v3 for this.
            • Discover / Force rediscover your Mikrotik devices. After discovery has been completed the vlans menu should appear within LibreNMS for the device.

            IMPORTANT NOTE

            It is strongly recommended that SNMP service only be allowed to be communicated on a very limited set of IP addresses that LibreNMS and related systems will be coming from. (usually /32 address for each) because the write permission could allow an attack on a device. (such as dropping all firewall filters or changing the admin credentials)

            Theory of operation:

            Mikrotik vlan discovery plugin using the ability of ROS to "fire up" a script through SNMP.

            At first, LibreNMS check for the existence of the script, and if it is present, it will start the LNMS_vlans script.

            The script will gather information from: - /interface/bridge/vlan for tagged ports inside bridge - /interface/bridge/vlan for currently untagged ports inside bridge - /interface/bridge/port for ports PVID (untagged) inside bridge - /interface/vlan for vlan interfaces

            after the information is gathered, it is transmitted to LibreNMS over SNMP

            protocol is: type,vlanId,ifName

            i.e: T,254,ether1 is translated to Tagged vlan 254 on port ether1

            U,100,wlan2 is translated to Untagged vlan 100 on port wlan2

            \ No newline at end of file diff --git a/Support/Device-Sensors/index.html b/Support/Device-Sensors/index.html index 20b40101..2b28d52d 100644 --- a/Support/Device-Sensors/index.html +++ b/Support/Device-Sensors/index.html @@ -1,4 +1,4 @@ - Device Sensors - LibreNMS Docs

            Device Sensors

            LibreNMS has a standard for device sensors they are split into categories. This doc is to help users understand device sensors in general, if you need help with developing sensors for a device please see the Contributing + Developing section.

            Health Sensors

            The High and Low values of these sensors can be edited in Web UI by going to the device settings -> Health. There you can set your own custom High and Low values. List of these sensors can be found here Link

            Note Some values are defined by the manufactures and others are auto calculated when you add the device into librenms. Keep in mind every environment is different and may require user input.

            Wireless Sensors

            Some Wireless have High and Low values of these sensors can be edited in Web UI by going to the device settings -> Wireless Sensors There you can set your own custom High and Low values. List of these sensors can be found here Link

            Note Some values are defined by the manufactures and others are auto calculated when you add the device into librenms. Keep in mind every environment is different and may require user input.

            State Sensors

            Return states of device entries sensors states. For example.

            Drive Status, Memory Status, Power Supply Status.

            0 = OK
            + Device Sensors - LibreNMS Docs       

            Device Sensors

            LibreNMS has a standard for device sensors they are split into categories. This doc is to help users understand device sensors in general, if you need help with developing sensors for a device please see the Contributing + Developing section.

            Health Sensors

            The High and Low values of these sensors can be edited in Web UI by going to the device settings -> Health. There you can set your own custom High and Low values. List of these sensors can be found here Link

            Note Some values are defined by the manufactures and others are auto calculated when you add the device into librenms. Keep in mind every environment is different and may require user input.

            Wireless Sensors

            Some Wireless have High and Low values of these sensors can be edited in Web UI by going to the device settings -> Wireless Sensors There you can set your own custom High and Low values. List of these sensors can be found here Link

            Note Some values are defined by the manufactures and others are auto calculated when you add the device into librenms. Keep in mind every environment is different and may require user input.

            State Sensors

            Return states of device entries sensors states. For example.

            Drive Status, Memory Status, Power Supply Status.

            0 = OK
             1 = Warning
             2 = Critical
             3 = Unknown
            diff --git a/Support/Device-Troubleshooting/index.html b/Support/Device-Troubleshooting/index.html
            index 6d8225a3..647dbbc7 100644
            --- a/Support/Device-Troubleshooting/index.html
            +++ b/Support/Device-Troubleshooting/index.html
            @@ -1 +1 @@
            - Device Troubleshooting - LibreNMS Docs       

            Capture Debug Information

            You can use this feature to run Debug on Discovery, Poller, SNMP, Alerts. This output information could be helpful for you in troubleshooting a device or when requesting help.

            This feature can be found by going to the device that you are troubleshooting in the webui, clicking on the settings icon menu on far right and selecting Capture. Capture-Debug-Icon

            Discovery

            Discovery will run and output debug information.

            Poller

            Poller will run and output debug information.

            SNMP

            SNMP will run SNMP Bulk Walk on the device and output the information.

            Alerts

            Alerts Capture is handy when you are creating alerts and need to see if your alert rule matches.

            device-troubleshooting

            \ No newline at end of file + Device Troubleshooting - LibreNMS Docs

            Capture Debug Information

            You can use this feature to run Debug on Discovery, Poller, SNMP, Alerts. This output information could be helpful for you in troubleshooting a device or when requesting help.

            This feature can be found by going to the device that you are troubleshooting in the webui, clicking on the settings icon menu on far right and selecting Capture. Capture-Debug-Icon

            Discovery

            Discovery will run and output debug information.

            Poller

            Poller will run and output debug information.

            SNMP

            SNMP will run SNMP Bulk Walk on the device and output the information.

            Alerts

            Alerts Capture is handy when you are creating alerts and need to see if your alert rule matches.

            device-troubleshooting

            \ No newline at end of file diff --git a/Support/Discovery Support/index.html b/Support/Discovery Support/index.html index dbfd676e..67a3a3e7 100644 --- a/Support/Discovery Support/index.html +++ b/Support/Discovery Support/index.html @@ -1,4 +1,4 @@ - Discovery Support - LibreNMS Docs

            discovery.php

            This document will explain how to use discovery.php to debug issues or manually running to process data.

            Command options

            -h <device id> | <device hostname wildcard>  Poll single device
            + Discovery Support - LibreNMS Docs       

            discovery.php

            This document will explain how to use discovery.php to debug issues or manually running to process data.

            Command options

            -h <device id> | <device hostname wildcard>  Poll single device
             -h odd                                       Poll odd numbered devices  (same as -i 2 -n 0)
             -h even                                      Poll even numbered devices (same as -i 2 -n 1)
             -h all                                       Poll all devices
            diff --git a/Support/Environment-Variables/index.html b/Support/Environment-Variables/index.html
            index 68344e3d..ec1e9734 100644
            --- a/Support/Environment-Variables/index.html
            +++ b/Support/Environment-Variables/index.html
            @@ -1,4 +1,4 @@
            - Environment Variables - LibreNMS Docs       

            Environment Variables

            LibreNMS allows certain settings to be set via the environment or through the .env file.

            Database

            Set the variables to connect to the database. The default values are shown below.

            DB_HOST=localhost
            + Environment Variables - LibreNMS Docs       

            Environment Variables

            LibreNMS allows certain settings to be set via the environment or through the .env file.

            Database

            Set the variables to connect to the database. The default values are shown below.

            DB_HOST=localhost
             DB_PORT=3306
             DB_DATABASE=librenms
             DB_USERNAME=librenms
            diff --git a/Support/Example-Hardware-Setup/index.html b/Support/Example-Hardware-Setup/index.html
            index 26b93ebe..1d3a9292 100644
            --- a/Support/Example-Hardware-Setup/index.html
            +++ b/Support/Example-Hardware-Setup/index.html
            @@ -1,4 +1,4 @@
            - Example Hardware Setups - LibreNMS Docs       

            Example hardware setups

            The information in this document is direct from users, it's a place for people to share their setups so you have an idea of what may be required for your install.

            To obtain the device, port and sensor counts you can run:

            select count(*) from devices;
            + Example Hardware Setups - LibreNMS Docs       

            Example hardware setups

            The information in this document is direct from users, it's a place for people to share their setups so you have an idea of what may be required for your install.

            To obtain the device, port and sensor counts you can run:

            select count(*) from devices;
             select count(*) from ports where `deleted` = 0;
             select count(*) from sensors where `sensor_deleted` = 0;
             

            laf

            Home

            Running in Proxmox.

            LibreNMS MySQL
            Type Virtual Virtual
            OS CentOS 7 CentOS 7
            CPU 2 Sockets, 4 Cores 1 Socket, 2 Cores
            Memory 2GB 2GB
            Disk Type Raid 1, SSD Raid 1, SSD
            Disk Space 18GB 30GB
            Devices 20 -
            Ports 133 -
            Health sensors 47 -
            Load < 0.1 < 0.1

            Vente-Privée

            NOC

            LibreNMS MariaDB
            Type Dell R430 Dell R430
            OS Debian 7 (dotdeb) Debian 7 (dotdeb)
            CPU 2 Sockets, 14 Cores 1 Socket, 2 Cores
            Memory 256GB 256GB
            Disk Type Raid 10, SSD Raid 10, SSD
            Disk Space 1TB 1TB
            Devices 1028 -
            Ports 26745 -
            Health sensors 6238 -
            Load < 0.5 < 0.5

            KKrumm

            Home

            LibreNMS MySQL
            Type VM Same Server
            OS CentOS 7
            CPU 2 Sockets, 4 Cores
            Memory 4GB
            Disk Type Raid 10, SAS Drives
            Disk Space 40 GB
            Devices 12
            Ports 130
            Health sensors 44
            Load < 2.5

            KKrumm

            Work

            LibreNMS MySQL
            Type HP Proliantdl380gen8 Same Server
            OS CentOS 7
            CPU 2 Sockets, 24 Cores
            Memory 32GB
            Disk Type Raid 10, SAS Drives
            Disk Space 250 GB
            Devices 390
            Ports 16167
            Health sensors 3223
            Load < 14.5

            CppMonkey(KodApa85)

            Home

            LibreNMS MariaDB
            Type i5-4690K Same Workstation
            OS Ubuntu 18.04.2
            CPU 4 Cores
            Memory 16GB
            Disk Type Hybrid SATA
            Disk Space 2 TB
            Devices 14
            Ports 0
            Health sensors 70
            Load < 0.5

            CppMonkey(KodApa85)

            Dev

            Running in Ganeti

            LibreNMS MariaDB
            Type VM Same VM
            OS CentOS 7.5
            CPU 2 Cores
            Memory 4GB
            Disk Type M.2
            Disk Space 40 GB
            Devices 38
            Ports 1583
            Health sensors 884
            Load < 1.0

            CppMonkey(KodApa85)

            Work NOC

            Running in Ganeti Cluster with 2x Dell PER730xd - 64GB, Dual E5-2660 v3

            LibreNMS MariaDB
            Type VM VM
            OS Debian Stretch Debian Stretch
            CPU 4 Cores 2 Cores
            Memory 8GB 4GB
            Disk Type Raid 6, SAS Drives
            Disk Space 100 GB 40GB
            Devices 179
            Ports 14495
            Health sensors 2329
            Load < 2.5 < 1.5

            LaZyDK

            Home

            LibreNMS MariaDB
            Type VM - QNAP TS-453 Pro Same Server
            OS Ubuntu 16.04
            CPU 1 vCore
            Memory 2GB
            Disk Type Raid 1, SATA Drives
            Disk Space 10 GB
            Devices 26
            Ports 228
            Health sensors 117
            Load < 0.92

            SirMaple

            Home

            LibreNMS MariaDB
            Type VM Same Server
            OS Debian 11
            CPU 4 vCore
            Memory 4GB
            Disk Type Raid 1, SSD
            Disk Space 50 GB
            Devices 41
            Ports 317
            Health sensors 243
            Load < 3.15

            VVelox

            Home / Dev

            LibreNMS MariaDB
            Type Supermicro X7SPA-HF Same Server
            OS FreeBSD 12-STABLE
            CPU Intel Atom D525
            Memory 4GB
            Disk Type Raid 1, SATA
            Disk Space 1TB
            Devices 17
            Ports 174
            Health sensors 76
            Load < 3

            SourceDoctor

            Home / Dev

            Running in VMWare Workstation Pro

            LibreNMS MariaDB
            Type VM Same Server
            OS Debian Buster
            CPU 2 vCore
            Memory 2GB
            Disk Type Raid 5, SSD
            Disk Space 20GB
            Devices 35
            Ports 245
            Health sensors 101
            Load < 1

            lazyb0nes

            Lab

            LibreNMS MariaDB
            Type VM Same Server
            OS RHEL 7.7
            CPU 32 cores
            Memory 64GB
            Disk Type Flash San Array
            Disk Space 400GB
            Devices 670
            Ports 25678
            Health sensors 2457
            Load 10.92

            dagb

            Work

            Running in VMware.

            LibreNMS MariaDB
            Type Virtual Same Server
            OS CentOS 7
            CPU 12 Cores Xeon 6130
            Memory 8GB
            Disk Type SAN (SSD)
            Disk Space 26GB/72GB/7GB (logs/RRDs/db)
            Devices 650
            Ports 34300
            Health sensors 10500
            Load 5.5 (45%)
            \ No newline at end of file diff --git a/Support/FAQ/index.html b/Support/FAQ/index.html index 355d1e41..66c10644 100644 --- a/Support/FAQ/index.html +++ b/Support/FAQ/index.html @@ -1,4 +1,4 @@ - FAQ - LibreNMS Docs

            FAQ

            Getting started

            How do I install LibreNMS?

            This is currently well documented within the doc folder of the installation files.

            Please see the following doc

            How do I add a device?

            You have two options for adding a new device into LibreNMS.

            1: Using the command line via ssh you can add a new device by changing to the directory of your LibreNMS install and typing:

            lnms device:add [hostname or ip]
            + FAQ - LibreNMS Docs       

            FAQ

            Getting started

            How do I install LibreNMS?

            This is currently well documented within the doc folder of the installation files.

            Please see the following doc

            How do I add a device?

            You have two options for adding a new device into LibreNMS.

            1: Using the command line via ssh you can add a new device by changing to the directory of your LibreNMS install and typing:

            lnms device:add [hostname or ip]
             

            To see all options run: lnms device:add -h

            Please note that if the community contains special characters such as $ then you will need to wrap it in '. I.e: 'Pa$$w0rd'.

            2: Using the web interface, go to Devices and then Add Device. Enter the details required for the device that you want to add and then click 'Add Host'.

            How do I get help?

            Getting Help

            What are the supported OSes for installing LibreNMS on?

            Supported is quite a strong word :) The 'officially' supported distros are:

            • Ubuntu / Debian
            • Red Hat / CentOS
            • Gentoo

            However we will always aim to help wherever possible so if you are running a distro that isn't one of the above then give it a try anyway and if you need help then jump on the discord server.

            Do you have a demo available?

            We do indeed, you can find access to the demo here

            Support

            How does LibreNMS use MIBs?

            LibreNMS does not parse MIBs to discover sensors for devices. LibreNMS uses static discovery definitions written in YAML or PHP. Therefore, updating a MIB alone will not improve OS support, the definitions must be updated. LibreNMS only uses MIBs to make OIDs easier to read.

            Why do I get blank pages sometimes in the WebUI?

            You can enable debug information by setting APP_DEBUG=true in your .env. (Do not leave this enabled, it could leak private data)

            If the page you are trying to load has a substantial amount of data in it then it could be that the php memory limit needs to be increased in config.php.

            Why do I not see any graphs?

            The easiest way to check if all is well is to run ./validate.php as librenms from within your install directory. This should give you info on why things aren't working.

            One other reason could be a restricted snmpd.conf file or snmp view which limits the data sent back. If you use net-snmp then we suggest using the included snmpd.conf file.

            How do I debug pages not loading correctly?

            A debug system is in place which enables you to see the output from php errors, warnings and notices along with the MySQL queries that have been run for that page.

            You can enable debug information by setting APP_DEBUG=true in your .env. (Do not leave this enabled, it could leak private data) To see additional information, run ./scripts/composer_wrapper.php install, to install additional debug tools. This will add a debug bar at the bottom of every page that will show you detailed debug information.

            How do I debug the discovery process?

            Please see the Discovery Support document for further details.

            How do I debug the poller process?

            Please see the Poller Support document for further details.

            Why do I get a lot apache or rrdtool zombies in my process list?

            If this is related to your web service for LibreNMS then this has been tracked down to an issue within php which the developers aren't fixing. We have implemented a work around which means you shouldn't be seeing this. If you are, please report this in issue 443.

            Why do I see traffic spikes in my graphs?

            This occurs either when a counter resets or the device sends back bogus data making it look like a counter reset. We have enabled support for setting a maximum value for rrd files for ports.

            Before this all rrd files were set to 100G max values, now you can enable support to limit this to the actual port speed.

            rrdtool tune will change the max value when the interface speed is detected as being changed (min value will be set for anything 10M or over) or when you run the included script (./scripts/tune_port.php) - see RRDTune doc

            SNMP ifInOctets and ifOutOctets are counters, which means they start at 0 (at device boot) and count up from there. LibreNMS records the value every 5 minutes and uses the difference between the previous value and the current value to calculate rate. (Also, this value resets to 0 when it hits the max value)

            Now, when the value is not recorded for awhile RRD (our time series storage) does not record a 0, it records the last value, otherwise, there would be even worse problems. Then finally we get the current ifIn/OutOctets value and record that. Now, it appears as though all of the traffic since it stopped getting values have occurred in the last 5 minute interval.

            So whenever you see spikes like this, it means we have not received data from the device for several polling intervals. The cause can vary quite a bit: bad snmp implementations, intermittent network connectivity, broken poller, and more.

            Why do I see gaps in my graphs?

            This is most commonly due to the poller not being able to complete it's run within 300 seconds. Check which devices are causing this by going to /poll-log/ within the Web interface.

            When you find the device(s) which are taking the longest you can then look at the Polling module graph under Graphs -> Poller -> Poller Modules Performance. Take a look at what modules are taking the longest and disabled un used modules.

            If you poll a large number of devices / ports then it's recommended to run a local recursive dns server such as pdns-recursor.

            Running RRDCached is also highly advised in larger installs but has benefits no matter the size.

            How do I change the IP / hostname of a device?

            There is a host rename tool called renamehost.php in your librenms root directory. When renaming you are also changing the device's IP / hostname address for monitoring.

            Usage:

            ./renamehost.php <old hostname> <new hostname>
             

            You can also rename a device in the Web UI by going to the device, then clicking settings Icon -> Edit.

            My device doesn't finish polling within 300 seconds

            We have a few things you can try:

            • Disable unnecessary polling modules under edit device.
            • Set a max repeater value within the snmp settings for a device. What to set this to is tricky, you really should run an snmpbulkwalk with -Cr10 through -Cr50 to see what works best. 50 is usually a good choice if the device can cope.

            Things aren't working correctly?

            Run ./validate.php as librenms from within your install.

            Re-run ./validate.php once you've resolved any issues raised.

            You have an odd issue - we'd suggest you join our discord server to discuss.

            What do the values mean in my graphs?

            The values you see are reported as metric values. Thanks to a post on Reddit here are those values:

            10^-18  a - atto
             10^-15  f - femto
            diff --git a/Support/Features/index.html b/Support/Features/index.html
            index ee3d6469..9fbf3d71 100644
            --- a/Support/Features/index.html
            +++ b/Support/Features/index.html
            @@ -1 +1 @@
            - Features - LibreNMS Docs       

            Features

            Here's a brief list of supported features, some might be missing. If you think something is missing, feel free to ask us.

            • Auto discovery
            • Alerting
            • Multiple environment sensors support
            • Multiple protocols data collection (STP, OSPF, BGP etc)
            • VLAN, ARP and FDB table collection
            • Customizable Dashboards
            • Device Backup integration (Oxidized, RANCID)
            • Distributed Polling
            • Multiple Authentication Methods (MySQL, LDAP, Active Directory, HTTP)
            • NetFlow, sFlow, IPFIX (NfSen)
            • Service monitoring (Nagios Plugins)
            • Syslog (Integrated, Graylog)
            • Traffic Billing (Quota, 95th Percentile)
            • Two Factor Authentication
            • API
            • Auto Updating

            Supported Vendors

            Here's a list of supported vendors, some might be missing. If you are unsure of whether your device is supported or not, feel free to ask us.

            3

            • 3Com

            A

            • A10 Networks
            • Acano OS
            • Accedian AEN
            • Adtran AOS
            • ADVA FSP150CC
            • ADVA FSP3000 R7
            • ADVA OptiSwitch
            • Advantech
            • Aerohive HiveOS
            • Airconsole Server
            • AIX
            • AKCP SensorProbe
            • Alcatel OmniPCX
            • Alcatel-Lucent Enterprise Stellar Wireless OS (AWOS)
            • Alcatel-Lucent OS
            • Alcoma
            • ALGCOM DC UPS
            • Allied Telesis Wireless (TQ)
            • Alliedware
            • Alliedware Plus
            • Allworx VoIP
            • Alpha Comp@s
            • Alpha CXC HP Controller
            • Alpha FXM
            • Alpine OptoElectronics TDCM-EDFA platform
            • AlteonOS
            • Alvarion Breeze
            • Anue
            • AnyOS
            • APC Environmental Monitoring Unit
            • APC ePDU
            • APC Management Module
            • APC MGE UPS
            • Apex Lynx
            • Apex Plus
            • Apple AirPort
            • Apple OS X
            • Aprisa
            • ApsoluteOS
            • ArbOS
            • Areca RAID Subsystem
            • Arista EOS
            • Arista MOS
            • Array Networks
            • Arris Apex
            • Arris CMTS
            • Arris D5 Universal EdgeQAM
            • ARRIS DOCSIS
            • Arris Satellite Receiver
            • Aruba Clearpass
            • Aruba Instant
            • ArubaOS
            • ArubaOS-CX
            • Ascom
            • Asentria SiteBoss
            • AsusWRT Merlin
            • Aten PDU
            • Audiocodes
            • Automatic Transfer Switch
            • Avaya Scopia
            • AvediaPlayer Receivers
            • AvediaStream Encoder
            • Aviat WTM
            • Avocent
            • Avtech Environment Sensor
            • AXIS Audio Appliances
            • AXIS Network Camera
            • AXIS Network Document Server

            B

            • Barco Clickshare
            • Barracuda Email Security Gateway
            • Barracuda Load Balancer
            • Barracuda NG Firewall
            • Barracuda Web Application Firewall
            • BATS AATS
            • BDCOM(tm) Software
            • BeagleBoard
            • Benu
            • Bintec Be.IP Plus
            • Bintec Smart Router
            • BKE
            • BKtel
            • Blade Network Technologies
            • BladeShelter PDU by PowerTek
            • Blue Coat PacketShaper
            • Blue Coat SSL Visibility
            • Bluecat Networks
            • BlueCoat ProxySG
            • Broadcom BCM963xx
            • Brocade FabricOS
            • Brocade IronWare
            • Brocade NOS
            • Brocade ServerIron
            • Brother Printer
            • BTI SA-800
            • Buffalo

            C

            • C&C Power Commander plus
            • Calix AXOS
            • Calix B6 System
            • Calix EXA
            • Calix Legacy
            • Cambium
            • Cambium CMM
            • Cambium CMM4
            • Cambium cnMatrix
            • Cambium cnPilot
            • Cambium cnPilot Router
            • Cambium cnWave60
            • Cambium epmp
            • Cambium PTP 250
            • Cambium PTP 300/500
            • Cambium PTP 600
            • Cambium PTP 650
            • Cambium PTP 670
            • Cambium PTP 800
            • Canon Printer
            • Carel pCOWeb
            • cdata
            • Ceragon CeraOS
            • CET TSI Controller
            • Chatsworth PDU
            • Check Point GAiA
            • CheckPoint SecurePlatform
            • Christie Projector
            • Ciena SAOS
            • Ciena Service Delivery Switch
            • Ciena Waveserver
            • Ciena Z-Series
            • cirpack
            • Cisco ACE
            • Cisco ACS
            • Cisco APIC
            • Cisco ASA
            • Cisco AsyncOS
            • Cisco Catalyst 1900
            • Cisco CatOS
            • Cisco EPC
            • Cisco FTD
            • Cisco FX-OS
            • Cisco Identity Services Engine
            • Cisco Integrated Management Controller
            • Cisco Intrusion Prevention System
            • Cisco IOS
            • Cisco IOS-XE
            • Cisco IOS-XR
            • Cisco ME1200
            • Cisco Nexus 3550 Series
            • Cisco NX-OS
            • Cisco ONS
            • Cisco PIX-OS
            • Cisco SAN-OS
            • Cisco Satellite Receiver
            • Cisco SCE
            • Cisco Services Ready Platform
            • Cisco Small Business
            • Cisco Unified Communications Manager
            • Cisco Voice Gateway
            • Cisco WAAS
            • Cisco Wireless Access Point
            • Cisco WLC
            • Citrix Netscaler
            • Comet System Web Sensor
            • Comtrol Industrial Switch
            • Controlbox TH-332B
            • CoreOS
            • Corero CMS
            • Coriant TNMS
            • CradlePoint WiPipe
            • CTC Union
            • Cumulus Linux
            • CXR Networks TS
            • Cyberoam UTM
            • Cyberpower

            D

            • D-Link Access Point
            • D-Link Switch
            • Dahua NVR
            • Dantel Webmon
            • Dantherm
            • Dasan NOS
            • Datacom
            • dd-wrt
            • DDN Storage
            • Deliberant OS
            • Dell DRAC
            • Dell EMC Networking OS10 Enterprise
            • Dell EqualLogic
            • Dell Laser
            • Dell Networking OS
            • Dell OpenManage Enterprise Modular
            • Dell PowerConnect
            • Dell PowerVault
            • Dell PowerVault MD
            • Dell Rack PDU
            • Dell Remote Console
            • Dell Storage
            • Dell UPS
            • Delta Orion Controller
            • Delta UPS
            • Develop Printer
            • DHCPatriot
            • Digipower
            • Digital China Networks
            • DKT Comega
            • DPS Telecom NetGuardian
            • DragonflyBSD
            • Dragonwave Harmony Enhanced
            • Dragonwave Horizon Compact
            • Dragonwave Horizon Compact Plus
            • Dragonwave Horizon Duo
            • DrayTek
            • DVB Modulator & Ampiflier
            • DVB-T Transmitter

            E

            • E3 Meter
            • E3 Meter DataConcentrator
            • Eagle-I
            • East
            • Eaton ATS
            • Eaton Matrix
            • Eaton MGE PDU
            • Eaton PDU
            • Eaton SC200 Controller
            • Eaton UPS
            • EDFA
            • Edgecore
            • EdgeOS
            • EdgeSwitch
            • EDS
            • EfficientIP SOLIDserver
            • Ekinops Optical
            • Eltek Valere
            • Eltek Valere eNexus
            • Eltek WebPower
            • Eltex OLT
            • Eltex-MES21xx
            • Eltex-MES23xx
            • EMC Data Domain
            • EMC Flare OS
            • EMC Isilon OneFS
            • Emerson Energy System
            • Emerson Netsure
            • Endian
            • EndRun
            • EnGenius Access Point
            • enLogic PDU
            • Enterasys
            • Epson Printer
            • Epson Projector
            • Ericsson 6600 series
            • Ericsson IPOS
            • Ericsson LG iPECS UCP
            • Ericsson MINI-LINK
            • Ericsson Traffic Node
            • EricssonLG IPECS ES
            • Etherwan Managed Switch
            • EUROstor RAID Subsystem
            • Exagrid
            • Exalt ExtendAir
            • Exinda
            • Extrahop Appliance
            • Extreme BOSS
            • Extreme SLX-OS
            • Extreme VOSS
            • Extreme Wireless Convergence
            • Extreme XOS
            • Extremeware

            F

            • F5 Big IP
            • F5OS
            • Fiberhome
            • FiberHome Switch
            • Fibernet XMUX 4+
            • Fiberstore GBN
            • Fiberstore Switch
            • Firebrick
            • FireEye OS
            • Force10 FTOS
            • Fortinet Application Deliver Controller
            • Fortinet FortiAuthenticator
            • Fortinet Fortigate
            • Fortinet FortiMail
            • Fortinet FortiSandbox
            • Fortinet FortiSwitch
            • Fortinet FortiVoice
            • Fortinet FortiWeb
            • Fortinet FortiWLC
            • FortiOS
            • Foundry Networking
            • FreeBSD
            • FreshTomato
            • FS.COM monitored pdu
            • Fujitsu
            • Fujitsu ETERNUS
            • FUJITSU iRMC
            • Fujitsu NAS
            • FusionHub

            G

            • Gamatronic UPS Stack
            • Gandi Packet Journey
            • GE Digital Energy UPS
            • GE MDS Orbit network Operating System
            • GE Pulsar
            • Geist PDU
            • Geist Watchdog
            • Generex UPS SNMP adapter
            • Generic
            • Generic Device
            • Gestetner Printer
            • GigaVUE
            • Glass Way WDM EYDFA
            • Grandstream HT
            • Greenbone OS
            • Gude Expert Transfer Switch
            • gwd

            H

            • Halon
            • Hanwha Techwin
            • HAProxy ALOHA
            • Hardware Appliance
            • Hatteras Overdue DSLAM
            • Helios IP
            • Hikvision Camera
            • Hikvision NVR
            • Hillstone StoneOs
            • Himoinsa Generator Sets
            • Hirschmann Railswitch
            • Hitachi Storage Virtualization Operating System (SVOS)
            • HP Blade Management
            • HP MSM
            • HP PDU Management Module
            • HP Print server
            • HP ProCurve
            • HP UPS
            • HP Virtual Connect
            • HPE 3PAR
            • HPE Comware
            • HPE Integrated Lights Out
            • HPE iPDU
            • HPE Managed Power Distribution Unit
            • HPE MSA
            • HPE OpenVMS
            • HPE StoreEver MSL
            • Huawei iBMC Management Console
            • Huawei OceanStor
            • Huawei SmartAX
            • Huawei SmartAX MDU
            • Huawei SMU
            • Huawei UPS
            • Huawei VRP
            • HWg Poseidon
            • HWg STE
            • HWg STE2
            • HWg WLD
            • Hytera Repeater

            I

            • IBM AMM
            • IBM DPI
            • IBM i
            • IBM IMM
            • IBM Networking Operating System
            • IBM Tape Library
            • iBoot PDU
            • Icotera OS
            • ICR-OS
            • ICT Digital Series Power Supply
            • ICT Distribution Series
            • ICT Modular Power System
            • ICT Sine Wave Inverter
            • Ifotec
            • IgniteNet FusionSwitch
            • IgniteNet HeliOS
            • Illustra Network Camera
            • Imco Power
            • Imco Power LS110
            • Infinera Groove
            • Infinera PON
            • Infinera XTM
            • Infoblox
            • Ingrasys iPoMan
            • Innovaphone ISDN
            • Inteno GW
            • IONODES
            • IP Infusion OcNOS
            • IP Office Firmware
            • ITWatchDogs Goose

            J

            • Jacarta InterSeptor
            • Janitza
            • Janitza UMG96
            • Juniper EX2500
            • Juniper JunOS
            • Juniper JunOSe
            • Juniper JWOS
            • Juniper MSS
            • Juniper ScreenOS

            K

            • Kemp Loadbalancer
            • Konica-Minolta Printer
            • KTI
            • Kyocera Mita Printer

            L

            • Lambdatrail
            • Lancom OS
            • Lanier Printer
            • LANTIME v6
            • Lantronix SLC
            • Lantronix UDS
            • Last Mile Gear CTM
            • Lenovo Cloud Network Operating System
            • Lenovo XCC IMPI
            • LenovoEMC
            • Lexmark Printer
            • Liebert
            • LigoWave Infinity
            • LigoWave LigoOS
            • Linksys Smart Switch
            • Linux
            • Loadbalancer.org
            • LogMaster
            • Loop Telecom Operating System

            M

            • m0n0wall
            • Maipu MyPower
            • Marathon UPS
            • McAfee Linux OS - ATD
            • McAfee Linux OS - NSP
            • McAfee SIEM Nitro
            • Mcafee Web Gateway
            • MegaTec NetAgent II
            • Mellanox
            • Meraki AP
            • Meraki MX Appliance
            • Meraki Switch
            • Microsemi PowerDsine Midspan PoE
            • Microsemi Synchronization Supply Unit
            • Microsoft Windows
            • Mikrotik RouterOS
            • Mikrotik SwOS
            • Mimosa
            • Minkels RMS
            • Mirth Connect
            • Mitel Standard Linux
            • MNI Microwave Radio
            • MobileIron
            • Montclair EDFA
            • Motorola DOCSIS Cable Modem
            • Motorola Netopia
            • Moxa
            • Moxa AWK
            • MRV LambdaDriver
            • MRV OptiDriver

            N

            • NEC Univerge
            • NetApp
            • NetBotz Environment Sensor
            • NetBSD
            • Netgear ProSafe
            • NetMan Plus
            • NetModule
            • Netonix
            • NetScaler SD-WAN
            • Network Management Unit
            • Nexans
            • Nimble OS
            • NOKIA ISAM
            • Nokia SR OS (TiMOS)
            • Novell Netware
            • NRG Printer
            • NTI
            • Nutanix AOS
            • NVT Phybridge

            O

            • OKI Printer
            • Omnitron iConverter
            • OneAccess
            • Open Access Netspire
            • Open-E
            • OpenBSD
            • Opengear
            • OpenIndiana
            • OpenSystems
            • OpenWrt
            • OPNsense
            • Oracle ILOM
            • Orvaldi UPS

            P

            • Packetflux SiteMonitor
            • Packetlight
            • Panasonic KX-NS Series
            • Panduit PDU
            • PanOS
            • Papouch QUIDO
            • Papouch TME
            • Paradyne (by Zhone)
            • Patton SmartNode
            • PBI Digital Decoder
            • PBN
            • PBN P2P CP100 Series Platform
            • Pegasus
            • Pepwave
            • Perle
            • pfSense
            • Pica8 OS
            • Ping only
            • PLANET
            • Polycom Videoconferencing System
            • Powercode BMU
            • PowerWalker UPS
            • PowerWalker VFI
            • Prime Infrastructure
            • Procera Networks
            • Proxim
            • proxmox pve
            • Pulse Secure

            Q

            • QNAP TurboNAS
            • QTECH
            • Quanta
            • QuantaStor

            R

            • Radlan
            • RADWIN
            • Raisecom ROAP
            • Raisecom ROS
            • Raritan EMX
            • Raritan KVM
            • Raritan PDU
            • RAy
            • RAy3
            • RecoveryOS
            • Red Lion Sixnet
            • Redback Networks SmartEdge
            • Redlion N-Tron
            • Ribbon GSX
            • Ribbon SBC
            • Ricoh Printer
            • Rittal CMC
            • Rittal CMC III PU
            • Rittal IT Chiller
            • Rittal LCP
            • Rittal LCP DX Chiller
            • Riverbed
            • RNX UPDU
            • Rohde & Schwarz
            • Rubrik
            • Ruckus Wireless HotZone
            • Ruckus Wireless SmartZone
            • Ruckus Wireless Unleashed
            • Ruckus Wireless ZoneDirector
            • Ruijie Networks

            S

            • SAF CFM
            • SAF Integra B
            • SAF Integra E
            • SAF Integra W
            • SAF Integra X
            • SAF Tehnika
            • Sagem ADR IONOS
            • Samsung Printer
            • Savin Printer
            • Schleifenbauer SPDM
            • Schneider PowerLogic
            • SCS KS
            • Sensatronics EM1
            • Sensatronics ITTM
            • ServersCheck
            • ServerTech Sentry3
            • ServerTech Sentry4
            • Sharp Printer
            • SIAE Alfoplus 80HD
            • Siemens Ruggedcom Switches (ROS)
            • Siemens SCALANCE
            • Siklu Wireless
            • Silver Peak VXOA
            • Sinetica UPS
            • SM-OS
            • SmartOptics DCP-M Series
            • SmartOptics M-Series
            • SmartOptics T-Series
            • snr
            • snr-erd
            • Socomec Net Vision
            • Socomec PDU
            • Software Appliance
            • Solid Optics EDFAMUX
            • SonicWALL
            • Sophos UTM Firewall
            • Sophos XG
            • Stormshield NS-BSD
            • Stulz GMBH Klimatechnik
            • Sub10 Systems
            • Sun OpenSolaris
            • Sun Solaris
            • Supermicro Switch
            • Symbol AP
            • SyncServer
            • Synology DSM

            T

            • Tait Infra93 Series
            • Tait TN Admin OS
            • Tandberg Magnum
            • technicolor TG MediaAcces
            • Tegile IntelliFlash
            • Telco Systems BiNOS
            • Telco Systems BiNOX
            • Teldat
            • TelePresence Codec
            • TelePresence Conductor
            • Teleste Luminato
            • teltonika rutos
            • Teltonika RutOS RUTX Series
            • Teradici PCoIP
            • Terra
            • Thomson DOCSIS Cable Modem
            • Thomson Speedtouch
            • Tomato
            • TopVision
            • Toshiba Printer
            • Toshiba RemotEye4
            • TP-Link JetStream
            • TP-Link Switch
            • Transition
            • Tranzeo
            • TRENDnet Switch
            • Tripp Lite PowerAlert
            • TrueNAS
            • TSC Printer
            • Tycon Systems TPDIN

            U

            • Ubiquiti AirFiber
            • Ubiquiti AirFiber 60
            • Ubiquiti AirFiber LTU
            • Ubiquiti AirOS
            • Ubiquiti Edgepower
            • Ubiquiti UniFi
            • Ubiquoss PON
            • Ucopia
            • UFiber
            • UHP Networks VSAT Terminal
            • UniPing

            V

            • V-Solution
            • Vanguard ApplicationsWare
            • Vertiv Avocent MergePoint Unity
            • Vertiv PDU
            • Video Communication Server
            • Viprinux
            • Viptela
            • Vivotek Camera
            • VMware ESXi
            • VMware SD-WAN
            • VMware vCenter
            • Volius
            • Voswall
            • Vubiq Networks
            • Vutlan
            • Vyatta
            • VyOS

            W

            • Watchguard Fireware
            • Waystream iBOS
            • Web-Thermo-Hygrometer
            • WebPower
            • West Mountain RMCU
            • WISI Tangram
            • WTI CONSOLE
            • WTI MPC
            • WTI POWER

            X

            • Xerox Printer
            • Xirrus ArrayOS

            Z

            • ZebraNet
            • Zhone MXK
            • Zmtel Greenpacket
            • ZTE ZXA10
            • ZTE ZXR10
            • ZXDSL
            • ZyXEL AC
            • ZyXEL DSLAM
            • ZyXEL Ethernet Switch
            • ZyXEL IES MSAN
            • ZyXEL IES-5000 DSLAM
            • ZyXEL NWA
            • ZyXEL Prestige
            • ZyXEL ZyWALL
            \ No newline at end of file + Features - LibreNMS Docs

            Features

            Here's a brief list of supported features, some might be missing. If you think something is missing, feel free to ask us.

            • Auto discovery
            • Alerting
            • Multiple environment sensors support
            • Multiple protocols data collection (STP, OSPF, BGP etc)
            • VLAN, ARP and FDB table collection
            • Customizable Dashboards
            • Device Backup integration (Oxidized, RANCID)
            • Distributed Polling
            • Multiple Authentication Methods (MySQL, LDAP, Active Directory, HTTP)
            • NetFlow, sFlow, IPFIX (NfSen)
            • Service monitoring (Nagios Plugins)
            • Syslog (Integrated, Graylog)
            • Traffic Billing (Quota, 95th Percentile)
            • Two Factor Authentication
            • API
            • Auto Updating

            Supported Vendors

            Here's a list of supported vendors, some might be missing. If you are unsure of whether your device is supported or not, feel free to ask us.

            3

            • 3Com

            A

            • A10 Networks
            • Acano OS
            • Accedian AEN
            • Adtran AOS
            • ADVA FSP150CC
            • ADVA FSP3000 R7
            • ADVA OptiSwitch
            • Advantech
            • Aerohive HiveOS
            • Airconsole Server
            • AIX
            • AKCP SensorProbe
            • Alcatel OmniPCX
            • Alcatel-Lucent Enterprise Stellar Wireless OS (AWOS)
            • Alcatel-Lucent OS
            • Alcoma
            • ALGCOM DC UPS
            • Allied Telesis Wireless (TQ)
            • Alliedware
            • Alliedware Plus
            • Allworx VoIP
            • Alpha Comp@s
            • Alpha CXC HP Controller
            • Alpha FXM
            • Alpine OptoElectronics TDCM-EDFA platform
            • AlteonOS
            • Alvarion Breeze
            • Anue
            • AnyOS
            • APC Environmental Monitoring Unit
            • APC ePDU
            • APC Management Module
            • APC MGE UPS
            • Apex Lynx
            • Apex Plus
            • Apple AirPort
            • Apple OS X
            • Aprisa
            • ApsoluteOS
            • ArbOS
            • Areca RAID Subsystem
            • Arista EOS
            • Arista MOS
            • Array Networks
            • Arris Apex
            • Arris CMTS
            • Arris D5 Universal EdgeQAM
            • ARRIS DOCSIS
            • Arris Satellite Receiver
            • Aruba Clearpass
            • Aruba Instant
            • ArubaOS
            • ArubaOS-CX
            • Ascom
            • Asentria SiteBoss
            • AsusWRT Merlin
            • Aten PDU
            • Audiocodes
            • Automatic Transfer Switch
            • Avaya Scopia
            • AvediaPlayer Receivers
            • AvediaStream Encoder
            • Aviat WTM
            • Avocent
            • Avtech Environment Sensor
            • AXIS Audio Appliances
            • AXIS Network Camera
            • AXIS Network Document Server

            B

            • Barco Clickshare
            • Barracuda Email Security Gateway
            • Barracuda Load Balancer
            • Barracuda NG Firewall
            • Barracuda Web Application Firewall
            • BATS AATS
            • BDCOM(tm) Software
            • BeagleBoard
            • Benu
            • Bintec Be.IP Plus
            • Bintec Smart Router
            • BKE
            • BKtel
            • Blade Network Technologies
            • BladeShelter PDU by PowerTek
            • Blue Coat PacketShaper
            • Blue Coat SSL Visibility
            • Bluecat Networks
            • BlueCoat ProxySG
            • Broadcom BCM963xx
            • Brocade FabricOS
            • Brocade IronWare
            • Brocade NOS
            • Brocade ServerIron
            • Brother Printer
            • BTI SA-800
            • Buffalo

            C

            • C&C Power Commander plus
            • Calix AXOS
            • Calix B6 System
            • Calix EXA
            • Calix Legacy
            • Cambium
            • Cambium CMM
            • Cambium CMM4
            • Cambium cnMatrix
            • Cambium cnPilot
            • Cambium cnPilot Router
            • Cambium cnWave60
            • Cambium epmp
            • Cambium PTP 250
            • Cambium PTP 300/500
            • Cambium PTP 600
            • Cambium PTP 650
            • Cambium PTP 670
            • Cambium PTP 800
            • Canon Printer
            • Carel pCOWeb
            • cdata
            • Ceragon CeraOS
            • CET TSI Controller
            • Chatsworth PDU
            • Check Point GAiA
            • CheckPoint SecurePlatform
            • Christie Projector
            • Ciena SAOS
            • Ciena Service Delivery Switch
            • Ciena Waveserver
            • Ciena Z-Series
            • cirpack
            • Cisco ACE
            • Cisco ACS
            • Cisco APIC
            • Cisco ASA
            • Cisco AsyncOS
            • Cisco Catalyst 1900
            • Cisco CatOS
            • Cisco EPC
            • Cisco FTD
            • Cisco FX-OS
            • Cisco Identity Services Engine
            • Cisco Integrated Management Controller
            • Cisco Intrusion Prevention System
            • Cisco IOS
            • Cisco IOS-XE
            • Cisco IOS-XR
            • Cisco ME1200
            • Cisco Nexus 3550 Series
            • Cisco NX-OS
            • Cisco ONS
            • Cisco PIX-OS
            • Cisco SAN-OS
            • Cisco Satellite Receiver
            • Cisco SCE
            • Cisco Services Ready Platform
            • Cisco Small Business
            • Cisco Unified Communications Manager
            • Cisco Voice Gateway
            • Cisco WAAS
            • Cisco Wireless Access Point
            • Cisco WLC
            • Citrix Netscaler
            • Comet System Web Sensor
            • Comtrol Industrial Switch
            • Controlbox TH-332B
            • CoreOS
            • Corero CMS
            • Coriant TNMS
            • CradlePoint WiPipe
            • CTC Union
            • Cumulus Linux
            • CXR Networks TS
            • Cyberoam UTM
            • Cyberpower

            D

            • D-Link Access Point
            • D-Link Switch
            • Dahua NVR
            • Dantel Webmon
            • Dantherm
            • Dasan NOS
            • Datacom
            • dd-wrt
            • DDN Storage
            • Deliberant OS
            • Dell DRAC
            • Dell EMC Networking OS10 Enterprise
            • Dell EqualLogic
            • Dell Laser
            • Dell Networking OS
            • Dell OpenManage Enterprise Modular
            • Dell PowerConnect
            • Dell PowerVault
            • Dell PowerVault MD
            • Dell Rack PDU
            • Dell Remote Console
            • Dell Storage
            • Dell UPS
            • Delta Orion Controller
            • Delta UPS
            • Develop Printer
            • DHCPatriot
            • Digipower
            • Digital China Networks
            • DKT Comega
            • DPS Telecom NetGuardian
            • DragonflyBSD
            • Dragonwave Harmony Enhanced
            • Dragonwave Horizon Compact
            • Dragonwave Horizon Compact Plus
            • Dragonwave Horizon Duo
            • DrayTek
            • DVB Modulator & Ampiflier
            • DVB-T Transmitter

            E

            • E3 Meter
            • E3 Meter DataConcentrator
            • Eagle-I
            • East
            • Eaton ATS
            • Eaton Matrix
            • Eaton MGE PDU
            • Eaton PDU
            • Eaton SC200 Controller
            • Eaton UPS
            • EDFA
            • Edgecore
            • EdgeOS
            • EdgeSwitch
            • EDS
            • EfficientIP SOLIDserver
            • Ekinops Optical
            • Eltek Valere
            • Eltek Valere eNexus
            • Eltek WebPower
            • Eltex OLT
            • Eltex-MES21xx
            • Eltex-MES23xx
            • EMC Data Domain
            • EMC Flare OS
            • EMC Isilon OneFS
            • Emerson Energy System
            • Emerson Netsure
            • Endian
            • EndRun
            • EnGenius Access Point
            • enLogic PDU
            • Enterasys
            • Epson Printer
            • Epson Projector
            • Ericsson 6600 series
            • Ericsson IPOS
            • Ericsson LG iPECS UCP
            • Ericsson MINI-LINK
            • Ericsson Traffic Node
            • EricssonLG IPECS ES
            • Etherwan Managed Switch
            • EUROstor RAID Subsystem
            • Exagrid
            • Exalt ExtendAir
            • Exinda
            • Extrahop Appliance
            • Extreme BOSS
            • Extreme SLX-OS
            • Extreme VOSS
            • Extreme Wireless Convergence
            • Extreme XOS
            • Extremeware

            F

            • F5 Big IP
            • F5OS
            • Fiberhome
            • FiberHome Switch
            • Fibernet XMUX 4+
            • Fiberstore GBN
            • Fiberstore Switch
            • Firebrick
            • FireEye OS
            • Force10 FTOS
            • Fortinet Application Deliver Controller
            • Fortinet FortiAuthenticator
            • Fortinet Fortigate
            • Fortinet FortiMail
            • Fortinet FortiSandbox
            • Fortinet FortiSwitch
            • Fortinet FortiVoice
            • Fortinet FortiWeb
            • Fortinet FortiWLC
            • FortiOS
            • Foundry Networking
            • FreeBSD
            • FreshTomato
            • FS.COM monitored pdu
            • Fujitsu
            • Fujitsu ETERNUS
            • FUJITSU iRMC
            • Fujitsu NAS
            • FusionHub

            G

            • Gamatronic UPS Stack
            • Gandi Packet Journey
            • GE Digital Energy UPS
            • GE MDS Orbit network Operating System
            • GE Pulsar
            • Geist PDU
            • Geist Watchdog
            • Generex UPS SNMP adapter
            • Generic
            • Generic Device
            • Gestetner Printer
            • GigaVUE
            • Glass Way WDM EYDFA
            • Grandstream HT
            • Greenbone OS
            • Gude Expert Transfer Switch
            • gwd

            H

            • Halon
            • Hanwha Techwin
            • HAProxy ALOHA
            • Hardware Appliance
            • Hatteras Overdue DSLAM
            • Helios IP
            • Hikvision Camera
            • Hikvision NVR
            • Hillstone StoneOs
            • Himoinsa Generator Sets
            • Hirschmann Railswitch
            • Hitachi Storage Virtualization Operating System (SVOS)
            • HP Blade Management
            • HP MSM
            • HP PDU Management Module
            • HP Print server
            • HP ProCurve
            • HP UPS
            • HP Virtual Connect
            • HPE 3PAR
            • HPE Comware
            • HPE Integrated Lights Out
            • HPE iPDU
            • HPE Managed Power Distribution Unit
            • HPE MSA
            • HPE OpenVMS
            • HPE StoreEver MSL
            • Huawei iBMC Management Console
            • Huawei OceanStor
            • Huawei SmartAX
            • Huawei SmartAX MDU
            • Huawei SMU
            • Huawei UPS
            • Huawei VRP
            • HWg Poseidon
            • HWg STE
            • HWg STE2
            • HWg WLD
            • Hytera Repeater

            I

            • IBM AMM
            • IBM DPI
            • IBM i
            • IBM IMM
            • IBM Networking Operating System
            • IBM Tape Library
            • iBoot PDU
            • Icotera OS
            • ICR-OS
            • ICT Digital Series Power Supply
            • ICT Distribution Series
            • ICT Modular Power System
            • ICT Sine Wave Inverter
            • Ifotec
            • IgniteNet FusionSwitch
            • IgniteNet HeliOS
            • Illustra Network Camera
            • Imco Power
            • Imco Power LS110
            • Infinera Groove
            • Infinera PON
            • Infinera XTM
            • Infoblox
            • Ingrasys iPoMan
            • Innovaphone ISDN
            • Inteno GW
            • IONODES
            • IP Infusion OcNOS
            • IP Office Firmware
            • ITWatchDogs Goose

            J

            • Jacarta InterSeptor
            • Janitza
            • Janitza UMG96
            • Juniper EX2500
            • Juniper JunOS
            • Juniper JunOSe
            • Juniper JWOS
            • Juniper MSS
            • Juniper ScreenOS

            K

            • Kemp Loadbalancer
            • Konica-Minolta Printer
            • KTI
            • Kyocera Mita Printer

            L

            • Lambdatrail
            • Lancom OS
            • Lanier Printer
            • LANTIME v6
            • Lantronix SLC
            • Lantronix UDS
            • Last Mile Gear CTM
            • Lenovo Cloud Network Operating System
            • Lenovo XCC IMPI
            • LenovoEMC
            • Lexmark Printer
            • Liebert
            • LigoWave Infinity
            • LigoWave LigoOS
            • Linksys Smart Switch
            • Linux
            • Loadbalancer.org
            • LogMaster
            • Loop Telecom Operating System

            M

            • m0n0wall
            • Maipu MyPower
            • Marathon UPS
            • McAfee Linux OS - ATD
            • McAfee Linux OS - NSP
            • McAfee SIEM Nitro
            • Mcafee Web Gateway
            • MegaTec NetAgent II
            • Mellanox
            • Meraki AP
            • Meraki MX Appliance
            • Meraki Switch
            • Microsemi PowerDsine Midspan PoE
            • Microsemi Synchronization Supply Unit
            • Microsoft Windows
            • Mikrotik RouterOS
            • Mikrotik SwOS
            • Mimosa
            • Minkels RMS
            • Mirth Connect
            • Mitel Standard Linux
            • MNI Microwave Radio
            • MobileIron
            • Montclair EDFA
            • Motorola DOCSIS Cable Modem
            • Motorola Netopia
            • Moxa
            • Moxa AWK
            • MRV LambdaDriver
            • MRV OptiDriver

            N

            • NEC Univerge
            • NetApp
            • NetBotz Environment Sensor
            • NetBSD
            • Netgear ProSafe
            • NetMan Plus
            • NetModule
            • Netonix
            • NetScaler SD-WAN
            • Network Management Unit
            • Nexans
            • Nimble OS
            • NOKIA ISAM
            • Nokia SR OS (TiMOS)
            • Novell Netware
            • NRG Printer
            • NTI
            • Nutanix AOS
            • NVT Phybridge

            O

            • OKI Printer
            • Omnitron iConverter
            • OneAccess
            • Open Access Netspire
            • Open-E
            • OpenBSD
            • Opengear
            • OpenIndiana
            • OpenSystems
            • OpenWrt
            • OPNsense
            • Oracle ILOM
            • Orvaldi UPS

            P

            • Packetflux SiteMonitor
            • Packetlight
            • Panasonic KX-NS Series
            • Panduit PDU
            • PanOS
            • Papouch QUIDO
            • Papouch TME
            • Paradyne (by Zhone)
            • Patton SmartNode
            • PBI Digital Decoder
            • PBN
            • PBN P2P CP100 Series Platform
            • Pegasus
            • Pepwave
            • Perle
            • pfSense
            • Pica8 OS
            • Ping only
            • PLANET
            • Polycom Videoconferencing System
            • Powercode BMU
            • PowerWalker UPS
            • PowerWalker VFI
            • Prime Infrastructure
            • Procera Networks
            • Proxim
            • proxmox pve
            • Pulse Secure

            Q

            • QNAP TurboNAS
            • QTECH
            • Quanta
            • QuantaStor

            R

            • Radlan
            • RADWIN
            • Raisecom ROAP
            • Raisecom ROS
            • Raritan EMX
            • Raritan KVM
            • Raritan PDU
            • RAy
            • RAy3
            • RecoveryOS
            • Red Lion Sixnet
            • Redback Networks SmartEdge
            • Redlion N-Tron
            • Ribbon GSX
            • Ribbon SBC
            • Ricoh Printer
            • Rittal CMC
            • Rittal CMC III PU
            • Rittal IT Chiller
            • Rittal LCP
            • Rittal LCP DX Chiller
            • Riverbed
            • RNX UPDU
            • Rohde & Schwarz
            • Rubrik
            • Ruckus Wireless HotZone
            • Ruckus Wireless SmartZone
            • Ruckus Wireless Unleashed
            • Ruckus Wireless ZoneDirector
            • Ruijie Networks

            S

            • SAF CFM
            • SAF Integra B
            • SAF Integra E
            • SAF Integra W
            • SAF Integra X
            • SAF Tehnika
            • Sagem ADR IONOS
            • Samsung Printer
            • Savin Printer
            • Schleifenbauer SPDM
            • Schneider PowerLogic
            • SCS KS
            • Sensatronics EM1
            • Sensatronics ITTM
            • ServersCheck
            • ServerTech Sentry3
            • ServerTech Sentry4
            • Sharp Printer
            • SIAE Alfoplus 80HD
            • Siemens Ruggedcom Switches (ROS)
            • Siemens SCALANCE
            • Siklu Wireless
            • Silver Peak VXOA
            • Sinetica UPS
            • SM-OS
            • SmartOptics DCP-M Series
            • SmartOptics M-Series
            • SmartOptics T-Series
            • snr
            • snr-erd
            • Socomec Net Vision
            • Socomec PDU
            • Software Appliance
            • Solid Optics EDFAMUX
            • SonicWALL
            • Sophos UTM Firewall
            • Sophos XG
            • Stormshield NS-BSD
            • Stulz GMBH Klimatechnik
            • Sub10 Systems
            • Sun OpenSolaris
            • Sun Solaris
            • Supermicro Switch
            • Symbol AP
            • SyncServer
            • Synology DSM

            T

            • Tait Infra93 Series
            • Tait TN Admin OS
            • Tandberg Magnum
            • technicolor TG MediaAcces
            • Tegile IntelliFlash
            • Telco Systems BiNOS
            • Telco Systems BiNOX
            • Teldat
            • TelePresence Codec
            • TelePresence Conductor
            • Teleste Luminato
            • teltonika rutos
            • Teltonika RutOS RUTX Series
            • Teradici PCoIP
            • Terra
            • Thomson DOCSIS Cable Modem
            • Thomson Speedtouch
            • Tomato
            • TopVision
            • Toshiba Printer
            • Toshiba RemotEye4
            • TP-Link JetStream
            • TP-Link Switch
            • Transition
            • Tranzeo
            • TRENDnet Switch
            • Tripp Lite PowerAlert
            • TrueNAS
            • TSC Printer
            • Tycon Systems TPDIN

            U

            • Ubiquiti AirFiber
            • Ubiquiti AirFiber 60
            • Ubiquiti AirFiber LTU
            • Ubiquiti AirOS
            • Ubiquiti Edgepower
            • Ubiquiti UniFi
            • Ubiquoss PON
            • Ucopia
            • UFiber
            • UHP Networks VSAT Terminal
            • UniPing

            V

            • V-Solution
            • Vanguard ApplicationsWare
            • Vertiv Avocent MergePoint Unity
            • Vertiv PDU
            • Video Communication Server
            • Viprinux
            • Viptela
            • Vivotek Camera
            • VMware ESXi
            • VMware SD-WAN
            • VMware vCenter
            • Volius
            • Voswall
            • Vubiq Networks
            • Vutlan
            • Vyatta
            • VyOS

            W

            • Watchguard Fireware
            • Waystream iBOS
            • Web-Thermo-Hygrometer
            • WebPower
            • West Mountain RMCU
            • WISI Tangram
            • WTI CONSOLE
            • WTI MPC
            • WTI POWER

            X

            • Xerox Printer
            • Xirrus ArrayOS

            Z

            • ZebraNet
            • Zhone MXK
            • Zmtel Greenpacket
            • ZTE ZXA10
            • ZTE ZXR10
            • ZXDSL
            • ZyXEL AC
            • ZyXEL DSLAM
            • ZyXEL Ethernet Switch
            • ZyXEL IES MSAN
            • ZyXEL IES-5000 DSLAM
            • ZyXEL NWA
            • ZyXEL Prestige
            • ZyXEL ZyWALL
            \ No newline at end of file diff --git a/Support/Install Validation/index.html b/Support/Install Validation/index.html index 02a8c35d..da0f03b1 100644 --- a/Support/Install Validation/index.html +++ b/Support/Install Validation/index.html @@ -1 +1 @@ - Install Validation - LibreNMS Docs

            Install validation

            With a lot of configuration possibilities, manually editing config.php means it's not uncommon that mistakes get made. It's also impossible to validate user input in config.php when you're just using a text editor :)

            So, to try and help with some of the general issues people come across we've put together a simple validation tool which at present will:

            • Validate config.php from a php perspective including whitespace where it shouldn't be.
            • Connection to your MySQL server to verify credentials.
            • Checks if you are running the older alerting system.
            • Checks your rrd directory setup if not running rrdcached.
            • Checks disk space for where /opt/librenms is installed.
            • Checks location to fping
            • Tests MySQL strict mode being enabled
            • Tests for files not owned by librenms user (if configured)

            Optionally you can also pass -m and a module name for that to be tested. Current modules are:

            • mail - This will validate your mail transport configuration.
            • dist-poller - This will test your distributed poller configuration.
            • rrdcheck - This will test your rrd files to see if they are unreadable or corrupted (source of broken graphs).

            You can run validate.php as root by executing ./validate.php within your install directory.

            The output will provide you either a clean bill of health or a list of things you need to fix:

            OK - This is a good thing, you can skip over these :)

            WARN - You probably want to check this out.

            FAIL - This is going to need your attention!

            Validate from the WebUI

            You can validate your LibreNMS install from the WebUI, using the nav bar and clicking on the little Gear Icon -> Validate Config.

            Validate Config Icon

            Then You should see the results of validate.

            Below is just example of the results.

            Validate results

            \ No newline at end of file + Install Validation - LibreNMS Docs

            Install validation

            With a lot of configuration possibilities, manually editing config.php means it's not uncommon that mistakes get made. It's also impossible to validate user input in config.php when you're just using a text editor :)

            So, to try and help with some of the general issues people come across we've put together a simple validation tool which at present will:

            • Validate config.php from a php perspective including whitespace where it shouldn't be.
            • Connection to your MySQL server to verify credentials.
            • Checks if you are running the older alerting system.
            • Checks your rrd directory setup if not running rrdcached.
            • Checks disk space for where /opt/librenms is installed.
            • Checks location to fping
            • Tests MySQL strict mode being enabled
            • Tests for files not owned by librenms user (if configured)

            Optionally you can also pass -m and a module name for that to be tested. Current modules are:

            • mail - This will validate your mail transport configuration.
            • dist-poller - This will test your distributed poller configuration.
            • rrdcheck - This will test your rrd files to see if they are unreadable or corrupted (source of broken graphs).

            You can run validate.php as root by executing ./validate.php within your install directory.

            The output will provide you either a clean bill of health or a list of things you need to fix:

            OK - This is a good thing, you can skip over these :)

            WARN - You probably want to check this out.

            FAIL - This is going to need your attention!

            Validate from the WebUI

            You can validate your LibreNMS install from the WebUI, using the nav bar and clicking on the little Gear Icon -> Validate Config.

            Validate Config Icon

            Then You should see the results of validate.

            Below is just example of the results.

            Validate results

            \ No newline at end of file diff --git a/Support/Performance/index.html b/Support/Performance/index.html index 3f95f37f..016405d6 100644 --- a/Support/Performance/index.html +++ b/Support/Performance/index.html @@ -1,4 +1,4 @@ - Performance - LibreNMS Docs

            Performance optimisations

            This document will give you some guidance on optimising your setup.

            The suggestions are in a rough order of how much impact they will have.

            RRDCached

            We absolutely recommend running this, it will save on IO load. RRDCached

            MySQL Optimisation

            It's advisable after 24 hours of running MySQL that you run MySQL Tuner which will make suggestions on things you can change specific to your setup.

            One recommendation we can make is that you set the following in my.cnf under a [mysqld] group:

            innodb_flush_log_at_trx_commit = 0
            + Performance - LibreNMS Docs       

            Performance optimisations

            This document will give you some guidance on optimising your setup.

            The suggestions are in a rough order of how much impact they will have.

            RRDCached

            We absolutely recommend running this, it will save on IO load. RRDCached

            MySQL Optimisation

            It's advisable after 24 hours of running MySQL that you run MySQL Tuner which will make suggestions on things you can change specific to your setup.

            One recommendation we can make is that you set the following in my.cnf under a [mysqld] group:

            innodb_flush_log_at_trx_commit = 0
             

            You can also set this to 2. This will have the possibility that you could lose up to 1 second on mysql data in the event MySQL crashes or your server does but it provides an amazing difference in IO use.

            Polling modules

            Review the graph of poller module time take under gear > pollers > performance to see what modules are consuming poller time. This data is shown per device under device > graphs > poller.

            Disable polling (and discovery) modules that you do not need. You can do this globally in config.php like:

            Disable OSPF polling

            poller/poller_modules

            lnms config:set poller_modules.ospf false
             

            You can disable modules globally then re-enable the module per device or the opposite way. For a list of modules please see Poller modules

            SNMP Max Repeaters

            We have support for SNMP Max repeaters which can be handy on devices where we poll a lot of ports or bgp sessions for instance and where snmpwalk or snmpbulkwalk is used. This needs to be enabled on a per device basis under edit device -> snmp -> Max repeaters.

            You can also set this globally with the config option $config['snmp']['max_repeaters'] = X;.

            It's advisable to test the time taken to snmpwalk IF-MIB or something similar to work out what the best value is. To do this run the following but replace -REPEATERS- with varying numbers from 10 upto around 50. You will also need to set the correct snmp version, hostname and community string:

            time snmpbulkwalk -v2c -cpublic HOSTNAME -Cr-REPEATERS- -M /opt/librenms/mibs -m IF-MIB IfEntry

            NOTE: Do not go blindly setting this value as you can impact polling negatively.

            SNMP Max OIDs

            For sensors polling we now do bulk snmp gets to speed things up. By default this is ten but you can overwrite this per device under edit device -> snmp -> Max OIDs.

            You can also set this globally with the config option $config['snmp']['max_oid'] = X;.

            NOTE: It is advisable to monitor sensor polling when you change this to ensure you don't set the value too high.

            fping tuning

            You can change some of the default fping options used globally or per device. The defaults are:

            poller/ping

            lnms config:set fping_options.timeout 500
             lnms config:set fping_options.count 3
            diff --git a/Support/Poller Support/index.html b/Support/Poller Support/index.html
            index 0ffaabc9..142e453b 100644
            --- a/Support/Poller Support/index.html	
            +++ b/Support/Poller Support/index.html	
            @@ -1,4 +1,4 @@
            - Poller Support - LibreNMS Docs       

            lnms device:poll

            This document will explain how to use lnms device:poll to debug issues or manually running to process data.

            Command options

            Description:
            + Poller Support - LibreNMS Docs       

            lnms device:poll

            This document will explain how to use lnms device:poll to debug issues or manually running to process data.

            Command options

            Description:
               Poll data from device(s) as defined by discovery
             
             Usage:
            diff --git a/Support/Remote-Monitoring-VPN/index.html b/Support/Remote-Monitoring-VPN/index.html
            index c39f1846..82561f4c 100644
            --- a/Support/Remote-Monitoring-VPN/index.html
            +++ b/Support/Remote-Monitoring-VPN/index.html
            @@ -1,4 +1,4 @@
            - Remote Monitoring VPN - LibreNMS Docs       

            Remote monitoring using tinc VPN

            This article describes how to use tinc to connect several remote sites and their subnets to your central monitoring server. This will let you connect to devices on remote private IP ranges through one gateway on each site, routing them securely back to your LibreNMS installation.

            Configuring the monitoring server

            tinc should be available on nearly all Linux distributions via package management. If you are running something different, just take a look at tinc's homepage to find an appropriate version for your operating system: https://www.tinc-vpn.org/download/

            I am going to describe the setup for Debian-based systems, but there are virtually no differences for e.g. CentOS or similar.

            • First make sure your firewall accepts connections on port 655 UDP and TCP.
            • Then install tinc via apt-get install tinc.
            • Create the following directory structure to hold all your configuration files: mkdir -p /etc/tinc/myvpn/hosts "myvpn" is your VPN network's name and can be chosen freely.
            • Create your main configuration file: vim /etc/tinc/myvpn/tinc.conf
            Name = monitoring
            + Remote Monitoring VPN - LibreNMS Docs       

            Remote monitoring using tinc VPN

            This article describes how to use tinc to connect several remote sites and their subnets to your central monitoring server. This will let you connect to devices on remote private IP ranges through one gateway on each site, routing them securely back to your LibreNMS installation.

            Configuring the monitoring server

            tinc should be available on nearly all Linux distributions via package management. If you are running something different, just take a look at tinc's homepage to find an appropriate version for your operating system: https://www.tinc-vpn.org/download/

            I am going to describe the setup for Debian-based systems, but there are virtually no differences for e.g. CentOS or similar.

            • First make sure your firewall accepts connections on port 655 UDP and TCP.
            • Then install tinc via apt-get install tinc.
            • Create the following directory structure to hold all your configuration files: mkdir -p /etc/tinc/myvpn/hosts "myvpn" is your VPN network's name and can be chosen freely.
            • Create your main configuration file: vim /etc/tinc/myvpn/tinc.conf
            Name = monitoring
             AddressFamily = ipv4
             Device = /dev/net/tun
             
            • Next we need network up- and down scripts to define a few network settings for inside our VPN: vim /etc/tinc/myvpn/tinc-up
            #!/bin/sh
            diff --git a/Support/SNMP-Configuration-Examples/index.html b/Support/SNMP-Configuration-Examples/index.html
            index d45f5b73..956c34a2 100644
            --- a/Support/SNMP-Configuration-Examples/index.html
            +++ b/Support/SNMP-Configuration-Examples/index.html
            @@ -1,4 +1,4 @@
            - SNMP Configuration Examples - LibreNMS Docs       

            SNMP configuration examples

            Devices

            Cisco

            Adaptive Security Appliance (ASA)

            ASDM

            1. Launch ASDM and connect to your device
            2. Go to Configuration > Management Access > SNMP
            3. Add your community string
            4. Add in the "SNMP Host Access List" section your LibreNMS server IP address
            5. Click Apply and Save

            CLI

            # SNMPv2c
            + SNMP Configuration Examples - LibreNMS Docs       

            SNMP configuration examples

            Devices

            Cisco

            Adaptive Security Appliance (ASA)

            ASDM

            1. Launch ASDM and connect to your device
            2. Go to Configuration > Management Access > SNMP
            3. Add your community string
            4. Add in the "SNMP Host Access List" section your LibreNMS server IP address
            5. Click Apply and Save

            CLI

            # SNMPv2c
             
             snmp-server community <YOUR-COMMUNITY>
             snmp-server contact <YOUR-CONTACT>
            diff --git a/Support/index.html b/Support/index.html
            index 5a202da4..267abf8b 100644
            --- a/Support/index.html
            +++ b/Support/index.html
            @@ -1 +1 @@
            - How to get help - LibreNMS Docs       
            \ No newline at end of file + How to get help - LibreNMS Docs
            \ No newline at end of file diff --git a/index.html b/index.html index f58d1c5b..b022fb27 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ - Home - LibreNMS Docs
            \ No newline at end of file + Home - LibreNMS Docs
            \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json index 05c9be69..719d8e81 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Installing Install LibreNMS Now Install Using Docker Setup Applications Auto Discovery Oxidized RRDCached Alerting Rules Templates Transports More... API Using the API API Endpoints Support FAQ Install validation Performance tweaks More... Developing Getting Started Support for a new OS","title":"Home"},{"location":"API/","text":"Versioning Versioning an API is a minefield which saw us looking at numerous options on how to do this. We have currently settled on using versioning within the API end point itself /api/v0 . As the API itself is new and still in active development we also decided that v0 would be the best starting point to indicate it's in development. Tokens To access any of the token end points you will be required to authenticate using a token. Tokens can be created directly from within the LibreNMS web interface by going to /api-access/ . Click on 'Create API access token'. Select the user you would like to generate the token for. Enter an optional description. Click Create API Token. Endpoints Whilst this documentation will describe and show examples of the end points, we've designed the API so you should be able to traverse through it without knowing any of the available API routes. You can do this by first calling /api/v0 : curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0 Output: { \"list_bgp\" : \"https://librenms.org/api/v0/bgp\" , ... \"edit_rule\" : \"https://librenms.org/api/v0/rules\" } Input Input to the API is done in three different ways, sometimes a combination of two or three of these. Passing parameters via the api route. For example when obtaining a devices details you will pass the hostname of the device in the route: /api/v0/devices/:hostname . Passing parameters via the query string. For example you can list all devices on your install but limit the output to devices that are currently down: /api/v0/devices?type=down Passing data in via JSON, this will mainly be used when adding or updating information via the API, for instance adding a new device: curl -X POST -d '{\"hostname\":\"localhost.localdomain\",\"version\":\"v1\",\"community\":\"public\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices Output Output from the API currently is via two output types: JSON: Most API responses will output json. As shown in the example for calling the API endpoint. PNG: This is for when the request is for an image such as a graph for a switch port. Endpoint Categories Devices DeviceGroups Ports Port_Groups PortGroups Alerts Routing Switching Inventory Bills ARP Services Logs System Locations","title":"Using the API"},{"location":"API/#versioning","text":"Versioning an API is a minefield which saw us looking at numerous options on how to do this. We have currently settled on using versioning within the API end point itself /api/v0 . As the API itself is new and still in active development we also decided that v0 would be the best starting point to indicate it's in development.","title":"Versioning"},{"location":"API/#tokens","text":"To access any of the token end points you will be required to authenticate using a token. Tokens can be created directly from within the LibreNMS web interface by going to /api-access/ . Click on 'Create API access token'. Select the user you would like to generate the token for. Enter an optional description. Click Create API Token.","title":"Tokens"},{"location":"API/#endpoints","text":"Whilst this documentation will describe and show examples of the end points, we've designed the API so you should be able to traverse through it without knowing any of the available API routes. You can do this by first calling /api/v0 : curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0 Output: { \"list_bgp\" : \"https://librenms.org/api/v0/bgp\" , ... \"edit_rule\" : \"https://librenms.org/api/v0/rules\" }","title":"Endpoints"},{"location":"API/#input","text":"Input to the API is done in three different ways, sometimes a combination of two or three of these. Passing parameters via the api route. For example when obtaining a devices details you will pass the hostname of the device in the route: /api/v0/devices/:hostname . Passing parameters via the query string. For example you can list all devices on your install but limit the output to devices that are currently down: /api/v0/devices?type=down Passing data in via JSON, this will mainly be used when adding or updating information via the API, for instance adding a new device: curl -X POST -d '{\"hostname\":\"localhost.localdomain\",\"version\":\"v1\",\"community\":\"public\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices","title":"Input"},{"location":"API/#output","text":"Output from the API currently is via two output types: JSON: Most API responses will output json. As shown in the example for calling the API endpoint. PNG: This is for when the request is for an image such as a graph for a switch port.","title":"Output"},{"location":"API/#endpoint-categories","text":"Devices DeviceGroups Ports Port_Groups PortGroups Alerts Routing Switching Inventory Bills ARP Services Logs System Locations","title":"Endpoint Categories"},{"location":"API/ARP/","text":"list_arp Retrieve a specific ARP entry or all ARP entries for a device Route: /api/v0/resources/ip/arp/:query Query can be: - An IP address - A MAC address - A CIDR network (192.168.1.0/24) - all and set ?device= hostname (or device id) Input: device if you specify all for the query then you need to populate this with the hostname or id of the device. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/arp/1.1.1.1 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/arp/192.168.1.0/24 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/arp/all?device=localhost Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"arp\" : [ { \"port_id\" : \"229\" , \"mac_address\" : \"da160e5c2002\" , \"ipv4_address\" : \"1.1.1.1\" , \"context_name\" : \"\" } ] }","title":"ARP"},{"location":"API/ARP/#list_arp","text":"Retrieve a specific ARP entry or all ARP entries for a device Route: /api/v0/resources/ip/arp/:query Query can be: - An IP address - A MAC address - A CIDR network (192.168.1.0/24) - all and set ?device= hostname (or device id) Input: device if you specify all for the query then you need to populate this with the hostname or id of the device. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/arp/1.1.1.1 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/arp/192.168.1.0/24 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/arp/all?device=localhost Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"arp\" : [ { \"port_id\" : \"229\" , \"mac_address\" : \"da160e5c2002\" , \"ipv4_address\" : \"1.1.1.1\" , \"context_name\" : \"\" } ] }","title":"list_arp"},{"location":"API/Alerts/","text":"get_alert Get details of an alert Route: /api/v0/alerts/:id id is the alert id, you can obtain a list of alert ids from list_alerts . Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts/1 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 7 , \"alerts\" : [ { \"hostname\" : \"localhost\" , \"id\" : \"1\" , \"device_id\" : \"1\" , \"rule_id\" : \"1\" , \"state\" : \"1\" , \"alerted\" : \"1\" , \"open\" : \"1\" , \"timestamp\" : \"2014-12-11 14:40:02\" }] } ack_alert Acknowledge an alert Route: /api/v0/alerts/:id id is the alert id, you can obtain a list of alert ids from list_alerts . note is the note to add to the alert until_clear is a boolean and if set to false, the alert will re-alert if it worsens/betters. Input: - Example: curl -X PUT -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts/1 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"message\" : \"Alert has been acknowledged\" } unmute_alert Unmute an alert Route: /api/v0/alerts/unmute/:id id is the alert id, you can obtain a list of alert ids from list_alerts . Input: - Example: curl -X PUT -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts/unmute/1 Output: { \"status\" : \"ok\" , \"message\" : \"Alert has been unmuted\" } list_alerts List all alerts Route: /api/v0/alerts Input: state: Filter the alerts by state, 0 = ok, 1 = alert, 2 = ack severity: Filter the alerts by severity. Valid values are ok , warning , critical . alert_rule: Filter alerts by alert rule ID. order: How to order the output, default is by timestamp (descending). Can be appended by DESC or ASC to change the order. Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts?state=1 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts?severity=critical curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts?order=timestamp%20ASC curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts?alert_rule=49 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"alerts\" : [ { \"id\" : \"1\" , \"device_id\" : \"1\" , \"rule_id\" : \"1\" , \"state\" : \"1\" , \"alerted\" : \"1\" , \"open\" : \"1\" , \"timestamp\" : \"2014-12-11 14:40:02\" }] } Rules get_alert_rule Get the alert rule details. Route: /api/v0/rules/:id id is the rule id. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules/1 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"rules\" : [ { \"id\" : \"1\" , \"device_id\" : \"1\" , \"rule\" : \"%devices.os != \\\"Juniper\\\"\" , \"severity\" : \"warning\" , \"extra\" : \"{\\\"mute\\\":true,\\\"count\\\":\\\"15\\\",\\\"delay\\\":null,\\\"invert\\\":false}\" , \"disabled\" : \"0\" , \"name\" : \"A test rule\" } ] } delete_rule Delete an alert rule by id Route: /api/v0/rules/:id id is the rule id. Input: - Example: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules/1 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"message\" : \"Alert rule has been removed\" } list_alert_rules List the alert rules. Route: /api/v0/rules - Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"rules\" : [ { \"id\" : \"1\" , \"device_id\" : \"-1\" , \"rule\" : \"%devices.os != \\\"Juniper\\\"\" , \"severity\" : \"critical\" , \"extra\" : \"{\\\"mute\\\":false,\\\"count\\\":\\\"15\\\",\\\"delay\\\":\\\"300\\\",\\\"invert\\\":false}\" , \"disabled\" : \"0\" , \"name\" : \"A test rule\" }] } add_rule Add a new alert rule. Route: /api/v0/rules - Input (JSON): devices: This is either an array of device ids or -1 for a global rule builder: The rule which should be in the format entity.condition value (i.e devices.status != 0 for devices marked as down). It must be json encoded in the format rules are currently stored. severity: The severity level the alert will be raised against, Ok, Warning, Critical. disabled: Whether the rule will be disabled or not, 0 = enabled, 1 = disabled count: This is how many polling runs before an alert will trigger and the frequency. delay: Delay is when to start alerting and how frequently. The value is stored in seconds but you can specify minutes, hours or days by doing 5 m, 5 h, 5 d for each one. interval: How often to re-issue notifications while this alert is active,0 means notify once.The value is stored in seconds but you can specify minutes, hours or days by doing 5 m, 5 h, 5 d for each one. mute: If mute is enabled then an alert will never be sent but will show up in the Web UI (true or false). invert: This would invert the rules check. name: This is the name of the rule and is mandatory. notes: Some informal notes for this rule Example: curl -X POST -d '{\"devices\":[1,2,3], \"name\": \"testrule\", \"builder\":{\"condition\":\"AND\",\"rules\":[{\"id\":\"devices.hostname\",\"field\":\"devices.hostname\",\"type\":\"string\",\"input\":\"text\",\"operator\":\"equal\",\"value\":\"localhost\"}],\"valid\":true},\"severity\": \"critical\",\"count\":15,\"delay\":\"5 m\",\"interval\":\"5 m\",\"mute\":false,\"notes\":\"This a note from the API\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules Output: { \"status\" : \"ok\" } edit_rule Edit an existing alert rule Route: /api/v0/rules - Input (JSON): rule_id: You must specify the rule_id to edit an existing rule, if this is absent then a new rule will be created. devices: This is either an array of device ids or -1 for a global rule builder: The rule which should be in the format entity.condition value (i.e devices.status != 0 for devices marked as down). It must be json encoded in the format rules are currently stored. severity: The severity level the alert will be raised against, Ok, Warning, Critical. disabled: Whether the rule will be disabled or not, 0 = enabled, 1 = disabled count: This is how many polling runs before an alert will trigger and the frequency. delay: Delay is when to start alerting and how frequently. The value is stored in seconds but you can specify minutes, hours or days by doing 5 m, 5 h, 5 d for each one. interval: How often to re-issue notifications while this alert is active,0 means notify once.The value is stored in seconds but you can specify minutes, hours or days by doing 5 m, 5 h, 5 d for each one. mute: If mute is enabled then an alert will never be sent but will show up in the Web UI (true or false). invert: This would invert the rules check. name: This is the name of the rule and is mandatory. notes: Some informal notes for this rule Example: curl -X PUT -d '{\"rule_id\":1,\"device_id\":\"-1\", \"name\": \"testrule\", \"builder\":{\"condition\":\"AND\",\"rules\":[{\"id\":\"devices.hostname\",\"field\":\"devices.hostname\",\"type\":\"string\",\"input\":\"text\",\"operator\":\"equal\",\"value\":\"localhost\"}],\"valid\":true},\"severity\": \"critical\",\"count\":15,\"delay\":\"5 m\",\"interval\":\"5 m\",\"mute\":false,\"notes\":\"This a note from the API\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules Output: { \"status\" : \"ok\" }","title":"Alerts"},{"location":"API/Alerts/#get_alert","text":"Get details of an alert Route: /api/v0/alerts/:id id is the alert id, you can obtain a list of alert ids from list_alerts . Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts/1 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 7 , \"alerts\" : [ { \"hostname\" : \"localhost\" , \"id\" : \"1\" , \"device_id\" : \"1\" , \"rule_id\" : \"1\" , \"state\" : \"1\" , \"alerted\" : \"1\" , \"open\" : \"1\" , \"timestamp\" : \"2014-12-11 14:40:02\" }] }","title":"get_alert"},{"location":"API/Alerts/#ack_alert","text":"Acknowledge an alert Route: /api/v0/alerts/:id id is the alert id, you can obtain a list of alert ids from list_alerts . note is the note to add to the alert until_clear is a boolean and if set to false, the alert will re-alert if it worsens/betters. Input: - Example: curl -X PUT -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts/1 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"message\" : \"Alert has been acknowledged\" }","title":"ack_alert"},{"location":"API/Alerts/#unmute_alert","text":"Unmute an alert Route: /api/v0/alerts/unmute/:id id is the alert id, you can obtain a list of alert ids from list_alerts . Input: - Example: curl -X PUT -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts/unmute/1 Output: { \"status\" : \"ok\" , \"message\" : \"Alert has been unmuted\" }","title":"unmute_alert"},{"location":"API/Alerts/#list_alerts","text":"List all alerts Route: /api/v0/alerts Input: state: Filter the alerts by state, 0 = ok, 1 = alert, 2 = ack severity: Filter the alerts by severity. Valid values are ok , warning , critical . alert_rule: Filter alerts by alert rule ID. order: How to order the output, default is by timestamp (descending). Can be appended by DESC or ASC to change the order. Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts?state=1 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts?severity=critical curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts?order=timestamp%20ASC curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts?alert_rule=49 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"alerts\" : [ { \"id\" : \"1\" , \"device_id\" : \"1\" , \"rule_id\" : \"1\" , \"state\" : \"1\" , \"alerted\" : \"1\" , \"open\" : \"1\" , \"timestamp\" : \"2014-12-11 14:40:02\" }] }","title":"list_alerts"},{"location":"API/Alerts/#rules","text":"","title":"Rules"},{"location":"API/Alerts/#get_alert_rule","text":"Get the alert rule details. Route: /api/v0/rules/:id id is the rule id. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules/1 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"rules\" : [ { \"id\" : \"1\" , \"device_id\" : \"1\" , \"rule\" : \"%devices.os != \\\"Juniper\\\"\" , \"severity\" : \"warning\" , \"extra\" : \"{\\\"mute\\\":true,\\\"count\\\":\\\"15\\\",\\\"delay\\\":null,\\\"invert\\\":false}\" , \"disabled\" : \"0\" , \"name\" : \"A test rule\" } ] }","title":"get_alert_rule"},{"location":"API/Alerts/#delete_rule","text":"Delete an alert rule by id Route: /api/v0/rules/:id id is the rule id. Input: - Example: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules/1 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"message\" : \"Alert rule has been removed\" }","title":"delete_rule"},{"location":"API/Alerts/#list_alert_rules","text":"List the alert rules. Route: /api/v0/rules - Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"rules\" : [ { \"id\" : \"1\" , \"device_id\" : \"-1\" , \"rule\" : \"%devices.os != \\\"Juniper\\\"\" , \"severity\" : \"critical\" , \"extra\" : \"{\\\"mute\\\":false,\\\"count\\\":\\\"15\\\",\\\"delay\\\":\\\"300\\\",\\\"invert\\\":false}\" , \"disabled\" : \"0\" , \"name\" : \"A test rule\" }] }","title":"list_alert_rules"},{"location":"API/Alerts/#add_rule","text":"Add a new alert rule. Route: /api/v0/rules - Input (JSON): devices: This is either an array of device ids or -1 for a global rule builder: The rule which should be in the format entity.condition value (i.e devices.status != 0 for devices marked as down). It must be json encoded in the format rules are currently stored. severity: The severity level the alert will be raised against, Ok, Warning, Critical. disabled: Whether the rule will be disabled or not, 0 = enabled, 1 = disabled count: This is how many polling runs before an alert will trigger and the frequency. delay: Delay is when to start alerting and how frequently. The value is stored in seconds but you can specify minutes, hours or days by doing 5 m, 5 h, 5 d for each one. interval: How often to re-issue notifications while this alert is active,0 means notify once.The value is stored in seconds but you can specify minutes, hours or days by doing 5 m, 5 h, 5 d for each one. mute: If mute is enabled then an alert will never be sent but will show up in the Web UI (true or false). invert: This would invert the rules check. name: This is the name of the rule and is mandatory. notes: Some informal notes for this rule Example: curl -X POST -d '{\"devices\":[1,2,3], \"name\": \"testrule\", \"builder\":{\"condition\":\"AND\",\"rules\":[{\"id\":\"devices.hostname\",\"field\":\"devices.hostname\",\"type\":\"string\",\"input\":\"text\",\"operator\":\"equal\",\"value\":\"localhost\"}],\"valid\":true},\"severity\": \"critical\",\"count\":15,\"delay\":\"5 m\",\"interval\":\"5 m\",\"mute\":false,\"notes\":\"This a note from the API\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules Output: { \"status\" : \"ok\" }","title":"add_rule"},{"location":"API/Alerts/#edit_rule","text":"Edit an existing alert rule Route: /api/v0/rules - Input (JSON): rule_id: You must specify the rule_id to edit an existing rule, if this is absent then a new rule will be created. devices: This is either an array of device ids or -1 for a global rule builder: The rule which should be in the format entity.condition value (i.e devices.status != 0 for devices marked as down). It must be json encoded in the format rules are currently stored. severity: The severity level the alert will be raised against, Ok, Warning, Critical. disabled: Whether the rule will be disabled or not, 0 = enabled, 1 = disabled count: This is how many polling runs before an alert will trigger and the frequency. delay: Delay is when to start alerting and how frequently. The value is stored in seconds but you can specify minutes, hours or days by doing 5 m, 5 h, 5 d for each one. interval: How often to re-issue notifications while this alert is active,0 means notify once.The value is stored in seconds but you can specify minutes, hours or days by doing 5 m, 5 h, 5 d for each one. mute: If mute is enabled then an alert will never be sent but will show up in the Web UI (true or false). invert: This would invert the rules check. name: This is the name of the rule and is mandatory. notes: Some informal notes for this rule Example: curl -X PUT -d '{\"rule_id\":1,\"device_id\":\"-1\", \"name\": \"testrule\", \"builder\":{\"condition\":\"AND\",\"rules\":[{\"id\":\"devices.hostname\",\"field\":\"devices.hostname\",\"type\":\"string\",\"input\":\"text\",\"operator\":\"equal\",\"value\":\"localhost\"}],\"valid\":true},\"severity\": \"critical\",\"count\":15,\"delay\":\"5 m\",\"interval\":\"5 m\",\"mute\":false,\"notes\":\"This a note from the API\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules Output: { \"status\" : \"ok\" }","title":"edit_rule"},{"location":"API/Bills/","text":"list_bills Retrieve the list of bills currently in the system. Route: /api/v0/bills /api/v0/bills?period=previous Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills?period=previous Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"bills\" : [ { \"bill_id\" : \"1\" , \"bill_name\" : \"Router bills\" , \"bill_type\" : \"cdr\" , \"bill_cdr\" : \"10000000\" , \"bill_day\" : \"1\" , \"bill_quota\" : \"0\" , \"rate_95th_in\" : \"0\" , \"rate_95th_out\" : \"0\" , \"rate_95th\" : \"0\" , \"dir_95th\" : \"in\" , \"total_data\" : \"0\" , \"total_data_in\" : \"0\" , \"total_data_out\" : \"0\" , \"rate_average_in\" : \"0\" , \"rate_average_out\" : \"0\" , \"rate_average\" : \"0\" , \"bill_last_calc\" : \"2015-07-02 17:01:26\" , \"bill_custid\" : \"Router\" , \"bill_ref\" : \"Router\" , \"bill_notes\" : \"Bill me\" , \"bill_autoadded\" : \"0\" , \"ports_total\" : \"0\" , \"allowed\" : \"10Mbps\" , \"used\" : \"0bps\" , \"percent\" : 0 , \"overuse\" : \"-\" , \"ports\" : [ { \"device_id\" : \"168\" , \"port_id\" : \"35146\" , \"ifName\" : \"eth0\" } ] } ] } get_bill Retrieve a specific bill Route: /api/v0/bills/:id /api/v0/bills/:id?period=previous /api/v0/bills?ref=:ref /api/v0/bills?ref=:ref&period=previous /api/v0/bills?custid=:custid /api/v0/bills?custid=:custid&period=previous id is the specific bill id ref is the billing reference custid is the customer reference period=previous indicates you would like the data for the last complete period rather than the current period Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills?ref=:customerref curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills?custid=:custid Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"bills\" : [ { \"bill_id\" : \"1\" , \"bill_name\" : \"Router bills\" , \"bill_type\" : \"cdr\" , \"bill_cdr\" : \"10000000\" , \"bill_day\" : \"1\" , \"bill_quota\" : \"0\" , \"rate_95th_in\" : \"0\" , \"rate_95th_out\" : \"0\" , \"rate_95th\" : \"0\" , \"dir_95th\" : \"in\" , \"total_data\" : \"0\" , \"total_data_in\" : \"0\" , \"total_data_out\" : \"0\" , \"rate_average_in\" : \"0\" , \"rate_average_out\" : \"0\" , \"rate_average\" : \"0\" , \"bill_last_calc\" : \"2015-07-02 17:01:26\" , \"bill_custid\" : \"Router\" , \"bill_ref\" : \"Router\" , \"bill_notes\" : \"Bill me\" , \"bill_autoadded\" : \"0\" , \"ports_total\" : \"0\" , \"allowed\" : \"10Mbps\" , \"used\" : \"0bps\" , \"percent\" : 0 , \"overuse\" : \"-\" , \"ports\" : [ { \"device_id\" : \"168\" , \"port_id\" : \"35146\" , \"ifName\" : \"eth0\" } ] } ] } get_bill_graph Retrieve a graph image associated with a bill. NB: The graphs returned from this will always be png as they do not come from rrdtool, even if you have SVG set. Route: `/api/v0/bills/:id/graphs/:graph_type Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphs/bits curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphs/bits?from=1517443200 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphs/bits?from=1517443200&to=1517788800 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphs/monthly Output: Graph Image get_bill_graphdata Retrieve the data used to draw a graph so it can be rendered in an external system Route: /api/v0/bills/:id/graphdata/:graph_type Input: The reducefactor parameter is used to reduce the number of data points. Billing data has 5 minute granularity, so requesting a graph for a long time period will result in many data points. If not supplied, it will be automatically calculated. A reducefactor of 1 means return all items, 2 means half of the items etc. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphdata/bits curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphdata/bits?from=1517443200 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphdata/bits?from=1517443200&to=1517788800 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphdata/bits?from=1517443200&to=1517788800&reducefactor=5 Output: { \"status\": \"ok\", \"graph_data\": { \"from\": \"1517443200\", \"to\": 1518196161, \"last\": \"1518195901\", \"in_data\": [ 103190525.20999999, 104949255.81 ], \"out_data\": [ 1102059.1299999999, 1079216.46 ], \"tot_data\": [ 104292584.33999999, 106028472.27 ], \"ticks\": [ \"1517750401\", \"1517756101\" ], \"rate_95th\": \"251880417\", \"rate_average\": \"146575554\", \"bill_type\": \"cdr\", \"max_in\": 9888289942, \"max_out\": 75848756, \"ave_in\": 18029660.242105871, \"ave_out\": 196447.38060137472, \"last_in\": 3790227.9500000002, \"last_out\": 122731.63333333333 } } get_bill_history Retrieve the history of specific bill Route: /api/v0/bills/:id/history Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history Output: { \"status\" : \"ok\" , \"bill_history\" : [ { \"bill_hist_id\" : \"1\" , \"bill_id\" : \"1\" , \"updated\" : \"2018-02-06 17:01:01\" , \"bill_datefrom\" : \"2018-02-01 00:00:00\" , \"bill_dateto\" : \"2018-02-28 23:59:59\" , \"bill_type\" : \"CDR\" , \"bill_allowed\" : \"100000000\" , \"bill_used\" : \"229963765\" , \"bill_overuse\" : \"129963765\" , \"bill_percent\" : \"229.96\" , \"rate_95th_in\" : \"229963765\" , \"rate_95th_out\" : \"1891344\" , \"rate_95th\" : \"229963765\" , \"dir_95th\" : \"in\" , \"rate_average\" : \"136527101\" , \"rate_average_in\" : \"135123359\" , \"rate_average_out\" : \"1403743\" , \"traf_in\" : \"3235123452544\" , \"traf_out\" : \"33608406566\" , \"traf_total\" : \"3268731859110\" , \"bill_peak_out\" : \"2782349290\" , \"bill_peak_in\" : \"10161119\" , \"pdf\" : null } ], \"count\" : 1 , } get_bill_history_graph Retrieve a graph of a previous period of a bill NB: The graphs returned from this will always be png as they do not come from rrdtool, even if you have SVG set. Route: /api/v0/bills/:id/history/:bill_hist_id/graphs/:graph_type Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphs/bits curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphs/hour curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphs/day Output: (image) get_bill_history_graphdata Retrieve the data for a graph of a previous period of a bill, to be rendered in an external system Route: /api/v0/bills/:id/history/:bill_hist_id/graphdata/:graph_type Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphdata/bits curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphdata/hour curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphdata/day Output: delete_bill Delete a specific bill and all dependent data Route: /api/v0/bills/:id id is the specific bill id Input: Example: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1 Output: { \"status\" : \"ok\" , \"message\" : \"Bill has been removed\" } create_edit_bill Creates a new bill or updates an existing one Route: /api/v0/bills Method: POST If you send an existing bill_id the call replaces all values it receives. For example if you send 2 ports it will delete the existing ports and add the the 2 new ports. So to add ports you have to get the current ports first and add them to your update call. Input: Example (create): curl -X POST -d '{\"ports\":[ 1021 ],\"bill_name\":\"NEWBILL\",\"bill_day\":\"1\",\"bill_type\":\"quota\",\"bill_quota\":\"2000000000000\",\"bill_custid\":\"1337\",\"bill_ref\":\"reference1\",\"bill_notes\":\"mynote\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills Example (set): curl -X POST -d '{\"bill_id\":\"32\",\"ports\":[ 1021 ],\"bill_name\":\"NEWNAME\",\"bill_quota\":\"1000000000000\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills Output: { \"status\" : \"ok\" , \"bill_id\" : 32 }","title":"Bills"},{"location":"API/Bills/#list_bills","text":"Retrieve the list of bills currently in the system. Route: /api/v0/bills /api/v0/bills?period=previous Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills?period=previous Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"bills\" : [ { \"bill_id\" : \"1\" , \"bill_name\" : \"Router bills\" , \"bill_type\" : \"cdr\" , \"bill_cdr\" : \"10000000\" , \"bill_day\" : \"1\" , \"bill_quota\" : \"0\" , \"rate_95th_in\" : \"0\" , \"rate_95th_out\" : \"0\" , \"rate_95th\" : \"0\" , \"dir_95th\" : \"in\" , \"total_data\" : \"0\" , \"total_data_in\" : \"0\" , \"total_data_out\" : \"0\" , \"rate_average_in\" : \"0\" , \"rate_average_out\" : \"0\" , \"rate_average\" : \"0\" , \"bill_last_calc\" : \"2015-07-02 17:01:26\" , \"bill_custid\" : \"Router\" , \"bill_ref\" : \"Router\" , \"bill_notes\" : \"Bill me\" , \"bill_autoadded\" : \"0\" , \"ports_total\" : \"0\" , \"allowed\" : \"10Mbps\" , \"used\" : \"0bps\" , \"percent\" : 0 , \"overuse\" : \"-\" , \"ports\" : [ { \"device_id\" : \"168\" , \"port_id\" : \"35146\" , \"ifName\" : \"eth0\" } ] } ] }","title":"list_bills"},{"location":"API/Bills/#get_bill","text":"Retrieve a specific bill Route: /api/v0/bills/:id /api/v0/bills/:id?period=previous /api/v0/bills?ref=:ref /api/v0/bills?ref=:ref&period=previous /api/v0/bills?custid=:custid /api/v0/bills?custid=:custid&period=previous id is the specific bill id ref is the billing reference custid is the customer reference period=previous indicates you would like the data for the last complete period rather than the current period Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills?ref=:customerref curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills?custid=:custid Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"bills\" : [ { \"bill_id\" : \"1\" , \"bill_name\" : \"Router bills\" , \"bill_type\" : \"cdr\" , \"bill_cdr\" : \"10000000\" , \"bill_day\" : \"1\" , \"bill_quota\" : \"0\" , \"rate_95th_in\" : \"0\" , \"rate_95th_out\" : \"0\" , \"rate_95th\" : \"0\" , \"dir_95th\" : \"in\" , \"total_data\" : \"0\" , \"total_data_in\" : \"0\" , \"total_data_out\" : \"0\" , \"rate_average_in\" : \"0\" , \"rate_average_out\" : \"0\" , \"rate_average\" : \"0\" , \"bill_last_calc\" : \"2015-07-02 17:01:26\" , \"bill_custid\" : \"Router\" , \"bill_ref\" : \"Router\" , \"bill_notes\" : \"Bill me\" , \"bill_autoadded\" : \"0\" , \"ports_total\" : \"0\" , \"allowed\" : \"10Mbps\" , \"used\" : \"0bps\" , \"percent\" : 0 , \"overuse\" : \"-\" , \"ports\" : [ { \"device_id\" : \"168\" , \"port_id\" : \"35146\" , \"ifName\" : \"eth0\" } ] } ] }","title":"get_bill"},{"location":"API/Bills/#get_bill_graph","text":"Retrieve a graph image associated with a bill. NB: The graphs returned from this will always be png as they do not come from rrdtool, even if you have SVG set. Route: `/api/v0/bills/:id/graphs/:graph_type Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphs/bits curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphs/bits?from=1517443200 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphs/bits?from=1517443200&to=1517788800 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphs/monthly Output: Graph Image","title":"get_bill_graph"},{"location":"API/Bills/#get_bill_graphdata","text":"Retrieve the data used to draw a graph so it can be rendered in an external system Route: /api/v0/bills/:id/graphdata/:graph_type Input: The reducefactor parameter is used to reduce the number of data points. Billing data has 5 minute granularity, so requesting a graph for a long time period will result in many data points. If not supplied, it will be automatically calculated. A reducefactor of 1 means return all items, 2 means half of the items etc. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphdata/bits curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphdata/bits?from=1517443200 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphdata/bits?from=1517443200&to=1517788800 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphdata/bits?from=1517443200&to=1517788800&reducefactor=5 Output: { \"status\": \"ok\", \"graph_data\": { \"from\": \"1517443200\", \"to\": 1518196161, \"last\": \"1518195901\", \"in_data\": [ 103190525.20999999, 104949255.81 ], \"out_data\": [ 1102059.1299999999, 1079216.46 ], \"tot_data\": [ 104292584.33999999, 106028472.27 ], \"ticks\": [ \"1517750401\", \"1517756101\" ], \"rate_95th\": \"251880417\", \"rate_average\": \"146575554\", \"bill_type\": \"cdr\", \"max_in\": 9888289942, \"max_out\": 75848756, \"ave_in\": 18029660.242105871, \"ave_out\": 196447.38060137472, \"last_in\": 3790227.9500000002, \"last_out\": 122731.63333333333 } }","title":"get_bill_graphdata"},{"location":"API/Bills/#get_bill_history","text":"Retrieve the history of specific bill Route: /api/v0/bills/:id/history Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history Output: { \"status\" : \"ok\" , \"bill_history\" : [ { \"bill_hist_id\" : \"1\" , \"bill_id\" : \"1\" , \"updated\" : \"2018-02-06 17:01:01\" , \"bill_datefrom\" : \"2018-02-01 00:00:00\" , \"bill_dateto\" : \"2018-02-28 23:59:59\" , \"bill_type\" : \"CDR\" , \"bill_allowed\" : \"100000000\" , \"bill_used\" : \"229963765\" , \"bill_overuse\" : \"129963765\" , \"bill_percent\" : \"229.96\" , \"rate_95th_in\" : \"229963765\" , \"rate_95th_out\" : \"1891344\" , \"rate_95th\" : \"229963765\" , \"dir_95th\" : \"in\" , \"rate_average\" : \"136527101\" , \"rate_average_in\" : \"135123359\" , \"rate_average_out\" : \"1403743\" , \"traf_in\" : \"3235123452544\" , \"traf_out\" : \"33608406566\" , \"traf_total\" : \"3268731859110\" , \"bill_peak_out\" : \"2782349290\" , \"bill_peak_in\" : \"10161119\" , \"pdf\" : null } ], \"count\" : 1 , }","title":"get_bill_history"},{"location":"API/Bills/#get_bill_history_graph","text":"Retrieve a graph of a previous period of a bill NB: The graphs returned from this will always be png as they do not come from rrdtool, even if you have SVG set. Route: /api/v0/bills/:id/history/:bill_hist_id/graphs/:graph_type Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphs/bits curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphs/hour curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphs/day Output: (image)","title":"get_bill_history_graph"},{"location":"API/Bills/#get_bill_history_graphdata","text":"Retrieve the data for a graph of a previous period of a bill, to be rendered in an external system Route: /api/v0/bills/:id/history/:bill_hist_id/graphdata/:graph_type Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphdata/bits curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphdata/hour curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphdata/day Output:","title":"get_bill_history_graphdata"},{"location":"API/Bills/#delete_bill","text":"Delete a specific bill and all dependent data Route: /api/v0/bills/:id id is the specific bill id Input: Example: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1 Output: { \"status\" : \"ok\" , \"message\" : \"Bill has been removed\" }","title":"delete_bill"},{"location":"API/Bills/#create_edit_bill","text":"Creates a new bill or updates an existing one Route: /api/v0/bills Method: POST If you send an existing bill_id the call replaces all values it receives. For example if you send 2 ports it will delete the existing ports and add the the 2 new ports. So to add ports you have to get the current ports first and add them to your update call. Input: Example (create): curl -X POST -d '{\"ports\":[ 1021 ],\"bill_name\":\"NEWBILL\",\"bill_day\":\"1\",\"bill_type\":\"quota\",\"bill_quota\":\"2000000000000\",\"bill_custid\":\"1337\",\"bill_ref\":\"reference1\",\"bill_notes\":\"mynote\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills Example (set): curl -X POST -d '{\"bill_id\":\"32\",\"ports\":[ 1021 ],\"bill_name\":\"NEWNAME\",\"bill_quota\":\"1000000000000\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills Output: { \"status\" : \"ok\" , \"bill_id\" : 32 }","title":"create_edit_bill"},{"location":"API/DeviceGroups/","text":"get_devicegroups List all device groups. Route: /api/v0/devicegroups Input (JSON): - Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devicegroups Output: [ { \"status\" : \"ok\" , \"message\" : \"Found 1 device groups\" , \"count\" : 1 , \"groups\" : [ { \"id\" : \"1\" , \"name\" : \"Testing\" , \"desc\" : \"Testing\" , \"pattern\" : \"%devices.status = \\\"1\\\" &&\" } ] } ] add_devicegroup Add a new device group. Upon success, the ID of the new device group is returned and the HTTP response code is 201 . Route: /api/v0/devicegroups Input (JSON): name : required - The name of the device group type : required - should be static or dynamic . Setting this to static requires that the devices input be provided desc : optional - Description of the device group rules : required if type == dynamic - A set of rules to determine which devices should be included in this device group devices : required if type == static - A list of devices that should be included in this group. This is a static list of devices Examples: Dynamic Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups \\ --data-raw ' { \"name\": \"New Device Group\", \"desc\": \"A very fancy dynamic group\", \"type\": \"dynamic\", \"rules\": \"{\\\"condition\\\":\\\"AND\\\",\\\"rules\\\":[{\\\"id\\\":\\\"access_points.name\\\",\\\"field\\\":\\\"access_points.name\\\",\\\"type\\\":\\\"string\\\",\\\"input\\\":\\\"text\\\",\\\"operator\\\":\\\"equal\\\",\\\"value\\\":\\\"accesspoint1\\\"}],\\\"valid\\\":true}\" } ' Output: { \"status\" : \"ok\" , \"id\" : 86 , \"message\" : \"Device group New Device Group created\" } Static Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups \\ -d '{\"name\":\"New Device Group\",\"type\":\"static\",\"devices\":[261,271]}' Output: { \"status\" : \"ok\" , \"id\" : 86 , \"message\" : \"Device group New Device Group created\" } update_devicegroup Updates a device group. Route: /api/v0/devicegroups/:name name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input (JSON): name : optional - The name of the device group type : optional - should be static or dynamic . Setting this to static requires that the devices input be provided desc : optional - Description of the device group rules : required if type == dynamic - A set of rules to determine which devices should be included in this device group devices : required if type == static - A list of devices that should be included in this group. This is a static list of devices Examples: curl -X PATCH -d '{\"name\": \"NewLinuxServers\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/LinuxServers Output: { \"status\" : \"ok\" , \"message\" : \"Device group LinuxServers updated\" } delete_devicegroup Deletes a device group. Route: /api/v0/devicegroups/:name name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input: - Examples: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/LinuxServers Output: { \"status\" : \"ok\" , \"message\" : \"Device group LinuxServers deleted\" } get_devices_by_group List all devices matching the group provided. Route: /api/v0/devicegroups/:name name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input (JSON): full: set to any value to return all data for the devices in a given group Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devicegroups/LinuxServers Output: [ { \"status\" : \"ok\" , \"message\" : \"Found 3 in group LinuxServers\" , \"count\" : 3 , \"devices\" : [ { \"device_id\" : \"15\" }, { \"device_id\" : \"18\" }, { \"device_id\" : \"20\" } ] } ] maintenance_devicegroup Set a device group into maintenance mode. Route: /api/v0/devicesgroups/:name/maintenance Input (JSON): title : optional - Some title for the Maintenance Will be replaced with device group name if omitted notes : optional - Some description for the Maintenance start : optional - start time of Maintenance in full format Y-m-d H:i:00 eg: 2022-08-01 22:45:00 Current system time now() will be used if omitted duration : required - Duration of Maintenance in format H:i / Hrs:Mins eg: 02:00 Example with start time: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups/Cisco%20switches/maintenance/ \\ --data-raw ' { \"title\":\"Device group Maintenance\", \"notes\":\"A 2 hour Maintenance triggered via API with start time\", \"start\":\"2022-08-01 08:00:00\", \"duration\":\"2:00\" } ' Output: { \"status\" : \"ok\" , \"message\" : \"Device group Cisco switches (2) will begin maintenance mode at 2022-08-01 22:45:00 for 2:00h\" } Example with no start time: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups/Cisco%20switches/maintenance/ \\ --data-raw ' { \"title\":\"Device group Maintenance\", \"notes\":\"A 2 hour Maintenance triggered via API with no start time\", \"duration\":\"2:00\" } ' Output: { \"status\" : \"ok\" , \"message\" : \"Device group Cisco switches (2) moved into maintenance mode for 2:00h\" } Add devices to group Add devices to a device group. Route: /api/v0/devicesgroups/:name/devices name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input (JSON): devices : required - A list of devices to be added to the group. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups/devices \\ --data-raw '{\"devices\":[261,271]}' Output: { \"status\" : \"ok\" , \"message\" : \"Devices added\" } Remove devices from group Removes devices from a device group. Route: /api/v0/devicesgroups/:name/devices name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input (JSON): devices : required - A list of devices to be removed from the group. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X DELETE https://librenms.org/api/v0/devicegroups/devices \\ --data-raw '{\"devices\":[261,271]}' Output: { \"status\" : \"ok\" , \"message\" : \"Devices removed\" }","title":"DeviceGroups"},{"location":"API/DeviceGroups/#get_devicegroups","text":"List all device groups. Route: /api/v0/devicegroups Input (JSON): - Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devicegroups Output: [ { \"status\" : \"ok\" , \"message\" : \"Found 1 device groups\" , \"count\" : 1 , \"groups\" : [ { \"id\" : \"1\" , \"name\" : \"Testing\" , \"desc\" : \"Testing\" , \"pattern\" : \"%devices.status = \\\"1\\\" &&\" } ] } ]","title":"get_devicegroups"},{"location":"API/DeviceGroups/#add_devicegroup","text":"Add a new device group. Upon success, the ID of the new device group is returned and the HTTP response code is 201 . Route: /api/v0/devicegroups Input (JSON): name : required - The name of the device group type : required - should be static or dynamic . Setting this to static requires that the devices input be provided desc : optional - Description of the device group rules : required if type == dynamic - A set of rules to determine which devices should be included in this device group devices : required if type == static - A list of devices that should be included in this group. This is a static list of devices Examples: Dynamic Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups \\ --data-raw ' { \"name\": \"New Device Group\", \"desc\": \"A very fancy dynamic group\", \"type\": \"dynamic\", \"rules\": \"{\\\"condition\\\":\\\"AND\\\",\\\"rules\\\":[{\\\"id\\\":\\\"access_points.name\\\",\\\"field\\\":\\\"access_points.name\\\",\\\"type\\\":\\\"string\\\",\\\"input\\\":\\\"text\\\",\\\"operator\\\":\\\"equal\\\",\\\"value\\\":\\\"accesspoint1\\\"}],\\\"valid\\\":true}\" } ' Output: { \"status\" : \"ok\" , \"id\" : 86 , \"message\" : \"Device group New Device Group created\" } Static Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups \\ -d '{\"name\":\"New Device Group\",\"type\":\"static\",\"devices\":[261,271]}' Output: { \"status\" : \"ok\" , \"id\" : 86 , \"message\" : \"Device group New Device Group created\" }","title":"add_devicegroup"},{"location":"API/DeviceGroups/#update_devicegroup","text":"Updates a device group. Route: /api/v0/devicegroups/:name name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input (JSON): name : optional - The name of the device group type : optional - should be static or dynamic . Setting this to static requires that the devices input be provided desc : optional - Description of the device group rules : required if type == dynamic - A set of rules to determine which devices should be included in this device group devices : required if type == static - A list of devices that should be included in this group. This is a static list of devices Examples: curl -X PATCH -d '{\"name\": \"NewLinuxServers\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/LinuxServers Output: { \"status\" : \"ok\" , \"message\" : \"Device group LinuxServers updated\" }","title":"update_devicegroup"},{"location":"API/DeviceGroups/#delete_devicegroup","text":"Deletes a device group. Route: /api/v0/devicegroups/:name name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input: - Examples: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/LinuxServers Output: { \"status\" : \"ok\" , \"message\" : \"Device group LinuxServers deleted\" }","title":"delete_devicegroup"},{"location":"API/DeviceGroups/#get_devices_by_group","text":"List all devices matching the group provided. Route: /api/v0/devicegroups/:name name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input (JSON): full: set to any value to return all data for the devices in a given group Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devicegroups/LinuxServers Output: [ { \"status\" : \"ok\" , \"message\" : \"Found 3 in group LinuxServers\" , \"count\" : 3 , \"devices\" : [ { \"device_id\" : \"15\" }, { \"device_id\" : \"18\" }, { \"device_id\" : \"20\" } ] } ]","title":"get_devices_by_group"},{"location":"API/DeviceGroups/#maintenance_devicegroup","text":"Set a device group into maintenance mode. Route: /api/v0/devicesgroups/:name/maintenance Input (JSON): title : optional - Some title for the Maintenance Will be replaced with device group name if omitted notes : optional - Some description for the Maintenance start : optional - start time of Maintenance in full format Y-m-d H:i:00 eg: 2022-08-01 22:45:00 Current system time now() will be used if omitted duration : required - Duration of Maintenance in format H:i / Hrs:Mins eg: 02:00 Example with start time: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups/Cisco%20switches/maintenance/ \\ --data-raw ' { \"title\":\"Device group Maintenance\", \"notes\":\"A 2 hour Maintenance triggered via API with start time\", \"start\":\"2022-08-01 08:00:00\", \"duration\":\"2:00\" } ' Output: { \"status\" : \"ok\" , \"message\" : \"Device group Cisco switches (2) will begin maintenance mode at 2022-08-01 22:45:00 for 2:00h\" } Example with no start time: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups/Cisco%20switches/maintenance/ \\ --data-raw ' { \"title\":\"Device group Maintenance\", \"notes\":\"A 2 hour Maintenance triggered via API with no start time\", \"duration\":\"2:00\" } ' Output: { \"status\" : \"ok\" , \"message\" : \"Device group Cisco switches (2) moved into maintenance mode for 2:00h\" }","title":"maintenance_devicegroup"},{"location":"API/DeviceGroups/#add-devices-to-group","text":"Add devices to a device group. Route: /api/v0/devicesgroups/:name/devices name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input (JSON): devices : required - A list of devices to be added to the group. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups/devices \\ --data-raw '{\"devices\":[261,271]}' Output: { \"status\" : \"ok\" , \"message\" : \"Devices added\" }","title":"Add devices to group"},{"location":"API/DeviceGroups/#remove-devices-from-group","text":"Removes devices from a device group. Route: /api/v0/devicesgroups/:name/devices name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input (JSON): devices : required - A list of devices to be removed from the group. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X DELETE https://librenms.org/api/v0/devicegroups/devices \\ --data-raw '{\"devices\":[261,271]}' Output: { \"status\" : \"ok\" , \"message\" : \"Devices removed\" }","title":"Remove devices from group"},{"location":"API/Devices/","text":"del_device Delete a given device. Route: /api/v0/devices/:hostname hostname can be either the device hostname or id Input: - Example: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost Output: { \"status\" : \"ok\" , \"message\" : \"Removed device localhost\" , \"devices\" : [ { \"device_id\" : \"1\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } ] } get_device Get details of a given device. Route: /api/v0/devices/:hostname hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost Output: { \"status\" : \"ok\" , \"devices\" : [ { \"device_id\" : \"1\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } ] } discover_device Trigger a discovery of given device. Route: /api/v0/devices/:hostname/discover hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/discover Output: { \"status\" : \"ok\" , \"result\" : { \"status\" : 0 , \"message\" : \"Device will be rediscovered\" }, \"count\" : 2 } availability Get calculated availabilities of given device. Route: /api/v0/devices/:hostname/availability hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/availability Output: { \"status\" : \"ok\" , \"availability\" : [ { \"duration\" : 86400 , \"availability_perc\" : \"100.000000\" }, { \"duration\" : 604800 , \"availability_perc\" : \"100.000000\" }, { \"duration\" : 2592000 , \"availability_perc\" : \"99.946000\" }, { \"duration\" : 31536000 , \"availability_perc\" : \"99.994000\" } ], \"count\" : 4 } outages Get detected outages of given device. Route: /api/v0/devices/:hostname/outages hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/outages Output: { \"status\" : \"ok\" , \"outages\" : [ { \"going_down\" : 1593194031 , \"up_again\" : 1593194388 }, { \"going_down\" : 1593946507 , \"up_again\" : 1593946863 }, { \"going_down\" : 1594628616 , \"up_again\" : 1594628968 }, { \"going_down\" : 1594628974 , \"up_again\" : 1594629339 }, { \"going_down\" : 1594638668 , \"up_again\" : 1594638992 } ], \"count\" : 5 } get_graphs Get a list of available graphs for a device, this does not include ports. Route: /api/v0/devices/:hostname/graphs hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 3 , \"graphs\" : [ { \"desc\" : \"Poller Time\" , \"name\" : \"device_poller_perf\" }, { \"desc\" : \"Ping Response\" , \"name\" : \"device_ping_perf\" }, { \"desc\" : \"System Uptime\" , \"name\" : \"uptime\" } ] } list_available_health_graphs This function allows to do three things: Get a list of overall health graphs available. Get a list of health graphs based on provided class. Get the health sensors information based on ID. Route: /api/v0/devices/:hostname/health(/:type)(/:sensor_id) hostname can be either the device hostname or id type (optional) is health type / sensor class sensor_id (optional) is the sensor id to retrieve specific information. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/health Output: { \"status\": \"ok\", \"message\": \"\", \"count\": 2, \"graphs\": [ { \"desc\": \"Airflow\", \"name\": \"device_airflow\" }, { \"desc\": \"Voltage\", \"name\": \"device_voltage\" } ] } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/health/device_voltage Output: { \"status\": \"ok\", \"message\": \"\", \"count\": 2, \"graphs\": [ { \"sensor_id\": \"1\", \"desc\": \"Input Feed A\" }, { \"sensor_id\": \"2\", \"desc\": \"Output Feed\" } ] } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/health/device_voltage/1 Output: { \"status\": \"ok\", \"message\": \"\", \"count\": 1, \"graphs\": [ { \"sensor_id\": \"1\", \"sensor_deleted\": \"0\", \"sensor_class\": \"voltage\", \"device_id\": \"1\", \"poller_type\": \"snmp\", \"sensor_oid\": \".1.3.6.1.4.1.318.1.1.27.1.1.0\", \"sensor_index\": \"1\", \"sensor_type\": \"apc\", \"sensor_descr\": \"Input\", \"sensor_divisor\": \"1\", \"sensor_multiplier\": \"1\", \"sensor_current\": \"1\", \"sensor_limit\": \"1.15\", \"sensor_limit_warn\": null, \"sensor_limit_low\": \"0.85\", \"sensor_limit_low_warn\": null, \"sensor_alert\": \"1\", \"sensor_custom\": \"No\", \"entPhysicalIndex\": null, \"entPhysicalIndex_measured\": null, \"lastupdate\": \"2017-01-13 13:50:26\", \"sensor_prev\": \"1\" } ] } list_available_wireless_graphs This function allows to do three things: Get a list of overall wireless graphs available. Get a list of wireless graphs based on provided class. Get the wireless sensors information based on ID. Route: /api/v0/devices/:hostname/wireless(/:type)(/:sensor_id) hostname can be either the device hostname or id type (optional) is wireless type / wireless class sensor_id (optional) is the sensor id to retrieve specific information. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/wireless Output: { \"status\": \"ok\", \"graphs\": [ { \"desc\": \"Ccq\", \"name\": \"device_wireless_ccq\" }, { \"desc\": \"Clients\", \"name\": \"device_wireless_clients\" } ], \"count\": 2 } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/wireless/device_wireless_ccq Output: { \"status\": \"ok\", \"graphs\": [ { \"sensor_id\": \"791\", \"desc\": \"SSID: bast (ng)\" }, { \"sensor_id\": \"792\", \"desc\": \"SSID: bast (na)\" } ], \"count\": 2 } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/health/device_wireless_ccq/1 Output: { \"status\": \"ok\", \"graphs\": [ { \"sensor_id\": \"791\", \"sensor_deleted\": \"0\", \"sensor_class\": \"ccq\", \"device_id\": \"381\", \"sensor_index\": \"0\", \"sensor_type\": \"unifi\", \"sensor_descr\": \"SSID: bast (ng)\", \"sensor_divisor\": \"10\", \"sensor_multiplier\": \"1\", \"sensor_aggregator\": \"sum\", \"sensor_current\": \"100\", \"sensor_prev\": \"100\", \"sensor_limit\": null, \"sensor_limit_warn\": null, \"sensor_limit_low\": null, \"sensor_limit_low_warn\": null, \"sensor_alert\": \"1\", \"sensor_custom\": \"No\", \"entPhysicalIndex\": null, \"entPhysicalIndex_measured\": null, \"lastupdate\": \"2017-12-06 21:26:29\", \"sensor_oids\": \"[\\\".1.3.6.1.4.1.41112.1.6.1.2.1.3.0\\\"]\", \"access_point_id\": null } ], \"count\": 1 } get_health_graph Get a particular health class graph for a device, if you provide a sensor_id as well then a single sensor graph will be provided. If no sensor_id value is provided then you will be sent a stacked sensor graph. Route: /api/v0/devices/:hostname/graphs/health/:type(/:sensor_id) hostname can be either the device hostname or id type is the name of the health graph as returned by list_available_health_graphs sensor_id (optional) restricts the graph to return a particular health sensor graph. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs/health/device_voltage Output: Output is a stacked graph for the health type provided. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs/health/device_voltage/1 Output: Output is the graph of the particular health type sensor provided. get_wireless_graph Get a particular wireless class graph for a device, if you provide a sensor_id as well then a single sensor graph will be provided. If no sensor_id value is provided then you will be sent a stacked wireless graph. Route: /api/v0/devices/:hostname/graphs/wireless/:type(/:sensor_id) hostname can be either the device hostname or id type is the name of the wireless graph as returned by list_available_wireless_graphs sensor_id (optional) restricts the graph to return a particular wireless sensor graph. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs/wireless/device_wireless_ccq Output: Output is a stacked graph for the wireless type provided. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs/wireless/device_wireless_ccq/1 Output: Output is the graph of the particular wireless type sensor provided. get_graph_generic_by_hostname Get a specific graph for a device, this does not include ports. Route: /api/v0/devices/:hostname/:type hostname can be either the device hostname or id type is the type of graph you want, use [ get_graphs ](#function-get_graphs to see the graphs available. Defaults to device uptime. Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. output: Set how the graph should be outputted (base64, display), defaults to display. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/device_poller_perf Output: Output is an image. get_graph_by_service Get the graph for a service Route: /api/v0/devices/:hostname/services/:service_id/graphs/:datasource hostname can be either the device hostname or id service id datasource is the name of the service datasource Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/localhost/35/graphs/loss Output: Output is an image. get_port_graphs Get a list of ports for a particular device. Route: /api/v0/devices/:hostname/ports hostname can be either the device hostname or id Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/ports Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 3 , \"ports\" : [ { \"ifName\" : \"lo\" }, { \"ifName\" : \"eth0\" }, { \"ifName\" : \"eth1\" } ] } get_device_fdb Get a list of FDB entries associated with a device. Route: /api/v0/devices/:hostname/fdb hostname can be either the device hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/fdb Output: { \"status\" : \"ok\" , \"ports_fdb\" : { \"ports_fdb_id\" : 10 , \"port_id\" : 10000 , \"mac_address\" : \"1aaa2bbb3ccc\" , \"vlan_id\" : 20000 , \"device_id\" : 1 , \"created_at\" : \"2019-01-1 01:01:01\" , \"updated_at\" : \"2019-01-1 01:01:01\" } } get_device_ip_addresses Get a list of IP addresses (v4 and v6) associated with a device. Route: /api/v0/devices/:hostname/ip hostname can be either the device hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/ip Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"addresses\" : [ { \"ipv4_address_id\" : \"290\" , \"ipv4_address\" : \"192.168.99.292\" , \"ipv4_prefixlen\" : \"30\" , \"ipv4_network_id\" : \"247\" , \"port_id\" : \"323\" , \"context_name\" : \"\" } ] } get_port_stack Get a list of port mappings for a device. This is useful for showing physical ports that are in a virtual port-channel. Route: /api/v0/devices/:hostname/port_stack hostname can be either the device hostname or id Input: valid_mappings: Filter the result by only showing valid mappings (\"0\" values not shown). Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/port_stack?valid_mappings Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 2 , \"mappings\" : [ { \"device_id\" : \"3742\" , \"port_id_high\" : \"1001000\" , \"port_id_low\" : \"51001\" , \"ifStackStatus\" : \"active\" }, { \"device_id\" : \"3742\" , \"port_id_high\" : \"1001000\" , \"port_id_low\" : \"52001\" , \"ifStackStatus\" : \"active\" } ] } get_components Get a list of components for a particular device. Route: /api/v0/devices/:hostname/components hostname can be either the device hostname or id Input: type: Filter the result by type (Equals). id: Filter the result by id (Equals). label: Filter the result by label (Contains). status: Filter the result by status (Equals). disabled: Filter the result by disabled (Equals). ignore: Filter the result by ignore (Equals). Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/components Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 3 , \"components\" : { \"2\" : { \"TestAttribute-1\" : \"Value1\" , \"TestAttribute-2\" : \"Value2\" , \"TestAttribute-3\" : \"Value3\" , \"type\" : \"TestComponent-1\" , \"label\" : \"This is a really cool blue component\" , \"status\" : \"1\" , \"ignore\" : \"0\" , \"disabled\" : \"0\" }, \"20\" : { \"TestAttribute-1\" : \"Value4\" , \"TestAttribute-2\" : \"Value5\" , \"TestAttribute-3\" : \"Value6\" , \"type\" : \"TestComponent-1\" , \"label\" : \"This is a really cool red component\" , \"status\" : \"1\" , \"ignore\" : \"0\" , \"disabled\" : \"0\" }, \"27\" : { \"TestAttribute-1\" : \"Value7\" , \"TestAttribute-2\" : \"Value8\" , \"TestAttribute-3\" : \"Value9\" , \"type\" : \"TestComponent-2\" , \"label\" : \"This is a really cool yellow widget\" , \"status\" : \"1\" , \"ignore\" : \"0\" , \"disabled\" : \"0\" } } } add_components Create a new component of a type on a particular device. Route: /api/v0/devices/:hostname/components/:type hostname can be either the device hostname or id type is the type of component to add Example: curl -X POST -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/components/APITEST Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"components\" : { \"4459\" : { \"type\" : \"APITEST\" , \"label\" : \"\" , \"status\" : 1 , \"ignore\" : 0 , \"disabled\" : 0 , \"error\" : \"\" } } } edit_components Edit an existing component on a particular device. Route: /api/v0/devices/:hostname/components hostname can be either the device hostname or id In this example we set the label and add a new field: TestField: curl -X PUT -d '{\"4459\": {\"type\": \"APITEST\",\"label\": \"This is a test label\",\"status\": 1,\"ignore\": 0,\"disabled\": 0,\"error\": \"\",\"TestField\": \"TestData\"}}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/components Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 } Just take the JSON array from add_components or edit_components, edit as you wish and submit it back to edit components. delete_components Delete an existing component on a particular device. Route: /api/v0/devices/:hostname/components/:component hostname can be either the device hostname or id component is the component ID to be deleted. Example: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/components/4459 Output: { \"status\" : \"ok\" , \"message\" : \"\" } get_port_stats_by_port_hostname Get information about a particular port for a device. Route: /api/v0/devices/:hostname/ports/:ifname hostname can be either the device hostname or id ifname can be any of the interface names for the device which can be obtained using get_port_graphs . Please ensure that the ifname is urlencoded if it needs to be (i.e Gi0/1/0 would need to be urlencoded. Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/ports/eth0 Output: { \"status\" : \"ok\" , \"port\" : { \"port_id\" : \"2\" , \"device_id\" : \"1\" , ... \"poll_prev\" : \"1418412902\" , \"poll_period\" : \"300\" } } get_graph_by_port_hostname Get a graph of a port for a particular device. Route: /api/v0/devices/:hostname/ports/:ifname/:type hostname can be either the device hostname or id ifname can be any of the interface names for the device which can be obtained using get_port_graphs . Please ensure that the ifname is urlencoded if it needs to be (i.e Gi0/1/0 would need to be urlencoded. type is the port type you want the graph for, you can request a list of ports for a device with get_port_graphs . Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. ifDescr: If this is set to true then we will use ifDescr to lookup the port instead of ifName. Pass the ifDescr value you want to search as you would ifName. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/ports/eth0/port_bits Output: Output is an image. list_sensors Get a list of all Sensors. Route: /api/v0/resources/sensors Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/sensors Output: { \"status\" : \"ok\" , \"sensors\" : [ { \"sensor_id\" : 218810 , \"sensor_deleted\" : 0 , \"sensor_class\" : \"dbm\" , \"device_id\" : 136 , \"poller_type\" : \"snmp\" , \"sensor_oid\" : \".1.3.6.1.4.1.2636.3.60.1.1.1.1.7.919\" , \"sensor_index\" : \"tx-919\" , \"sensor_type\" : \"junos\" , \"sensor_descr\" : \"xe-2/1/4 Tx Power\" , \"group\" : null , \"sensor_divisor\" : 100 , \"sensor_multiplier\" : 1 , \"sensor_current\" : -1.81 , \"sensor_limit\" : 2 , \"sensor_limit_warn\" : 0.5 , \"sensor_limit_low\" : -9.7 , \"sensor_limit_low_warn\" : -8.21 , \"sensor_alert\" : 1 , \"sensor_custom\" : \"No\" , \"entPhysicalIndex\" : \"919\" , \"entPhysicalIndex_measured\" : \"ports\" , \"lastupdate\" : \"2019-02-18 02:47:09\" , \"sensor_prev\" : -1.77 , \"user_func\" : null }, ... ], \"count\" : 100 } list_devices Return a list of devices. Route: /api/v0/devices Input: order: How to order the output, default is by hostname. Can be prepended by DESC or ASC to change the order. type: can be one of the following to filter or search by: all: All devices active: Only not ignored and not disabled devices ignored: Only ignored devices up: Only devices that are up down: Only devices that are down disabled: Disabled devices os: search by os type mac: search by mac address ipv4: search by IPv4 address ipv6: search by IPv6 address (compressed or uncompressed) location: search by location location_id: serach by locaiton_id hostname: search by hostname sysName: search by sysName display: search by display name device_id: exact match by device-id type: search by device type query: If searching by, then this will be used as the input. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices?order=hostname%20DESC&type=down Output: { \"status\" : \"ok\" , \"count\" : 1 , \"devices\" : [ { \"device_id\" : \"1\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } ] } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices?type=mac&query=00000c9ff013 Output: { \"status\" : \"ok\" , \"count\" : 1 , \"devices\" : [ { \"device_id\" : \"1\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } ] } maintenance_device Set a device into maintenance mode. Route: /api/v0/devices/:hostname/maintenance Input (JSON): title : optional - Some title for the Maintenance Will be replaced with hostname if omitted notes : optional - Some description for the Maintenance Will also be added to device notes if user prefs \"Add schedule notes to devices notes\" is set start : optional - start time of Maintenance in full format Y-m-d H:i:00 eg: 2022-08-01 22:45:00 Current system time now() will be used if omitted duration : required - Duration of Maintenance in format H:i / Hrs:Mins eg: 02:00 Example with start time: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devices/localhost/maintenance/ \\ --data-raw ' \"title\":\"Device Maintenance\", \"notes\":\"A 2 hour Maintenance triggered via API with start time\", \"start\":\"2022-08-01 08:00:00\", \"duration\":\"2:00\" } ' Output: { \"status\" : \"ok\" , \"message\" : \"Device localhost (1) will begin maintenance mode at 2022-08-01 22:45:00 for 2:00h\" } Example with no start time: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devices/localhost/maintenance/ \\ --data-raw ' \"title\":\"Device Maintenance\", \"notes\":\"A 2 hour Maintenance triggered via API with no start time\", \"duration\":\"2:00\" } ' Output: { \"status\" : \"ok\" , \"message\" : \"Device localhost (1) moved into maintenance mode for 2:00h\" } add_device Add a new device. Most fields are optional. You may omit snmp credentials to attempt each system credential in order. See snmp.version, snmp.community, and snmp.v3 To guarantee device is added, use force_add. This will skip checks for duplicate device and snmp reachability, but not duplicate hostname. Route: /api/v0/devices Input (JSON): Fields: hostname (required): device hostname or IP display: A string to display as the name of this device, defaults to hostname (or device_display_default setting). May be a simple template using replacements: {{ $hostname }}, {{ $sysName }}, {{ $sysName_fallback }}, {{ $ip }} snmpver: SNMP version to use, v1, v2c or v3. During checks detection order is v2c,v3,v1 port: SNMP port (defaults to port defined in config). transport: SNMP protocol (udp,tcp,udp6,tcp6) Defaults to transport defined in config. port_association_mode: method to identify ports: ifIndex (default), ifName, ifDescr, ifAlias poller_group: This is the poller_group id used for distributed poller setup. Defaults to 0. location or location_id: set the location by text or location id Options: force_add: Skip all checks and attempts to detect credentials. Add the device as given directly to the database. ping_fallback: if snmp checks fail, add the device as ping only instead of failing SNMP v1 or v2c credentials: community: Required for SNMP v1 or v2c. SNMP v3 credentials: authlevel: SNMP authlevel (noAuthNoPriv, authNoPriv, authPriv). authname: SNMP Auth username authpass: SNMP Auth password authalgo: SNMP Auth algorithm (MD5, SHA) (SHA-224, SHA-256, SHA-384, SHA-512 if supported by your server) cryptopass: SNMP Crypto Password cryptoalgo: SNMP Crypto algorithm (AES, DES) For ICMP only: snmp_disable: set to true for ICMP only. Disables SNMP checks and polling. os: OS short name for the device (defaults to ping). sysName: sysName for the device. hardware: Device hardware. Example: curl -X POST -d '{\"hostname\":\"localhost.localdomain\",\"version\":\"v1\",\"community\":\"public\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices Output: { \"status\" : \"ok\" , \"message\" : \"Device localhost.localdomain (57) has been added successfully\" , \"devices\" : [ { \"device_id\" : \"57\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } } list_oxidized List devices for use with Oxidized. If you have group support enabled then a group will also be returned based on your config. LibreNMS will automatically map the OS to the Oxidized model name if they don't match. Route: /api/v0/oxidized(/:hostname) Input (JSON): - Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/oxidized Output: [ { \"hostname\" : \"localhost\" , \"os\" : \"linux\" }, { \"hostname\" : \"otherserver\" , \"os\" : \"linux\" } ] update_device_field Update devices field in the database. Route: /api/v0/devices/:hostname hostname can be either the device hostname or id Input (JSON): field: The column name within the database (can be an array of fields) data: The data to update the column with (can be an array of data)) Examples: curl -X PATCH -d '{\"field\": \"notes\", \"data\": \"This server should be kept online\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost Output: [ { \"status\" : \"ok\" , \"message\" : \"Device notes has been updated\" } ] update_device_port_notes Update a device port notes field in the devices_attrs database. Route: /api/v0/devices/:hostname/port/:portid hostname can be either the device hostname or id portid needs to be the port unique id (int). Input (JSON): - notes: The string data to populate on the port notes field. Examples: curl -X PATCH -d '{\"notes\": \"This port is in a scheduled maintenance with the provider.\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/port/5 Output: [ { \"status\" : \"ok\" , \"message\" : \"Port notes field has been updated\" } ] curl -X PATCH -d '{\"field\": [\"notes\",\"purpose\"], \"data\": [\"This server should be kept online\", \"For serving web traffic\"]}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost Output: [ { \"status\" : \"ok\" , \"message\" : \"Device fields have been updated\" } ] rename_device Rename device. Route: /api/v0/devices/:hostname/rename/:new_hostname hostname can be either the device hostname or id Input: - Examples: curl -X PATCH -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/rename/localhost2 Output: [ { \"status\" : \"ok\" , \"message\" : \"Device has been renamed\" } ] get_device_groups List the device groups that a device is matched on. Route: /api/v0/devices/:hostname/groups hostname can be either the device hostname or id Input (JSON): - Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/groups Output: [ { \"status\" : \"ok\" , \"message\" : \"Found 1 device groups\" , \"count\" : 1 , \"groups\" : [ { \"id\" : \"1\" , \"name\" : \"Testing\" , \"desc\" : \"Testing\" , \"pattern\" : \"%devices.status = \\\"1\\\" &&\" } ] } ] search_oxidized search all oxidized device configs for a string. Route: api/v0/oxidized/config/search/:searchstring searchstring is the specific string you would like to search for. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/oxidized/config/search/vlan10 Output: { \"status\" : \"ok\" , \"nodes\" : [ { \"node\" : \"asr9k.librenms.org\" , \"full_name\" : \"cisco\\/ASR9K.Librenms.org\" }, { \"node\" : \"ios.Librenms.org\" , \"full_name\" : \"cisco\\/ios.Librenms.org\" } ], \"count\" : 2 } get_oxidized_config Returns a specific device's config from oxidized. Route: api/v0/oxidized/config/:hostname hostname is the Hostname or IP of the device used when adding the device to librenms. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/oxidized/config/router.corp.com Output: { \"status\" : \"ok\" , \"config\" : \"DEVICE CONFIG HERE\" } add_parents_to_host Add one or more parents to a host. Route: /api/v0/devices/:device/parents Input (JSON): parent_ids: one or more parent ids or hostnames Example: curl -X POST -d '{\"parent_ids\":\"15,16,17\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/1/parents Output: { \"status\" : \"ok\" , \"message\" : \"Device dependencies have been saved\" } delete_parents_from_host Deletes some or all the parents from a host. Route: /api/v0/devices/:device/parents Input (JSON): parent_ids: One or more parent ids or hostnames, if not specified deletes all parents from host. Example: curl -X DELETE -d '{\"parent_ids\":\"15,16,17\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/1/parents Output: { \"status\" : \"ok\" , \"message\" : \"All device dependencies have been removed\" } list_parents_of_host This is not a seperate API call. Instead, you obtain the list of parents from list_devices . See that entry point for more detailed information. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' 'http://librenms.org/api/v0/devices?type=device_id&query=34' Output: { \"status\" : \"ok\" , \"devices\" : [ { ... \"dependency_parent_id\" : \"98,99\" , \"dependency_parent_hostname\" : \"HOSTNAME1,HOSTNAME2\" , ... } ], \"count\" : 1 }","title":"Devices"},{"location":"API/Devices/#del_device","text":"Delete a given device. Route: /api/v0/devices/:hostname hostname can be either the device hostname or id Input: - Example: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost Output: { \"status\" : \"ok\" , \"message\" : \"Removed device localhost\" , \"devices\" : [ { \"device_id\" : \"1\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } ] }","title":"del_device"},{"location":"API/Devices/#get_device","text":"Get details of a given device. Route: /api/v0/devices/:hostname hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost Output: { \"status\" : \"ok\" , \"devices\" : [ { \"device_id\" : \"1\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } ] }","title":"get_device"},{"location":"API/Devices/#discover_device","text":"Trigger a discovery of given device. Route: /api/v0/devices/:hostname/discover hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/discover Output: { \"status\" : \"ok\" , \"result\" : { \"status\" : 0 , \"message\" : \"Device will be rediscovered\" }, \"count\" : 2 }","title":"discover_device"},{"location":"API/Devices/#availability","text":"Get calculated availabilities of given device. Route: /api/v0/devices/:hostname/availability hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/availability Output: { \"status\" : \"ok\" , \"availability\" : [ { \"duration\" : 86400 , \"availability_perc\" : \"100.000000\" }, { \"duration\" : 604800 , \"availability_perc\" : \"100.000000\" }, { \"duration\" : 2592000 , \"availability_perc\" : \"99.946000\" }, { \"duration\" : 31536000 , \"availability_perc\" : \"99.994000\" } ], \"count\" : 4 }","title":"availability"},{"location":"API/Devices/#outages","text":"Get detected outages of given device. Route: /api/v0/devices/:hostname/outages hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/outages Output: { \"status\" : \"ok\" , \"outages\" : [ { \"going_down\" : 1593194031 , \"up_again\" : 1593194388 }, { \"going_down\" : 1593946507 , \"up_again\" : 1593946863 }, { \"going_down\" : 1594628616 , \"up_again\" : 1594628968 }, { \"going_down\" : 1594628974 , \"up_again\" : 1594629339 }, { \"going_down\" : 1594638668 , \"up_again\" : 1594638992 } ], \"count\" : 5 }","title":"outages"},{"location":"API/Devices/#get_graphs","text":"Get a list of available graphs for a device, this does not include ports. Route: /api/v0/devices/:hostname/graphs hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 3 , \"graphs\" : [ { \"desc\" : \"Poller Time\" , \"name\" : \"device_poller_perf\" }, { \"desc\" : \"Ping Response\" , \"name\" : \"device_ping_perf\" }, { \"desc\" : \"System Uptime\" , \"name\" : \"uptime\" } ] }","title":"get_graphs"},{"location":"API/Devices/#list_available_health_graphs","text":"This function allows to do three things: Get a list of overall health graphs available. Get a list of health graphs based on provided class. Get the health sensors information based on ID. Route: /api/v0/devices/:hostname/health(/:type)(/:sensor_id) hostname can be either the device hostname or id type (optional) is health type / sensor class sensor_id (optional) is the sensor id to retrieve specific information. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/health Output: { \"status\": \"ok\", \"message\": \"\", \"count\": 2, \"graphs\": [ { \"desc\": \"Airflow\", \"name\": \"device_airflow\" }, { \"desc\": \"Voltage\", \"name\": \"device_voltage\" } ] } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/health/device_voltage Output: { \"status\": \"ok\", \"message\": \"\", \"count\": 2, \"graphs\": [ { \"sensor_id\": \"1\", \"desc\": \"Input Feed A\" }, { \"sensor_id\": \"2\", \"desc\": \"Output Feed\" } ] } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/health/device_voltage/1 Output: { \"status\": \"ok\", \"message\": \"\", \"count\": 1, \"graphs\": [ { \"sensor_id\": \"1\", \"sensor_deleted\": \"0\", \"sensor_class\": \"voltage\", \"device_id\": \"1\", \"poller_type\": \"snmp\", \"sensor_oid\": \".1.3.6.1.4.1.318.1.1.27.1.1.0\", \"sensor_index\": \"1\", \"sensor_type\": \"apc\", \"sensor_descr\": \"Input\", \"sensor_divisor\": \"1\", \"sensor_multiplier\": \"1\", \"sensor_current\": \"1\", \"sensor_limit\": \"1.15\", \"sensor_limit_warn\": null, \"sensor_limit_low\": \"0.85\", \"sensor_limit_low_warn\": null, \"sensor_alert\": \"1\", \"sensor_custom\": \"No\", \"entPhysicalIndex\": null, \"entPhysicalIndex_measured\": null, \"lastupdate\": \"2017-01-13 13:50:26\", \"sensor_prev\": \"1\" } ] }","title":"list_available_health_graphs"},{"location":"API/Devices/#list_available_wireless_graphs","text":"This function allows to do three things: Get a list of overall wireless graphs available. Get a list of wireless graphs based on provided class. Get the wireless sensors information based on ID. Route: /api/v0/devices/:hostname/wireless(/:type)(/:sensor_id) hostname can be either the device hostname or id type (optional) is wireless type / wireless class sensor_id (optional) is the sensor id to retrieve specific information. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/wireless Output: { \"status\": \"ok\", \"graphs\": [ { \"desc\": \"Ccq\", \"name\": \"device_wireless_ccq\" }, { \"desc\": \"Clients\", \"name\": \"device_wireless_clients\" } ], \"count\": 2 } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/wireless/device_wireless_ccq Output: { \"status\": \"ok\", \"graphs\": [ { \"sensor_id\": \"791\", \"desc\": \"SSID: bast (ng)\" }, { \"sensor_id\": \"792\", \"desc\": \"SSID: bast (na)\" } ], \"count\": 2 } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/health/device_wireless_ccq/1 Output: { \"status\": \"ok\", \"graphs\": [ { \"sensor_id\": \"791\", \"sensor_deleted\": \"0\", \"sensor_class\": \"ccq\", \"device_id\": \"381\", \"sensor_index\": \"0\", \"sensor_type\": \"unifi\", \"sensor_descr\": \"SSID: bast (ng)\", \"sensor_divisor\": \"10\", \"sensor_multiplier\": \"1\", \"sensor_aggregator\": \"sum\", \"sensor_current\": \"100\", \"sensor_prev\": \"100\", \"sensor_limit\": null, \"sensor_limit_warn\": null, \"sensor_limit_low\": null, \"sensor_limit_low_warn\": null, \"sensor_alert\": \"1\", \"sensor_custom\": \"No\", \"entPhysicalIndex\": null, \"entPhysicalIndex_measured\": null, \"lastupdate\": \"2017-12-06 21:26:29\", \"sensor_oids\": \"[\\\".1.3.6.1.4.1.41112.1.6.1.2.1.3.0\\\"]\", \"access_point_id\": null } ], \"count\": 1 }","title":"list_available_wireless_graphs"},{"location":"API/Devices/#get_health_graph","text":"Get a particular health class graph for a device, if you provide a sensor_id as well then a single sensor graph will be provided. If no sensor_id value is provided then you will be sent a stacked sensor graph. Route: /api/v0/devices/:hostname/graphs/health/:type(/:sensor_id) hostname can be either the device hostname or id type is the name of the health graph as returned by list_available_health_graphs sensor_id (optional) restricts the graph to return a particular health sensor graph. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs/health/device_voltage Output: Output is a stacked graph for the health type provided. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs/health/device_voltage/1 Output: Output is the graph of the particular health type sensor provided.","title":"get_health_graph"},{"location":"API/Devices/#get_wireless_graph","text":"Get a particular wireless class graph for a device, if you provide a sensor_id as well then a single sensor graph will be provided. If no sensor_id value is provided then you will be sent a stacked wireless graph. Route: /api/v0/devices/:hostname/graphs/wireless/:type(/:sensor_id) hostname can be either the device hostname or id type is the name of the wireless graph as returned by list_available_wireless_graphs sensor_id (optional) restricts the graph to return a particular wireless sensor graph. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs/wireless/device_wireless_ccq Output: Output is a stacked graph for the wireless type provided. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs/wireless/device_wireless_ccq/1 Output: Output is the graph of the particular wireless type sensor provided.","title":"get_wireless_graph"},{"location":"API/Devices/#get_graph_generic_by_hostname","text":"Get a specific graph for a device, this does not include ports. Route: /api/v0/devices/:hostname/:type hostname can be either the device hostname or id type is the type of graph you want, use [ get_graphs ](#function-get_graphs to see the graphs available. Defaults to device uptime. Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. output: Set how the graph should be outputted (base64, display), defaults to display. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/device_poller_perf Output: Output is an image.","title":"get_graph_generic_by_hostname"},{"location":"API/Devices/#get_graph_by_service","text":"Get the graph for a service Route: /api/v0/devices/:hostname/services/:service_id/graphs/:datasource hostname can be either the device hostname or id service id datasource is the name of the service datasource Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/localhost/35/graphs/loss Output: Output is an image.","title":"get_graph_by_service"},{"location":"API/Devices/#get_port_graphs","text":"Get a list of ports for a particular device. Route: /api/v0/devices/:hostname/ports hostname can be either the device hostname or id Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/ports Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 3 , \"ports\" : [ { \"ifName\" : \"lo\" }, { \"ifName\" : \"eth0\" }, { \"ifName\" : \"eth1\" } ] }","title":"get_port_graphs"},{"location":"API/Devices/#get_device_fdb","text":"Get a list of FDB entries associated with a device. Route: /api/v0/devices/:hostname/fdb hostname can be either the device hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/fdb Output: { \"status\" : \"ok\" , \"ports_fdb\" : { \"ports_fdb_id\" : 10 , \"port_id\" : 10000 , \"mac_address\" : \"1aaa2bbb3ccc\" , \"vlan_id\" : 20000 , \"device_id\" : 1 , \"created_at\" : \"2019-01-1 01:01:01\" , \"updated_at\" : \"2019-01-1 01:01:01\" } }","title":"get_device_fdb"},{"location":"API/Devices/#get_device_ip_addresses","text":"Get a list of IP addresses (v4 and v6) associated with a device. Route: /api/v0/devices/:hostname/ip hostname can be either the device hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/ip Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"addresses\" : [ { \"ipv4_address_id\" : \"290\" , \"ipv4_address\" : \"192.168.99.292\" , \"ipv4_prefixlen\" : \"30\" , \"ipv4_network_id\" : \"247\" , \"port_id\" : \"323\" , \"context_name\" : \"\" } ] }","title":"get_device_ip_addresses"},{"location":"API/Devices/#get_port_stack","text":"Get a list of port mappings for a device. This is useful for showing physical ports that are in a virtual port-channel. Route: /api/v0/devices/:hostname/port_stack hostname can be either the device hostname or id Input: valid_mappings: Filter the result by only showing valid mappings (\"0\" values not shown). Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/port_stack?valid_mappings Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 2 , \"mappings\" : [ { \"device_id\" : \"3742\" , \"port_id_high\" : \"1001000\" , \"port_id_low\" : \"51001\" , \"ifStackStatus\" : \"active\" }, { \"device_id\" : \"3742\" , \"port_id_high\" : \"1001000\" , \"port_id_low\" : \"52001\" , \"ifStackStatus\" : \"active\" } ] }","title":"get_port_stack"},{"location":"API/Devices/#get_components","text":"Get a list of components for a particular device. Route: /api/v0/devices/:hostname/components hostname can be either the device hostname or id Input: type: Filter the result by type (Equals). id: Filter the result by id (Equals). label: Filter the result by label (Contains). status: Filter the result by status (Equals). disabled: Filter the result by disabled (Equals). ignore: Filter the result by ignore (Equals). Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/components Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 3 , \"components\" : { \"2\" : { \"TestAttribute-1\" : \"Value1\" , \"TestAttribute-2\" : \"Value2\" , \"TestAttribute-3\" : \"Value3\" , \"type\" : \"TestComponent-1\" , \"label\" : \"This is a really cool blue component\" , \"status\" : \"1\" , \"ignore\" : \"0\" , \"disabled\" : \"0\" }, \"20\" : { \"TestAttribute-1\" : \"Value4\" , \"TestAttribute-2\" : \"Value5\" , \"TestAttribute-3\" : \"Value6\" , \"type\" : \"TestComponent-1\" , \"label\" : \"This is a really cool red component\" , \"status\" : \"1\" , \"ignore\" : \"0\" , \"disabled\" : \"0\" }, \"27\" : { \"TestAttribute-1\" : \"Value7\" , \"TestAttribute-2\" : \"Value8\" , \"TestAttribute-3\" : \"Value9\" , \"type\" : \"TestComponent-2\" , \"label\" : \"This is a really cool yellow widget\" , \"status\" : \"1\" , \"ignore\" : \"0\" , \"disabled\" : \"0\" } } }","title":"get_components"},{"location":"API/Devices/#add_components","text":"Create a new component of a type on a particular device. Route: /api/v0/devices/:hostname/components/:type hostname can be either the device hostname or id type is the type of component to add Example: curl -X POST -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/components/APITEST Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"components\" : { \"4459\" : { \"type\" : \"APITEST\" , \"label\" : \"\" , \"status\" : 1 , \"ignore\" : 0 , \"disabled\" : 0 , \"error\" : \"\" } } }","title":"add_components"},{"location":"API/Devices/#edit_components","text":"Edit an existing component on a particular device. Route: /api/v0/devices/:hostname/components hostname can be either the device hostname or id In this example we set the label and add a new field: TestField: curl -X PUT -d '{\"4459\": {\"type\": \"APITEST\",\"label\": \"This is a test label\",\"status\": 1,\"ignore\": 0,\"disabled\": 0,\"error\": \"\",\"TestField\": \"TestData\"}}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/components Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 } Just take the JSON array from add_components or edit_components, edit as you wish and submit it back to edit components.","title":"edit_components"},{"location":"API/Devices/#delete_components","text":"Delete an existing component on a particular device. Route: /api/v0/devices/:hostname/components/:component hostname can be either the device hostname or id component is the component ID to be deleted. Example: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/components/4459 Output: { \"status\" : \"ok\" , \"message\" : \"\" }","title":"delete_components"},{"location":"API/Devices/#get_port_stats_by_port_hostname","text":"Get information about a particular port for a device. Route: /api/v0/devices/:hostname/ports/:ifname hostname can be either the device hostname or id ifname can be any of the interface names for the device which can be obtained using get_port_graphs . Please ensure that the ifname is urlencoded if it needs to be (i.e Gi0/1/0 would need to be urlencoded. Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/ports/eth0 Output: { \"status\" : \"ok\" , \"port\" : { \"port_id\" : \"2\" , \"device_id\" : \"1\" , ... \"poll_prev\" : \"1418412902\" , \"poll_period\" : \"300\" } }","title":"get_port_stats_by_port_hostname"},{"location":"API/Devices/#get_graph_by_port_hostname","text":"Get a graph of a port for a particular device. Route: /api/v0/devices/:hostname/ports/:ifname/:type hostname can be either the device hostname or id ifname can be any of the interface names for the device which can be obtained using get_port_graphs . Please ensure that the ifname is urlencoded if it needs to be (i.e Gi0/1/0 would need to be urlencoded. type is the port type you want the graph for, you can request a list of ports for a device with get_port_graphs . Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. ifDescr: If this is set to true then we will use ifDescr to lookup the port instead of ifName. Pass the ifDescr value you want to search as you would ifName. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/ports/eth0/port_bits Output: Output is an image.","title":"get_graph_by_port_hostname"},{"location":"API/Devices/#list_sensors","text":"Get a list of all Sensors. Route: /api/v0/resources/sensors Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/sensors Output: { \"status\" : \"ok\" , \"sensors\" : [ { \"sensor_id\" : 218810 , \"sensor_deleted\" : 0 , \"sensor_class\" : \"dbm\" , \"device_id\" : 136 , \"poller_type\" : \"snmp\" , \"sensor_oid\" : \".1.3.6.1.4.1.2636.3.60.1.1.1.1.7.919\" , \"sensor_index\" : \"tx-919\" , \"sensor_type\" : \"junos\" , \"sensor_descr\" : \"xe-2/1/4 Tx Power\" , \"group\" : null , \"sensor_divisor\" : 100 , \"sensor_multiplier\" : 1 , \"sensor_current\" : -1.81 , \"sensor_limit\" : 2 , \"sensor_limit_warn\" : 0.5 , \"sensor_limit_low\" : -9.7 , \"sensor_limit_low_warn\" : -8.21 , \"sensor_alert\" : 1 , \"sensor_custom\" : \"No\" , \"entPhysicalIndex\" : \"919\" , \"entPhysicalIndex_measured\" : \"ports\" , \"lastupdate\" : \"2019-02-18 02:47:09\" , \"sensor_prev\" : -1.77 , \"user_func\" : null }, ... ], \"count\" : 100 }","title":"list_sensors"},{"location":"API/Devices/#list_devices","text":"Return a list of devices. Route: /api/v0/devices Input: order: How to order the output, default is by hostname. Can be prepended by DESC or ASC to change the order. type: can be one of the following to filter or search by: all: All devices active: Only not ignored and not disabled devices ignored: Only ignored devices up: Only devices that are up down: Only devices that are down disabled: Disabled devices os: search by os type mac: search by mac address ipv4: search by IPv4 address ipv6: search by IPv6 address (compressed or uncompressed) location: search by location location_id: serach by locaiton_id hostname: search by hostname sysName: search by sysName display: search by display name device_id: exact match by device-id type: search by device type query: If searching by, then this will be used as the input. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices?order=hostname%20DESC&type=down Output: { \"status\" : \"ok\" , \"count\" : 1 , \"devices\" : [ { \"device_id\" : \"1\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } ] } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices?type=mac&query=00000c9ff013 Output: { \"status\" : \"ok\" , \"count\" : 1 , \"devices\" : [ { \"device_id\" : \"1\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } ] }","title":"list_devices"},{"location":"API/Devices/#maintenance_device","text":"Set a device into maintenance mode. Route: /api/v0/devices/:hostname/maintenance Input (JSON): title : optional - Some title for the Maintenance Will be replaced with hostname if omitted notes : optional - Some description for the Maintenance Will also be added to device notes if user prefs \"Add schedule notes to devices notes\" is set start : optional - start time of Maintenance in full format Y-m-d H:i:00 eg: 2022-08-01 22:45:00 Current system time now() will be used if omitted duration : required - Duration of Maintenance in format H:i / Hrs:Mins eg: 02:00 Example with start time: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devices/localhost/maintenance/ \\ --data-raw ' \"title\":\"Device Maintenance\", \"notes\":\"A 2 hour Maintenance triggered via API with start time\", \"start\":\"2022-08-01 08:00:00\", \"duration\":\"2:00\" } ' Output: { \"status\" : \"ok\" , \"message\" : \"Device localhost (1) will begin maintenance mode at 2022-08-01 22:45:00 for 2:00h\" } Example with no start time: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devices/localhost/maintenance/ \\ --data-raw ' \"title\":\"Device Maintenance\", \"notes\":\"A 2 hour Maintenance triggered via API with no start time\", \"duration\":\"2:00\" } ' Output: { \"status\" : \"ok\" , \"message\" : \"Device localhost (1) moved into maintenance mode for 2:00h\" }","title":"maintenance_device"},{"location":"API/Devices/#add_device","text":"Add a new device. Most fields are optional. You may omit snmp credentials to attempt each system credential in order. See snmp.version, snmp.community, and snmp.v3 To guarantee device is added, use force_add. This will skip checks for duplicate device and snmp reachability, but not duplicate hostname. Route: /api/v0/devices Input (JSON): Fields: hostname (required): device hostname or IP display: A string to display as the name of this device, defaults to hostname (or device_display_default setting). May be a simple template using replacements: {{ $hostname }}, {{ $sysName }}, {{ $sysName_fallback }}, {{ $ip }} snmpver: SNMP version to use, v1, v2c or v3. During checks detection order is v2c,v3,v1 port: SNMP port (defaults to port defined in config). transport: SNMP protocol (udp,tcp,udp6,tcp6) Defaults to transport defined in config. port_association_mode: method to identify ports: ifIndex (default), ifName, ifDescr, ifAlias poller_group: This is the poller_group id used for distributed poller setup. Defaults to 0. location or location_id: set the location by text or location id Options: force_add: Skip all checks and attempts to detect credentials. Add the device as given directly to the database. ping_fallback: if snmp checks fail, add the device as ping only instead of failing SNMP v1 or v2c credentials: community: Required for SNMP v1 or v2c. SNMP v3 credentials: authlevel: SNMP authlevel (noAuthNoPriv, authNoPriv, authPriv). authname: SNMP Auth username authpass: SNMP Auth password authalgo: SNMP Auth algorithm (MD5, SHA) (SHA-224, SHA-256, SHA-384, SHA-512 if supported by your server) cryptopass: SNMP Crypto Password cryptoalgo: SNMP Crypto algorithm (AES, DES) For ICMP only: snmp_disable: set to true for ICMP only. Disables SNMP checks and polling. os: OS short name for the device (defaults to ping). sysName: sysName for the device. hardware: Device hardware. Example: curl -X POST -d '{\"hostname\":\"localhost.localdomain\",\"version\":\"v1\",\"community\":\"public\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices Output: { \"status\" : \"ok\" , \"message\" : \"Device localhost.localdomain (57) has been added successfully\" , \"devices\" : [ { \"device_id\" : \"57\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } }","title":"add_device"},{"location":"API/Devices/#list_oxidized","text":"List devices for use with Oxidized. If you have group support enabled then a group will also be returned based on your config. LibreNMS will automatically map the OS to the Oxidized model name if they don't match. Route: /api/v0/oxidized(/:hostname) Input (JSON): - Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/oxidized Output: [ { \"hostname\" : \"localhost\" , \"os\" : \"linux\" }, { \"hostname\" : \"otherserver\" , \"os\" : \"linux\" } ]","title":"list_oxidized"},{"location":"API/Devices/#update_device_field","text":"Update devices field in the database. Route: /api/v0/devices/:hostname hostname can be either the device hostname or id Input (JSON): field: The column name within the database (can be an array of fields) data: The data to update the column with (can be an array of data)) Examples: curl -X PATCH -d '{\"field\": \"notes\", \"data\": \"This server should be kept online\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost Output: [ { \"status\" : \"ok\" , \"message\" : \"Device notes has been updated\" } ]","title":"update_device_field"},{"location":"API/Devices/#update_device_port_notes","text":"Update a device port notes field in the devices_attrs database. Route: /api/v0/devices/:hostname/port/:portid hostname can be either the device hostname or id portid needs to be the port unique id (int). Input (JSON): - notes: The string data to populate on the port notes field. Examples: curl -X PATCH -d '{\"notes\": \"This port is in a scheduled maintenance with the provider.\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/port/5 Output: [ { \"status\" : \"ok\" , \"message\" : \"Port notes field has been updated\" } ] curl -X PATCH -d '{\"field\": [\"notes\",\"purpose\"], \"data\": [\"This server should be kept online\", \"For serving web traffic\"]}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost Output: [ { \"status\" : \"ok\" , \"message\" : \"Device fields have been updated\" } ]","title":"update_device_port_notes"},{"location":"API/Devices/#rename_device","text":"Rename device. Route: /api/v0/devices/:hostname/rename/:new_hostname hostname can be either the device hostname or id Input: - Examples: curl -X PATCH -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/rename/localhost2 Output: [ { \"status\" : \"ok\" , \"message\" : \"Device has been renamed\" } ]","title":"rename_device"},{"location":"API/Devices/#get_device_groups","text":"List the device groups that a device is matched on. Route: /api/v0/devices/:hostname/groups hostname can be either the device hostname or id Input (JSON): - Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/groups Output: [ { \"status\" : \"ok\" , \"message\" : \"Found 1 device groups\" , \"count\" : 1 , \"groups\" : [ { \"id\" : \"1\" , \"name\" : \"Testing\" , \"desc\" : \"Testing\" , \"pattern\" : \"%devices.status = \\\"1\\\" &&\" } ] } ]","title":"get_device_groups"},{"location":"API/Devices/#search_oxidized","text":"search all oxidized device configs for a string. Route: api/v0/oxidized/config/search/:searchstring searchstring is the specific string you would like to search for. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/oxidized/config/search/vlan10 Output: { \"status\" : \"ok\" , \"nodes\" : [ { \"node\" : \"asr9k.librenms.org\" , \"full_name\" : \"cisco\\/ASR9K.Librenms.org\" }, { \"node\" : \"ios.Librenms.org\" , \"full_name\" : \"cisco\\/ios.Librenms.org\" } ], \"count\" : 2 }","title":"search_oxidized"},{"location":"API/Devices/#get_oxidized_config","text":"Returns a specific device's config from oxidized. Route: api/v0/oxidized/config/:hostname hostname is the Hostname or IP of the device used when adding the device to librenms. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/oxidized/config/router.corp.com Output: { \"status\" : \"ok\" , \"config\" : \"DEVICE CONFIG HERE\" }","title":"get_oxidized_config"},{"location":"API/Devices/#add_parents_to_host","text":"Add one or more parents to a host. Route: /api/v0/devices/:device/parents Input (JSON): parent_ids: one or more parent ids or hostnames Example: curl -X POST -d '{\"parent_ids\":\"15,16,17\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/1/parents Output: { \"status\" : \"ok\" , \"message\" : \"Device dependencies have been saved\" }","title":"add_parents_to_host"},{"location":"API/Devices/#delete_parents_from_host","text":"Deletes some or all the parents from a host. Route: /api/v0/devices/:device/parents Input (JSON): parent_ids: One or more parent ids or hostnames, if not specified deletes all parents from host. Example: curl -X DELETE -d '{\"parent_ids\":\"15,16,17\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/1/parents Output: { \"status\" : \"ok\" , \"message\" : \"All device dependencies have been removed\" }","title":"delete_parents_from_host"},{"location":"API/Devices/#list_parents_of_host","text":"This is not a seperate API call. Instead, you obtain the list of parents from list_devices . See that entry point for more detailed information. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' 'http://librenms.org/api/v0/devices?type=device_id&query=34' Output: { \"status\" : \"ok\" , \"devices\" : [ { ... \"dependency_parent_id\" : \"98,99\" , \"dependency_parent_hostname\" : \"HOSTNAME1,HOSTNAME2\" , ... } ], \"count\" : 1 }","title":"list_parents_of_host"},{"location":"API/Inventory/","text":"get_inventory Retrieve the inventory for a device. If you call this without any parameters then you will only get part of the inventory. This is because a lot of devices nest each component, for instance you may initially have the chassis, within this the ports - 1 being an sfp cage, then the sfp itself. The way this API call is designed is to enable a recursive lookup. The first call will retrieve the root entry, included within this response will be entPhysicalIndex, you can then call for entPhysicalContainedIn which will then return the next layer of results. To retrieve all items together, see get_inventory_for_device . Route: /api/v0/inventory/:hostname hostname can be either the device hostname or the device id Input: entPhysicalClass: This is used to restrict the class of the inventory, for example you can specify chassis to only return items in the inventory that are labelled as chassis. entPhysicalContainedIn: This is used to retrieve items within the inventory assigned to a previous component, for example specifying the chassis (entPhysicalIndex) will retrieve all items where the chassis is the parent. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/inventory/localhost?entPhysicalContainedIn=65536 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"inventory\" : [ { \"entPhysical_id\" : \"2\" , \"device_id\" : \"32\" , \"entPhysicalIndex\" : \"262145\" , \"entPhysicalDescr\" : \"Linux 3.3.5 ehci_hcd RB400 EHCI\" , \"entPhysicalClass\" : \"unknown\" , \"entPhysicalName\" : \"1:1\" , \"entPhysicalHardwareRev\" : \"\" , \"entPhysicalFirmwareRev\" : \"\" , \"entPhysicalSoftwareRev\" : \"\" , \"entPhysicalAlias\" : \"\" , \"entPhysicalAssetID\" : \"\" , \"entPhysicalIsFRU\" : \"false\" , \"entPhysicalModelName\" : \"0x0002\" , \"entPhysicalVendorType\" : \"zeroDotZero\" , \"entPhysicalSerialNum\" : \"rb400_usb\" , \"entPhysicalContainedIn\" : \"65536\" , \"entPhysicalParentRelPos\" : \"-1\" , \"entPhysicalMfgName\" : \"0x1d6b\" , \"ifIndex\" : \"0\" } ] } get_inventory_for_device Retrieve the flattened inventory for a device. This retrieves all inventory items for a device regardless of their structure, and may be more useful for devices with with nested components. Route: /api/v0/inventory/:hostname/all hostname can be either the device hostname or the device id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/inventory/localhost?entPhysicalContainedIn=65536 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"inventory\" : [ { \"entPhysical_id\" : \"2\" , \"device_id\" : \"32\" , \"entPhysicalIndex\" : \"262145\" , \"entPhysicalDescr\" : \"Linux 3.3.5 ehci_hcd RB400 EHCI\" , \"entPhysicalClass\" : \"unknown\" , \"entPhysicalName\" : \"1:1\" , \"entPhysicalHardwareRev\" : \"\" , \"entPhysicalFirmwareRev\" : \"\" , \"entPhysicalSoftwareRev\" : \"\" , \"entPhysicalAlias\" : \"\" , \"entPhysicalAssetID\" : \"\" , \"entPhysicalIsFRU\" : \"false\" , \"entPhysicalModelName\" : \"0x0002\" , \"entPhysicalVendorType\" : \"zeroDotZero\" , \"entPhysicalSerialNum\" : \"rb400_usb\" , \"entPhysicalContainedIn\" : \"65536\" , \"entPhysicalParentRelPos\" : \"-1\" , \"entPhysicalMfgName\" : \"0x1d6b\" , \"ifIndex\" : \"0\" } ] }","title":"Inventory"},{"location":"API/Inventory/#get_inventory","text":"Retrieve the inventory for a device. If you call this without any parameters then you will only get part of the inventory. This is because a lot of devices nest each component, for instance you may initially have the chassis, within this the ports - 1 being an sfp cage, then the sfp itself. The way this API call is designed is to enable a recursive lookup. The first call will retrieve the root entry, included within this response will be entPhysicalIndex, you can then call for entPhysicalContainedIn which will then return the next layer of results. To retrieve all items together, see get_inventory_for_device . Route: /api/v0/inventory/:hostname hostname can be either the device hostname or the device id Input: entPhysicalClass: This is used to restrict the class of the inventory, for example you can specify chassis to only return items in the inventory that are labelled as chassis. entPhysicalContainedIn: This is used to retrieve items within the inventory assigned to a previous component, for example specifying the chassis (entPhysicalIndex) will retrieve all items where the chassis is the parent. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/inventory/localhost?entPhysicalContainedIn=65536 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"inventory\" : [ { \"entPhysical_id\" : \"2\" , \"device_id\" : \"32\" , \"entPhysicalIndex\" : \"262145\" , \"entPhysicalDescr\" : \"Linux 3.3.5 ehci_hcd RB400 EHCI\" , \"entPhysicalClass\" : \"unknown\" , \"entPhysicalName\" : \"1:1\" , \"entPhysicalHardwareRev\" : \"\" , \"entPhysicalFirmwareRev\" : \"\" , \"entPhysicalSoftwareRev\" : \"\" , \"entPhysicalAlias\" : \"\" , \"entPhysicalAssetID\" : \"\" , \"entPhysicalIsFRU\" : \"false\" , \"entPhysicalModelName\" : \"0x0002\" , \"entPhysicalVendorType\" : \"zeroDotZero\" , \"entPhysicalSerialNum\" : \"rb400_usb\" , \"entPhysicalContainedIn\" : \"65536\" , \"entPhysicalParentRelPos\" : \"-1\" , \"entPhysicalMfgName\" : \"0x1d6b\" , \"ifIndex\" : \"0\" } ] }","title":"get_inventory"},{"location":"API/Inventory/#get_inventory_for_device","text":"Retrieve the flattened inventory for a device. This retrieves all inventory items for a device regardless of their structure, and may be more useful for devices with with nested components. Route: /api/v0/inventory/:hostname/all hostname can be either the device hostname or the device id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/inventory/localhost?entPhysicalContainedIn=65536 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"inventory\" : [ { \"entPhysical_id\" : \"2\" , \"device_id\" : \"32\" , \"entPhysicalIndex\" : \"262145\" , \"entPhysicalDescr\" : \"Linux 3.3.5 ehci_hcd RB400 EHCI\" , \"entPhysicalClass\" : \"unknown\" , \"entPhysicalName\" : \"1:1\" , \"entPhysicalHardwareRev\" : \"\" , \"entPhysicalFirmwareRev\" : \"\" , \"entPhysicalSoftwareRev\" : \"\" , \"entPhysicalAlias\" : \"\" , \"entPhysicalAssetID\" : \"\" , \"entPhysicalIsFRU\" : \"false\" , \"entPhysicalModelName\" : \"0x0002\" , \"entPhysicalVendorType\" : \"zeroDotZero\" , \"entPhysicalSerialNum\" : \"rb400_usb\" , \"entPhysicalContainedIn\" : \"65536\" , \"entPhysicalParentRelPos\" : \"-1\" , \"entPhysicalMfgName\" : \"0x1d6b\" , \"ifIndex\" : \"0\" } ] }","title":"get_inventory_for_device"},{"location":"API/Locations/","text":"list_locations Return a list of locations. Route: /api/v0/resources/locations Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/locations Output: { \"status\" : \"ok\" , \"locations\" : [ { \"id\" : \"1\" , \"location\" : \"Example location, Example city, Example Country\" , \"lat\" : \"-18.911436\" , \"lng\" : \"47.517446\" , \"timestamp\" : \"2017-04-01 02:40:05\" }, ... ], \"count\" : 100 } add_location Add a new location Route: /api/v0/locations/ Input: location: name of the new location lat: latitude lng: longitude fixed_coordinates: 0 if updated from the device or 1 if the coordinate is fixed (default is fixed if lat and lng are valid) Example: curl -X POST -d '{\"location\":\"Google\", \"lat\":\"37.4220041\",\"lng\":\"-122.0862462\"}' -H 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/locations Output: { \"status\" : \"ok\" , \"message\" : \"Location added with id #45\" } delete_location Deletes an existing location Route: /api/v0/locations/:location location: name or id of the location to delete Example: curl -X DELETE -H 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/locations/Google Output: { \"status\" : \"ok\" , \"message\" : \"Location Google has been deleted successfully\" } edit_location Edits a location Route: /api/v0/locations/:location location: name or id of the location to edit Input: lat: latitude lng: longitude Example: curl -X PATCH -d '{\"lng\":\"100.0862462\"}' -H 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/locations/Google Output: { \"status\" : \"ok\" , \"message\" : \"Location updated successfully\" } get_location Gets a specific location Route: /api/v0/location/:location location: name or id of the location to get Output: { \"status\" : \"ok\" , \"get_location\" : [ { \"id\" : 1 , \"location\" : \"TEST\" , \"lat\" : 00.000000 , \"lng\" : 00.000000 , \"timestamp\" : \"2023-01-01 00:00:00\" , \"fixed_coordinates\" : 1 } ], \"count\" : 1 }","title":"Locations"},{"location":"API/Locations/#list_locations","text":"Return a list of locations. Route: /api/v0/resources/locations Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/locations Output: { \"status\" : \"ok\" , \"locations\" : [ { \"id\" : \"1\" , \"location\" : \"Example location, Example city, Example Country\" , \"lat\" : \"-18.911436\" , \"lng\" : \"47.517446\" , \"timestamp\" : \"2017-04-01 02:40:05\" }, ... ], \"count\" : 100 }","title":"list_locations"},{"location":"API/Locations/#add_location","text":"Add a new location Route: /api/v0/locations/ Input: location: name of the new location lat: latitude lng: longitude fixed_coordinates: 0 if updated from the device or 1 if the coordinate is fixed (default is fixed if lat and lng are valid) Example: curl -X POST -d '{\"location\":\"Google\", \"lat\":\"37.4220041\",\"lng\":\"-122.0862462\"}' -H 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/locations Output: { \"status\" : \"ok\" , \"message\" : \"Location added with id #45\" }","title":"add_location"},{"location":"API/Locations/#delete_location","text":"Deletes an existing location Route: /api/v0/locations/:location location: name or id of the location to delete Example: curl -X DELETE -H 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/locations/Google Output: { \"status\" : \"ok\" , \"message\" : \"Location Google has been deleted successfully\" }","title":"delete_location"},{"location":"API/Locations/#edit_location","text":"Edits a location Route: /api/v0/locations/:location location: name or id of the location to edit Input: lat: latitude lng: longitude Example: curl -X PATCH -d '{\"lng\":\"100.0862462\"}' -H 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/locations/Google Output: { \"status\" : \"ok\" , \"message\" : \"Location updated successfully\" }","title":"edit_location"},{"location":"API/Locations/#get_location","text":"Gets a specific location Route: /api/v0/location/:location location: name or id of the location to get Output: { \"status\" : \"ok\" , \"get_location\" : [ { \"id\" : 1 , \"location\" : \"TEST\" , \"lat\" : 00.000000 , \"lng\" : 00.000000 , \"timestamp\" : \"2023-01-01 00:00:00\" , \"fixed_coordinates\" : 1 } ], \"count\" : 1 }","title":"get_location"},{"location":"API/Logs/","text":"All the list_*logs calls are aliased to list_logs . Retrieve all logs or logs for a specific device. id or hostname is the specific device Input: start: The page number to request. limit: The limit of results to be returned. from: The date and time or the event id to search from. to: The data and time or the event id to search to. list_eventlog Route: /api/v0/logs/eventlog/:hostname list_syslog Route: /api/v0/logs/syslog/:hostname list_alertlog Route: /api/v0/logs/alertlog/:hostname list_authlog Route: /api/v0/logs/authlog/:hostname Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/eventlog/:hostname curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/syslog/:hostname?limit=20 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/eventlog/:hostname?limit=20&start=5&from=2017-07-22%2023:00:00 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/eventlog/:hostname?sortorder=DESC Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 5 , \"total\" : \"15\" , \"logs\" : [ { \"hostname\" : \"localhost\" , \"sysName\" : \"web01.1.novalocal\" , \"event_id\" : \"10050349\" , \"host\" : \"279\" , \"device_id\" : \"279\" , \"datetime\" : \"2017-07-22 19:57:47\" , \"message\" : \"ifAlias: -> \" , \"type\" : \"interface\" , \"reference\" : \"NULL\" , \"username\" : \"\" , \"severity\" : \"3\" }, .... { \"hostname\" : \"localhost\" , \"sysName\" : \"web01.1.novalocal\" , \"event_id\" : \"10050353\" , \"host\" : \"279\" , \"device_id\" : \"279\" , \"datetime\" : \"2017-07-22 19:57:47\" , \"message\" : \"ifHighSpeed: -> 0\" , \"type\" : \"interface\" , \"reference\" : \"NULL\" , \"username\" : \"\" , \"severity\" : \"3\" } ] } syslogsink Route: /api/v0/logs/syslogsink Accept any json messages and passes to further syslog processing. single messages or an array of multiple messages is accepted. see Syslog for more details and logstash integration Example curl -L -X POST 'https://sink.librenms.org/api/v0/syslogsink/' -H 'X-Auth-Token: xxxxxxxLibreNMSApiToken' --data-raw '[ { \"msg\": \"kernel: minimum Message\", \"host\": \"mydevice.fqdn.com\" }, { \"msg\": \"Line protocol on Interface GigabitEthernet1/0/41, changed state to up\", \"facility\": 23, \"priority\": \"189\", \"program\": \"LINEPROTO-5-UPDOWN\", \"host\": \"172.29.10.24\", \"@timestamp\": \"2022-12-01T20:14:28.257Z\", \"severity\": 5, \"level\": \"ERROR\" }, { \"msg\": \"kernel: a unknown host\", \"host\": \"unknown.fqdn.com\" } ]'","title":"Logs"},{"location":"API/Logs/#list_eventlog","text":"Route: /api/v0/logs/eventlog/:hostname","title":"list_eventlog"},{"location":"API/Logs/#list_syslog","text":"Route: /api/v0/logs/syslog/:hostname","title":"list_syslog"},{"location":"API/Logs/#list_alertlog","text":"Route: /api/v0/logs/alertlog/:hostname","title":"list_alertlog"},{"location":"API/Logs/#list_authlog","text":"Route: /api/v0/logs/authlog/:hostname Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/eventlog/:hostname curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/syslog/:hostname?limit=20 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/eventlog/:hostname?limit=20&start=5&from=2017-07-22%2023:00:00 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/eventlog/:hostname?sortorder=DESC Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 5 , \"total\" : \"15\" , \"logs\" : [ { \"hostname\" : \"localhost\" , \"sysName\" : \"web01.1.novalocal\" , \"event_id\" : \"10050349\" , \"host\" : \"279\" , \"device_id\" : \"279\" , \"datetime\" : \"2017-07-22 19:57:47\" , \"message\" : \"ifAlias: -> \" , \"type\" : \"interface\" , \"reference\" : \"NULL\" , \"username\" : \"\" , \"severity\" : \"3\" }, .... { \"hostname\" : \"localhost\" , \"sysName\" : \"web01.1.novalocal\" , \"event_id\" : \"10050353\" , \"host\" : \"279\" , \"device_id\" : \"279\" , \"datetime\" : \"2017-07-22 19:57:47\" , \"message\" : \"ifHighSpeed: -> 0\" , \"type\" : \"interface\" , \"reference\" : \"NULL\" , \"username\" : \"\" , \"severity\" : \"3\" } ] }","title":"list_authlog"},{"location":"API/Logs/#syslogsink","text":"Route: /api/v0/logs/syslogsink Accept any json messages and passes to further syslog processing. single messages or an array of multiple messages is accepted. see Syslog for more details and logstash integration Example curl -L -X POST 'https://sink.librenms.org/api/v0/syslogsink/' -H 'X-Auth-Token: xxxxxxxLibreNMSApiToken' --data-raw '[ { \"msg\": \"kernel: minimum Message\", \"host\": \"mydevice.fqdn.com\" }, { \"msg\": \"Line protocol on Interface GigabitEthernet1/0/41, changed state to up\", \"facility\": 23, \"priority\": \"189\", \"program\": \"LINEPROTO-5-UPDOWN\", \"host\": \"172.29.10.24\", \"@timestamp\": \"2022-12-01T20:14:28.257Z\", \"severity\": 5, \"level\": \"ERROR\" }, { \"msg\": \"kernel: a unknown host\", \"host\": \"unknown.fqdn.com\" } ]'","title":"syslogsink"},{"location":"API/PollerGroups/","text":"get_poller_group Gets a specific poller group or all if none is specified Route: /api/v0/poller_group/:poller_group poller_group: optional name or id of the poller group to get Output: { \"status\" : \"ok\" , \"get_poller_group\" : [ { \"id\" : 1 , \"group_name\" : \"test\" , \"descr\" : \"test group\" } ], \"count\" : 1 }","title":"PollerGroups"},{"location":"API/PollerGroups/#get_poller_group","text":"Gets a specific poller group or all if none is specified Route: /api/v0/poller_group/:poller_group poller_group: optional name or id of the poller group to get Output: { \"status\" : \"ok\" , \"get_poller_group\" : [ { \"id\" : 1 , \"group_name\" : \"test\" , \"descr\" : \"test group\" } ], \"count\" : 1 }","title":"get_poller_group"},{"location":"API/PortGroups/","text":"get_graph_by_portgroup Get the graph based on the group type. Route: /api/v0/portgroups/:group group is the type of port group graph you want, I.e Transit, Peering, etc. You can specify multiple types comma separated. Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/portgroups/transit,peering Output: Output is an image. get_graph_by_portgroup_multiport_bits Get the graph based on the multiple port id separated by commas , . Route: /api/v0/portgroups/multiport/bits/:id id is a comma separated list of port ids you want, I.e 1,2,3,4, etc. You can specify multiple IDs comma separated. Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/portgroups/multiport/bits/1,2,3 Output: Output is an image.","title":"PortGroups"},{"location":"API/PortGroups/#get_graph_by_portgroup","text":"Get the graph based on the group type. Route: /api/v0/portgroups/:group group is the type of port group graph you want, I.e Transit, Peering, etc. You can specify multiple types comma separated. Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/portgroups/transit,peering Output: Output is an image.","title":"get_graph_by_portgroup"},{"location":"API/PortGroups/#get_graph_by_portgroup_multiport_bits","text":"Get the graph based on the multiple port id separated by commas , . Route: /api/v0/portgroups/multiport/bits/:id id is a comma separated list of port ids you want, I.e 1,2,3,4, etc. You can specify multiple IDs comma separated. Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/portgroups/multiport/bits/1,2,3 Output: Output is an image.","title":"get_graph_by_portgroup_multiport_bits"},{"location":"API/Port_Groups/","text":"get_port_groups List all port groups. Route: /api/v0/port_groups Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/port_groups Output: [ { \"status\" : \"ok\" , \"message\" : \"Found 1 port groups\" , \"count\" : 1 , \"groups\" : [ { \"id\" : \"1\" , \"name\" : \"Testing\" , \"desc\" : \"Testing\" } ] } ] get_ports_by_group List all ports matching the group provided. Route: /api/v0/port_groups/:name name Is the name of the port group which can be obtained using get_port_groups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Params: full: set to any value to return all data for the devices in a given group Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/port_groups/Billable Output: { \"status\" : \"ok\" , \"ports\" : [ { \"port_id\" : 1376 }, { \"port_id\" : 2376 } ], \"count\" : 2 } add_port_group Add a new port group. Upon success, the ID of the new port group is returned and the HTTP response code is 201 . Route: /api/v0/port_groups Input (JSON): name : required - The name of the port group desc : optional - Description of the port group Examples: Dynamic Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST \\ -d '{\"name\": \"New Port Group\", \\ \"desc\": \"A very fancy port group\"}' \\ https://librenms.org/api/v0/port_groups Output: { \"status\" : \"ok\" , \"id\" : 86 , \"message\" : \"Port group New Port Group created\" } assign_port_group Assign a Port Group to a list of Ports Route: /api/v0/port_groups/:port_group_id/assign Input (JSON): port_ids : required - List of Port Ids Examples: Dynamic Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' -X POST -d '{\"port_ids\": [\"4\",\"34\",\"25,\"983\"]}' https://librenms.org/api/v0/port_groups/3/assign Output: { \"status\" : \"ok\" , \"Port Ids 4, 34, 25, 983 have been added to Port Group Id 3\" : 200 } remove_port_group Remove a Port Group from a list of Ports Route: /api/v0/port_groups/:port_group_id/remove Input (JSON): port_ids : required - List of Port Ids Examples: Dynamic Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' -X POST -d '{\"port_ids\": [\"4\",\"34\",\"25,\"983\"]}' https://librenms.org/api/v0/port_groups/3/remove Output: { \"status\" : \"ok\" , \"Port Ids 4, 34, 25, 983 have been removed from Port Group Id 3\" : 200 }","title":"Port_Groups"},{"location":"API/Port_Groups/#get_port_groups","text":"List all port groups. Route: /api/v0/port_groups Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/port_groups Output: [ { \"status\" : \"ok\" , \"message\" : \"Found 1 port groups\" , \"count\" : 1 , \"groups\" : [ { \"id\" : \"1\" , \"name\" : \"Testing\" , \"desc\" : \"Testing\" } ] } ]","title":"get_port_groups"},{"location":"API/Port_Groups/#get_ports_by_group","text":"List all ports matching the group provided. Route: /api/v0/port_groups/:name name Is the name of the port group which can be obtained using get_port_groups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Params: full: set to any value to return all data for the devices in a given group Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/port_groups/Billable Output: { \"status\" : \"ok\" , \"ports\" : [ { \"port_id\" : 1376 }, { \"port_id\" : 2376 } ], \"count\" : 2 }","title":"get_ports_by_group"},{"location":"API/Port_Groups/#add_port_group","text":"Add a new port group. Upon success, the ID of the new port group is returned and the HTTP response code is 201 . Route: /api/v0/port_groups Input (JSON): name : required - The name of the port group desc : optional - Description of the port group Examples: Dynamic Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST \\ -d '{\"name\": \"New Port Group\", \\ \"desc\": \"A very fancy port group\"}' \\ https://librenms.org/api/v0/port_groups Output: { \"status\" : \"ok\" , \"id\" : 86 , \"message\" : \"Port group New Port Group created\" }","title":"add_port_group"},{"location":"API/Port_Groups/#assign_port_group","text":"Assign a Port Group to a list of Ports Route: /api/v0/port_groups/:port_group_id/assign Input (JSON): port_ids : required - List of Port Ids Examples: Dynamic Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' -X POST -d '{\"port_ids\": [\"4\",\"34\",\"25,\"983\"]}' https://librenms.org/api/v0/port_groups/3/assign Output: { \"status\" : \"ok\" , \"Port Ids 4, 34, 25, 983 have been added to Port Group Id 3\" : 200 }","title":"assign_port_group"},{"location":"API/Port_Groups/#remove_port_group","text":"Remove a Port Group from a list of Ports Route: /api/v0/port_groups/:port_group_id/remove Input (JSON): port_ids : required - List of Port Ids Examples: Dynamic Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' -X POST -d '{\"port_ids\": [\"4\",\"34\",\"25,\"983\"]}' https://librenms.org/api/v0/port_groups/3/remove Output: { \"status\" : \"ok\" , \"Port Ids 4, 34, 25, 983 have been removed from Port Group Id 3\" : 200 }","title":"remove_port_group"},{"location":"API/Ports/","text":"get_all_ports Get info for all ports on all devices. Strongly recommend that you use the columns parameter to avoid pulling too much data. Route: /api/v0/ports - Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports?columns=ifName%2Cport_id Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"ports\" : [ { \"ifName\" : \"Gi0/0/0\" , \"port_id\" : \"1\" }, { \"ifName\" : \"Gi0/0/1\" , \"port_id\" : \"2\" }, ... { \"ifName\" : \"Vlan 3615\" , \"port_id\" : \"5488\" } ] } search_ports Search for ports matching the query. Route: /api/v0/ports/search/:search search string to search in fields: ifAlias, ifDescr, and ifName Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/search/lo Output: { \"status\" : \"ok\" , \"ports\" : [ { \"device_id\" : 1 , \"port_id\" : 1 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" }, { \"device_id\" : 2 , \"port_id\" : 3 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" }, { \"device_id\" : 3 , \"port_id\" : 5 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" } ] } search_ports in specific field(s) Specific search for ports matching the query. Route: /api/v0/ports/search/:field/:search field: comma separated list of field(s) to search search: string to search in fields Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/search/ifName/lo Output: { \"status\" : \"ok\" , \"ports\" : [ { \"device_id\" : 1 , \"port_id\" : 1 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" }, { \"device_id\" : 2 , \"port_id\" : 3 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" }, { \"device_id\" : 3 , \"port_id\" : 5 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" } ] } ports_with_associated_mac Search for ports matching the search mac. Route: /api/v0/ports/mac/:search?filter=first search a mac address in fdb and print the ports ordered by the mac count of the associated port. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/mac/00:11:22:33:44:55 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/mac/001122.334455?filter=first curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/mac/001122334455?filter=first Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"port\" : [ { \"port_id\" : \"323\" , \"device_id\" : \"55\" , \"port_descr_type\" : null , \"port_descr_descr\" : null , \"port_descr_circuit\" : null , \"port_descr_speed\" : null , \"port_descr_notes\" : null , \"ifDescr\" : \"GigabitEthernet0/0/0\" , \"ifName\" : \"Gi0/0/0\" , \"portName\" : null , \"ifIndex\" : \"1\" , \"ifSpeed\" : \"1000000000\" , \"ifConnectorPresent\" : \"true\" , \"ifPromiscuousMode\" : \"false\" , \"ifHighSpeed\" : \"1000\" , \"ifOperStatus\" : \"up\" , \"ifOperStatus_prev\" : null , \"ifAdminStatus\" : \"up\" , \"ifAdminStatus_prev\" : null , \"ifDuplex\" : \"fullDuplex\" , \"ifMtu\" : \"1560\" , \"ifType\" : \"ethernetCsmacd\" , \"ifAlias\" : \"ASR Interconnect Trunk\" , \"ifPhysAddress\" : \"84bf20853e00\" , \"ifHardType\" : null , \"ifLastChange\" : \"42407358\" , \"ifVlan\" : \"\" , \"ifTrunk\" : \"\" , \"ifVrf\" : \"0\" , \"counter_in\" : null , \"counter_out\" : null , \"ignore\" : \"0\" , \"disabled\" : \"0\" , \"detailed\" : \"0\" , \"deleted\" : \"0\" , \"pagpOperationMode\" : null , \"pagpPortState\" : null , \"pagpPartnerDeviceId\" : null , \"pagpPartnerLearnMethod\" : null , \"pagpPartnerIfIndex\" : null , \"pagpPartnerGroupIfIndex\" : null , \"pagpPartnerDeviceName\" : null , \"pagpEthcOperationMode\" : null , \"pagpDeviceId\" : null , \"pagpGroupIfIndex\" : null , \"ifInUcastPkts\" : \"128518576\" , \"ifInUcastPkts_prev\" : \"128517284\" , \"ifInUcastPkts_delta\" : \"1292\" , \"ifInUcastPkts_rate\" : \"4\" , \"ifOutUcastPkts\" : \"128510560\" , \"ifOutUcastPkts_prev\" : \"128509268\" , \"ifOutUcastPkts_delta\" : \"1292\" , \"ifOutUcastPkts_rate\" : \"4\" , \"ifInErrors\" : \"0\" , \"ifInErrors_prev\" : \"0\" , \"ifInErrors_delta\" : \"0\" , \"ifInErrors_rate\" : \"0\" , \"ifOutErrors\" : \"0\" , \"ifOutErrors_prev\" : \"0\" , \"ifOutErrors_delta\" : \"0\" , \"ifOutErrors_rate\" : \"0\" , \"ifInOctets\" : \"12827393730\" , \"ifInOctets_prev\" : \"12827276736\" , \"ifInOctets_delta\" : \"116994\" , \"ifInOctets_rate\" : \"387\" , \"ifOutOctets\" : \"14957481766\" , \"ifOutOctets_prev\" : \"14957301765\" , \"ifOutOctets_delta\" : \"180001\" , \"ifOutOctets_rate\" : \"596\" , \"poll_time\" : \"1483779150\" , \"poll_prev\" : \"1483778848\" , \"poll_period\" : \"302\" } ] } get_port_info Get all info for a particular port. Route: /api/v0/ports/:portid portid must be an integer Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/323 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"port\" : [ { \"port_id\" : \"323\" , \"device_id\" : \"55\" , \"port_descr_type\" : null , \"port_descr_descr\" : null , \"port_descr_circuit\" : null , \"port_descr_speed\" : null , \"port_descr_notes\" : null , \"ifDescr\" : \"GigabitEthernet0/0/0\" , \"ifName\" : \"Gi0/0/0\" , \"portName\" : null , \"ifIndex\" : \"1\" , \"ifSpeed\" : \"1000000000\" , \"ifConnectorPresent\" : \"true\" , \"ifPromiscuousMode\" : \"false\" , \"ifHighSpeed\" : \"1000\" , \"ifOperStatus\" : \"up\" , \"ifOperStatus_prev\" : null , \"ifAdminStatus\" : \"up\" , \"ifAdminStatus_prev\" : null , \"ifDuplex\" : \"fullDuplex\" , \"ifMtu\" : \"1560\" , \"ifType\" : \"ethernetCsmacd\" , \"ifAlias\" : \"ASR Interconnect Trunk\" , \"ifPhysAddress\" : \"84bf20853e00\" , \"ifHardType\" : null , \"ifLastChange\" : \"42407358\" , \"ifVlan\" : \"\" , \"ifTrunk\" : \"\" , \"ifVrf\" : \"0\" , \"counter_in\" : null , \"counter_out\" : null , \"ignore\" : \"0\" , \"disabled\" : \"0\" , \"detailed\" : \"0\" , \"deleted\" : \"0\" , \"pagpOperationMode\" : null , \"pagpPortState\" : null , \"pagpPartnerDeviceId\" : null , \"pagpPartnerLearnMethod\" : null , \"pagpPartnerIfIndex\" : null , \"pagpPartnerGroupIfIndex\" : null , \"pagpPartnerDeviceName\" : null , \"pagpEthcOperationMode\" : null , \"pagpDeviceId\" : null , \"pagpGroupIfIndex\" : null , \"ifInUcastPkts\" : \"128518576\" , \"ifInUcastPkts_prev\" : \"128517284\" , \"ifInUcastPkts_delta\" : \"1292\" , \"ifInUcastPkts_rate\" : \"4\" , \"ifOutUcastPkts\" : \"128510560\" , \"ifOutUcastPkts_prev\" : \"128509268\" , \"ifOutUcastPkts_delta\" : \"1292\" , \"ifOutUcastPkts_rate\" : \"4\" , \"ifInErrors\" : \"0\" , \"ifInErrors_prev\" : \"0\" , \"ifInErrors_delta\" : \"0\" , \"ifInErrors_rate\" : \"0\" , \"ifOutErrors\" : \"0\" , \"ifOutErrors_prev\" : \"0\" , \"ifOutErrors_delta\" : \"0\" , \"ifOutErrors_rate\" : \"0\" , \"ifInOctets\" : \"12827393730\" , \"ifInOctets_prev\" : \"12827276736\" , \"ifInOctets_delta\" : \"116994\" , \"ifInOctets_rate\" : \"387\" , \"ifOutOctets\" : \"14957481766\" , \"ifOutOctets_prev\" : \"14957301765\" , \"ifOutOctets_delta\" : \"180001\" , \"ifOutOctets_rate\" : \"596\" , \"poll_time\" : \"1483779150\" , \"poll_prev\" : \"1483778848\" , \"poll_period\" : \"302\" } ] } get_port_ip_info Get all IP info (v4 and v6) for a given port id. Route: /api/v0/ports/:portid/ip portid must be an integer Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/323/ip Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"addresses\" : [ { \"ipv4_address_id\" : \"290\" , \"ipv4_address\" : \"192.168.99.292\" , \"ipv4_prefixlen\" : \"30\" , \"ipv4_network_id\" : \"247\" , \"port_id\" : \"323\" , \"context_name\" : \"\" } ] } get_port_description Get the description ( ifAlias ) for a given port id. Route: /api/v0/ports/:portid/description Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/323/description Output: { \"status\" : \"ok\" , \"port_description\" : \"GigabitEthernet14\" } update_port_description Change the description ( ifAlias ) for a given port id. Route: /api/v0/ports/:portid/description Input (JSON): description: The string data to use as the new port description. Sending an empty string will reset the description to default. Example: curl -X PATCH -d '{\"description\": \"Out-of-Band Management Link\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/323/description Output: { \"status\" : \"ok\" , \"message\" : \"Port description updated.\" }","title":"Ports"},{"location":"API/Ports/#get_all_ports","text":"Get info for all ports on all devices. Strongly recommend that you use the columns parameter to avoid pulling too much data. Route: /api/v0/ports - Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports?columns=ifName%2Cport_id Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"ports\" : [ { \"ifName\" : \"Gi0/0/0\" , \"port_id\" : \"1\" }, { \"ifName\" : \"Gi0/0/1\" , \"port_id\" : \"2\" }, ... { \"ifName\" : \"Vlan 3615\" , \"port_id\" : \"5488\" } ] }","title":"get_all_ports"},{"location":"API/Ports/#search_ports","text":"Search for ports matching the query. Route: /api/v0/ports/search/:search search string to search in fields: ifAlias, ifDescr, and ifName Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/search/lo Output: { \"status\" : \"ok\" , \"ports\" : [ { \"device_id\" : 1 , \"port_id\" : 1 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" }, { \"device_id\" : 2 , \"port_id\" : 3 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" }, { \"device_id\" : 3 , \"port_id\" : 5 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" } ] }","title":"search_ports"},{"location":"API/Ports/#search_ports-in-specific-fields","text":"Specific search for ports matching the query. Route: /api/v0/ports/search/:field/:search field: comma separated list of field(s) to search search: string to search in fields Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/search/ifName/lo Output: { \"status\" : \"ok\" , \"ports\" : [ { \"device_id\" : 1 , \"port_id\" : 1 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" }, { \"device_id\" : 2 , \"port_id\" : 3 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" }, { \"device_id\" : 3 , \"port_id\" : 5 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" } ] }","title":"search_ports in specific field(s)"},{"location":"API/Ports/#ports_with_associated_mac","text":"Search for ports matching the search mac. Route: /api/v0/ports/mac/:search?filter=first search a mac address in fdb and print the ports ordered by the mac count of the associated port. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/mac/00:11:22:33:44:55 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/mac/001122.334455?filter=first curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/mac/001122334455?filter=first Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"port\" : [ { \"port_id\" : \"323\" , \"device_id\" : \"55\" , \"port_descr_type\" : null , \"port_descr_descr\" : null , \"port_descr_circuit\" : null , \"port_descr_speed\" : null , \"port_descr_notes\" : null , \"ifDescr\" : \"GigabitEthernet0/0/0\" , \"ifName\" : \"Gi0/0/0\" , \"portName\" : null , \"ifIndex\" : \"1\" , \"ifSpeed\" : \"1000000000\" , \"ifConnectorPresent\" : \"true\" , \"ifPromiscuousMode\" : \"false\" , \"ifHighSpeed\" : \"1000\" , \"ifOperStatus\" : \"up\" , \"ifOperStatus_prev\" : null , \"ifAdminStatus\" : \"up\" , \"ifAdminStatus_prev\" : null , \"ifDuplex\" : \"fullDuplex\" , \"ifMtu\" : \"1560\" , \"ifType\" : \"ethernetCsmacd\" , \"ifAlias\" : \"ASR Interconnect Trunk\" , \"ifPhysAddress\" : \"84bf20853e00\" , \"ifHardType\" : null , \"ifLastChange\" : \"42407358\" , \"ifVlan\" : \"\" , \"ifTrunk\" : \"\" , \"ifVrf\" : \"0\" , \"counter_in\" : null , \"counter_out\" : null , \"ignore\" : \"0\" , \"disabled\" : \"0\" , \"detailed\" : \"0\" , \"deleted\" : \"0\" , \"pagpOperationMode\" : null , \"pagpPortState\" : null , \"pagpPartnerDeviceId\" : null , \"pagpPartnerLearnMethod\" : null , \"pagpPartnerIfIndex\" : null , \"pagpPartnerGroupIfIndex\" : null , \"pagpPartnerDeviceName\" : null , \"pagpEthcOperationMode\" : null , \"pagpDeviceId\" : null , \"pagpGroupIfIndex\" : null , \"ifInUcastPkts\" : \"128518576\" , \"ifInUcastPkts_prev\" : \"128517284\" , \"ifInUcastPkts_delta\" : \"1292\" , \"ifInUcastPkts_rate\" : \"4\" , \"ifOutUcastPkts\" : \"128510560\" , \"ifOutUcastPkts_prev\" : \"128509268\" , \"ifOutUcastPkts_delta\" : \"1292\" , \"ifOutUcastPkts_rate\" : \"4\" , \"ifInErrors\" : \"0\" , \"ifInErrors_prev\" : \"0\" , \"ifInErrors_delta\" : \"0\" , \"ifInErrors_rate\" : \"0\" , \"ifOutErrors\" : \"0\" , \"ifOutErrors_prev\" : \"0\" , \"ifOutErrors_delta\" : \"0\" , \"ifOutErrors_rate\" : \"0\" , \"ifInOctets\" : \"12827393730\" , \"ifInOctets_prev\" : \"12827276736\" , \"ifInOctets_delta\" : \"116994\" , \"ifInOctets_rate\" : \"387\" , \"ifOutOctets\" : \"14957481766\" , \"ifOutOctets_prev\" : \"14957301765\" , \"ifOutOctets_delta\" : \"180001\" , \"ifOutOctets_rate\" : \"596\" , \"poll_time\" : \"1483779150\" , \"poll_prev\" : \"1483778848\" , \"poll_period\" : \"302\" } ] }","title":"ports_with_associated_mac"},{"location":"API/Ports/#get_port_info","text":"Get all info for a particular port. Route: /api/v0/ports/:portid portid must be an integer Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/323 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"port\" : [ { \"port_id\" : \"323\" , \"device_id\" : \"55\" , \"port_descr_type\" : null , \"port_descr_descr\" : null , \"port_descr_circuit\" : null , \"port_descr_speed\" : null , \"port_descr_notes\" : null , \"ifDescr\" : \"GigabitEthernet0/0/0\" , \"ifName\" : \"Gi0/0/0\" , \"portName\" : null , \"ifIndex\" : \"1\" , \"ifSpeed\" : \"1000000000\" , \"ifConnectorPresent\" : \"true\" , \"ifPromiscuousMode\" : \"false\" , \"ifHighSpeed\" : \"1000\" , \"ifOperStatus\" : \"up\" , \"ifOperStatus_prev\" : null , \"ifAdminStatus\" : \"up\" , \"ifAdminStatus_prev\" : null , \"ifDuplex\" : \"fullDuplex\" , \"ifMtu\" : \"1560\" , \"ifType\" : \"ethernetCsmacd\" , \"ifAlias\" : \"ASR Interconnect Trunk\" , \"ifPhysAddress\" : \"84bf20853e00\" , \"ifHardType\" : null , \"ifLastChange\" : \"42407358\" , \"ifVlan\" : \"\" , \"ifTrunk\" : \"\" , \"ifVrf\" : \"0\" , \"counter_in\" : null , \"counter_out\" : null , \"ignore\" : \"0\" , \"disabled\" : \"0\" , \"detailed\" : \"0\" , \"deleted\" : \"0\" , \"pagpOperationMode\" : null , \"pagpPortState\" : null , \"pagpPartnerDeviceId\" : null , \"pagpPartnerLearnMethod\" : null , \"pagpPartnerIfIndex\" : null , \"pagpPartnerGroupIfIndex\" : null , \"pagpPartnerDeviceName\" : null , \"pagpEthcOperationMode\" : null , \"pagpDeviceId\" : null , \"pagpGroupIfIndex\" : null , \"ifInUcastPkts\" : \"128518576\" , \"ifInUcastPkts_prev\" : \"128517284\" , \"ifInUcastPkts_delta\" : \"1292\" , \"ifInUcastPkts_rate\" : \"4\" , \"ifOutUcastPkts\" : \"128510560\" , \"ifOutUcastPkts_prev\" : \"128509268\" , \"ifOutUcastPkts_delta\" : \"1292\" , \"ifOutUcastPkts_rate\" : \"4\" , \"ifInErrors\" : \"0\" , \"ifInErrors_prev\" : \"0\" , \"ifInErrors_delta\" : \"0\" , \"ifInErrors_rate\" : \"0\" , \"ifOutErrors\" : \"0\" , \"ifOutErrors_prev\" : \"0\" , \"ifOutErrors_delta\" : \"0\" , \"ifOutErrors_rate\" : \"0\" , \"ifInOctets\" : \"12827393730\" , \"ifInOctets_prev\" : \"12827276736\" , \"ifInOctets_delta\" : \"116994\" , \"ifInOctets_rate\" : \"387\" , \"ifOutOctets\" : \"14957481766\" , \"ifOutOctets_prev\" : \"14957301765\" , \"ifOutOctets_delta\" : \"180001\" , \"ifOutOctets_rate\" : \"596\" , \"poll_time\" : \"1483779150\" , \"poll_prev\" : \"1483778848\" , \"poll_period\" : \"302\" } ] }","title":"get_port_info"},{"location":"API/Ports/#get_port_ip_info","text":"Get all IP info (v4 and v6) for a given port id. Route: /api/v0/ports/:portid/ip portid must be an integer Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/323/ip Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"addresses\" : [ { \"ipv4_address_id\" : \"290\" , \"ipv4_address\" : \"192.168.99.292\" , \"ipv4_prefixlen\" : \"30\" , \"ipv4_network_id\" : \"247\" , \"port_id\" : \"323\" , \"context_name\" : \"\" } ] }","title":"get_port_ip_info"},{"location":"API/Ports/#get_port_description","text":"Get the description ( ifAlias ) for a given port id. Route: /api/v0/ports/:portid/description Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/323/description Output: { \"status\" : \"ok\" , \"port_description\" : \"GigabitEthernet14\" }","title":"get_port_description"},{"location":"API/Ports/#update_port_description","text":"Change the description ( ifAlias ) for a given port id. Route: /api/v0/ports/:portid/description Input (JSON): description: The string data to use as the new port description. Sending an empty string will reset the description to default. Example: curl -X PATCH -d '{\"description\": \"Out-of-Band Management Link\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/323/description Output: { \"status\" : \"ok\" , \"message\" : \"Port description updated.\" }","title":"update_port_description"},{"location":"API/Routing/","text":"list_bgp List the current BGP sessions. Route: /api/v0/bgp Input: hostname = Either the devices hostname or id. asn = The local ASN you would like to filter by remote_asn = Filter by remote peer ASN remote_address = Filter by remote peer address local_address = Filter by local address bgp_descr = Filter by BGP neighbor description bgp_state = Filter by BGP session state (like established,idle...) bgp_state = Filter by BGP admin state (start,stop,running...) bgp_family = Filter by BGP address Family (4,6) Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?hostname=host.example.com curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?asn=1234 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?remote_asn=1234 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?local_address=1.1.1.1&remote_address=2.2.2.2 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_descr=UPSTREAM curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_state=established curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_adminstate=start curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_family=6 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_state=idle&bgp_descr=CORE&bgp_family=4 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"bgp_sessions\" : [ { \"bgpPeer_id\" : 1260 , \"device_id\" : 7 , \"vrf_id\" : null , \"astext\" : \"Acme Ltd\" , \"bgpPeerIdentifier\" : \"2001:0DB8:0000:24cb:0000:0000:0000:0001\" , \"bgpPeerRemoteAs\" : 65432 , \"bgpPeerState\" : \"established\" , \"bgpPeerAdminStatus\" : \"start\" , \"bgpPeerLastErrorCode\" : 6 , \"bgpPeerLastErrorSubCode\" : 2 , \"bgpPeerLastErrorText\" : \"administrative shutdown\" , \"bgpPeerIface\" : 268 , \"bgpLocalAddr\" : \"2001:0DB8:0000:24cb:0000:0000:0000:0002\" , \"bgpPeerRemoteAddr\" : \"0.0.0.0\" , \"bgpPeerDescr\" : \"Another one #CORE\" , \"bgpPeerInUpdates\" : 283882969 , \"bgpPeerOutUpdates\" : 7008 , \"bgpPeerInTotalMessages\" : 283883031 , \"bgpPeerOutTotalMessages\" : 1386692 , \"bgpPeerFsmEstablishedTime\" : 1628487 , \"bgpPeerInUpdateElapsedTime\" : 0 , \"context_name\" : \"\" }, ... ], \"count\" : 100 } get_bgp Retrieves a BGP session by ID Route: /api/v0/bgp/:id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp/4 Output: { \"status\" : \"ok\" , \"bgp_session\" : [ { \"bgpPeer_id\" : \"4\" , \"device_id\" : \"2\" , \"astext\" : \"\" , \"bgpPeerIdentifier\" : \"1234:1b80:1:12::2\" , \"bgpPeerRemoteAs\" : \"54321\" , \"bgpPeerState\" : \"established\" , \"bgpPeerAdminStatus\" : \"running\" , \"bgpLocalAddr\" : \"1234:1b80:1:12::1\" , \"bgpPeerRemoteAddr\" : \"0.0.0.0\" , \"bgpPeerInUpdates\" : \"3\" , \"bgpPeerOutUpdates\" : \"1\" , \"bgpPeerInTotalMessages\" : \"0\" , \"bgpPeerOutTotalMessages\" : \"0\" , \"bgpPeerFsmEstablishedTime\" : \"0\" , \"bgpPeerInUpdateElapsedTime\" : \"0\" , \"context_name\" : \"\" } ], \"count\" : 1 } edit_bgp_descr This is a POST type request Set the BGP session description by ID Route: /api/v0/bgp/:id Input: id = The id of the BGP Peer Session. bgp_descr = The description for the bgpPeerDescr field on the BGP Session. Example: curl -v -H 'X-Auth-Token: YOURAPITOKENHERE' --data '{\"bgp_descr\": \"Your description here\"}' https://librenms.org/api/v0/bgp/4 Output: { \"status\" : \"ok\" , \"message\" : \"BGP description for peer X.X.X.X on device 1 updated to Your description here\" } list_cbgp List the current BGP sessions counters. Route: /api/v0/routing/bgp/cbgp Input: hostname = Either the devices hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/bgp/cbgp curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/bgp/cbgp?hostname=host.example.com Output: { \"status\" : \"ok\" , \"bgp_counters\" : [ { \"device_id\" : \"9\" , \"bgpPeerIdentifier\" : \"192.168.99.31\" , \"afi\" : \"ipv4\" , \"safi\" : \"multicast\" , \"AcceptedPrefixes\" : \"2\" , \"DeniedPrefixes\" : \"0\" , \"PrefixAdminLimit\" : \"0\" , \"PrefixThreshold\" : \"0\" , \"PrefixClearThreshold\" : \"0\" , \"AdvertisedPrefixes\" : \"11487\" , \"SuppressedPrefixes\" : \"0\" , \"WithdrawnPrefixes\" : \"10918\" , \"AcceptedPrefixes_delta\" : \"-2\" , \"AcceptedPrefixes_prev\" : \"2\" , \"DeniedPrefixes_delta\" : \"0\" , \"DeniedPrefixes_prev\" : \"0\" , \"AdvertisedPrefixes_delta\" : \"-11487\" , \"AdvertisedPrefixes_prev\" : \"11487\" , \"SuppressedPrefixes_delta\" : \"0\" , \"SuppressedPrefixes_prev\" : \"0\" , \"WithdrawnPrefixes_delta\" : \"-10918\" , \"WithdrawnPrefixes_prev\" : \"10918\" , \"context_name\" : \"\" }, ... ], \"count\" : 100 } list_ip_addresses List all IPv4 and IPv6 addresses. Route: /api/v0/resources/ip/addresses Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/addresses Output: { \"status\" : \"ok\" , \"ip_addresses\" : [ { \"ipv4_address_id\" : \"69\" , \"ipv4_address\" : \"127.0.0.1\" , \"ipv4_prefixlen\" : \"8\" , \"ipv4_network_id\" : \"55\" , \"port_id\" : \"135\" , \"context_name\" : \"\" }, ... ], \"count\" : 55 } get_network_ip_addresses Get all IPv4 and IPv6 addresses for particular network. Route: /api/v0/resources/ip/networks/:id/ip id must be integer Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/networks/55/ip Output: { \"status\" : \"ok\" , \"addresses\" : [ { \"ipv4_address_id\" : \"69\" , \"ipv4_address\" : \"127.0.0.1\" , \"ipv4_prefixlen\" : \"8\" , \"ipv4_network_id\" : \"55\" , \"port_id\" : \"135\" , \"context_name\" : \"\" } ], \"count\" : 1 } list_ip_networks List all IPv4 and IPv6 networks. Route: /api/v0/resources/ip/networks Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/networks Output: { \"status\" : \"ok\" , \"ip_networks\" : [ { \"ipv4_network_id\" : \"1\" , \"ipv4_network\" : \"127.0.0.0/8\" , \"context_name\" : \"\" }, ... ], \"count\" : 100 } list_ipsec List the current IPSec tunnels which are active. Route: /api/v0/routing/ipsec/data/:hostname hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/ipsec/data/localhost Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 0 , \"ipsec\" : [ \"tunnel_id\" : \"1\" , \"device_id\" : \"1\" , \"peer_port\" : \"0\" , \"peer_addr\" : \"127.0.0.1\" , \"local_addr\" : \"127.0.0.2\" , \"local_port\" : \"0\" , \"tunnel_name\" : \"\" , \"tunnel_status\" : \"active\" ] } Please note, this will only show active VPN sessions not all configured. list_ospf List the current OSPF neighbours. Route: /api/v0/ospf Input: hostname = Either the devices hostname or id. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ospf curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ospf?hostname=host.example.com Output: { \"status\" : \"ok\" , \"ospf_neighbours\" : [ { \"device_id\" : \"1\" , \"port_id\" : \"0\" , \"ospf_nbr_id\" : \"172.16.1.145.0\" , \"ospfNbrIpAddr\" : \"172.16.1.145\" , \"ospfNbrAddressLessIndex\" : \"0\" , \"ospfNbrRtrId\" : \"172.16.0.140\" , \"ospfNbrOptions\" : \"82\" , \"ospfNbrPriority\" : \"1\" , \"ospfNbrState\" : \"full\" , \"ospfNbrEvents\" : \"5\" , \"ospfNbrLsRetransQLen\" : \"0\" , \"ospfNbmaNbrStatus\" : \"active\" , \"ospfNbmaNbrPermanence\" : \"dynamic\" , \"ospfNbrHelloSuppressed\" : \"false\" , \"context_name\" : \"\" } ], \"count\" : 1 } list_ospf_ports List the current OSPF ports. Route: /api/v0/ospf_ports Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ospf_ports Output: { \"status\" : \"ok\" , \"ospf_ports\" : [ { \"id\" : 189086 , \"device_id\" : 43 , \"port_id\" : 2838 , \"ospf_port_id\" : \"10.10.2.86.0\" , \"ospfIfIpAddress\" : \"10.10.2.86\" , \"ospfAddressLessIf\" : 0 , \"ospfIfAreaId\" : \"0.0.0.0\" , \"ospfIfType\" : \"pointToPoint\" , \"ospfIfAdminStat\" : \"enabled\" , \"ospfIfRtrPriority\" : 128 , \"ospfIfTransitDelay\" : 1 , \"ospfIfRetransInterval\" : 5 , \"ospfIfHelloInterval\" : 10 , \"ospfIfRtrDeadInterval\" : 40 , \"ospfIfPollInterval\" : 90 , \"ospfIfState\" : \"pointToPoint\" , \"ospfIfDesignatedRouter\" : \"0.0.0.0\" , \"ospfIfBackupDesignatedRouter\" : \"0.0.0.0\" , \"ospfIfEvents\" : 33 , \"ospfIfAuthKey\" : \"\" , \"ospfIfStatus\" : \"active\" , \"ospfIfMulticastForwarding\" : \"unicast\" , \"ospfIfDemand\" : \"false\" , \"ospfIfAuthType\" : \"0\" , \"ospfIfMetricIpAddress\" : \"10.10.2.86\" , \"ospfIfMetricAddressLessIf\" : 0 , \"ospfIfMetricTOS\" : 0 , \"ospfIfMetricValue\" : 10 , \"ospfIfMetricStatus\" : \"active\" , \"context_name\" : null } ], \"count\" : 1 } list_vrf List the current VRFs. Route: /api/v0/routing/vrf Input: hostname = Either the devices hostname or id OR vrfname = The VRF name you would like to filter by Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/vrf curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/vrf?hostname=host.example.com curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/vrf?vrfname=Mgmt-vrf Output: { \"status\" : \"ok\" , \"vrfs\" : [ { \"vrf_id\" : \"2\" , \"vrf_oid\" : \"8.77.103.109.116.45.118.114.102\" , \"vrf_name\" : \"Mgmt-vrf\" , \"mplsVpnVrfRouteDistinguisher\" : \"\" , \"mplsVpnVrfDescription\" : \"\" , \"device_id\" : \"8\" }, ... ], \"count\" : 100 } get_vrf Retrieves VRF by ID Route: /api/v0/routing/vrf/:id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/vrf/2 Output: { \"status\" : \"ok\" , \"vrf\" : [ { \"vrf_id\" : \"2\" , \"vrf_oid\" : \"8.77.103.109.116.45.118.114.102\" , \"vrf_name\" : \"Mgmt-vrf\" , \"mplsVpnVrfRouteDistinguisher\" : \"\" , \"mplsVpnVrfDescription\" : \"\" , \"device_id\" : \"8\" } ], \"count\" : 1 } list_mpls_services List MPLS services Route: /api/v0/routing/mpls/services Input: hostname = Either the devices hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/mpls/services curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/mpls/services?hostname=host.example.com Output: { \"status\" : \"ok\" , \"mpls_services\" : [ { \"svc_id\" : 1671 , \"svc_oid\" : 27 , \"device_id\" : 4 , \"svcRowStatus\" : \"active\" , \"svcType\" : \"tls\" , \"svcCustId\" : 1 , \"svcAdminStatus\" : \"up\" , \"svcOperStatus\" : \"up\" , \"svcDescription\" : \"\" , \"svcMtu\" : 9008 , \"svcNumSaps\" : 1 , \"svcNumSdps\" : 0 , \"svcLastMgmtChange\" : 2 , \"svcLastStatusChange\" : 168 , \"svcVRouterId\" : 0 , \"svcTlsMacLearning\" : \"enabled\" , \"svcTlsStpAdminStatus\" : \"disabled\" , \"svcTlsStpOperStatus\" : \"down\" , \"svcTlsFdbTableSize\" : 250 , \"svcTlsFdbNumEntries\" : 0 , \"hostname\" : \"host.example.com\" } ], \"count\" : 1 } list_mpls_saps List MPLS SAPs Route: /api/v0/routing/mpls/saps Input: hostname = Either the devices hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/mpls/saps curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/mpls/saps?hostname=host.example.com Output: { \"status\" : \"ok\" , \"saps\" : [ { \"sap_id\" : 1935 , \"svc_id\" : 1660 , \"svc_oid\" : 7 , \"sapPortId\" : 16108921125 , \"ifName\" : \"1/1/c2/1\" , \"device_id\" : 3 , \"sapEncapValue\" : \"0\" , \"sapRowStatus\" : \"active\" , \"sapType\" : \"epipe\" , \"sapDescription\" : \"\" , \"sapAdminStatus\" : \"up\" , \"sapOperStatus\" : \"down\" , \"sapLastMgmtChange\" : 2 , \"sapLastStatusChange\" : 0 , \"hostname\" : \"hostname=host.example.com\" } ], \"count\" : 1 }","title":"Routing"},{"location":"API/Routing/#list_bgp","text":"List the current BGP sessions. Route: /api/v0/bgp Input: hostname = Either the devices hostname or id. asn = The local ASN you would like to filter by remote_asn = Filter by remote peer ASN remote_address = Filter by remote peer address local_address = Filter by local address bgp_descr = Filter by BGP neighbor description bgp_state = Filter by BGP session state (like established,idle...) bgp_state = Filter by BGP admin state (start,stop,running...) bgp_family = Filter by BGP address Family (4,6) Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?hostname=host.example.com curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?asn=1234 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?remote_asn=1234 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?local_address=1.1.1.1&remote_address=2.2.2.2 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_descr=UPSTREAM curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_state=established curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_adminstate=start curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_family=6 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_state=idle&bgp_descr=CORE&bgp_family=4 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"bgp_sessions\" : [ { \"bgpPeer_id\" : 1260 , \"device_id\" : 7 , \"vrf_id\" : null , \"astext\" : \"Acme Ltd\" , \"bgpPeerIdentifier\" : \"2001:0DB8:0000:24cb:0000:0000:0000:0001\" , \"bgpPeerRemoteAs\" : 65432 , \"bgpPeerState\" : \"established\" , \"bgpPeerAdminStatus\" : \"start\" , \"bgpPeerLastErrorCode\" : 6 , \"bgpPeerLastErrorSubCode\" : 2 , \"bgpPeerLastErrorText\" : \"administrative shutdown\" , \"bgpPeerIface\" : 268 , \"bgpLocalAddr\" : \"2001:0DB8:0000:24cb:0000:0000:0000:0002\" , \"bgpPeerRemoteAddr\" : \"0.0.0.0\" , \"bgpPeerDescr\" : \"Another one #CORE\" , \"bgpPeerInUpdates\" : 283882969 , \"bgpPeerOutUpdates\" : 7008 , \"bgpPeerInTotalMessages\" : 283883031 , \"bgpPeerOutTotalMessages\" : 1386692 , \"bgpPeerFsmEstablishedTime\" : 1628487 , \"bgpPeerInUpdateElapsedTime\" : 0 , \"context_name\" : \"\" }, ... ], \"count\" : 100 }","title":"list_bgp"},{"location":"API/Routing/#get_bgp","text":"Retrieves a BGP session by ID Route: /api/v0/bgp/:id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp/4 Output: { \"status\" : \"ok\" , \"bgp_session\" : [ { \"bgpPeer_id\" : \"4\" , \"device_id\" : \"2\" , \"astext\" : \"\" , \"bgpPeerIdentifier\" : \"1234:1b80:1:12::2\" , \"bgpPeerRemoteAs\" : \"54321\" , \"bgpPeerState\" : \"established\" , \"bgpPeerAdminStatus\" : \"running\" , \"bgpLocalAddr\" : \"1234:1b80:1:12::1\" , \"bgpPeerRemoteAddr\" : \"0.0.0.0\" , \"bgpPeerInUpdates\" : \"3\" , \"bgpPeerOutUpdates\" : \"1\" , \"bgpPeerInTotalMessages\" : \"0\" , \"bgpPeerOutTotalMessages\" : \"0\" , \"bgpPeerFsmEstablishedTime\" : \"0\" , \"bgpPeerInUpdateElapsedTime\" : \"0\" , \"context_name\" : \"\" } ], \"count\" : 1 }","title":"get_bgp"},{"location":"API/Routing/#edit_bgp_descr","text":"This is a POST type request Set the BGP session description by ID Route: /api/v0/bgp/:id Input: id = The id of the BGP Peer Session. bgp_descr = The description for the bgpPeerDescr field on the BGP Session. Example: curl -v -H 'X-Auth-Token: YOURAPITOKENHERE' --data '{\"bgp_descr\": \"Your description here\"}' https://librenms.org/api/v0/bgp/4 Output: { \"status\" : \"ok\" , \"message\" : \"BGP description for peer X.X.X.X on device 1 updated to Your description here\" }","title":"edit_bgp_descr"},{"location":"API/Routing/#list_cbgp","text":"List the current BGP sessions counters. Route: /api/v0/routing/bgp/cbgp Input: hostname = Either the devices hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/bgp/cbgp curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/bgp/cbgp?hostname=host.example.com Output: { \"status\" : \"ok\" , \"bgp_counters\" : [ { \"device_id\" : \"9\" , \"bgpPeerIdentifier\" : \"192.168.99.31\" , \"afi\" : \"ipv4\" , \"safi\" : \"multicast\" , \"AcceptedPrefixes\" : \"2\" , \"DeniedPrefixes\" : \"0\" , \"PrefixAdminLimit\" : \"0\" , \"PrefixThreshold\" : \"0\" , \"PrefixClearThreshold\" : \"0\" , \"AdvertisedPrefixes\" : \"11487\" , \"SuppressedPrefixes\" : \"0\" , \"WithdrawnPrefixes\" : \"10918\" , \"AcceptedPrefixes_delta\" : \"-2\" , \"AcceptedPrefixes_prev\" : \"2\" , \"DeniedPrefixes_delta\" : \"0\" , \"DeniedPrefixes_prev\" : \"0\" , \"AdvertisedPrefixes_delta\" : \"-11487\" , \"AdvertisedPrefixes_prev\" : \"11487\" , \"SuppressedPrefixes_delta\" : \"0\" , \"SuppressedPrefixes_prev\" : \"0\" , \"WithdrawnPrefixes_delta\" : \"-10918\" , \"WithdrawnPrefixes_prev\" : \"10918\" , \"context_name\" : \"\" }, ... ], \"count\" : 100 }","title":"list_cbgp"},{"location":"API/Routing/#list_ip_addresses","text":"List all IPv4 and IPv6 addresses. Route: /api/v0/resources/ip/addresses Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/addresses Output: { \"status\" : \"ok\" , \"ip_addresses\" : [ { \"ipv4_address_id\" : \"69\" , \"ipv4_address\" : \"127.0.0.1\" , \"ipv4_prefixlen\" : \"8\" , \"ipv4_network_id\" : \"55\" , \"port_id\" : \"135\" , \"context_name\" : \"\" }, ... ], \"count\" : 55 }","title":"list_ip_addresses"},{"location":"API/Routing/#get_network_ip_addresses","text":"Get all IPv4 and IPv6 addresses for particular network. Route: /api/v0/resources/ip/networks/:id/ip id must be integer Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/networks/55/ip Output: { \"status\" : \"ok\" , \"addresses\" : [ { \"ipv4_address_id\" : \"69\" , \"ipv4_address\" : \"127.0.0.1\" , \"ipv4_prefixlen\" : \"8\" , \"ipv4_network_id\" : \"55\" , \"port_id\" : \"135\" , \"context_name\" : \"\" } ], \"count\" : 1 }","title":"get_network_ip_addresses"},{"location":"API/Routing/#list_ip_networks","text":"List all IPv4 and IPv6 networks. Route: /api/v0/resources/ip/networks Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/networks Output: { \"status\" : \"ok\" , \"ip_networks\" : [ { \"ipv4_network_id\" : \"1\" , \"ipv4_network\" : \"127.0.0.0/8\" , \"context_name\" : \"\" }, ... ], \"count\" : 100 }","title":"list_ip_networks"},{"location":"API/Routing/#list_ipsec","text":"List the current IPSec tunnels which are active. Route: /api/v0/routing/ipsec/data/:hostname hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/ipsec/data/localhost Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 0 , \"ipsec\" : [ \"tunnel_id\" : \"1\" , \"device_id\" : \"1\" , \"peer_port\" : \"0\" , \"peer_addr\" : \"127.0.0.1\" , \"local_addr\" : \"127.0.0.2\" , \"local_port\" : \"0\" , \"tunnel_name\" : \"\" , \"tunnel_status\" : \"active\" ] } Please note, this will only show active VPN sessions not all configured.","title":"list_ipsec"},{"location":"API/Routing/#list_ospf","text":"List the current OSPF neighbours. Route: /api/v0/ospf Input: hostname = Either the devices hostname or id. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ospf curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ospf?hostname=host.example.com Output: { \"status\" : \"ok\" , \"ospf_neighbours\" : [ { \"device_id\" : \"1\" , \"port_id\" : \"0\" , \"ospf_nbr_id\" : \"172.16.1.145.0\" , \"ospfNbrIpAddr\" : \"172.16.1.145\" , \"ospfNbrAddressLessIndex\" : \"0\" , \"ospfNbrRtrId\" : \"172.16.0.140\" , \"ospfNbrOptions\" : \"82\" , \"ospfNbrPriority\" : \"1\" , \"ospfNbrState\" : \"full\" , \"ospfNbrEvents\" : \"5\" , \"ospfNbrLsRetransQLen\" : \"0\" , \"ospfNbmaNbrStatus\" : \"active\" , \"ospfNbmaNbrPermanence\" : \"dynamic\" , \"ospfNbrHelloSuppressed\" : \"false\" , \"context_name\" : \"\" } ], \"count\" : 1 }","title":"list_ospf"},{"location":"API/Routing/#list_ospf_ports","text":"List the current OSPF ports. Route: /api/v0/ospf_ports Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ospf_ports Output: { \"status\" : \"ok\" , \"ospf_ports\" : [ { \"id\" : 189086 , \"device_id\" : 43 , \"port_id\" : 2838 , \"ospf_port_id\" : \"10.10.2.86.0\" , \"ospfIfIpAddress\" : \"10.10.2.86\" , \"ospfAddressLessIf\" : 0 , \"ospfIfAreaId\" : \"0.0.0.0\" , \"ospfIfType\" : \"pointToPoint\" , \"ospfIfAdminStat\" : \"enabled\" , \"ospfIfRtrPriority\" : 128 , \"ospfIfTransitDelay\" : 1 , \"ospfIfRetransInterval\" : 5 , \"ospfIfHelloInterval\" : 10 , \"ospfIfRtrDeadInterval\" : 40 , \"ospfIfPollInterval\" : 90 , \"ospfIfState\" : \"pointToPoint\" , \"ospfIfDesignatedRouter\" : \"0.0.0.0\" , \"ospfIfBackupDesignatedRouter\" : \"0.0.0.0\" , \"ospfIfEvents\" : 33 , \"ospfIfAuthKey\" : \"\" , \"ospfIfStatus\" : \"active\" , \"ospfIfMulticastForwarding\" : \"unicast\" , \"ospfIfDemand\" : \"false\" , \"ospfIfAuthType\" : \"0\" , \"ospfIfMetricIpAddress\" : \"10.10.2.86\" , \"ospfIfMetricAddressLessIf\" : 0 , \"ospfIfMetricTOS\" : 0 , \"ospfIfMetricValue\" : 10 , \"ospfIfMetricStatus\" : \"active\" , \"context_name\" : null } ], \"count\" : 1 }","title":"list_ospf_ports"},{"location":"API/Routing/#list_vrf","text":"List the current VRFs. Route: /api/v0/routing/vrf Input: hostname = Either the devices hostname or id OR vrfname = The VRF name you would like to filter by Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/vrf curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/vrf?hostname=host.example.com curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/vrf?vrfname=Mgmt-vrf Output: { \"status\" : \"ok\" , \"vrfs\" : [ { \"vrf_id\" : \"2\" , \"vrf_oid\" : \"8.77.103.109.116.45.118.114.102\" , \"vrf_name\" : \"Mgmt-vrf\" , \"mplsVpnVrfRouteDistinguisher\" : \"\" , \"mplsVpnVrfDescription\" : \"\" , \"device_id\" : \"8\" }, ... ], \"count\" : 100 }","title":"list_vrf"},{"location":"API/Routing/#get_vrf","text":"Retrieves VRF by ID Route: /api/v0/routing/vrf/:id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/vrf/2 Output: { \"status\" : \"ok\" , \"vrf\" : [ { \"vrf_id\" : \"2\" , \"vrf_oid\" : \"8.77.103.109.116.45.118.114.102\" , \"vrf_name\" : \"Mgmt-vrf\" , \"mplsVpnVrfRouteDistinguisher\" : \"\" , \"mplsVpnVrfDescription\" : \"\" , \"device_id\" : \"8\" } ], \"count\" : 1 }","title":"get_vrf"},{"location":"API/Routing/#list_mpls_services","text":"List MPLS services Route: /api/v0/routing/mpls/services Input: hostname = Either the devices hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/mpls/services curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/mpls/services?hostname=host.example.com Output: { \"status\" : \"ok\" , \"mpls_services\" : [ { \"svc_id\" : 1671 , \"svc_oid\" : 27 , \"device_id\" : 4 , \"svcRowStatus\" : \"active\" , \"svcType\" : \"tls\" , \"svcCustId\" : 1 , \"svcAdminStatus\" : \"up\" , \"svcOperStatus\" : \"up\" , \"svcDescription\" : \"\" , \"svcMtu\" : 9008 , \"svcNumSaps\" : 1 , \"svcNumSdps\" : 0 , \"svcLastMgmtChange\" : 2 , \"svcLastStatusChange\" : 168 , \"svcVRouterId\" : 0 , \"svcTlsMacLearning\" : \"enabled\" , \"svcTlsStpAdminStatus\" : \"disabled\" , \"svcTlsStpOperStatus\" : \"down\" , \"svcTlsFdbTableSize\" : 250 , \"svcTlsFdbNumEntries\" : 0 , \"hostname\" : \"host.example.com\" } ], \"count\" : 1 }","title":"list_mpls_services"},{"location":"API/Routing/#list_mpls_saps","text":"List MPLS SAPs Route: /api/v0/routing/mpls/saps Input: hostname = Either the devices hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/mpls/saps curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/mpls/saps?hostname=host.example.com Output: { \"status\" : \"ok\" , \"saps\" : [ { \"sap_id\" : 1935 , \"svc_id\" : 1660 , \"svc_oid\" : 7 , \"sapPortId\" : 16108921125 , \"ifName\" : \"1/1/c2/1\" , \"device_id\" : 3 , \"sapEncapValue\" : \"0\" , \"sapRowStatus\" : \"active\" , \"sapType\" : \"epipe\" , \"sapDescription\" : \"\" , \"sapAdminStatus\" : \"up\" , \"sapOperStatus\" : \"down\" , \"sapLastMgmtChange\" : 2 , \"sapLastStatusChange\" : 0 , \"hostname\" : \"hostname=host.example.com\" } ], \"count\" : 1 }","title":"list_mpls_saps"},{"location":"API/Services/","text":"list_services Retrieve all services Route: /api/v0/services Input: state: only which have a certain state (valid options are 0=Ok, 1=Warning, 2=Critical). type: service type, used sql LIKE to find services, so for tcp, use type=tcp for http use type=http Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services?state=2 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services?state=0&type=tcp Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"services\" : [ [ { \"service_id\" : \"13\" , \"device_id\" : \"1\" , \"service_ip\" : \"demo1.yourdomian.net\" , \"service_type\" : \"ntp_peer\" , \"service_desc\" : \"NTP\" , \"service_param\" : \"-H 192.168.1.10\" , \"service_ignore\" : \"0\" , \"service_status\" : \"0\" , \"service_changed\" : \"1470962470\" , \"service_message\" : \"NTP OK: Offset -0.000717 secs\" , \"service_disabled\" : \"0\" , \"service_ds\" : \"{\\\"offset\\\":\\\"s\\\"}\" } ], [ { \"service_id\" : \"2\" , \"device_id\" : \"2\" , \"service_ip\" : \"demo2.yourdomian.net\" , \"service_type\" : \"esxi_hardware.py\" , \"service_desc\" : \"vmware hardware\" , \"service_param\" : \"-H 192.168.1.11 -U USER -P PASS -p\" , \"service_ignore\" : \"0\" , \"service_status\" : \"0\" , \"service_changed\" : \"1471702206\" , \"service_message\" : \"OK - Server: Supermicro X9SCL/X9SCM s/n: 0123456789 System BIOS: 2.2 2015-02-20\" , \"service_disabled\" : \"0\" , \"service_ds\" : \"{\\\"P2Vol_0_Processor_1_Vcore\\\":\\\"\\\",\\\"P2Vol_1_System_Board_1_-12V\\\":\\\"\\\",\\\"P2Vol_2_System_Board_1_12V\\\":\\\"\\\",\\\"P2Vol_3_System_Board_1_3.3VCC\\\":\\\"\\\",\\\"P2Vol_4_System_Board_1_5VCC\\\":\\\"\\\",\\\"P2Vol_5_System_Board_1_AVCC\\\":\\\"\\\",\\\"P2Vol_6_System_Board_1_VBAT\\\":\\\"\\\",\\\"P2Vol_7_System_Board_1_\" } ] ] } get_service_for_host Retrieve services for device Route: /api/v0/services/:hostname id or hostname is the specific device Input: state: only which have a certain state (valid options are 0=Ok, 1=Warning, 2=Critical). type: service type, used sql LIKE to find services, so for tcp, use type=tcp for http use type=http Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/:hostname curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/:hostname?state=2 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/:hostname?state=0&type=tcp Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"services\" : [ [ { \"service_id\" : \"2\" , \"device_id\" : \"2\" , \"service_ip\" : \"demo2.yourdomian.net\" , \"service_type\" : \"esxi_hardware.py\" , \"service_desc\" : \"vmware hardware\" , \"service_param\" : \"-H 192.168.1.11 -U USER -P PASS -p\" , \"service_ignore\" : \"0\" , \"service_status\" : \"0\" , \"service_changed\" : \"1471702206\" , \"service_message\" : \"OK - Server: Supermicro X9SCL/X9SCM s/n: 0123456789 System BIOS: 2.2 2015-02-20\" , \"service_disabled\" : \"0\" , \"service_ds\" : \"{\\\"P2Vol_0_Processor_1_Vcore\\\":\\\"\\\",\\\"P2Vol_1_System_Board_1_-12V\\\":\\\"\\\",\\\"P2Vol_2_System_Board_1_12V\\\":\\\"\\\",\\\"P2Vol_3_System_Board_1_3.3VCC\\\":\\\"\\\",\\\"P2Vol_4_System_Board_1_5VCC\\\":\\\"\\\",\\\"P2Vol_5_System_Board_1_AVCC\\\":\\\"\\\",\\\"P2Vol_6_System_Board_1_VBAT\\\":\\\"\\\",\\\"P2Vol_7_System_Board_1_\" } ] ] } add_service_for_host Add a service for device Route: /api/v0/services/:hostname id or hostname is the specific device Input: type: service type ip: ip of the service desc: description for the service param: parameters for the service ignore: ignore the service for checks Example: curl -X POST -d '{\"type\":\"ping\",\"ip\": \"192.168.1.10\",\"desc\":\"test ping\",\"param\": \"-t 10 -c 5\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/192.168.1.10 Output: { \"status\" : \"ok\" , \"message\" : \"Service ping has been added to device 192.168.1.10 (#10)\" } edit_service_from_host Edits a service Route: /api/v0/services/:service_id service id Input: id: service id Example: curl -X PATCH -d '{\"service_disabled\":\"1\"}' 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/services/5 Output: { \"status\" : \"ok\" , \"message\" : \"Service updated successfully\" } delete_service_from_host Deletes service from device Route: /api/v0/services/:service_id service id Input: id: service id Example: curl -X DELETE -H 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/services/35 Output: { \"status\" : \"ok\" , \"message\" : \"Service has been deleted successfully\" }","title":"Services"},{"location":"API/Services/#list_services","text":"Retrieve all services Route: /api/v0/services Input: state: only which have a certain state (valid options are 0=Ok, 1=Warning, 2=Critical). type: service type, used sql LIKE to find services, so for tcp, use type=tcp for http use type=http Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services?state=2 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services?state=0&type=tcp Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"services\" : [ [ { \"service_id\" : \"13\" , \"device_id\" : \"1\" , \"service_ip\" : \"demo1.yourdomian.net\" , \"service_type\" : \"ntp_peer\" , \"service_desc\" : \"NTP\" , \"service_param\" : \"-H 192.168.1.10\" , \"service_ignore\" : \"0\" , \"service_status\" : \"0\" , \"service_changed\" : \"1470962470\" , \"service_message\" : \"NTP OK: Offset -0.000717 secs\" , \"service_disabled\" : \"0\" , \"service_ds\" : \"{\\\"offset\\\":\\\"s\\\"}\" } ], [ { \"service_id\" : \"2\" , \"device_id\" : \"2\" , \"service_ip\" : \"demo2.yourdomian.net\" , \"service_type\" : \"esxi_hardware.py\" , \"service_desc\" : \"vmware hardware\" , \"service_param\" : \"-H 192.168.1.11 -U USER -P PASS -p\" , \"service_ignore\" : \"0\" , \"service_status\" : \"0\" , \"service_changed\" : \"1471702206\" , \"service_message\" : \"OK - Server: Supermicro X9SCL/X9SCM s/n: 0123456789 System BIOS: 2.2 2015-02-20\" , \"service_disabled\" : \"0\" , \"service_ds\" : \"{\\\"P2Vol_0_Processor_1_Vcore\\\":\\\"\\\",\\\"P2Vol_1_System_Board_1_-12V\\\":\\\"\\\",\\\"P2Vol_2_System_Board_1_12V\\\":\\\"\\\",\\\"P2Vol_3_System_Board_1_3.3VCC\\\":\\\"\\\",\\\"P2Vol_4_System_Board_1_5VCC\\\":\\\"\\\",\\\"P2Vol_5_System_Board_1_AVCC\\\":\\\"\\\",\\\"P2Vol_6_System_Board_1_VBAT\\\":\\\"\\\",\\\"P2Vol_7_System_Board_1_\" } ] ] }","title":"list_services"},{"location":"API/Services/#get_service_for_host","text":"Retrieve services for device Route: /api/v0/services/:hostname id or hostname is the specific device Input: state: only which have a certain state (valid options are 0=Ok, 1=Warning, 2=Critical). type: service type, used sql LIKE to find services, so for tcp, use type=tcp for http use type=http Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/:hostname curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/:hostname?state=2 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/:hostname?state=0&type=tcp Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"services\" : [ [ { \"service_id\" : \"2\" , \"device_id\" : \"2\" , \"service_ip\" : \"demo2.yourdomian.net\" , \"service_type\" : \"esxi_hardware.py\" , \"service_desc\" : \"vmware hardware\" , \"service_param\" : \"-H 192.168.1.11 -U USER -P PASS -p\" , \"service_ignore\" : \"0\" , \"service_status\" : \"0\" , \"service_changed\" : \"1471702206\" , \"service_message\" : \"OK - Server: Supermicro X9SCL/X9SCM s/n: 0123456789 System BIOS: 2.2 2015-02-20\" , \"service_disabled\" : \"0\" , \"service_ds\" : \"{\\\"P2Vol_0_Processor_1_Vcore\\\":\\\"\\\",\\\"P2Vol_1_System_Board_1_-12V\\\":\\\"\\\",\\\"P2Vol_2_System_Board_1_12V\\\":\\\"\\\",\\\"P2Vol_3_System_Board_1_3.3VCC\\\":\\\"\\\",\\\"P2Vol_4_System_Board_1_5VCC\\\":\\\"\\\",\\\"P2Vol_5_System_Board_1_AVCC\\\":\\\"\\\",\\\"P2Vol_6_System_Board_1_VBAT\\\":\\\"\\\",\\\"P2Vol_7_System_Board_1_\" } ] ] }","title":"get_service_for_host"},{"location":"API/Services/#add_service_for_host","text":"Add a service for device Route: /api/v0/services/:hostname id or hostname is the specific device Input: type: service type ip: ip of the service desc: description for the service param: parameters for the service ignore: ignore the service for checks Example: curl -X POST -d '{\"type\":\"ping\",\"ip\": \"192.168.1.10\",\"desc\":\"test ping\",\"param\": \"-t 10 -c 5\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/192.168.1.10 Output: { \"status\" : \"ok\" , \"message\" : \"Service ping has been added to device 192.168.1.10 (#10)\" }","title":"add_service_for_host"},{"location":"API/Services/#edit_service_from_host","text":"Edits a service Route: /api/v0/services/:service_id service id Input: id: service id Example: curl -X PATCH -d '{\"service_disabled\":\"1\"}' 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/services/5 Output: { \"status\" : \"ok\" , \"message\" : \"Service updated successfully\" }","title":"edit_service_from_host"},{"location":"API/Services/#delete_service_from_host","text":"Deletes service from device Route: /api/v0/services/:service_id service id Input: id: service id Example: curl -X DELETE -H 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/services/35 Output: { \"status\" : \"ok\" , \"message\" : \"Service has been deleted successfully\" }","title":"delete_service_from_host"},{"location":"API/Switching/","text":"list_vlans Get a list of all VLANs. Route: /api/v0/resources/vlans Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/vlans Output: { \"status\" : \"ok\" , \"vlans\" : [ { \"vlan_id\" : \"31\" , \"device_id\" : \"10\" , \"vlan_vlan\" : \"1\" , \"vlan_domain\" : \"1\" , \"vlan_name\" : \"default\" , \"vlan_type\" : \"ethernet\" , \"vlan_mtu\" : null }, ... ], \"count\" : 100 } get_vlans Get a list of all VLANs for a given device. Route: /api/v0/devices/:hostname/vlans hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/vlans Output: { \"status\" : \"ok\" , \"count\" : 0 , \"vlans\" : [ { \"vlan_vlan\" : \"1\" , \"vlan_domain\" : \"1\" , \"vlan_name\" : \"default\" , \"vlan_type\" : \"ethernet\" , \"vlan_mtu\" : null } ] } list_links Get a list of all Links. Route: /api/v0/resources/links Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/links Output: { \"status\" : \"ok\" , \"links\" : [ { \"id\" : 10 , \"local_port_id\" : 100 , \"local_device_id\" : 1 , \"remote_port_id\" : 200 , \"active\" : 1 , \"protocol\" : \"lldp\" , \"remote_hostname\" : \"host2.example.com\" , \"remote_device_id\" : 2 , \"remote_port\" : \"xe-0/0/1\" , \"remote_platform\" : null , \"remote_version\" : \"Example Router v.1.0\" }, ... ], \"count\" : 100 } get_links Get a list of Links per giver device. Route: /api/v0/devices/:hostname/links hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/links Output: { \"status\" : \"ok\" , \"links\" : [ { \"id\" : 10 , \"local_port_id\" : 100 , \"local_device_id\" : 1 , \"remote_port_id\" : 200 , \"active\" : 1 , \"protocol\" : \"lldp\" , \"remote_hostname\" : \"host2.example.com\" , \"remote_device_id\" : 2 , \"remote_port\" : \"xe-0/0/1\" , \"remote_platform\" : null , \"remote_version\" : \"Example Router v.1.0\" }, ... ], \"count\" : 10 } get_link Retrieves Link by ID Route: /api/v0/resources/links/:id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/links/10 Output: { \"status\" : \"ok\" , \"links\" : [ { \"id\" : 10 , \"local_port_id\" : 100 , \"local_device_id\" : 1 , \"remote_port_id\" : 200 , \"active\" : 1 , \"protocol\" : \"lldp\" , \"remote_hostname\" : \"host2.example.com\" , \"remote_device_id\" : 2 , \"remote_port\" : \"xe-0/0/1\" , \"remote_platform\" : null , \"remote_version\" : \"Example Router v.1.0\" } ], \"count\" : 1 } list_fdb Get a list of all ports FDB. Route: /api/v0/resources/fdb/:mac mac is the specific MAC address you would like to query Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/fdb curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/fdb/1aaa2bbb3ccc Output: { \"status\" : \"ok\" , \"ports_fdb\" : [ { \"ports_fdb_id\" : 10 , \"port_id\" : 10000 , \"mac_address\" : \"1aaa2bbb3ccc\" , \"vlan_id\" : 20000 , \"device_id\" : 1 , \"created_at\" : \"2019-01-1 01:01:01\" , \"updated_at\" : \"2019-01-1 01:01:01\" }, ... ], \"count\" : 100 } list_fdb_detail Get a list of all ports FDB with human readable device and interface names. Route: /api/v0/resources/fdb/:mac/detail mac is the specific MAC address you would like to query Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/fdb/1aaa2bbb3ccc/detail Output: { 'cou nt ' : 7 , 'mac' : ' 9 c : 93 : aa : bb : cc : dd' , 'mac_oui' : 'Xerox Corpora t io n ' , 'por ts _ f db' : [ { 'hos tna me' : 'hq - core 1 ' , 'i f Name' : 'ae 10 ' , 'las t _see n ' : ' 2 hours ago' , 'upda te d_a t ' : ' 2023-05-17 03 : 19 : 15 ' }, { 'hos tna me' : 'hq - sw 1 ' , 'i f Name' : 'ge -0 / 0 / 0 ' , 'las t _see n ' : ' 3 hours ago' , 'upda te d_a t ' : ' 2023-05-17 02 : 02 : 06 ' }, ... ], 's tatus ' : 'ok' }","title":"Switching"},{"location":"API/Switching/#list_vlans","text":"Get a list of all VLANs. Route: /api/v0/resources/vlans Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/vlans Output: { \"status\" : \"ok\" , \"vlans\" : [ { \"vlan_id\" : \"31\" , \"device_id\" : \"10\" , \"vlan_vlan\" : \"1\" , \"vlan_domain\" : \"1\" , \"vlan_name\" : \"default\" , \"vlan_type\" : \"ethernet\" , \"vlan_mtu\" : null }, ... ], \"count\" : 100 }","title":"list_vlans"},{"location":"API/Switching/#get_vlans","text":"Get a list of all VLANs for a given device. Route: /api/v0/devices/:hostname/vlans hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/vlans Output: { \"status\" : \"ok\" , \"count\" : 0 , \"vlans\" : [ { \"vlan_vlan\" : \"1\" , \"vlan_domain\" : \"1\" , \"vlan_name\" : \"default\" , \"vlan_type\" : \"ethernet\" , \"vlan_mtu\" : null } ] }","title":"get_vlans"},{"location":"API/Switching/#list_links","text":"Get a list of all Links. Route: /api/v0/resources/links Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/links Output: { \"status\" : \"ok\" , \"links\" : [ { \"id\" : 10 , \"local_port_id\" : 100 , \"local_device_id\" : 1 , \"remote_port_id\" : 200 , \"active\" : 1 , \"protocol\" : \"lldp\" , \"remote_hostname\" : \"host2.example.com\" , \"remote_device_id\" : 2 , \"remote_port\" : \"xe-0/0/1\" , \"remote_platform\" : null , \"remote_version\" : \"Example Router v.1.0\" }, ... ], \"count\" : 100 }","title":"list_links"},{"location":"API/Switching/#get_links","text":"Get a list of Links per giver device. Route: /api/v0/devices/:hostname/links hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/links Output: { \"status\" : \"ok\" , \"links\" : [ { \"id\" : 10 , \"local_port_id\" : 100 , \"local_device_id\" : 1 , \"remote_port_id\" : 200 , \"active\" : 1 , \"protocol\" : \"lldp\" , \"remote_hostname\" : \"host2.example.com\" , \"remote_device_id\" : 2 , \"remote_port\" : \"xe-0/0/1\" , \"remote_platform\" : null , \"remote_version\" : \"Example Router v.1.0\" }, ... ], \"count\" : 10 }","title":"get_links"},{"location":"API/Switching/#get_link","text":"Retrieves Link by ID Route: /api/v0/resources/links/:id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/links/10 Output: { \"status\" : \"ok\" , \"links\" : [ { \"id\" : 10 , \"local_port_id\" : 100 , \"local_device_id\" : 1 , \"remote_port_id\" : 200 , \"active\" : 1 , \"protocol\" : \"lldp\" , \"remote_hostname\" : \"host2.example.com\" , \"remote_device_id\" : 2 , \"remote_port\" : \"xe-0/0/1\" , \"remote_platform\" : null , \"remote_version\" : \"Example Router v.1.0\" } ], \"count\" : 1 }","title":"get_link"},{"location":"API/Switching/#list_fdb","text":"Get a list of all ports FDB. Route: /api/v0/resources/fdb/:mac mac is the specific MAC address you would like to query Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/fdb curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/fdb/1aaa2bbb3ccc Output: { \"status\" : \"ok\" , \"ports_fdb\" : [ { \"ports_fdb_id\" : 10 , \"port_id\" : 10000 , \"mac_address\" : \"1aaa2bbb3ccc\" , \"vlan_id\" : 20000 , \"device_id\" : 1 , \"created_at\" : \"2019-01-1 01:01:01\" , \"updated_at\" : \"2019-01-1 01:01:01\" }, ... ], \"count\" : 100 }","title":"list_fdb"},{"location":"API/Switching/#list_fdb_detail","text":"Get a list of all ports FDB with human readable device and interface names. Route: /api/v0/resources/fdb/:mac/detail mac is the specific MAC address you would like to query Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/fdb/1aaa2bbb3ccc/detail Output: { 'cou nt ' : 7 , 'mac' : ' 9 c : 93 : aa : bb : cc : dd' , 'mac_oui' : 'Xerox Corpora t io n ' , 'por ts _ f db' : [ { 'hos tna me' : 'hq - core 1 ' , 'i f Name' : 'ae 10 ' , 'las t _see n ' : ' 2 hours ago' , 'upda te d_a t ' : ' 2023-05-17 03 : 19 : 15 ' }, { 'hos tna me' : 'hq - sw 1 ' , 'i f Name' : 'ge -0 / 0 / 0 ' , 'las t _see n ' : ' 3 hours ago' , 'upda te d_a t ' : ' 2023-05-17 02 : 02 : 06 ' }, ... ], 's tatus ' : 'ok' }","title":"list_fdb_detail"},{"location":"API/System/","text":"system Display Librenms instance information. Route: /api/v0/system Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/system Output: { \"status\" : \"ok\" , \"system\" : [ { \"local_ver\" : \"1.37-234-g19103ee\" , \"local_sha\" : \"19103ee36f68f009272c15be22e5a7e10a8b0b85\" , \"local_date\" : \"1526480966\" , \"local_branch\" : \"master\" , \"db_schema\" : 249 , \"php_ver\" : \"7.2.2\" , \"database_ver\" : \"MariaDB 5.5.56-MariaDB\" , \"rrdtool_ver\" : \"1.4.8\" , \"netsnmp_ver\" : \"NET-SNMP 5.7.2\" } ], \"count\" : 1 }","title":"System"},{"location":"API/System/#system","text":"Display Librenms instance information. Route: /api/v0/system Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/system Output: { \"status\" : \"ok\" , \"system\" : [ { \"local_ver\" : \"1.37-234-g19103ee\" , \"local_sha\" : \"19103ee36f68f009272c15be22e5a7e10a8b0b85\" , \"local_date\" : \"1526480966\" , \"local_branch\" : \"master\" , \"db_schema\" : 249 , \"php_ver\" : \"7.2.2\" , \"database_ver\" : \"MariaDB 5.5.56-MariaDB\" , \"rrdtool_ver\" : \"1.4.8\" , \"netsnmp_ver\" : \"NET-SNMP 5.7.2\" } ], \"count\" : 1 }","title":"system"},{"location":"Alerting/","text":"Introduction To get started, you first need some alert rules which will react to changes with your devices before raising an alert. Creating alert rules After that you also need to tell LibreNMS how to notify you when an alert is raised, this is done using Alert Transports . Configuring alert transports The next step is not strictly required but most people find it useful. Creating custom alert templates will help you get the benefit out of the alert system in general. Whilst we include a default template, it is limited in the data that you will receive in the alerts. Configuring alert templates Managing alerts When an alert has triggered you will see these in the Alerts -> Notifications page within the Web UI. This list has a couple of options available to it and we'll explain what these are here. ACK This column provides you visibility on the status of the alert: This alert is currently active and sending alerts. Click this icon to acknowledge the alert. This alert is currently acknowledged until the alert clears. Click this icon to un-acknowledge the alert. This alert is currently acknowledged until the alert worsens or gets better, at which stage it will be automatically unacknowledged and alerts will resume. Click this icon to un-acknowledge the alert. Notes This column will allow you access to the acknowledge/unacknowledge notes for this alert.","title":"Introduction"},{"location":"Alerting/#introduction","text":"To get started, you first need some alert rules which will react to changes with your devices before raising an alert. Creating alert rules After that you also need to tell LibreNMS how to notify you when an alert is raised, this is done using Alert Transports . Configuring alert transports The next step is not strictly required but most people find it useful. Creating custom alert templates will help you get the benefit out of the alert system in general. Whilst we include a default template, it is limited in the data that you will receive in the alerts. Configuring alert templates","title":"Introduction"},{"location":"Alerting/#managing-alerts","text":"When an alert has triggered you will see these in the Alerts -> Notifications page within the Web UI. This list has a couple of options available to it and we'll explain what these are here.","title":"Managing alerts"},{"location":"Alerting/#ack","text":"This column provides you visibility on the status of the alert: This alert is currently active and sending alerts. Click this icon to acknowledge the alert. This alert is currently acknowledged until the alert clears. Click this icon to un-acknowledge the alert. This alert is currently acknowledged until the alert worsens or gets better, at which stage it will be automatically unacknowledged and alerts will resume. Click this icon to un-acknowledge the alert.","title":"ACK"},{"location":"Alerting/#notes","text":"This column will allow you access to the acknowledge/unacknowledge notes for this alert.","title":"Notes"},{"location":"Alerting/Creating-Transport/","text":"Creating a new Transport File location All transports are located in LibreNMS\\Alert\\Transport and the files are named after the Transport name. I.e Discord.php for Discord. Transport structure The following functions are required for a new transport to pass the unit tests: deliverAlert() - This is function called within alerts to invoke the transport. Here you should do any post processing of the transport config to get it ready for use. contact$Transport() - This is named after the transport so for Discord it would be contactDiscord() . This is what actually interacts with the 3rd party API, invokes the mail command or whatever you want your alert to do. configTemplate() - This is used to define the form that will accept the transport config in the webui and then what data should be validated and how. Validation is done using Laravel validation The following function is not required for new Transports and is for legacy reasons only. deliverAlertOld() . Documentation Please don't forget to update the Transport file to include details of your new transport. A table should be provided to indicate the form values that we ask for and examples. I.e: Config Example Discord URL https://discordapp.com/api/webhooks/4515489001665127664/82-sf4385ysuhfn34u2fhfsdePGLrg8K7cP9wl553Fg6OlZuuxJGaa1d54fe Options username=myname","title":"Creating Transports"},{"location":"Alerting/Creating-Transport/#creating-a-new-transport","text":"","title":"Creating a new Transport"},{"location":"Alerting/Creating-Transport/#file-location","text":"All transports are located in LibreNMS\\Alert\\Transport and the files are named after the Transport name. I.e Discord.php for Discord.","title":"File location"},{"location":"Alerting/Creating-Transport/#transport-structure","text":"The following functions are required for a new transport to pass the unit tests: deliverAlert() - This is function called within alerts to invoke the transport. Here you should do any post processing of the transport config to get it ready for use. contact$Transport() - This is named after the transport so for Discord it would be contactDiscord() . This is what actually interacts with the 3rd party API, invokes the mail command or whatever you want your alert to do. configTemplate() - This is used to define the form that will accept the transport config in the webui and then what data should be validated and how. Validation is done using Laravel validation The following function is not required for new Transports and is for legacy reasons only. deliverAlertOld() .","title":"Transport structure"},{"location":"Alerting/Creating-Transport/#documentation","text":"Please don't forget to update the Transport file to include details of your new transport. A table should be provided to indicate the form values that we ask for and examples. I.e: Config Example Discord URL https://discordapp.com/api/webhooks/4515489001665127664/82-sf4385ysuhfn34u2fhfsdePGLrg8K7cP9wl553Fg6OlZuuxJGaa1d54fe Options username=myname","title":"Documentation"},{"location":"Alerting/Device-Dependencies/","text":"Device Dependencies It is possible to set one or more parents for a device. The aim for that is, if all parent devices are down, alert contacts will not receive redundant alerts for dependent devices. This is very useful when you have an outage, say in a branch office, where normally you'd receive hundreds of alerts, but when this is properly configured, you'd only receive an alert for the parent hosts. There are three ways to configure this feature. First one is from general settings of a device. The other two can be done in the 'Device Dependencies' item under 'Devices' menu. In this page, you can see all devices and with its parents. Clicking on the 'bin' icon will clear the dependency setting. Clicking on the 'pen' icon will let you edit or change the current setting for chosen device. There's also a 'Manage Device Dependencies' button on the top. This will let you set parents for multiple devices at once. For an intro on getting started with Device Dependencies, take a look at our Youtube video","title":"Device Dependencies"},{"location":"Alerting/Device-Dependencies/#device-dependencies","text":"It is possible to set one or more parents for a device. The aim for that is, if all parent devices are down, alert contacts will not receive redundant alerts for dependent devices. This is very useful when you have an outage, say in a branch office, where normally you'd receive hundreds of alerts, but when this is properly configured, you'd only receive an alert for the parent hosts. There are three ways to configure this feature. First one is from general settings of a device. The other two can be done in the 'Device Dependencies' item under 'Devices' menu. In this page, you can see all devices and with its parents. Clicking on the 'bin' icon will clear the dependency setting. Clicking on the 'pen' icon will let you edit or change the current setting for chosen device. There's also a 'Manage Device Dependencies' button on the top. This will let you set parents for multiple devices at once. For an intro on getting started with Device Dependencies, take a look at our Youtube video","title":"Device Dependencies"},{"location":"Alerting/Entities/","text":"Entities Entities as described earlier are based on the table and column names within the database, if you are unsure of what the entity is you want then have a browse around inside MySQL using show tables and desc . Below are some common entities that you can use within the alerting system. This list is not exhaustive and you should look at the MySQL database schema for the full list. Devices Entity Description devices.hostname The device hostname devices.sysName The device sysName devices.sysDescr The device sysDescr devices.hardware The device hardware devices.version The device os version devices.location The device location devices.status The status of the device, 1 devices.status_reason The reason the device was detected as down (icmp or snmp) devices.ignore If the device is ignored this will be set to 1 devices.disabled If the device is disabled this will be set to 1 devices.last_polled The the last polled datetime (yyyy-mm-dd hh:mm:ss) devices.type The device type such as network, server, firewall, etc. BGP Peers Entity Description bgpPeers.astext This is the description of the BGP Peer bgpPeers.bgpPeerIdentifier The IP address of the BGP Peer bgpPeers.bgpPeerRemoteAs The AS number of the BGP Peer bgpPeers.bgpPeerState The operational state of the BGP session bgpPeers.bgpPeerAdminStatus The administrative state of the BGP session bgpPeers.bgpLocalAddr The local address of the BGP session. IPSec Tunnels Entity Description ipsec_tunnels.peer_addr The remote VPN peer address ipsec_tunnels.local_addr The local VPN address ipsec_tunnels.tunnel_status The VPN tunnels operational status. Memory pools Entity | Description |---|---| mempools.mempool_type | The memory pool type such as hrstorage, cmp and cemp mempools.mempool_descr | The description of the pool such as Physical memory, Virtual memory and System memory mempools.mempool_perc | The used percentage of the memory pool. Ports Entity Description ports.ifDescr The interface description ports.ifName The interface name ports.ifSpeed The port speed in bps ports.ifHighSpeed The port speed in mbps ports.ifOperStatus The operational status of the port (up or down) ports.ifAdminStatus The administrative status of the port (up or down) ports.ifDuplex Duplex setting of the port ports.ifMtu The MTU setting of the port. Processors Entity Description processors.processor_usage The usage of the processor as a percentage processors.processor_descr The description of the processor. Storage Entity Description storage.storage_descr The description of the storage storage.storage_perc The usage of the storage as a percentage. Health / Sensors Entity Description sensors.sensor_desc The sensors description. sensors.sensor_current The current sensors value. sensors.sensor_prev The previous sensor value. sensors.lastupdate The sensors last updated datetime stamp.","title":"Entities"},{"location":"Alerting/Entities/#entities","text":"Entities as described earlier are based on the table and column names within the database, if you are unsure of what the entity is you want then have a browse around inside MySQL using show tables and desc . Below are some common entities that you can use within the alerting system. This list is not exhaustive and you should look at the MySQL database schema for the full list.","title":"Entities"},{"location":"Alerting/Entities/#devices","text":"Entity Description devices.hostname The device hostname devices.sysName The device sysName devices.sysDescr The device sysDescr devices.hardware The device hardware devices.version The device os version devices.location The device location devices.status The status of the device, 1 devices.status_reason The reason the device was detected as down (icmp or snmp) devices.ignore If the device is ignored this will be set to 1 devices.disabled If the device is disabled this will be set to 1 devices.last_polled The the last polled datetime (yyyy-mm-dd hh:mm:ss) devices.type The device type such as network, server, firewall, etc.","title":"Devices"},{"location":"Alerting/Entities/#bgp-peers","text":"Entity Description bgpPeers.astext This is the description of the BGP Peer bgpPeers.bgpPeerIdentifier The IP address of the BGP Peer bgpPeers.bgpPeerRemoteAs The AS number of the BGP Peer bgpPeers.bgpPeerState The operational state of the BGP session bgpPeers.bgpPeerAdminStatus The administrative state of the BGP session bgpPeers.bgpLocalAddr The local address of the BGP session.","title":"BGP Peers"},{"location":"Alerting/Entities/#ipsec-tunnels","text":"Entity Description ipsec_tunnels.peer_addr The remote VPN peer address ipsec_tunnels.local_addr The local VPN address ipsec_tunnels.tunnel_status The VPN tunnels operational status.","title":"IPSec Tunnels"},{"location":"Alerting/Entities/#memory-pools","text":"Entity | Description |---|---| mempools.mempool_type | The memory pool type such as hrstorage, cmp and cemp mempools.mempool_descr | The description of the pool such as Physical memory, Virtual memory and System memory mempools.mempool_perc | The used percentage of the memory pool.","title":"Memory pools"},{"location":"Alerting/Entities/#ports","text":"Entity Description ports.ifDescr The interface description ports.ifName The interface name ports.ifSpeed The port speed in bps ports.ifHighSpeed The port speed in mbps ports.ifOperStatus The operational status of the port (up or down) ports.ifAdminStatus The administrative status of the port (up or down) ports.ifDuplex Duplex setting of the port ports.ifMtu The MTU setting of the port.","title":"Ports"},{"location":"Alerting/Entities/#processors","text":"Entity Description processors.processor_usage The usage of the processor as a percentage processors.processor_descr The description of the processor.","title":"Processors"},{"location":"Alerting/Entities/#storage","text":"Entity Description storage.storage_descr The description of the storage storage.storage_perc The usage of the storage as a percentage.","title":"Storage"},{"location":"Alerting/Entities/#health-sensors","text":"Entity Description sensors.sensor_desc The sensors description. sensors.sensor_current The current sensors value. sensors.sensor_prev The previous sensor value. sensors.lastupdate The sensors last updated datetime stamp.","title":"Health / Sensors"},{"location":"Alerting/Macros/","text":"Macros Macros are shorthands to either portion of rules or pure SQL enhanced with placeholders. You can define your own macros in your config.php . Example macro-implementation of Debian-Devices $config [ 'alert' ][ 'macros' ][ 'rule' ][ 'is_debian' ] = 'devices.features ~ \"@debian@\"' ; And in the Rule: ... macros.is_debian = 1 ... This Example-macro is a Boolean-macro, it applies a form of filter to the set of results defined by the rule. All macros that are not unary should return Boolean. Device (Boolean) Entity: macros.device Description: Only select devices that aren't deleted, ignored or disabled. Source: (devices.disabled = 0 AND devices.ignore = 0) Device is up (Boolean) Entity: macros.device_up Description: Only select devices that are up. Implies: macros.device Source: (devices.status = 1 AND macros.device) Device is down (Boolean) Entity: macros.device_down Description: Only select devices that are down. Implies: macros.device Source: (devices.status = 0 AND macros.device) Port (Boolean) Entity: macros.port Description: Only select ports that aren't deleted, ignored or disabled. Source: (ports.deleted = 0 AND ports.ignore = 0 AND ports.disabled = 0) Port is up (Boolean) Entity: macros.port_up Description: Only select ports that are up and also should be up. Implies: macros.port Source: (ports.ifOperStatus = up AND ports.ifAdminStatus = up AND macros.port) Port is down (Boolean) Entity: macros.port_down Description: Only select ports that are down. Implies: macros.port Source: (ports.ifOperStatus != \"up\" AND ports.ifAdminStatus != \"down\" AND macros.port) Port-Usage in Percent (Decimal) Entity: macros.port_usage_perc Description: Return port-usage (max value of in and out) in percent. Source: ((SELECT IF(ports.ifOutOctets_rate>ports.ifInOctets_rate, ports.ifOutOctets_rate, ports.ifInOctets_rate)*8) / ports.ifSpeed)*100 Time Now (Datetime) Entity: macros.now Description: Alias of MySQL's NOW() Source: NOW() Past N Minutes (Datetime) Entity: macros.past_$m Description: Returns a MySQL Timestamp dated $ Minutes in the past. $ can only be a supported Resolution. Example: macros.past_5m is Last 5 Minutes. Resolution: 5,10,15,30,60 Source: DATE_SUB(NOW(),INTERVAL $ MINUTE) Sensors (Boolean) Entity: macros.sensor Description: Only select sensors that aren't ignored. Source: (sensors.sensor_alert = 1) Entity: macros.sensor_port_link = 1 Description: Only selects sensors that have a port linked to them, the port is up and the device is up. Source: (sensors.entity_link_type = \"port\" AND sensors.entity_link_index = ports.ifIndex AND macros.port_up AND macros.device_up)) State Sensors (Boolean) Entity: macros.state_sensor_ok , macros.state_sensor_warning , macros.state_sensor_critical , macros.state_sensor_unknown Description: Select state sensors by their generic status ok (0), warning (1), critical (2), unknown (3) Source: (sensors.sensor_current = state_translations.state_value AND state_translations.state_generic_value = 2) Misc (Boolean) Packet Loss Entity: (macros.packet_loss_5m) Description: Packet loss % value for the device within the last 5 minutes. Example: macros.packet_loss_5m > 50 Entity: (macros.packet_loss_15m) Description: Packet loss % value for the device within the last 15 minutes. Example: macros.packet_loss_15m > 50 Ports in usage perc (Int) Entity: ((ports.ifInOctets_rate*8)/ports.ifSpeed)*100 Description: Port in used more than 50% Example: `macros.port_in_usage_perc > 50 Ports out usage perc (Int) Entity: ((ports.ifOutOctets_rate*8)/ports.ifSpeed)*100 Description: Port out used more than 50% Example: `macros.port_out_usage_perc > 50 Ports now down (Boolean) Entity: ports.ifOperStatus != ports.ifOperStatus_prev AND ports.ifOperStatus_prev = \"up\" AND ports.ifAdminStatus = \"up\" Description: Ports that were previously up and have now gone down. Example: macros.port_now_down = 1 Port has xDP neighbour (Boolean) Entity: %macros.port AND %links.local_port_id = %ports.port_id Description: Ports that have an xDP (lldp, cdp, etc) neighbour. Example: macros.port_has_xdp_neighbours = 1 Port has xDP neighbour already known in LibreNMS (Boolean) Entity: %macros.port_has_neighbours AND (%links.remote_port_id IS NOT NULL) Description: Ports that have an xDP (lldp, cdp, etc) neighbour that is already known in libreNMS. Example: macros.port_has_xdp_neighbours_device = 1 Device component down [JunOS] Entity: sensors.sensor_class = \"state\" AND sensors.sensor_current != \"6\" AND sensors.sensor_type = \"jnxFruState\" AND sensors.sensor_current != \"2\" Description: Device component is down such as Fan, PSU, etc for JunOS devices. Example: macros.device_component_down_junos = 1 Device component down [Cisco] Entity: sensors.sensor_current != 1 AND sensors.sensor_current != 5 AND sensors.sensor_type ~ \"^cisco.*State$\" Description: Device component is down such as Fan, PSU, etc for Cisco devices. Example: macros.device_component_down_cisco = 1 PDU over amperage [APC] Entity: sensors.sensor_class = \"current\" AND sensors.sensor_descr = \"Bank Total\" AND sensors.sensor_current > sensors.sensor_limit AND devices.os = \"apc\" Description: APC PDU over amperage Example: macros.pdu_over_amperage_apc = 1","title":"Macros"},{"location":"Alerting/Macros/#macros","text":"Macros are shorthands to either portion of rules or pure SQL enhanced with placeholders. You can define your own macros in your config.php . Example macro-implementation of Debian-Devices $config [ 'alert' ][ 'macros' ][ 'rule' ][ 'is_debian' ] = 'devices.features ~ \"@debian@\"' ; And in the Rule: ... macros.is_debian = 1 ... This Example-macro is a Boolean-macro, it applies a form of filter to the set of results defined by the rule. All macros that are not unary should return Boolean.","title":"Macros"},{"location":"Alerting/Macros/#device-boolean","text":"Entity: macros.device Description: Only select devices that aren't deleted, ignored or disabled. Source: (devices.disabled = 0 AND devices.ignore = 0)","title":"Device (Boolean)"},{"location":"Alerting/Macros/#device-is-up-boolean","text":"Entity: macros.device_up Description: Only select devices that are up. Implies: macros.device Source: (devices.status = 1 AND macros.device)","title":"Device is up (Boolean)"},{"location":"Alerting/Macros/#device-is-down-boolean","text":"Entity: macros.device_down Description: Only select devices that are down. Implies: macros.device Source: (devices.status = 0 AND macros.device)","title":"Device is down (Boolean)"},{"location":"Alerting/Macros/#port-boolean","text":"Entity: macros.port Description: Only select ports that aren't deleted, ignored or disabled. Source: (ports.deleted = 0 AND ports.ignore = 0 AND ports.disabled = 0)","title":"Port (Boolean)"},{"location":"Alerting/Macros/#port-is-up-boolean","text":"Entity: macros.port_up Description: Only select ports that are up and also should be up. Implies: macros.port Source: (ports.ifOperStatus = up AND ports.ifAdminStatus = up AND macros.port)","title":"Port is up (Boolean)"},{"location":"Alerting/Macros/#port-is-down-boolean","text":"Entity: macros.port_down Description: Only select ports that are down. Implies: macros.port Source: (ports.ifOperStatus != \"up\" AND ports.ifAdminStatus != \"down\" AND macros.port)","title":"Port is down (Boolean)"},{"location":"Alerting/Macros/#port-usage-in-percent-decimal","text":"Entity: macros.port_usage_perc Description: Return port-usage (max value of in and out) in percent. Source: ((SELECT IF(ports.ifOutOctets_rate>ports.ifInOctets_rate, ports.ifOutOctets_rate, ports.ifInOctets_rate)*8) / ports.ifSpeed)*100","title":"Port-Usage in Percent (Decimal)"},{"location":"Alerting/Macros/#time","text":"","title":"Time"},{"location":"Alerting/Macros/#now-datetime","text":"Entity: macros.now Description: Alias of MySQL's NOW() Source: NOW()","title":"Now (Datetime)"},{"location":"Alerting/Macros/#past-n-minutes-datetime","text":"Entity: macros.past_$m Description: Returns a MySQL Timestamp dated $ Minutes in the past. $ can only be a supported Resolution. Example: macros.past_5m is Last 5 Minutes. Resolution: 5,10,15,30,60 Source: DATE_SUB(NOW(),INTERVAL $ MINUTE)","title":"Past N Minutes (Datetime)"},{"location":"Alerting/Macros/#sensors-boolean","text":"Entity: macros.sensor Description: Only select sensors that aren't ignored. Source: (sensors.sensor_alert = 1) Entity: macros.sensor_port_link = 1 Description: Only selects sensors that have a port linked to them, the port is up and the device is up. Source: (sensors.entity_link_type = \"port\" AND sensors.entity_link_index = ports.ifIndex AND macros.port_up AND macros.device_up))","title":"Sensors (Boolean)"},{"location":"Alerting/Macros/#state-sensors-boolean","text":"Entity: macros.state_sensor_ok , macros.state_sensor_warning , macros.state_sensor_critical , macros.state_sensor_unknown Description: Select state sensors by their generic status ok (0), warning (1), critical (2), unknown (3) Source: (sensors.sensor_current = state_translations.state_value AND state_translations.state_generic_value = 2)","title":"State Sensors (Boolean)"},{"location":"Alerting/Macros/#misc-boolean","text":"","title":"Misc (Boolean)"},{"location":"Alerting/Macros/#packet-loss","text":"Entity: (macros.packet_loss_5m) Description: Packet loss % value for the device within the last 5 minutes. Example: macros.packet_loss_5m > 50 Entity: (macros.packet_loss_15m) Description: Packet loss % value for the device within the last 15 minutes. Example: macros.packet_loss_15m > 50","title":"Packet Loss"},{"location":"Alerting/Macros/#ports-in-usage-perc-int","text":"Entity: ((ports.ifInOctets_rate*8)/ports.ifSpeed)*100 Description: Port in used more than 50% Example: `macros.port_in_usage_perc > 50","title":"Ports in usage perc (Int)"},{"location":"Alerting/Macros/#ports-out-usage-perc-int","text":"Entity: ((ports.ifOutOctets_rate*8)/ports.ifSpeed)*100 Description: Port out used more than 50% Example: `macros.port_out_usage_perc > 50","title":"Ports out usage perc (Int)"},{"location":"Alerting/Macros/#ports-now-down-boolean","text":"Entity: ports.ifOperStatus != ports.ifOperStatus_prev AND ports.ifOperStatus_prev = \"up\" AND ports.ifAdminStatus = \"up\" Description: Ports that were previously up and have now gone down. Example: macros.port_now_down = 1","title":"Ports now down (Boolean)"},{"location":"Alerting/Macros/#port-has-xdp-neighbour-boolean","text":"Entity: %macros.port AND %links.local_port_id = %ports.port_id Description: Ports that have an xDP (lldp, cdp, etc) neighbour. Example: macros.port_has_xdp_neighbours = 1","title":"Port has xDP neighbour (Boolean)"},{"location":"Alerting/Macros/#port-has-xdp-neighbour-already-known-in-librenms-boolean","text":"Entity: %macros.port_has_neighbours AND (%links.remote_port_id IS NOT NULL) Description: Ports that have an xDP (lldp, cdp, etc) neighbour that is already known in libreNMS. Example: macros.port_has_xdp_neighbours_device = 1","title":"Port has xDP neighbour already known in LibreNMS (Boolean)"},{"location":"Alerting/Macros/#device-component-down-junos","text":"Entity: sensors.sensor_class = \"state\" AND sensors.sensor_current != \"6\" AND sensors.sensor_type = \"jnxFruState\" AND sensors.sensor_current != \"2\" Description: Device component is down such as Fan, PSU, etc for JunOS devices. Example: macros.device_component_down_junos = 1","title":"Device component down [JunOS]"},{"location":"Alerting/Macros/#device-component-down-cisco","text":"Entity: sensors.sensor_current != 1 AND sensors.sensor_current != 5 AND sensors.sensor_type ~ \"^cisco.*State$\" Description: Device component is down such as Fan, PSU, etc for Cisco devices. Example: macros.device_component_down_cisco = 1","title":"Device component down [Cisco]"},{"location":"Alerting/Macros/#pdu-over-amperage-apc","text":"Entity: sensors.sensor_class = \"current\" AND sensors.sensor_descr = \"Bank Total\" AND sensors.sensor_current > sensors.sensor_limit AND devices.os = \"apc\" Description: APC PDU over amperage Example: macros.pdu_over_amperage_apc = 1","title":"PDU over amperage [APC]"},{"location":"Alerting/Rules/","text":"Rules Rules are defined using a logical language. The GUI provides a simple way of creating rules. Creating more complicated rules which may include maths calculations and MySQL queries can be done using macros Syntax Rules must consist of at least 3 elements: An Entity , a Condition and a Value . Rules can contain braces and Glues . Entities are provided from Table and Field from the database. For Example: ports.ifOperStatus . Conditions can be any of: Equals = Not Equals != In IN Not In NOT IN Begins with LIKE ('...%') Doesn't begin with NOT LIKE ('...%') Contains LIKE ('%...%') Doesn't Contain NOT LIKE ('%...%') Ends with LIKE ('%...') Doesn't end with NOT LIKE ('%...') Between BETWEEN Not Between NOT BETWEEN Is Empty = '' Is Not Empty != ''' Is Null IS NULL Is Not Null IS NOT NULL Greater > Greater or Equal >= Less < Less or Equal <= Regex REGEXP Values can be an entity or any data. If using macros as value you must include the macro name into backticks. i.e. `macros.past_60m` Note : Regex supports MySQL Regular expressions. Arithmetics are allowed as well. Options Here are some of the other options available when adding an alerting rule: Rule name: The name associated with the rule. Severity: How \"important\" the rule is. Max alerts: The maximum number of alerts sent for the event. -1 means unlimited. Delay: The amount of time in seconds to wait after a rule is matched before sending an alert out transport. Interval: The interval of time in seconds between alerts for an event until Max alert is reached. Mute alerts: Disables sending alert rule through alert transport. But will still show the alert in the Web UI. Invert match: Invert the matching rule (ie. alert on items that _don't match the rule). Recovery alerts: This will disable the recovery notification from being sent if turned off. Advanced On the Advanced tab, you can specify some additional options for the alert rule: Override SQL: Enable this if you using a custom query Query: The query to be used for the alert. An example of this would be an average rule for all CPUs over 10% SELECT devices . device_id , devices . status , devices . disabled , devices . ignore , AVG ( processors . processor_usage ) AS cpu_avg FROM devices INNER JOIN processors ON devices . device_id = processors . device_id WHERE devices . device_id = ? AND devices . status = 1 AND devices . disabled = 0 AND devices . ignore = 0 GROUP BY devices . device_id , devices . status , devices . disabled , devices . ignore HAVING AVG ( processors . processor_usage ) > 10 The 10 would then contain the average CPU usage value, you can change this value to be whatever you like. You will to need copy and paste this into the Alert Rule under Advanced then paste into Query box and switch the Override SQL. Procedure You can associate a rule to a procedure by giving the URL of the procedure when creating the rule. Only links like \"http://\" are supported, otherwise an error will be returned. Once configured, procedure can be opened from the Alert widget through the \"Open\" button, which can be shown/hidden from the widget configuration box. Examples Alert when: Device goes down: devices.status != 1 Any port changes: ports.ifOperStatus != 'up' Root-directory gets too full: storage.storage_descr = '/' AND storage.storage_perc >= '75' Any storage gets fuller than the 'warning': storage.storage_perc >= storage_perc_warn If device is a server and the used storage is above the warning level, but ignore /boot partitions: storage.storage_perc > storage.storage_perc_warn AND devices.type = \"server\" AND storage.storage_descr != \"/boot\" VMware LAG is not using \"Source ip address hash\" load balancing: devices.os = \"vmware\" AND ports.ifType = \"ieee8023adLag\" AND ports.ifDescr REGEXP \"Link Aggregation .*, load balancing algorithm: Source ip address hash\" Syslog, authentication failure during the last 5m: syslog.timestamp >= macros.past_5m AND syslog.msg REGEXP \".*authentication failure.*\" High memory usage: macros.device_up = 1 AND mempools.mempool_perc >= 90 AND mempools.mempool_descr REGEXP \"Virtual.*\" High CPU usage(per core usage, not overall): macros.device_up = 1 AND processors.processor_usage >= 90 High port usage, where description is not client & ifType is not softwareLoopback: macros.port_usage_perc >= 80 AND port.port_descr_type != \"client\" AND ports.ifType != \"softwareLoopback\" Alert when mac address is located on your network ipv4_mac.mac_address = \"2c233a756912\" Alert Rules Collection You can also select Alert Rule from the Alerts Collection. These Alert Rules are submitted by users in the community :) If would like to submit your alert rules to the collection, please submit them here Alert Rules Collection","title":"Rules"},{"location":"Alerting/Rules/#rules","text":"Rules are defined using a logical language. The GUI provides a simple way of creating rules. Creating more complicated rules which may include maths calculations and MySQL queries can be done using macros","title":"Rules"},{"location":"Alerting/Rules/#syntax","text":"Rules must consist of at least 3 elements: An Entity , a Condition and a Value . Rules can contain braces and Glues . Entities are provided from Table and Field from the database. For Example: ports.ifOperStatus . Conditions can be any of: Equals = Not Equals != In IN Not In NOT IN Begins with LIKE ('...%') Doesn't begin with NOT LIKE ('...%') Contains LIKE ('%...%') Doesn't Contain NOT LIKE ('%...%') Ends with LIKE ('%...') Doesn't end with NOT LIKE ('%...') Between BETWEEN Not Between NOT BETWEEN Is Empty = '' Is Not Empty != ''' Is Null IS NULL Is Not Null IS NOT NULL Greater > Greater or Equal >= Less < Less or Equal <= Regex REGEXP Values can be an entity or any data. If using macros as value you must include the macro name into backticks. i.e. `macros.past_60m` Note : Regex supports MySQL Regular expressions. Arithmetics are allowed as well.","title":"Syntax"},{"location":"Alerting/Rules/#options","text":"Here are some of the other options available when adding an alerting rule: Rule name: The name associated with the rule. Severity: How \"important\" the rule is. Max alerts: The maximum number of alerts sent for the event. -1 means unlimited. Delay: The amount of time in seconds to wait after a rule is matched before sending an alert out transport. Interval: The interval of time in seconds between alerts for an event until Max alert is reached. Mute alerts: Disables sending alert rule through alert transport. But will still show the alert in the Web UI. Invert match: Invert the matching rule (ie. alert on items that _don't match the rule). Recovery alerts: This will disable the recovery notification from being sent if turned off.","title":"Options"},{"location":"Alerting/Rules/#advanced","text":"On the Advanced tab, you can specify some additional options for the alert rule: Override SQL: Enable this if you using a custom query Query: The query to be used for the alert. An example of this would be an average rule for all CPUs over 10% SELECT devices . device_id , devices . status , devices . disabled , devices . ignore , AVG ( processors . processor_usage ) AS cpu_avg FROM devices INNER JOIN processors ON devices . device_id = processors . device_id WHERE devices . device_id = ? AND devices . status = 1 AND devices . disabled = 0 AND devices . ignore = 0 GROUP BY devices . device_id , devices . status , devices . disabled , devices . ignore HAVING AVG ( processors . processor_usage ) > 10 The 10 would then contain the average CPU usage value, you can change this value to be whatever you like. You will to need copy and paste this into the Alert Rule under Advanced then paste into Query box and switch the Override SQL.","title":"Advanced"},{"location":"Alerting/Rules/#procedure","text":"You can associate a rule to a procedure by giving the URL of the procedure when creating the rule. Only links like \"http://\" are supported, otherwise an error will be returned. Once configured, procedure can be opened from the Alert widget through the \"Open\" button, which can be shown/hidden from the widget configuration box.","title":"Procedure"},{"location":"Alerting/Rules/#examples","text":"Alert when: Device goes down: devices.status != 1 Any port changes: ports.ifOperStatus != 'up' Root-directory gets too full: storage.storage_descr = '/' AND storage.storage_perc >= '75' Any storage gets fuller than the 'warning': storage.storage_perc >= storage_perc_warn If device is a server and the used storage is above the warning level, but ignore /boot partitions: storage.storage_perc > storage.storage_perc_warn AND devices.type = \"server\" AND storage.storage_descr != \"/boot\" VMware LAG is not using \"Source ip address hash\" load balancing: devices.os = \"vmware\" AND ports.ifType = \"ieee8023adLag\" AND ports.ifDescr REGEXP \"Link Aggregation .*, load balancing algorithm: Source ip address hash\" Syslog, authentication failure during the last 5m: syslog.timestamp >= macros.past_5m AND syslog.msg REGEXP \".*authentication failure.*\" High memory usage: macros.device_up = 1 AND mempools.mempool_perc >= 90 AND mempools.mempool_descr REGEXP \"Virtual.*\" High CPU usage(per core usage, not overall): macros.device_up = 1 AND processors.processor_usage >= 90 High port usage, where description is not client & ifType is not softwareLoopback: macros.port_usage_perc >= 80 AND port.port_descr_type != \"client\" AND ports.ifType != \"softwareLoopback\" Alert when mac address is located on your network ipv4_mac.mac_address = \"2c233a756912\"","title":"Examples"},{"location":"Alerting/Rules/#alert-rules-collection","text":"You can also select Alert Rule from the Alerts Collection. These Alert Rules are submitted by users in the community :) If would like to submit your alert rules to the collection, please submit them here Alert Rules Collection","title":"Alert Rules Collection"},{"location":"Alerting/Templates/","text":"Templates This page is for installs running version 1.42 or later. You can find the older docs here Templates can be assigned to a single or a group of rules and can contain any kind of text. There is also a default template which is used for any rule that isn't associated with a template. This template can be found under Alert Templates page and can be edited. It also has an option revert it back to its default content. To attach a template to a rule just open the Alert Templates settings page, choose the template to assign and click the yellow button in the Actions column. In the appearing popupbox select the rule(s) you want the template to be assigned to and click the Attach button. You might hold down the CTRL key to select multiple rules at once. The templating engine in use is Laravel Blade. We will cover some of the basics here, however the official Laravel docs will have more information here Syntax Controls: if-else (Else can be omitted): @if ($alert->placeholder == 'value') Some Text @else Other Text @endif foreach-loop: @foreach ($alert->faults as $key => $value) Key: $key Value: $value @endforeach Placeholders: Placeholders are special variables that if used within the template will be replaced with the relevant data, I.e: The device {{ $alert->hostname }} has been up for {{ $alert->uptime }} seconds would result in the following The device localhost has been up for 30344 seconds . When using placeholders to echo data, you need to wrap the placeholder in {{ }} . I.e {{ $alert->hostname }} . Device ID: $alert->device_id Hostname of the Device: $alert->hostname sysName of the Device: $alert->sysName sysDescr of the Device: $alert->sysDescr display name of the Device: $alert->display sysContact of the Device: $alert->sysContact OS of the Device: $alert->os Type of Device: $alert->type IP of the Device: $alert->ip Hardware of the Device: $alert->hardware Software version of the Device: $alert->version Features of the Device: $alert->features Serial number of the Device: $alert->serial Location of the Device: $alert->location uptime of the Device (in seconds): $alert->uptime Short uptime of the Device (28d 22h 30m 7s): $alert->uptime_short Long uptime of the Device (28 days, 22h 30m 7s): $alert->uptime_long Description (purpose db field) of the Device: $alert->description Notes of the Device: $alert->notes Notes of the alert (ack notes): $alert->alert_notes ping timestamp (if icmp enabled): $alert->ping_timestamp ping loss (if icmp enabled): $alert->ping_loss ping min (if icmp enabled): $alert->ping_min ping max (if icmp enabled): $alert->ping_max ping avg (if icmp enabled): $alert->ping_avg debug (array) poller_name - name of poller (for distributed setups) If $config['debug']['run_trace] = true; is set then this will contain: traceroute (if enabled you will receive traceroute output): $alert->debug['traceroute'] traceroute_output (if the traceroute fails this will contain why): $alert->debug['traceroute_output'] Title for the Alert: $alert->title Time Elapsed, Only available on recovery ( $alert->state == 0 ): $alert->elapsed Rule Builder (the actual rule) (use {!! $alert->builder !!} ): $alert->builder Alert-ID: $alert->id Unique-ID: $alert->uid Faults, Only available on alert ( $alert->state != 0 ), must be iterated in a foreach ( @foreach ($alert->faults as $key => $value) @endforeach ). Holds all available information about the Fault, accessible in the format $value['Column'] , for example: $value['ifDescr'] . Special field $value['string'] has most Identification-information (IDs, Names, Descrs) as single string, this is the equivalent of the default used and must be encased in {{ }} State: $alert->state Severity: $alert->severity Rule: $alert->rule Rule-Name: $alert->name Procedure URL: $alert->proc Timestamp: $alert->timestamp Transport type: $alert->transport Transport name: $alert->transport_name Contacts, must be iterated in a foreach, $key holds email and $value holds name: $alert->contacts Placeholders can be used within the subjects for templates as well although $faults is most likely going to be worthless. The Default Template is a 'one-size-fit-all'. We highly recommend defining your own templates for your rules to include more specific information. Base Templates If you'd like to reuse a common template for your alerts follow below A default file is located in resources/views/alerts/templates/default.blade.php Displays the following: LibreNMS Alert
            @yield('content')
            The important part being the @yield('content') You can use plain text or html as per Alert templates and this will form the basis of your common template, feel free to make as many templates in the directory as needed. In your alert template just use @extends('alerts.templates.default') @section('content') {{ $alert->title }} Severity: {{ $alert->severity }} ... @endsection More info: https://laravel.com/docs/blade#extending-a-layout Examples Default Template {{ $alert->title }} Severity: {{ $alert->severity }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Unique-ID: {{ $alert->uid }} Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif @if ($alert->faults) Faults: @foreach ($alert->faults as $key => $value) {{ $key }}: {{ $value['string'] }} @endforeach @endif Alert sent to: @foreach ($alert->contacts as $key => $value) {{ $value }} <{{ $key }}> @endforeach Ports Utilization Template {{ $alert->title }} Device Name: {{ $alert->hostname }} Severity: {{ $alert->severity }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif @foreach ($alert->faults as $key => $value) Physical Interface: {{ $value['ifDescr'] }} Interface Description: {{ $value['ifAlias'] }} Interface Speed: {{ ($value['ifSpeed']/1000000000) }} Gbs Inbound Utilization: {{ (($value['ifInOctets_rate']*8)/$value['ifSpeed'])*100 }} Outbound Utilization: {{ (($value['ifOutOctets_rate']*8)/$value['ifSpeed'])*100 }} @endforeach Storage {{ $alert->title }} Device Name: {{ $alert->hostname }} Severity: {{ $alert->severity }} Uptime: {{ $alert->uptime_short }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Location: {{ $alert->location }} Description: {{ $alert->description }} Features: {{ $alert->features }} Notes: {{ $alert->notes }} Server: {{ $alert->sysName }} @foreach ($alert->faults as $key => $value) Mount Point: {{ $value['storage_descr'] }} Percent Utilized: {{ $value['storage_perc'] }} @endforeach Value Sensors (Temperature, Humidity, Fanspeed, ...) {{ $alert->title }} Device Name: {{ $alert->hostname }} Severity: {{ $alert->severity }} Timestamp: {{ $alert->timestamp }} Uptime: {{ $alert->uptime_short }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Location: {{ $alert->location }} Description: {{ $alert->description }} Features: {{ $alert->features }} Notes: {{ $alert->notes }} Rule: {{ $alert->name ?? $alert->rule }} @if ($alert->faults) Faults: @foreach ($alert->faults as $key => $value) @php($unit = __(\"sensors.${value[\"sensor_class\"]}.unit\")) #{{ $key }}: {{ $value['sensor_descr'] ?? 'Sensor' }} Current: {{ $value['sensor_current'].$unit }} Previous: {{ $value['sensor_prev'].$unit }} Limit: {{ $value['sensor_limit'].$unit }} Over Limit: {{ round($value['sensor_current']-$value['sensor_limit'], 2).$unit }} @endforeach @endif Memory Alert {{ $alert->title }} Device Name: {{ $alert->hostname }} Severity: {{ $alert->severity }} Uptime: {{ $alert->uptime_short }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Location: {{ $alert->location }} Description: {{ $alert->description }} Notes: {{ $alert->notes }} Server: {{ $alert->hostname }} @foreach ($alert->faults as $key => $value) Memory Description: {{ $value['mempool_descr'] }} Percent Utilized: {{ $value['mempool_perc'] }} @endforeach Advanced options Conditional formatting Conditional formatting example, will display a link to the host in email or just the hostname in any other transport: @if ($alert->transport == 'mail')hostname }}/\">{{ $alert->hostname }} @else {{ $alert->hostname }} @endif Traceroute debugs @if ($alert->status == 0) @if ($alert->status_reason == 'icmp') {{ $alert->debug['traceroute'] }} @endif @endif Examples HTML Note: To use HTML emails you must set HTML email to Yes in the WebUI under Global Settings > Alerting Settings > Email transport > Use HTML emails Graphs There are two helpers for graphs that will use a signed url to allow secure external access. Anyone using the signed url will be able to view the graph. Your LibreNMS web must be accessible from the location where the graph is viewed. Some alert transports require publicly accessible urls. APP_URL must be set in .env to use signed graphs. Changing APP_KEY will invalidate all previously issued singed urls. You may specify the graph one of two ways, a php array of parameters, or a direct url to a graph. Note that to and from can be specified either as timestamps with time() or as relative time -3d or -36h . When using relative time, the graph will show based on when the user views the graph, not when the event happened. Sharing a graph image with a relative time will always give the recipient access to current data, where a specific timestamp will only allow access to that timeframe. @signedGraphTag This will insert a specially formatted html img tag linking to the graph. Some transports may search the template for this tag to attach images properly for that transport. @signedGraphTag([ 'id' => $value['port_id'], 'type' => 'port_bits', 'from' => time() - 43200, 'to' => time(), 'width' => 700, 'height' => 250 ]) Output: < img class = \"librenms-graph\" src = \"https://librenms.org/graph?from=1662176216&height=250&id=20425&to=1662219416&type=port_bits&width=700&signature=f6e516e8fd893c772eeaba165d027cb400e15a515254de561a05b63bc6f360a4\" > Specific graph using url input: @signedGraphTag('https://librenms.org/graph.php?type=device_processor&from=-2d&device=2&legend=no&height=400&width=1200') @signedGraphUrl This is used when you need the url directly. One example is using the API Transport, you may want to include the url only instead of a html tag. @signedGraphUrl([ 'id' => $value['port_id'], 'type' => 'port_bits', 'from' => time() - 43200, 'to' => time(), ]) Using models for optional data If some value does not exist within the $faults[] -array, you may query fields from the database using Laravel models. You may use models to query additional values and use them on the template by placing the model and the value to search for within the braces. For example, ISIS-alerts do have a port_id value associated with the alert but ifName is not directly accessible from the $faults[] -array. If the name of the port was needed, it's value could be queried using a template such as: {{ $alert->title }} Severity: {{ $alert->severity }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif @if ($alert->faults) Faults: @foreach ($alert->faults as $key => $value) Local interface: {{ \\App\\Models\\Port::find($value['port_id'])->ifName }} Adjacent IP: {{ $value['isisISAdjIPAddrAddress'] }} Adjacent state: {{ $value['isisISAdjState'] }} @endforeach @endif Service Alert

            @if ($alert->state == 1) {{ $alert->severity }} @endif @if ($alert->state == 2) acknowledged @endif @if ($alert->state == 3) recovering @endif @if ($alert->state == 0) recovered @endif

            Host: {{ $alert->hostname }}
            Duration: {{ $alert->elapsed }}

            @if ($alert->faults) @foreach ($alert->faults as $key => $value) {{ $value['service_desc'] }} - {{ $value['service_type'] }}
            {{ $value['service_message'] }}

            @endforeach @endif
            Processor Alert with Graph {{ $alert->title }}
            Severity: {{ $alert->severity }}
            @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }}
            Alert-ID: {{ $alert->id }}
            Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif
            @if ($alert->faults) Faults: @foreach ($alert->faults as $key => $value) {{ $key }}: {{ $value['string'] }}
            @endforeach @if ($alert->faults) Faults:
            @foreach ($alert->faults as $key => $value) @signedGraphTag(['device' => $value['device_id'], 'type' => 'device_processor', 'width' => 459, 'height' => 213, 'from' => time() - 259200])
            https://server/graphs/device={{ $value['device_id'] }}/type=device_processor/
            @endforeach Template: CPU alert
            @endif @endif Included We include a few templates for you to use, these are specific to the type of alert rules you are creating. For example if you create a rule that would alert on BGP sessions then you can assign the BGP template to this rule to provide more information. The included templates apart from the default template are: BGP Sessions Ports Temperature Other Examples Microsoft Teams - Markdown [{{ $alert->title }}](https://your.librenms.url/device/device={{ $alert->device_id }}/) **Device name:** {{ $alert->sysName }} **Severity:** {{ $alert->severity }} @if ($alert->state == 0) **Time elapsed:** {{ $alert->elapsed }} @endif **Timestamp:** {{ $alert->timestamp }} **Unique-ID:** {{ $alert->uid }} @if ($alert->name) **Rule:** {{ $alert->name }} @else **Rule:** {{ $alert->rule }} @endif @if ($alert->faults) **Faults:**@foreach ($alert->faults as $key => $value) {{ $key }}: {{ $value['string'] }} @endforeach @endif Microsoft Teams - JSON { \"@context\": \"https://schema.org/extensions\", \"@type\": \"MessageCard\", \"title\": \"{{ $alert->title }}\", @if ($alert->state === 0) \"themeColor\": \"00FF00\", @elseif ($alert->state === 1) \"themeColor\": \"FF0000\", @elseif ($alert->state === 2) \"themeColor\": \"337AB7\", @elseif ($alert->state === 3) \"themeColor\": \"FF0000\", @elseif ($alert->state === 4) \"themeColor\": \"F0AD4E\", @else \"themeColor\": \"337AB7\", @endif \"summary\": \"LibreNMS\", \"sections\": [ { @if ($alert->name) \"facts\": [ { \"name\": \"Rule:\", \"value\": \"[{{ $alert->name }}](https://your.librenms.url/device/device={{ $alert->device_id }}/tab=alert/)\" }, @else { \"name\": \"Rule:\", \"value\": \"[{{ $alert->rule }}](https://your.librenms.url/device/device={{ $alert->device_id }}/tab=alert/)\" }, @endif { \"name\": \"Severity:\", \"value\": \"{{ $alert->severity }}\" }, { \"name\": \"Unique-ID:\", \"value\": \"{{ $alert->uid }}\" }, { \"name\": \"Timestamp:\", \"value\": \"{{ $alert->timestamp }}\" }, @if ($alert->state == 0) { \"name\": \"Time elapsed:\", \"value\": \"{{ $alert->elapsed }}\" }, @endif { \"name\": \"Hostname:\", \"value\": \"[{{ $alert->hostname }}](https://your.librenms.url/device/device={{ $alert->device_id }}/)\" }, { \"name\": \"Hardware:\", \"value\": \"{{ $alert->hardware }}\" }, { \"name\": \"IP:\", \"value\": \"{{ $alert->ip }}\" }, { \"name\": \"Faults:\", \"value\": \" \" } ] @if ($alert->faults) @foreach ($alert->faults as $key => $value) }, { \"facts\": [ { \"name\": \"Port:\", \"value\": \"[{{ $value['ifName'] }}](https://your.librenms.url/device/device={{ $alert->device_id }}/tab=port/port={{ $value['port_id'] }}/)\" }, { \"name\": \"Description:\", \"value\": \"{{ $value['ifAlias'] }}\" }, @if ($alert->state != 0) { \"name\": \"Status:\", \"value\": \"down\" } ] @else { \"name\": \"Status:\", \"value\": \"up\" } ] @endif @endforeach @endif } ] }","title":"Templates"},{"location":"Alerting/Templates/#templates","text":"This page is for installs running version 1.42 or later. You can find the older docs here Templates can be assigned to a single or a group of rules and can contain any kind of text. There is also a default template which is used for any rule that isn't associated with a template. This template can be found under Alert Templates page and can be edited. It also has an option revert it back to its default content. To attach a template to a rule just open the Alert Templates settings page, choose the template to assign and click the yellow button in the Actions column. In the appearing popupbox select the rule(s) you want the template to be assigned to and click the Attach button. You might hold down the CTRL key to select multiple rules at once. The templating engine in use is Laravel Blade. We will cover some of the basics here, however the official Laravel docs will have more information here","title":"Templates"},{"location":"Alerting/Templates/#syntax","text":"Controls: if-else (Else can be omitted): @if ($alert->placeholder == 'value') Some Text @else Other Text @endif foreach-loop: @foreach ($alert->faults as $key => $value) Key: $key Value: $value @endforeach Placeholders: Placeholders are special variables that if used within the template will be replaced with the relevant data, I.e: The device {{ $alert->hostname }} has been up for {{ $alert->uptime }} seconds would result in the following The device localhost has been up for 30344 seconds . When using placeholders to echo data, you need to wrap the placeholder in {{ }} . I.e {{ $alert->hostname }} . Device ID: $alert->device_id Hostname of the Device: $alert->hostname sysName of the Device: $alert->sysName sysDescr of the Device: $alert->sysDescr display name of the Device: $alert->display sysContact of the Device: $alert->sysContact OS of the Device: $alert->os Type of Device: $alert->type IP of the Device: $alert->ip Hardware of the Device: $alert->hardware Software version of the Device: $alert->version Features of the Device: $alert->features Serial number of the Device: $alert->serial Location of the Device: $alert->location uptime of the Device (in seconds): $alert->uptime Short uptime of the Device (28d 22h 30m 7s): $alert->uptime_short Long uptime of the Device (28 days, 22h 30m 7s): $alert->uptime_long Description (purpose db field) of the Device: $alert->description Notes of the Device: $alert->notes Notes of the alert (ack notes): $alert->alert_notes ping timestamp (if icmp enabled): $alert->ping_timestamp ping loss (if icmp enabled): $alert->ping_loss ping min (if icmp enabled): $alert->ping_min ping max (if icmp enabled): $alert->ping_max ping avg (if icmp enabled): $alert->ping_avg debug (array) poller_name - name of poller (for distributed setups) If $config['debug']['run_trace] = true; is set then this will contain: traceroute (if enabled you will receive traceroute output): $alert->debug['traceroute'] traceroute_output (if the traceroute fails this will contain why): $alert->debug['traceroute_output'] Title for the Alert: $alert->title Time Elapsed, Only available on recovery ( $alert->state == 0 ): $alert->elapsed Rule Builder (the actual rule) (use {!! $alert->builder !!} ): $alert->builder Alert-ID: $alert->id Unique-ID: $alert->uid Faults, Only available on alert ( $alert->state != 0 ), must be iterated in a foreach ( @foreach ($alert->faults as $key => $value) @endforeach ). Holds all available information about the Fault, accessible in the format $value['Column'] , for example: $value['ifDescr'] . Special field $value['string'] has most Identification-information (IDs, Names, Descrs) as single string, this is the equivalent of the default used and must be encased in {{ }} State: $alert->state Severity: $alert->severity Rule: $alert->rule Rule-Name: $alert->name Procedure URL: $alert->proc Timestamp: $alert->timestamp Transport type: $alert->transport Transport name: $alert->transport_name Contacts, must be iterated in a foreach, $key holds email and $value holds name: $alert->contacts Placeholders can be used within the subjects for templates as well although $faults is most likely going to be worthless. The Default Template is a 'one-size-fit-all'. We highly recommend defining your own templates for your rules to include more specific information.","title":"Syntax"},{"location":"Alerting/Templates/#base-templates","text":"If you'd like to reuse a common template for your alerts follow below A default file is located in resources/views/alerts/templates/default.blade.php Displays the following: LibreNMS Alert
            @yield('content')
            The important part being the @yield('content') You can use plain text or html as per Alert templates and this will form the basis of your common template, feel free to make as many templates in the directory as needed. In your alert template just use @extends('alerts.templates.default') @section('content') {{ $alert->title }} Severity: {{ $alert->severity }} ... @endsection More info: https://laravel.com/docs/blade#extending-a-layout","title":"Base Templates"},{"location":"Alerting/Templates/#examples","text":"","title":"Examples"},{"location":"Alerting/Templates/#default-template","text":"{{ $alert->title }} Severity: {{ $alert->severity }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Unique-ID: {{ $alert->uid }} Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif @if ($alert->faults) Faults: @foreach ($alert->faults as $key => $value) {{ $key }}: {{ $value['string'] }} @endforeach @endif Alert sent to: @foreach ($alert->contacts as $key => $value) {{ $value }} <{{ $key }}> @endforeach","title":"Default Template"},{"location":"Alerting/Templates/#ports-utilization-template","text":"{{ $alert->title }} Device Name: {{ $alert->hostname }} Severity: {{ $alert->severity }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif @foreach ($alert->faults as $key => $value) Physical Interface: {{ $value['ifDescr'] }} Interface Description: {{ $value['ifAlias'] }} Interface Speed: {{ ($value['ifSpeed']/1000000000) }} Gbs Inbound Utilization: {{ (($value['ifInOctets_rate']*8)/$value['ifSpeed'])*100 }} Outbound Utilization: {{ (($value['ifOutOctets_rate']*8)/$value['ifSpeed'])*100 }} @endforeach","title":"Ports Utilization Template"},{"location":"Alerting/Templates/#storage","text":"{{ $alert->title }} Device Name: {{ $alert->hostname }} Severity: {{ $alert->severity }} Uptime: {{ $alert->uptime_short }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Location: {{ $alert->location }} Description: {{ $alert->description }} Features: {{ $alert->features }} Notes: {{ $alert->notes }} Server: {{ $alert->sysName }} @foreach ($alert->faults as $key => $value) Mount Point: {{ $value['storage_descr'] }} Percent Utilized: {{ $value['storage_perc'] }} @endforeach","title":"Storage"},{"location":"Alerting/Templates/#value-sensors-temperature-humidity-fanspeed","text":"{{ $alert->title }} Device Name: {{ $alert->hostname }} Severity: {{ $alert->severity }} Timestamp: {{ $alert->timestamp }} Uptime: {{ $alert->uptime_short }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Location: {{ $alert->location }} Description: {{ $alert->description }} Features: {{ $alert->features }} Notes: {{ $alert->notes }} Rule: {{ $alert->name ?? $alert->rule }} @if ($alert->faults) Faults: @foreach ($alert->faults as $key => $value) @php($unit = __(\"sensors.${value[\"sensor_class\"]}.unit\")) #{{ $key }}: {{ $value['sensor_descr'] ?? 'Sensor' }} Current: {{ $value['sensor_current'].$unit }} Previous: {{ $value['sensor_prev'].$unit }} Limit: {{ $value['sensor_limit'].$unit }} Over Limit: {{ round($value['sensor_current']-$value['sensor_limit'], 2).$unit }} @endforeach @endif","title":"Value Sensors (Temperature, Humidity, Fanspeed, ...)"},{"location":"Alerting/Templates/#memory-alert","text":"{{ $alert->title }} Device Name: {{ $alert->hostname }} Severity: {{ $alert->severity }} Uptime: {{ $alert->uptime_short }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Location: {{ $alert->location }} Description: {{ $alert->description }} Notes: {{ $alert->notes }} Server: {{ $alert->hostname }} @foreach ($alert->faults as $key => $value) Memory Description: {{ $value['mempool_descr'] }} Percent Utilized: {{ $value['mempool_perc'] }} @endforeach","title":"Memory Alert"},{"location":"Alerting/Templates/#advanced-options","text":"","title":"Advanced options"},{"location":"Alerting/Templates/#conditional-formatting","text":"Conditional formatting example, will display a link to the host in email or just the hostname in any other transport: @if ($alert->transport == 'mail')hostname }}/\">{{ $alert->hostname }} @else {{ $alert->hostname }} @endif","title":"Conditional formatting"},{"location":"Alerting/Templates/#traceroute-debugs","text":"@if ($alert->status == 0) @if ($alert->status_reason == 'icmp') {{ $alert->debug['traceroute'] }} @endif @endif","title":"Traceroute debugs"},{"location":"Alerting/Templates/#examples-html","text":"Note: To use HTML emails you must set HTML email to Yes in the WebUI under Global Settings > Alerting Settings > Email transport > Use HTML emails","title":"Examples HTML"},{"location":"Alerting/Templates/#graphs","text":"There are two helpers for graphs that will use a signed url to allow secure external access. Anyone using the signed url will be able to view the graph. Your LibreNMS web must be accessible from the location where the graph is viewed. Some alert transports require publicly accessible urls. APP_URL must be set in .env to use signed graphs. Changing APP_KEY will invalidate all previously issued singed urls. You may specify the graph one of two ways, a php array of parameters, or a direct url to a graph. Note that to and from can be specified either as timestamps with time() or as relative time -3d or -36h . When using relative time, the graph will show based on when the user views the graph, not when the event happened. Sharing a graph image with a relative time will always give the recipient access to current data, where a specific timestamp will only allow access to that timeframe.","title":"Graphs"},{"location":"Alerting/Templates/#signedgraphtag","text":"This will insert a specially formatted html img tag linking to the graph. Some transports may search the template for this tag to attach images properly for that transport. @signedGraphTag([ 'id' => $value['port_id'], 'type' => 'port_bits', 'from' => time() - 43200, 'to' => time(), 'width' => 700, 'height' => 250 ]) Output: < img class = \"librenms-graph\" src = \"https://librenms.org/graph?from=1662176216&height=250&id=20425&to=1662219416&type=port_bits&width=700&signature=f6e516e8fd893c772eeaba165d027cb400e15a515254de561a05b63bc6f360a4\" > Specific graph using url input: @signedGraphTag('https://librenms.org/graph.php?type=device_processor&from=-2d&device=2&legend=no&height=400&width=1200')","title":"@signedGraphTag"},{"location":"Alerting/Templates/#signedgraphurl","text":"This is used when you need the url directly. One example is using the API Transport, you may want to include the url only instead of a html tag. @signedGraphUrl([ 'id' => $value['port_id'], 'type' => 'port_bits', 'from' => time() - 43200, 'to' => time(), ])","title":"@signedGraphUrl"},{"location":"Alerting/Templates/#using-models-for-optional-data","text":"If some value does not exist within the $faults[] -array, you may query fields from the database using Laravel models. You may use models to query additional values and use them on the template by placing the model and the value to search for within the braces. For example, ISIS-alerts do have a port_id value associated with the alert but ifName is not directly accessible from the $faults[] -array. If the name of the port was needed, it's value could be queried using a template such as: {{ $alert->title }} Severity: {{ $alert->severity }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif @if ($alert->faults) Faults: @foreach ($alert->faults as $key => $value) Local interface: {{ \\App\\Models\\Port::find($value['port_id'])->ifName }} Adjacent IP: {{ $value['isisISAdjIPAddrAddress'] }} Adjacent state: {{ $value['isisISAdjState'] }} @endforeach @endif","title":"Using models for optional data"},{"location":"Alerting/Templates/#service-alert","text":"

            @if ($alert->state == 1) {{ $alert->severity }} @endif @if ($alert->state == 2) acknowledged @endif @if ($alert->state == 3) recovering @endif @if ($alert->state == 0) recovered @endif

            Host: {{ $alert->hostname }}
            Duration: {{ $alert->elapsed }}

            @if ($alert->faults) @foreach ($alert->faults as $key => $value) {{ $value['service_desc'] }} - {{ $value['service_type'] }}
            {{ $value['service_message'] }}

            @endforeach @endif
            ","title":"Service Alert"},{"location":"Alerting/Templates/#processor-alert-with-graph","text":"{{ $alert->title }}
            Severity: {{ $alert->severity }}
            @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }}
            Alert-ID: {{ $alert->id }}
            Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif
            @if ($alert->faults) Faults: @foreach ($alert->faults as $key => $value) {{ $key }}: {{ $value['string'] }}
            @endforeach @if ($alert->faults) Faults:
            @foreach ($alert->faults as $key => $value) @signedGraphTag(['device' => $value['device_id'], 'type' => 'device_processor', 'width' => 459, 'height' => 213, 'from' => time() - 259200])
            https://server/graphs/device={{ $value['device_id'] }}/type=device_processor/
            @endforeach Template: CPU alert
            @endif @endif","title":"Processor Alert with Graph"},{"location":"Alerting/Templates/#included","text":"We include a few templates for you to use, these are specific to the type of alert rules you are creating. For example if you create a rule that would alert on BGP sessions then you can assign the BGP template to this rule to provide more information. The included templates apart from the default template are: BGP Sessions Ports Temperature","title":"Included"},{"location":"Alerting/Templates/#other-examples","text":"","title":"Other Examples"},{"location":"Alerting/Templates/#microsoft-teams-markdown","text":"[{{ $alert->title }}](https://your.librenms.url/device/device={{ $alert->device_id }}/) **Device name:** {{ $alert->sysName }} **Severity:** {{ $alert->severity }} @if ($alert->state == 0) **Time elapsed:** {{ $alert->elapsed }} @endif **Timestamp:** {{ $alert->timestamp }} **Unique-ID:** {{ $alert->uid }} @if ($alert->name) **Rule:** {{ $alert->name }} @else **Rule:** {{ $alert->rule }} @endif @if ($alert->faults) **Faults:**@foreach ($alert->faults as $key => $value) {{ $key }}: {{ $value['string'] }} @endforeach @endif","title":"Microsoft Teams - Markdown"},{"location":"Alerting/Templates/#microsoft-teams-json","text":"{ \"@context\": \"https://schema.org/extensions\", \"@type\": \"MessageCard\", \"title\": \"{{ $alert->title }}\", @if ($alert->state === 0) \"themeColor\": \"00FF00\", @elseif ($alert->state === 1) \"themeColor\": \"FF0000\", @elseif ($alert->state === 2) \"themeColor\": \"337AB7\", @elseif ($alert->state === 3) \"themeColor\": \"FF0000\", @elseif ($alert->state === 4) \"themeColor\": \"F0AD4E\", @else \"themeColor\": \"337AB7\", @endif \"summary\": \"LibreNMS\", \"sections\": [ { @if ($alert->name) \"facts\": [ { \"name\": \"Rule:\", \"value\": \"[{{ $alert->name }}](https://your.librenms.url/device/device={{ $alert->device_id }}/tab=alert/)\" }, @else { \"name\": \"Rule:\", \"value\": \"[{{ $alert->rule }}](https://your.librenms.url/device/device={{ $alert->device_id }}/tab=alert/)\" }, @endif { \"name\": \"Severity:\", \"value\": \"{{ $alert->severity }}\" }, { \"name\": \"Unique-ID:\", \"value\": \"{{ $alert->uid }}\" }, { \"name\": \"Timestamp:\", \"value\": \"{{ $alert->timestamp }}\" }, @if ($alert->state == 0) { \"name\": \"Time elapsed:\", \"value\": \"{{ $alert->elapsed }}\" }, @endif { \"name\": \"Hostname:\", \"value\": \"[{{ $alert->hostname }}](https://your.librenms.url/device/device={{ $alert->device_id }}/)\" }, { \"name\": \"Hardware:\", \"value\": \"{{ $alert->hardware }}\" }, { \"name\": \"IP:\", \"value\": \"{{ $alert->ip }}\" }, { \"name\": \"Faults:\", \"value\": \" \" } ] @if ($alert->faults) @foreach ($alert->faults as $key => $value) }, { \"facts\": [ { \"name\": \"Port:\", \"value\": \"[{{ $value['ifName'] }}](https://your.librenms.url/device/device={{ $alert->device_id }}/tab=port/port={{ $value['port_id'] }}/)\" }, { \"name\": \"Description:\", \"value\": \"{{ $value['ifAlias'] }}\" }, @if ($alert->state != 0) { \"name\": \"Status:\", \"value\": \"down\" } ] @else { \"name\": \"Status:\", \"value\": \"up\" } ] @endif @endforeach @endif } ] }","title":"Microsoft Teams - JSON"},{"location":"Alerting/Testing/","text":"Rules The simplest way of testing if an alert rule will match a device is by going to the device, clicking edit (the cog), select Capture. From this new screen choose Alerts and click run. The output will cycle through all alerts applicable to this device and show you the Rule name, rule, MySQL query and if the rule matches. See Device Troubleshooting Transports You can test your transports by forcing an actual active alert to run regardless of the interval or delay values. ./scripts/test-alert.php . This script accepts -r for the rule id, -h for the device id or hostname and -d for debug. Templates It's possible to test your new template before assigning it to a rule. To do so you can run ./scripts/test-template.php . The script will provide the help info when ran without any parameters. As an example, if you wanted to test template ID 10 against localhost running rule ID 2 then you would run: ./scripts/test-template.php -t 10 -d -h localhost -r 2 If the rule is currently alerting for localhost then you will get the full template as expected to see on email, if it's not then you will just see the template without any fault information.","title":"Testing"},{"location":"Alerting/Testing/#rules","text":"The simplest way of testing if an alert rule will match a device is by going to the device, clicking edit (the cog), select Capture. From this new screen choose Alerts and click run. The output will cycle through all alerts applicable to this device and show you the Rule name, rule, MySQL query and if the rule matches. See Device Troubleshooting","title":"Rules"},{"location":"Alerting/Testing/#transports","text":"You can test your transports by forcing an actual active alert to run regardless of the interval or delay values. ./scripts/test-alert.php . This script accepts -r for the rule id, -h for the device id or hostname and -d for debug.","title":"Transports"},{"location":"Alerting/Testing/#templates","text":"It's possible to test your new template before assigning it to a rule. To do so you can run ./scripts/test-template.php . The script will provide the help info when ran without any parameters. As an example, if you wanted to test template ID 10 against localhost running rule ID 2 then you would run: ./scripts/test-template.php -t 10 -d -h localhost -r 2 If the rule is currently alerting for localhost then you will get the full template as expected to see on email, if it's not then you will just see the template without any fault information.","title":"Templates"},{"location":"Alerting/Transports/","text":"Transports Transports are located within LibreNMS/Alert/Transport/ and can be configured within the WebUI under Alerts -> Alert Transports. Contacts will be gathered automatically and passed to the configured transports. By default the Contacts will be only gathered when the alert triggers and will ignore future changes in contacts for the incident. If you want contacts to be re-gathered before each dispatch, please set 'Updates to contact email addresses not honored' to Off in the WebUI. The contacts will always include the SysContact defined in the Device's SNMP configuration and also every LibreNMS user that has at least read -permissions on the entity that is to be alerted. At the moment LibreNMS only supports Port or Device permissions. You can exclude the SysContact by toggling 'Issue alerts to sysContact'. To include users that have Global-Read , Administrator or Normal-User permissions it is required to toggle the options: Issue alerts to admins. Issue alerts to read only users Issue alerts to normal users. Using a Proxy Proxy Configuration Using a AMQP based Transport You need to install an additional php module : bcmath Alerta The alerta monitoring system is a tool used to consolidate and de-duplicate alerts from multiple sources for quick \u2018at-a-glance\u2019 visualisation. With just one system you can monitor alerts from many other monitoring tools on a single screen. Example: Config Example API Endpoint http://alerta.example.com/api/alert Environment Production Apy key api key with write permission Alert state critical Recover state cleared Alertmanager Alertmanager is an alert handling software, initially developed for alert processing sent by Prometheus. It has built-in functionality for deduplicating, grouping and routing alerts based on configurable criteria. LibreNMS uses alert grouping by alert rule, which can produce an array of alerts of similar content for an array of hosts, whereas Alertmanager can group them by alert meta, ideally producing one single notice in case an issue occurs. It is possible to configure as many label values as required in Alertmanager Options section. Every label and its value should be entered as a new line. Labels can be a fixed string or a dynamic variable from the alert. To set a dynamic variable your label must start with extra_ then complete with the name of your label (only characters, figures and underscore are allowed here). The value must be the name of the variable you want to get (you can see all the variables in Alerts->Notifications by clicking on the Details icon of your alert when it is pending). If the variable's name does not match with an existing value the label's value will be the string you provided just as it was a fixed string. Multiple Alertmanager URLs (comma separated) are supported. Each URL will be tried and the search will stop at the first success. Basic HTTP authentication with a username and a password is supported. If you let those value blank, no authentication will be used. Alertmanager Docs Example: Config Example Alertmanager URL(s) http://alertmanager1.example.com,http://alertmanager2.example.com Alertmanager Username myUsername Alertmanager Password myPassword Alertmanager Options: source=librenms customlabel=value extra_dynamic_value=variable_name API The API transport allows to reach any service provider using POST, PUT or GET URLs (Like SMS provider, etc). It can be used in multiple ways: The same text built from the Alert template is available in the variable $msg , which can then be sent as an option to the API. Be carefull that HTTP GET requests are usually limited in length. The API-Option fields can be directly built from the variables defined in Template-Syntax but without the 'alert->' prefix. For instance, $alert->uptime is available as $uptime in the API transport The API-Headers allows you to add the headers that the api endpoint requires. The API-body allow sending data in the format required by the API endpoint. A few variables commonly used : Variable Description {{ $hostname }} Hostname {{ $sysName }} SysName {{ $sysDescr }} SysDescr {{ $os }} OS of device (librenms defined) {{ $type }} Type of device (librenms defined) {{ $ip }} IP Address {{ $hardware }} Hardware {{ $version }} Version {{ $uptime }} Uptime in seconds {{ $uptime_short }} Uptime in human-readable format {{ $timestamp }} Timestamp of alert {{ $description }} Description of device {{ $title }} Title (as built from the Alert Template) {{ $msg }} Body text (as built from the Alert Template) Example: The example below will use the API named sms-api of my.example.com and send the title of the alert to the provided number using the provided service key. Refer to your service documentation to configure it properly. Config Example API Method GET API URL http://my.example.com/sms-api API Options rcpt=0123456789 key=0987654321abcdef msg=(LNMS) {{ $title }} API Username myUsername API Password myPassword The example below will use the API named wall-display of my.example.com and send the title and text of the alert to a screen in the Network Operation Center. Config Example API Method POST API URL http://my.example.com/wall-display API Options title={{ $title }} msg={{ $msg }} The example below will use the API named component of my.example.com with id 1, body as json status value and headers send token authentication and content type required. Config Example API Method PUT API URL http://my.example.com/comonent/1 API Headers X-Token=HASH Content-Type=application/json API Body { \"status\": 2 } aspSMS aspSMS is a SMS provider that can be configured by using the generic API Transport. You need a token you can find on your personnal space. aspSMS docs Example: Config Example Transport type Api API Method POST API URL https://soap.aspsms.com/aspsmsx.asmx/SimpleTextSMS Options UserKey=USERKEY Password=APIPASSWORD Recipient=RECIPIENT Originator=ORIGINATOR MessageText={{ $msg }} Browser Push Browser push notifications can send a notification to the user's device even when the browser is not open. This requires HTTPS, the PHP GMP extension, Push API support, and permissions on each device to send alerts. Simply configure an alert transport and allow notification permission on the device(s) you wish to receive alerts on. You may disable alerts on a browser on the user preferences page. Canopsis Canopsis is a hypervision tool. LibreNMS can send alerts to Canopsis which are then converted to canopsis events. Canopsis Docs Example: Config Example Hostname www.xxx.yyy.zzz Port Number 5672 User admin Password my_password Vhost canopsis Cisco Spark (aka Webex Teams) Cisco Spark (now known as Webex Teams). LibreNMS can send alerts to a Cisco Spark room. To make this possible you need to have a RoomID and a token. You can also choose to send alerts using Markdown syntax. Enabling this option provides for more richly formatted alerts, but be sure to adjust your alert template to account for the Markdown syntax. For more information about Cisco Spark RoomID and token, take a look here : Getting started Rooms Example: Config Example API Token ASd23r23edewda RoomID 34243243251 Use Markdown? x Clickatell Clickatell provides a REST-API requiring an Authorization-Token and at least one Cellphone number. Clickatell Docs Here an example using 3 numbers, any amount of numbers is supported: Example: Config Example Token dsaWd3rewdwea Mobile Numbers +1234567890,+1234567891,+1234567892 Discord The Discord transport will POST the alert message to your Discord Incoming WebHook. Simple html tags are stripped from the message. The only required value is for url, without this no call to Discord will be made. The Options field supports the JSON/Form Params listed in the Discord Docs below. Discord Docs Example: Config Example Discord URL https://discordapp.com/api/webhooks/4515489001665127664/82-sf4385ysuhfn34u2fhfsdePGLrg8K7cP9wl553Fg6OlZuuxJGaa1d54fe Options username=myname Elasticsearch You can have LibreNMS send alerts to an elasticsearch database. Each fault will be sent as a separate document. Example: Config Example Host 127.0.0.1 Port 9200 Index Pattern \\l\\i\\b\\r\\e\\n\\m\\s-Y.m.d GitLab LibreNMS will create issues for warning and critical level alerts however only title and description are set. Uses Personal access tokens to authenticate with GitLab and will store the token in cleartext. Example: Config Example Host http://gitlab.host.tld Project ID 1 Personal Access Token AbCdEf12345 Grafana Oncall Send alerts to Grafana Oncall using a Formatted Webhook Example: Config Example Webhook URL https://a-prod-us-central-0.grafana.net/integrations/v1/formatted_webhook/m12xmIjOcgwH74UF8CN4dk0Dh/ HipChat See the HipChat API Documentation for rooms/message for details on acceptable values. You may notice that the link points at the \"deprecated\" v1 API. This is because the v2 API is still in beta. Example: Config Example API URL https://api.hipchat.com/v1/rooms/message?auth_token=109jawregoaihj Room ID 7654321 From Name LibreNMS Options color=red At present the following options are supported: color . Note: The default message format for HipChat messages is HTML. It is recommended that you specify the text message format to prevent unexpected results, such as HipChat attempting to interpret angled brackets ( < and > ). IRC The IRC transports only works together with the LibreNMS IRC-Bot. Configuration of the LibreNMS IRC-Bot is described here . Example: Config Example IRC enabled JIRA You can have LibreNMS create issues on a Jira instance for critical and warning alerts using either the Jira REST API or webhooks. Custom fields allow you to add any required fields beyond summary and description fields in case mandatory fields are required by your Jira project/issue type configuration. Custom fields are defined in JSON format but ustom fields allow you to add any required fields beyond summary and description fields in case mandatory fields are required by your Jira project/issue type configuration. Custom fields are defined in JSON format. Currently http authentication is used to access Jira and Jira username and password will be stored as cleartext in the LibreNMS database. REST API The config fields that need to set for Jira REST API are: Jira Open URL, Jira username, Jira password, Project key, and issue type. Note: REST API is that it is only able to open new tickets. Webhooks The config fields that need to set for webhooks are: Jira Open URL, Jira Close URL, Jira username, Jira password and webhook ID. Note: Webhooks allow more control over how alerts are handled in Jira. With webhooks, recovery messages can be sent to a different URL than alerts. Additionally, a custom conditional logic can be built using the webhook payload and ID to automatically close an open ticket if predefined conditions are met. Jira Issue Types Jira Webhooks Example: Config Example Project Key JIRAPROJECTKEY Issue Type Myissuetype Open URL https://myjira.mysite.com / https://webhook-open-url Close URL https://webhook-close-url Jira Username myjirauser Jira Password myjirapass Enable webhook ON/OFF Webhook ID alert_id Custom Fileds {\"components\":[{\"id\":\"00001\"}], \"source\": \"LibrenNMS\"} Jira Service Management Using Jira Service Management LibreNMS integration, LibreNMS forwards alerts to Jira Service Management with detailed information. Jira Service Management acts as a dispatcher for LibreNMS alerts, determines the right people to notify based on on-call schedules and notifies via email, text messages (SMS), phone calls and iOS & Android push notifications. Then escalates alerts until the alert is acknowledged or closed. :warning: If the feature isn\u2019t available on your site, keep checking Jira Service Management for updates. Example: Config Example WebHook URL https://url/path/to/webhook LINE Messaging API LINE Messaging API Docs Here is the step for setup a LINE bot and using it in LibreNMS. Use your real LINE account register in developer protal . Add a new channel, choose Messaging API and continue fill up the forms, note that Channel name cannot edit later. Go to \"Messaging API\" tab of your channel, here listing some important value. Bot basic ID and QR code is your LINE bot's ID and QR code. Channel access token (long-lived) , will use it in LibreNMS, keep it safe. Use your real Line account add your LINE bot as a friend. Recipient ID can be groupID , userID or roomID , it will be used in LibreNMS to send message to a group or a user. Use the following NodeJS program and ngrok for temporally https webhook to listen it. LINE-bot-RecipientFetcher Run the program and using ngrok expose port to public $ node index.js $ ngrok http 3000 Go to \"Messaging API\" tab of your channel, fill up Webhook URL to https:///webhook If you want to let LINE bot send message to a yourself, use your real account to send a message to your LINE bot. Program will print out the userID in console. sample value: {\"type\":\"user\",\"userId\":\"U527xxxxxxxxxxxxxxxxxxxxxxxxxc0ee\"} If you want to let LINE bot send message to a group, do the following steps. Add your LINE bot into group Use your real account to send a message to group Program will print out the groupID in console, it will be Recipient ID, keep it safe. sample value: {\"type\":\"group\",\"groupId\":\"Ce51xxxxxxxxxxxxxxxxxxxxxxxxxx6ef\",\"userId\":\"U527xxxxxxxxxxxxxxxxxxxxxxxxxc0ee\"} ``` Example: Config Example Access token fhJ9vH2fsxxxxxxxxxxxxxxxxxxxxlFU= Recipient (groupID, userID or roomID) Ce51xxxxxxxxxxxxxxxxxxxxxxxxxx6ef LINE Notify LINE Notify LINE Notify API Document Example: Config Example Token AbCdEf12345 Mail The E-Mail transports uses the same email-configuration as the rest of LibreNMS. As a small reminder, here is its configuration directives including defaults: Emails will attach all graphs included with the @signedGraphTag directive. If the email format is set to html, they will be embedded. To disable attaching images, set email_attach_graphs to false. alerting/email lnms config:set email_html true lnms config:set email_attach_graphs false Example: Config Example Email me@example.com Matrix For using the Matrix transports, you have to create a room on the Matrix-server. The provided Auth_token belongs to an user, which is member of this room. The Message, sent to the matrix-room can be built from the variables defined in Template-Syntax but without the 'alert->' prefix. See API-Transport. The variable $msg is contains the result of the Alert template.The Matrix-Server URL is cutted before the beginning of the _matrix/client/r0/... API-part. Example: Config Example Matrix-Server URL https://matrix.example.com/ Room !ajPbbPalmVbNuQoBDK:example.com Auth_token: MDAyYmxvY2F0aW9uI...z1DCn6lz_uOhtW3XRICg Message: Alert: {{ $msg }} https://librenms.example.com Messagebird LibreNMS can send text messages through Messagebird Rest API transport. Config Example Api Key Api rest key given in the messagebird dashboard Originator E.164 formatted originator Recipient E.164 formatted recipient for multi recipents comma separated Character limit Range 1..480 (max 3 split messages) Messagebird Voice LibreNMS can send messages through Messagebird voice Rest API transport (text to speech). Config Example Api Key Api rest key given in the messagebird dashboard Originator E.164 formatted originator Recipient E.164 formatted recipient for multi recipents comma separated Language Select box for options Spoken voice Female or Male Repeat X times the message is repeated Microsoft Teams LibreNMS can send alerts to Microsoft Teams Incoming Webhooks which are then posted to a specific channel. Microsoft recommends using markdown formatting for connector cards. Administrators can opt to compose the MessageCard themselves using JSON to get the full functionality. Example: Config Example WebHook URL https://outlook.office365.com/webhook/123456789 Use JSON? x Nagios Compatible The nagios transport will feed a FIFO at the defined location with the same format that nagios would. This allows you to use other alerting systems with LibreNMS, for example Flapjack . Example: Config Example Nagios FIFO /path/to/my.fifo OpsGenie Using OpsGenie LibreNMS integration, LibreNMS forwards alerts to OpsGenie with detailed information. OpsGenie acts as a dispatcher for LibreNMS alerts, determines the right people to notify based on on-call schedules and notifies via email, text messages (SMS), phone calls and iOS & Android push notifications. Then escalates alerts until the alert is acknowledged or closed. Create a LibreNMS Integration from the integrations page once you signup. Then copy the API key from OpsGenie to LibreNMS. If you want to automatically ack and close alerts, leverage Marid integration. More detail with screenshots is available in OpsGenie LibreNMS Integration page . Example: Config Example WebHook URL https://url/path/to/webhook osTicket LibreNMS can send alerts to osTicket API which are then converted to osTicket tickets. Example: Config Example API URL http://osticket.example.com/api/http.php/tickets.json API Token 123456789 PagerDuty LibreNMS can make use of PagerDuty, this is done by utilizing an API key and Integraton Key. API Keys can be found under 'API Access' in the PagerDuty portal. Integration Keys can be found under 'Integration' for the particular Service you have created in the PagerDuty portal. Example: Config Example API Key randomsample Integration Key somerandomstring Philips Hue Want to spice up your noc life? LibreNMS will flash all lights connected to your philips hue bridge whenever an alert is triggered. To setup, go to the you http:// your-bridge-ip /debug/clip.html Update the \"URL:\" field to /api Paste this in the \"Message Body\" {\"devicetype\":\"librenms\"} Press the round button on your philips Hue Bridge Click on POST In the Command Response You should see output with your username. Copy this without the quotes More Info: Philips Hue Documentation Example: Config Example Host http://your-bridge-ip Hue User username Duration 1 Second PlaySMS PlaySMS is an open source SMS-Gateway that can be used via their HTTP API using a Username and WebService Token. Please consult PlaySMS's documentation regarding number formatting. PlaySMS Docs Here an example using 3 numbers, any amount of numbers is supported: Example: Config Example PlaySMS https://localhost/index.php User user1 Token MYFANCYACCESSTOKEN From My Name Mobiles +1234567892,+1234567890,+1234567891 Pushbullet Get your Access Token from your Pushbullet's settings page and set it in your transport: Example: Config Example Access Token MYFANCYACCESSTOKEN Pushover If you want to change the default notification sound for all notifications then you can add the following in Pushover Options: sound=falling You also have the possibility to change sound per severity: sound_critical=falling sound_warning=siren sound_ok=magic Enabling Pushover support is fairly easy, there are only two required parameters. Firstly you need to create a new Application (called LibreNMS, for example) in your account on the Pushover website ( https://pushover.net/apps ). Now copy your API Key and obtain your User Key from the newly created Application and setup the transport. Pushover Docs Example: Config Example Api Key APPLICATIONAPIKEYGOESHERE User Key USERKEYGOESHERE Pushover Options sound_critical=falling sound_warning=siren sound_ok=magic Rocket.chat The Rocket.chat transport will POST the alert message to your Rocket.chat Incoming WebHook using the attachments option. Simple html tags are stripped from the message. All options are optional, the only required value is for url, without this then no call to Rocket.chat will be made. Rocket.chat Docs Example: Config Example Webhook URL https://rocket.url/api/v1/chat.postMessage Rocket.chat Options channel=#Alerting username=myname icon_url=http://someurl/image.gif icon_emoji=:smirk: Sensu The Sensu transport will POST an Event to the Agent API upon an alert being generated. It will be categorised (ok, warning or critical), and if you configure the alert to send recovery notifications, Sensu will also clear the alert automatically. No configuration is required - as long as you are running the Sensu Agent on your poller with the HTTP socket enabled on tcp/3031, LibreNMS will start generating Sensu events as soon as you create the transport. Acknowledging alerts within LibreNMS is not directly supported, but an annotation ( acknowledged ) is set, so a mutator or silence, or even the handler could be written to look for it directly in the handler. There is also an annotation ( generated-by ) set, to allow you to treat LibreNMS events differently from agent events. The 'shortname' option is a simple way to reduce the length of device names in configs. It replaces the last 3 domain components with single letters (e.g. websrv08.dc4.eu.corp.example.net gets shortened to websrv08.dc4.eu.cen). Limitations Only a single namespace is supported Sensu will reject rules with special characters - the Transport will attempt to fix up rule names, but it's best to stick to letters, numbers and spaces The transport only deals in absolutes - it ignores the got worse/got better states The agent will buffer alerts, but LibreNMS will not - if your agent is offline, alerts will be dropped There is no backchannel between Sensu and LibreNMS - if you make changes in Sensu to LibreNMS alerts, they'll be lost on the next event (silences will work) Example: Config Example Sensu Endpoint http://localhost:3031 Sensu Namespace eu-west Check Prefix lnms Source Key hostname Slack The Slack transport will POST the alert message to your Slack Incoming WebHook using the attachments option, you are able to specify multiple webhooks along with the relevant options to go with it. Simple html tags are stripped from the message. All options are optional, the only required value is for url, without this then no call to Slack will be made. We currently support the following attachment options: author_name Slack docs Example: Config Example Webhook URL https://slack.com/url/somehook Slack Options author_name=Me SMSEagle SMSEagle is a hardware SMS Gateway that can be used via their HTTP API using a Username and password. Destination numbers are one per line, with no spaces. They can be in either local or international dialling format. SMSEagle Docs Example: Config Example SMSEagle Host ip.add.re.ss User smseagle_user Password smseagle_user_password Mobiles +3534567890 0834567891 SMSmode SMSmode is a SMS provider that can be configured by using the generic API Transport. You need a token you can find on your personnal space. SMSmode docs Example: Config Example Transport type Api API Method POST API URL http://api.smsmode.com/http/1.6/sendSMS.do Options accessToken= PUT_HERE_YOUR_TOKEN numero= PUT_HERE_DESTS_NUMBER_COMMA_SEPARATED message={{ $msg }} Splunk LibreNMS can send alerts to a Splunk instance and provide all device and alert details. Example output: Feb 21 15:21:52 nms hostname=\"localhost\", sysName=\"localhost\", sysDescr=\"\", sysContact=\"\", os=\"fortigate\", type=\"firewall\", ip=\"localhost\", hardware=\"FGT_50E\", version=\"v5.6.9\", serial=\"\", features=\"\", location=\"\", uptime=\"387\", uptime_short=\" 6m 27s\", uptime_long=\" 6 minutes 27 seconds\", description=\"\", notes=\"\", alert_notes=\"\", device_id=\"0\", rule_id=\"0\", id=\"0\", proc=\"\", status=\"1\", status_reason=\"\", ping_timestamp=\"\", ping_loss=\"0\", ping_min=\"25.6\", ping_max=\"26.8\", ping_avg=\"26.3\", title=\"localhost recovered from Device up/down \", elapsed=\"14m 54s\", uid=\"0\", alert_id=\"0\", severity=\"critical\", name=\"Device up/down\", timestamp=\"2020-02-21 15:21:33\", state=\"0\", device_device_id=\"0\", device_inserted=\"\", device_hostname=\"localhost\", device_sysName=\"localhost\", device_ip=\"localhost\", device_overwrite_ip=\"\", device_timeout=\"\", device_retries=\"\", device_snmp_disable=\"0\", device_bgpLocalAs=\"0\", device_sysObjectID=\"\", device_sysDescr=\"\", device_sysContact=\"\", device_version=\"v5.6.9\", device_hardware=\"FGT_50E\", device_features=\"build1673\", device_location_id=\"\", device_os=\"fortigate\", device_status=\"1\", device_status_reason=\"\", device_ignore=\"0\", device_disabled=\"0\", device_uptime=\"387\", device_agent_uptime=\"0\", device_last_polled=\"2020-02-21 15:21:33\", device_last_poll_attempted=\"\", device_last_polled_timetaken=\"7.9\", device_last_discovered_timetaken=\"11.77\", device_last_discovered=\"2020-02-21 13:16:42\", device_last_ping=\"2020-02-21 15:21:33\", device_last_ping_timetaken=\"26.3\", device_purpose=\"\", device_type=\"firewall\", device_serial=\"FGT50EXXX\", device_icon=\"images/os/fortinet.svg\", device_poller_group=\"0\", device_override_sysLocation=\"0\", device_notes=\"\", device_port_association_mode=\"1\", device_max_depth=\"0\", device_disable_notify=\"0\", device_location=\"\", device_vrf_lites=\"Array\", device_lat=\"\", device_lng=\"\", - sysObjectID => \"\"; ` Each alert will be sent as a separate message. Example: Config Example Host 127.0.0.1 UDP Port 514 Syslog You can have LibreNMS emit alerts as syslogs complying with RFC 3164. More information on RFC 3164 can be found here: https://tools.ietf.org/html/rfc3164 Example output: <26> Mar 22 00:59:03 librenms.host.net librenms[233]: [Critical] network.device.net: Port Down - port_id => 98939; ifDescr => xe-1/1/0; Each fault will be sent as a separate syslog. Example: Config Example Host 127.0.0.1 Port 514 Facility 3 Telegram Thank you to snis for these instructions. First you must create a telegram account and add BotFather to you list. To do this click on the following url: https://telegram.me/botfather Generate a new bot with the command \"/newbot\" BotFather is then asking for a username and a normal name. After that your bot is created and you get a HTTP token. (for more options for your bot type \"/help\") Add your bot to telegram with the following url: http://telegram.me/ to use app or https://web.telegram.org/ to use in web, and send some text to the bot. The BotFather should have responded with a token, copy your token code and go to the following page in chrome: https://api.telegram.org/bot/getUpdates (this could take a while so continue to refresh until you see something similar to below) You see a json code with the message you sent to the bot. Copy the Chat id. In this example that is \u201c-9787468\u201d within this example: \"message\":{\"message_id\":7,\"from\":\"id\":656556,\"first_name\":\"Joo\",\"last_name\":\"Doo\",\"username\":\"JohnDoo\"},\"chat\":{\"id\":-9787468,\"title\":\"Telegram Group\"},\"date\":1435216924,\"text\":\"Hi\"}}]} . Now create a new \"Telegram transport\" in LibreNMS (Global Settings -> Alerting Settings -> Telegram transport). Click on 'Add Telegram config' and put your chat id and token into the relevant box. If want to use a group to receive alerts, you need to pick the Chat ID of the group chat, and not of the Bot itself. Telegram Docs Example: Config Example Chat ID 34243432 Token 3ed32wwf235234 Format HTML or MARKDOWN Twilio SMS Twilio will send your alert via SMS. From your Twilio account you will need your account SID, account token and your Twilio SMS phone number that you would like to send the alerts from. Twilio's APIs are located at: https://www.twilio.com/docs/api?filter-product=sms Example: Config Example SID ACxxxxxxxxxxxxxxxxxxxxxxxxxxxx Token 7xxxx573acxxxbc2xxx308d6xxx652d32 Twilio SMS Number 8888778660 UKFast PSS UKFast PSS tickets can be raised from alerts using the UKFastPSS transport. This required an API key with PSS write permissions Example: Config Example API Key ABCDefgfg12 Author 5423 Priority Critical Secure true VictorOps VictorOps provide a webHook url to make integration extremely simple. To get the URL required login to your VictorOps account and go to: Settings -> Integrations -> REST Endpoint -> Enable Integration. The URL provided will have $routing_key at the end, you need to change this to something that is unique to the system sending the alerts such as librenms. I.e: https://alert.victorops.com/integrations/generic/20132414/alert/2f974ce1-08fc-4dg8-a4f4-9aee6cf35c98/librenms Example: Config Example Post URL https://alert.victorops.com/integrations/generic/20132414/alert/2f974ce1-08fc-4dg8-a4f4-9aee6cf35c98/librenms Kayako Classic LibreNMS can send alerts to Kayako Classic API which are then converted to tickets. To use this module, you need REST API feature enabled in Kayako Classic and configured email account at LibreNMS. To enable this, do this: AdminCP -> REST API -> Settings -> Enable API (Yes) Also you need to know the department id to provide tickets to appropriate department and a user email to provide, which is used as ticket author. To get department id: navigate to appropriate department name at the departments list page in Admin CP and watch the number at the end of url. Example: http://servicedesk.example.com/admin/Base/Department/Edit/17 . Department ID is 17 As a requirement, you have to know API Url, API Key and API Secret to connect to servicedesk Kayako REST API Docs Example: Config Example Kayako URL http://servicedesk.example.com/api/ Kayako API Key 8cc02f38-7465-4a0c-8730-bb3af122167b Kayako API Secret Y2NhZDIxNDMtNjVkMi0wYzE0LWExYTUtZGUwMjJiZDI0ZWEzMmRhOGNiYWMtNTU2YS0yODk0LTA1MTEtN2VhN2YzYzgzZjk5 Kayako Department 1 Signal CLI Use the Signal Mesenger for Alerts. Run the Signal CLI with the D-Bus option. GitHub Project Example: Config Example Path /opt/signal-cli/bin/signal-cli Recipient type Group Recipient dfgjsdkgljior4345== SMSFeedback SMSFeedback is a SAAS service, which can be used to deliver Alerts via API, using API url, Username & Password. They can be in international dialling format only. SMSFeedback Api Docs Example: Config Example User smsfeedback_user Password smsfeedback_password Mobiles 71234567890 Sender name CIA Zenduty Leveraging LibreNMS<>Zenduty Integration, users can send new LibreNMS alerts to the right team and notify them based on on-call schedules via email, SMS, Phone Calls, Slack, Microsoft Teams and mobile push notifications. Zenduty provides engineers with detailed context around the LibreNMS alert along with playbooks and a complete incident command framework to triage, remediate and resolve incidents with speed. Create a LibreNMS Integration from inside Zenduty , then copy the Webhook URL from Zenduty to LibreNMS. For a detailed guide with screenshots, refer to the LibreNMS documentation at Zenduty . Example: Config Example WebHook URL https://www.zenduty.com/api/integration/librenms/integration-key/","title":"Transports"},{"location":"Alerting/Transports/#transports","text":"Transports are located within LibreNMS/Alert/Transport/ and can be configured within the WebUI under Alerts -> Alert Transports. Contacts will be gathered automatically and passed to the configured transports. By default the Contacts will be only gathered when the alert triggers and will ignore future changes in contacts for the incident. If you want contacts to be re-gathered before each dispatch, please set 'Updates to contact email addresses not honored' to Off in the WebUI. The contacts will always include the SysContact defined in the Device's SNMP configuration and also every LibreNMS user that has at least read -permissions on the entity that is to be alerted. At the moment LibreNMS only supports Port or Device permissions. You can exclude the SysContact by toggling 'Issue alerts to sysContact'. To include users that have Global-Read , Administrator or Normal-User permissions it is required to toggle the options: Issue alerts to admins. Issue alerts to read only users Issue alerts to normal users.","title":"Transports"},{"location":"Alerting/Transports/#using-a-proxy","text":"Proxy Configuration","title":"Using a Proxy"},{"location":"Alerting/Transports/#using-a-amqp-based-transport","text":"You need to install an additional php module : bcmath","title":"Using a AMQP based Transport"},{"location":"Alerting/Transports/#alerta","text":"The alerta monitoring system is a tool used to consolidate and de-duplicate alerts from multiple sources for quick \u2018at-a-glance\u2019 visualisation. With just one system you can monitor alerts from many other monitoring tools on a single screen. Example: Config Example API Endpoint http://alerta.example.com/api/alert Environment Production Apy key api key with write permission Alert state critical Recover state cleared","title":"Alerta"},{"location":"Alerting/Transports/#alertmanager","text":"Alertmanager is an alert handling software, initially developed for alert processing sent by Prometheus. It has built-in functionality for deduplicating, grouping and routing alerts based on configurable criteria. LibreNMS uses alert grouping by alert rule, which can produce an array of alerts of similar content for an array of hosts, whereas Alertmanager can group them by alert meta, ideally producing one single notice in case an issue occurs. It is possible to configure as many label values as required in Alertmanager Options section. Every label and its value should be entered as a new line. Labels can be a fixed string or a dynamic variable from the alert. To set a dynamic variable your label must start with extra_ then complete with the name of your label (only characters, figures and underscore are allowed here). The value must be the name of the variable you want to get (you can see all the variables in Alerts->Notifications by clicking on the Details icon of your alert when it is pending). If the variable's name does not match with an existing value the label's value will be the string you provided just as it was a fixed string. Multiple Alertmanager URLs (comma separated) are supported. Each URL will be tried and the search will stop at the first success. Basic HTTP authentication with a username and a password is supported. If you let those value blank, no authentication will be used. Alertmanager Docs Example: Config Example Alertmanager URL(s) http://alertmanager1.example.com,http://alertmanager2.example.com Alertmanager Username myUsername Alertmanager Password myPassword Alertmanager Options: source=librenms customlabel=value extra_dynamic_value=variable_name","title":"Alertmanager"},{"location":"Alerting/Transports/#api","text":"The API transport allows to reach any service provider using POST, PUT or GET URLs (Like SMS provider, etc). It can be used in multiple ways: The same text built from the Alert template is available in the variable $msg , which can then be sent as an option to the API. Be carefull that HTTP GET requests are usually limited in length. The API-Option fields can be directly built from the variables defined in Template-Syntax but without the 'alert->' prefix. For instance, $alert->uptime is available as $uptime in the API transport The API-Headers allows you to add the headers that the api endpoint requires. The API-body allow sending data in the format required by the API endpoint. A few variables commonly used : Variable Description {{ $hostname }} Hostname {{ $sysName }} SysName {{ $sysDescr }} SysDescr {{ $os }} OS of device (librenms defined) {{ $type }} Type of device (librenms defined) {{ $ip }} IP Address {{ $hardware }} Hardware {{ $version }} Version {{ $uptime }} Uptime in seconds {{ $uptime_short }} Uptime in human-readable format {{ $timestamp }} Timestamp of alert {{ $description }} Description of device {{ $title }} Title (as built from the Alert Template) {{ $msg }} Body text (as built from the Alert Template) Example: The example below will use the API named sms-api of my.example.com and send the title of the alert to the provided number using the provided service key. Refer to your service documentation to configure it properly. Config Example API Method GET API URL http://my.example.com/sms-api API Options rcpt=0123456789 key=0987654321abcdef msg=(LNMS) {{ $title }} API Username myUsername API Password myPassword The example below will use the API named wall-display of my.example.com and send the title and text of the alert to a screen in the Network Operation Center. Config Example API Method POST API URL http://my.example.com/wall-display API Options title={{ $title }} msg={{ $msg }} The example below will use the API named component of my.example.com with id 1, body as json status value and headers send token authentication and content type required. Config Example API Method PUT API URL http://my.example.com/comonent/1 API Headers X-Token=HASH Content-Type=application/json API Body { \"status\": 2 }","title":"API"},{"location":"Alerting/Transports/#aspsms","text":"aspSMS is a SMS provider that can be configured by using the generic API Transport. You need a token you can find on your personnal space. aspSMS docs Example: Config Example Transport type Api API Method POST API URL https://soap.aspsms.com/aspsmsx.asmx/SimpleTextSMS Options UserKey=USERKEY Password=APIPASSWORD Recipient=RECIPIENT Originator=ORIGINATOR MessageText={{ $msg }}","title":"aspSMS"},{"location":"Alerting/Transports/#browser-push","text":"Browser push notifications can send a notification to the user's device even when the browser is not open. This requires HTTPS, the PHP GMP extension, Push API support, and permissions on each device to send alerts. Simply configure an alert transport and allow notification permission on the device(s) you wish to receive alerts on. You may disable alerts on a browser on the user preferences page.","title":"Browser Push"},{"location":"Alerting/Transports/#canopsis","text":"Canopsis is a hypervision tool. LibreNMS can send alerts to Canopsis which are then converted to canopsis events. Canopsis Docs Example: Config Example Hostname www.xxx.yyy.zzz Port Number 5672 User admin Password my_password Vhost canopsis","title":"Canopsis"},{"location":"Alerting/Transports/#cisco-spark-aka-webex-teams","text":"Cisco Spark (now known as Webex Teams). LibreNMS can send alerts to a Cisco Spark room. To make this possible you need to have a RoomID and a token. You can also choose to send alerts using Markdown syntax. Enabling this option provides for more richly formatted alerts, but be sure to adjust your alert template to account for the Markdown syntax. For more information about Cisco Spark RoomID and token, take a look here : Getting started Rooms Example: Config Example API Token ASd23r23edewda RoomID 34243243251 Use Markdown? x","title":"Cisco Spark (aka Webex Teams)"},{"location":"Alerting/Transports/#clickatell","text":"Clickatell provides a REST-API requiring an Authorization-Token and at least one Cellphone number. Clickatell Docs Here an example using 3 numbers, any amount of numbers is supported: Example: Config Example Token dsaWd3rewdwea Mobile Numbers +1234567890,+1234567891,+1234567892","title":"Clickatell"},{"location":"Alerting/Transports/#discord","text":"The Discord transport will POST the alert message to your Discord Incoming WebHook. Simple html tags are stripped from the message. The only required value is for url, without this no call to Discord will be made. The Options field supports the JSON/Form Params listed in the Discord Docs below. Discord Docs Example: Config Example Discord URL https://discordapp.com/api/webhooks/4515489001665127664/82-sf4385ysuhfn34u2fhfsdePGLrg8K7cP9wl553Fg6OlZuuxJGaa1d54fe Options username=myname","title":"Discord"},{"location":"Alerting/Transports/#elasticsearch","text":"You can have LibreNMS send alerts to an elasticsearch database. Each fault will be sent as a separate document. Example: Config Example Host 127.0.0.1 Port 9200 Index Pattern \\l\\i\\b\\r\\e\\n\\m\\s-Y.m.d","title":"Elasticsearch"},{"location":"Alerting/Transports/#gitlab","text":"LibreNMS will create issues for warning and critical level alerts however only title and description are set. Uses Personal access tokens to authenticate with GitLab and will store the token in cleartext. Example: Config Example Host http://gitlab.host.tld Project ID 1 Personal Access Token AbCdEf12345","title":"GitLab"},{"location":"Alerting/Transports/#grafana-oncall","text":"Send alerts to Grafana Oncall using a Formatted Webhook Example: Config Example Webhook URL https://a-prod-us-central-0.grafana.net/integrations/v1/formatted_webhook/m12xmIjOcgwH74UF8CN4dk0Dh/","title":"Grafana Oncall"},{"location":"Alerting/Transports/#hipchat","text":"See the HipChat API Documentation for rooms/message for details on acceptable values. You may notice that the link points at the \"deprecated\" v1 API. This is because the v2 API is still in beta. Example: Config Example API URL https://api.hipchat.com/v1/rooms/message?auth_token=109jawregoaihj Room ID 7654321 From Name LibreNMS Options color=red At present the following options are supported: color . Note: The default message format for HipChat messages is HTML. It is recommended that you specify the text message format to prevent unexpected results, such as HipChat attempting to interpret angled brackets ( < and > ).","title":"HipChat"},{"location":"Alerting/Transports/#irc","text":"The IRC transports only works together with the LibreNMS IRC-Bot. Configuration of the LibreNMS IRC-Bot is described here . Example: Config Example IRC enabled","title":"IRC"},{"location":"Alerting/Transports/#jira","text":"You can have LibreNMS create issues on a Jira instance for critical and warning alerts using either the Jira REST API or webhooks. Custom fields allow you to add any required fields beyond summary and description fields in case mandatory fields are required by your Jira project/issue type configuration. Custom fields are defined in JSON format but ustom fields allow you to add any required fields beyond summary and description fields in case mandatory fields are required by your Jira project/issue type configuration. Custom fields are defined in JSON format. Currently http authentication is used to access Jira and Jira username and password will be stored as cleartext in the LibreNMS database.","title":"JIRA"},{"location":"Alerting/Transports/#rest-api","text":"The config fields that need to set for Jira REST API are: Jira Open URL, Jira username, Jira password, Project key, and issue type. Note: REST API is that it is only able to open new tickets.","title":"REST API"},{"location":"Alerting/Transports/#webhooks","text":"The config fields that need to set for webhooks are: Jira Open URL, Jira Close URL, Jira username, Jira password and webhook ID. Note: Webhooks allow more control over how alerts are handled in Jira. With webhooks, recovery messages can be sent to a different URL than alerts. Additionally, a custom conditional logic can be built using the webhook payload and ID to automatically close an open ticket if predefined conditions are met. Jira Issue Types Jira Webhooks Example: Config Example Project Key JIRAPROJECTKEY Issue Type Myissuetype Open URL https://myjira.mysite.com / https://webhook-open-url Close URL https://webhook-close-url Jira Username myjirauser Jira Password myjirapass Enable webhook ON/OFF Webhook ID alert_id Custom Fileds {\"components\":[{\"id\":\"00001\"}], \"source\": \"LibrenNMS\"}","title":"Webhooks"},{"location":"Alerting/Transports/#jira-service-management","text":"Using Jira Service Management LibreNMS integration, LibreNMS forwards alerts to Jira Service Management with detailed information. Jira Service Management acts as a dispatcher for LibreNMS alerts, determines the right people to notify based on on-call schedules and notifies via email, text messages (SMS), phone calls and iOS & Android push notifications. Then escalates alerts until the alert is acknowledged or closed. :warning: If the feature isn\u2019t available on your site, keep checking Jira Service Management for updates. Example: Config Example WebHook URL https://url/path/to/webhook","title":"Jira Service Management"},{"location":"Alerting/Transports/#line-messaging-api","text":"LINE Messaging API Docs Here is the step for setup a LINE bot and using it in LibreNMS. Use your real LINE account register in developer protal . Add a new channel, choose Messaging API and continue fill up the forms, note that Channel name cannot edit later. Go to \"Messaging API\" tab of your channel, here listing some important value. Bot basic ID and QR code is your LINE bot's ID and QR code. Channel access token (long-lived) , will use it in LibreNMS, keep it safe. Use your real Line account add your LINE bot as a friend. Recipient ID can be groupID , userID or roomID , it will be used in LibreNMS to send message to a group or a user. Use the following NodeJS program and ngrok for temporally https webhook to listen it. LINE-bot-RecipientFetcher Run the program and using ngrok expose port to public $ node index.js $ ngrok http 3000 Go to \"Messaging API\" tab of your channel, fill up Webhook URL to https:///webhook If you want to let LINE bot send message to a yourself, use your real account to send a message to your LINE bot. Program will print out the userID in console. sample value: {\"type\":\"user\",\"userId\":\"U527xxxxxxxxxxxxxxxxxxxxxxxxxc0ee\"} If you want to let LINE bot send message to a group, do the following steps. Add your LINE bot into group Use your real account to send a message to group Program will print out the groupID in console, it will be Recipient ID, keep it safe. sample value: {\"type\":\"group\",\"groupId\":\"Ce51xxxxxxxxxxxxxxxxxxxxxxxxxx6ef\",\"userId\":\"U527xxxxxxxxxxxxxxxxxxxxxxxxxc0ee\"} ``` Example: Config Example Access token fhJ9vH2fsxxxxxxxxxxxxxxxxxxxxlFU= Recipient (groupID, userID or roomID) Ce51xxxxxxxxxxxxxxxxxxxxxxxxxx6ef","title":"LINE Messaging API"},{"location":"Alerting/Transports/#line-notify","text":"LINE Notify LINE Notify API Document Example: Config Example Token AbCdEf12345","title":"LINE Notify"},{"location":"Alerting/Transports/#mail","text":"The E-Mail transports uses the same email-configuration as the rest of LibreNMS. As a small reminder, here is its configuration directives including defaults: Emails will attach all graphs included with the @signedGraphTag directive. If the email format is set to html, they will be embedded. To disable attaching images, set email_attach_graphs to false. alerting/email lnms config:set email_html true lnms config:set email_attach_graphs false Example: Config Example Email me@example.com","title":"Mail"},{"location":"Alerting/Transports/#matrix","text":"For using the Matrix transports, you have to create a room on the Matrix-server. The provided Auth_token belongs to an user, which is member of this room. The Message, sent to the matrix-room can be built from the variables defined in Template-Syntax but without the 'alert->' prefix. See API-Transport. The variable $msg is contains the result of the Alert template.The Matrix-Server URL is cutted before the beginning of the _matrix/client/r0/... API-part. Example: Config Example Matrix-Server URL https://matrix.example.com/ Room !ajPbbPalmVbNuQoBDK:example.com Auth_token: MDAyYmxvY2F0aW9uI...z1DCn6lz_uOhtW3XRICg Message: Alert: {{ $msg }} https://librenms.example.com","title":"Matrix"},{"location":"Alerting/Transports/#messagebird","text":"LibreNMS can send text messages through Messagebird Rest API transport. Config Example Api Key Api rest key given in the messagebird dashboard Originator E.164 formatted originator Recipient E.164 formatted recipient for multi recipents comma separated Character limit Range 1..480 (max 3 split messages)","title":"Messagebird"},{"location":"Alerting/Transports/#messagebird-voice","text":"LibreNMS can send messages through Messagebird voice Rest API transport (text to speech). Config Example Api Key Api rest key given in the messagebird dashboard Originator E.164 formatted originator Recipient E.164 formatted recipient for multi recipents comma separated Language Select box for options Spoken voice Female or Male Repeat X times the message is repeated","title":"Messagebird Voice"},{"location":"Alerting/Transports/#microsoft-teams","text":"LibreNMS can send alerts to Microsoft Teams Incoming Webhooks which are then posted to a specific channel. Microsoft recommends using markdown formatting for connector cards. Administrators can opt to compose the MessageCard themselves using JSON to get the full functionality. Example: Config Example WebHook URL https://outlook.office365.com/webhook/123456789 Use JSON? x","title":"Microsoft Teams"},{"location":"Alerting/Transports/#nagios-compatible","text":"The nagios transport will feed a FIFO at the defined location with the same format that nagios would. This allows you to use other alerting systems with LibreNMS, for example Flapjack . Example: Config Example Nagios FIFO /path/to/my.fifo","title":"Nagios Compatible"},{"location":"Alerting/Transports/#opsgenie","text":"Using OpsGenie LibreNMS integration, LibreNMS forwards alerts to OpsGenie with detailed information. OpsGenie acts as a dispatcher for LibreNMS alerts, determines the right people to notify based on on-call schedules and notifies via email, text messages (SMS), phone calls and iOS & Android push notifications. Then escalates alerts until the alert is acknowledged or closed. Create a LibreNMS Integration from the integrations page once you signup. Then copy the API key from OpsGenie to LibreNMS. If you want to automatically ack and close alerts, leverage Marid integration. More detail with screenshots is available in OpsGenie LibreNMS Integration page . Example: Config Example WebHook URL https://url/path/to/webhook","title":"OpsGenie"},{"location":"Alerting/Transports/#osticket","text":"LibreNMS can send alerts to osTicket API which are then converted to osTicket tickets. Example: Config Example API URL http://osticket.example.com/api/http.php/tickets.json API Token 123456789","title":"osTicket"},{"location":"Alerting/Transports/#pagerduty","text":"LibreNMS can make use of PagerDuty, this is done by utilizing an API key and Integraton Key. API Keys can be found under 'API Access' in the PagerDuty portal. Integration Keys can be found under 'Integration' for the particular Service you have created in the PagerDuty portal. Example: Config Example API Key randomsample Integration Key somerandomstring","title":"PagerDuty"},{"location":"Alerting/Transports/#philips-hue","text":"Want to spice up your noc life? LibreNMS will flash all lights connected to your philips hue bridge whenever an alert is triggered. To setup, go to the you http:// your-bridge-ip /debug/clip.html Update the \"URL:\" field to /api Paste this in the \"Message Body\" {\"devicetype\":\"librenms\"} Press the round button on your philips Hue Bridge Click on POST In the Command Response You should see output with your username. Copy this without the quotes More Info: Philips Hue Documentation Example: Config Example Host http://your-bridge-ip Hue User username Duration 1 Second","title":"Philips Hue"},{"location":"Alerting/Transports/#playsms","text":"PlaySMS is an open source SMS-Gateway that can be used via their HTTP API using a Username and WebService Token. Please consult PlaySMS's documentation regarding number formatting. PlaySMS Docs Here an example using 3 numbers, any amount of numbers is supported: Example: Config Example PlaySMS https://localhost/index.php User user1 Token MYFANCYACCESSTOKEN From My Name Mobiles +1234567892,+1234567890,+1234567891","title":"PlaySMS"},{"location":"Alerting/Transports/#pushbullet","text":"Get your Access Token from your Pushbullet's settings page and set it in your transport: Example: Config Example Access Token MYFANCYACCESSTOKEN","title":"Pushbullet"},{"location":"Alerting/Transports/#pushover","text":"If you want to change the default notification sound for all notifications then you can add the following in Pushover Options: sound=falling You also have the possibility to change sound per severity: sound_critical=falling sound_warning=siren sound_ok=magic Enabling Pushover support is fairly easy, there are only two required parameters. Firstly you need to create a new Application (called LibreNMS, for example) in your account on the Pushover website ( https://pushover.net/apps ). Now copy your API Key and obtain your User Key from the newly created Application and setup the transport. Pushover Docs Example: Config Example Api Key APPLICATIONAPIKEYGOESHERE User Key USERKEYGOESHERE Pushover Options sound_critical=falling sound_warning=siren sound_ok=magic","title":"Pushover"},{"location":"Alerting/Transports/#rocketchat","text":"The Rocket.chat transport will POST the alert message to your Rocket.chat Incoming WebHook using the attachments option. Simple html tags are stripped from the message. All options are optional, the only required value is for url, without this then no call to Rocket.chat will be made. Rocket.chat Docs Example: Config Example Webhook URL https://rocket.url/api/v1/chat.postMessage Rocket.chat Options channel=#Alerting username=myname icon_url=http://someurl/image.gif icon_emoji=:smirk:","title":"Rocket.chat"},{"location":"Alerting/Transports/#sensu","text":"The Sensu transport will POST an Event to the Agent API upon an alert being generated. It will be categorised (ok, warning or critical), and if you configure the alert to send recovery notifications, Sensu will also clear the alert automatically. No configuration is required - as long as you are running the Sensu Agent on your poller with the HTTP socket enabled on tcp/3031, LibreNMS will start generating Sensu events as soon as you create the transport. Acknowledging alerts within LibreNMS is not directly supported, but an annotation ( acknowledged ) is set, so a mutator or silence, or even the handler could be written to look for it directly in the handler. There is also an annotation ( generated-by ) set, to allow you to treat LibreNMS events differently from agent events. The 'shortname' option is a simple way to reduce the length of device names in configs. It replaces the last 3 domain components with single letters (e.g. websrv08.dc4.eu.corp.example.net gets shortened to websrv08.dc4.eu.cen).","title":"Sensu"},{"location":"Alerting/Transports/#limitations","text":"Only a single namespace is supported Sensu will reject rules with special characters - the Transport will attempt to fix up rule names, but it's best to stick to letters, numbers and spaces The transport only deals in absolutes - it ignores the got worse/got better states The agent will buffer alerts, but LibreNMS will not - if your agent is offline, alerts will be dropped There is no backchannel between Sensu and LibreNMS - if you make changes in Sensu to LibreNMS alerts, they'll be lost on the next event (silences will work) Example: Config Example Sensu Endpoint http://localhost:3031 Sensu Namespace eu-west Check Prefix lnms Source Key hostname","title":"Limitations"},{"location":"Alerting/Transports/#slack","text":"The Slack transport will POST the alert message to your Slack Incoming WebHook using the attachments option, you are able to specify multiple webhooks along with the relevant options to go with it. Simple html tags are stripped from the message. All options are optional, the only required value is for url, without this then no call to Slack will be made. We currently support the following attachment options: author_name Slack docs Example: Config Example Webhook URL https://slack.com/url/somehook Slack Options author_name=Me","title":"Slack"},{"location":"Alerting/Transports/#smseagle","text":"SMSEagle is a hardware SMS Gateway that can be used via their HTTP API using a Username and password. Destination numbers are one per line, with no spaces. They can be in either local or international dialling format. SMSEagle Docs Example: Config Example SMSEagle Host ip.add.re.ss User smseagle_user Password smseagle_user_password Mobiles +3534567890 0834567891","title":"SMSEagle"},{"location":"Alerting/Transports/#smsmode","text":"SMSmode is a SMS provider that can be configured by using the generic API Transport. You need a token you can find on your personnal space. SMSmode docs Example: Config Example Transport type Api API Method POST API URL http://api.smsmode.com/http/1.6/sendSMS.do Options accessToken= PUT_HERE_YOUR_TOKEN numero= PUT_HERE_DESTS_NUMBER_COMMA_SEPARATED message={{ $msg }}","title":"SMSmode"},{"location":"Alerting/Transports/#splunk","text":"LibreNMS can send alerts to a Splunk instance and provide all device and alert details. Example output: Feb 21 15:21:52 nms hostname=\"localhost\", sysName=\"localhost\", sysDescr=\"\", sysContact=\"\", os=\"fortigate\", type=\"firewall\", ip=\"localhost\", hardware=\"FGT_50E\", version=\"v5.6.9\", serial=\"\", features=\"\", location=\"\", uptime=\"387\", uptime_short=\" 6m 27s\", uptime_long=\" 6 minutes 27 seconds\", description=\"\", notes=\"\", alert_notes=\"\", device_id=\"0\", rule_id=\"0\", id=\"0\", proc=\"\", status=\"1\", status_reason=\"\", ping_timestamp=\"\", ping_loss=\"0\", ping_min=\"25.6\", ping_max=\"26.8\", ping_avg=\"26.3\", title=\"localhost recovered from Device up/down \", elapsed=\"14m 54s\", uid=\"0\", alert_id=\"0\", severity=\"critical\", name=\"Device up/down\", timestamp=\"2020-02-21 15:21:33\", state=\"0\", device_device_id=\"0\", device_inserted=\"\", device_hostname=\"localhost\", device_sysName=\"localhost\", device_ip=\"localhost\", device_overwrite_ip=\"\", device_timeout=\"\", device_retries=\"\", device_snmp_disable=\"0\", device_bgpLocalAs=\"0\", device_sysObjectID=\"\", device_sysDescr=\"\", device_sysContact=\"\", device_version=\"v5.6.9\", device_hardware=\"FGT_50E\", device_features=\"build1673\", device_location_id=\"\", device_os=\"fortigate\", device_status=\"1\", device_status_reason=\"\", device_ignore=\"0\", device_disabled=\"0\", device_uptime=\"387\", device_agent_uptime=\"0\", device_last_polled=\"2020-02-21 15:21:33\", device_last_poll_attempted=\"\", device_last_polled_timetaken=\"7.9\", device_last_discovered_timetaken=\"11.77\", device_last_discovered=\"2020-02-21 13:16:42\", device_last_ping=\"2020-02-21 15:21:33\", device_last_ping_timetaken=\"26.3\", device_purpose=\"\", device_type=\"firewall\", device_serial=\"FGT50EXXX\", device_icon=\"images/os/fortinet.svg\", device_poller_group=\"0\", device_override_sysLocation=\"0\", device_notes=\"\", device_port_association_mode=\"1\", device_max_depth=\"0\", device_disable_notify=\"0\", device_location=\"\", device_vrf_lites=\"Array\", device_lat=\"\", device_lng=\"\", - sysObjectID => \"\"; ` Each alert will be sent as a separate message. Example: Config Example Host 127.0.0.1 UDP Port 514","title":"Splunk"},{"location":"Alerting/Transports/#syslog","text":"You can have LibreNMS emit alerts as syslogs complying with RFC 3164. More information on RFC 3164 can be found here: https://tools.ietf.org/html/rfc3164 Example output: <26> Mar 22 00:59:03 librenms.host.net librenms[233]: [Critical] network.device.net: Port Down - port_id => 98939; ifDescr => xe-1/1/0; Each fault will be sent as a separate syslog. Example: Config Example Host 127.0.0.1 Port 514 Facility 3","title":"Syslog"},{"location":"Alerting/Transports/#telegram","text":"Thank you to snis for these instructions. First you must create a telegram account and add BotFather to you list. To do this click on the following url: https://telegram.me/botfather Generate a new bot with the command \"/newbot\" BotFather is then asking for a username and a normal name. After that your bot is created and you get a HTTP token. (for more options for your bot type \"/help\") Add your bot to telegram with the following url: http://telegram.me/ to use app or https://web.telegram.org/ to use in web, and send some text to the bot. The BotFather should have responded with a token, copy your token code and go to the following page in chrome: https://api.telegram.org/bot/getUpdates (this could take a while so continue to refresh until you see something similar to below) You see a json code with the message you sent to the bot. Copy the Chat id. In this example that is \u201c-9787468\u201d within this example: \"message\":{\"message_id\":7,\"from\":\"id\":656556,\"first_name\":\"Joo\",\"last_name\":\"Doo\",\"username\":\"JohnDoo\"},\"chat\":{\"id\":-9787468,\"title\":\"Telegram Group\"},\"date\":1435216924,\"text\":\"Hi\"}}]} . Now create a new \"Telegram transport\" in LibreNMS (Global Settings -> Alerting Settings -> Telegram transport). Click on 'Add Telegram config' and put your chat id and token into the relevant box. If want to use a group to receive alerts, you need to pick the Chat ID of the group chat, and not of the Bot itself. Telegram Docs Example: Config Example Chat ID 34243432 Token 3ed32wwf235234 Format HTML or MARKDOWN","title":"Telegram"},{"location":"Alerting/Transports/#twilio-sms","text":"Twilio will send your alert via SMS. From your Twilio account you will need your account SID, account token and your Twilio SMS phone number that you would like to send the alerts from. Twilio's APIs are located at: https://www.twilio.com/docs/api?filter-product=sms Example: Config Example SID ACxxxxxxxxxxxxxxxxxxxxxxxxxxxx Token 7xxxx573acxxxbc2xxx308d6xxx652d32 Twilio SMS Number 8888778660","title":"Twilio SMS"},{"location":"Alerting/Transports/#ukfast-pss","text":"UKFast PSS tickets can be raised from alerts using the UKFastPSS transport. This required an API key with PSS write permissions Example: Config Example API Key ABCDefgfg12 Author 5423 Priority Critical Secure true","title":"UKFast PSS"},{"location":"Alerting/Transports/#victorops","text":"VictorOps provide a webHook url to make integration extremely simple. To get the URL required login to your VictorOps account and go to: Settings -> Integrations -> REST Endpoint -> Enable Integration. The URL provided will have $routing_key at the end, you need to change this to something that is unique to the system sending the alerts such as librenms. I.e: https://alert.victorops.com/integrations/generic/20132414/alert/2f974ce1-08fc-4dg8-a4f4-9aee6cf35c98/librenms Example: Config Example Post URL https://alert.victorops.com/integrations/generic/20132414/alert/2f974ce1-08fc-4dg8-a4f4-9aee6cf35c98/librenms","title":"VictorOps"},{"location":"Alerting/Transports/#kayako-classic","text":"LibreNMS can send alerts to Kayako Classic API which are then converted to tickets. To use this module, you need REST API feature enabled in Kayako Classic and configured email account at LibreNMS. To enable this, do this: AdminCP -> REST API -> Settings -> Enable API (Yes) Also you need to know the department id to provide tickets to appropriate department and a user email to provide, which is used as ticket author. To get department id: navigate to appropriate department name at the departments list page in Admin CP and watch the number at the end of url. Example: http://servicedesk.example.com/admin/Base/Department/Edit/17 . Department ID is 17 As a requirement, you have to know API Url, API Key and API Secret to connect to servicedesk Kayako REST API Docs Example: Config Example Kayako URL http://servicedesk.example.com/api/ Kayako API Key 8cc02f38-7465-4a0c-8730-bb3af122167b Kayako API Secret Y2NhZDIxNDMtNjVkMi0wYzE0LWExYTUtZGUwMjJiZDI0ZWEzMmRhOGNiYWMtNTU2YS0yODk0LTA1MTEtN2VhN2YzYzgzZjk5 Kayako Department 1","title":"Kayako Classic"},{"location":"Alerting/Transports/#signal-cli","text":"Use the Signal Mesenger for Alerts. Run the Signal CLI with the D-Bus option. GitHub Project Example: Config Example Path /opt/signal-cli/bin/signal-cli Recipient type Group Recipient dfgjsdkgljior4345==","title":"Signal CLI"},{"location":"Alerting/Transports/#smsfeedback","text":"SMSFeedback is a SAAS service, which can be used to deliver Alerts via API, using API url, Username & Password. They can be in international dialling format only. SMSFeedback Api Docs Example: Config Example User smsfeedback_user Password smsfeedback_password Mobiles 71234567890 Sender name CIA","title":"SMSFeedback"},{"location":"Alerting/Transports/#zenduty","text":"Leveraging LibreNMS<>Zenduty Integration, users can send new LibreNMS alerts to the right team and notify them based on on-call schedules via email, SMS, Phone Calls, Slack, Microsoft Teams and mobile push notifications. Zenduty provides engineers with detailed context around the LibreNMS alert along with playbooks and a complete incident command framework to triage, remediate and resolve incidents with speed. Create a LibreNMS Integration from inside Zenduty , then copy the Webhook URL from Zenduty to LibreNMS. For a detailed guide with screenshots, refer to the LibreNMS documentation at Zenduty . Example: Config Example WebHook URL https://www.zenduty.com/api/integration/librenms/integration-key/","title":"Zenduty"},{"location":"Developing/Application-Notes/","text":"Notes On Application Development LibreNMS JSON SNMP Extends The polling function json_app_get makes it easy to poll complex data using SNMP extends and JSON. The following exceptions are provided by it. It takes three parameters, in order in the list below. Integer :: Device ID to fetch it for. String :: The extend name. For example, if 'zfs' is passed it will be converted to 'nsExtendOutputFull.3.122.102.115'. Integer :: Minimum expected version of the JSON return. The required keys for the returned JSON are as below. version :: The version of the snmp extend script. Should be numeric and at least 1. error :: Error code from the snmp extend script. Should be > 0 (0 will be ignored and negatives are reserved) errorString :: Text to describe the error. data :: An key with an array with the data to be used. The supported exceptions are as below. JsonAppPollingFailedException :: Empty return from SNMP. JsonAppParsingFailedException :: Could not parse the JSON JsonAppBlankJsonException :: Blank JSON. JsonAppMissingKeysException :: Missing required keys. JsonAppWrongVersionException :: Older version than supported. JsonAppExtendErroredException :: Polling and parsing was good, but the returned data has an error set. This may be checked via $e->getParsedJson() and then checking the keys error and errorString. The error value can be accessed via $e->getCode(). The output can be accessed via $->getOutput() Only returned JsonAppParsingFailedException. The parsed JSON can be access via $e->getParsedJson(). An example below from includes/polling/applications/zfs.inc.php ... try { $zfs = json_app_get ( $device , $name , 1 )[ 'data' ]; } catch ( JsonAppMissingKeysException $e ) { //old version with out the data key $zfs = $e -> getParsedJson (); } catch ( JsonAppException $e ) { echo PHP_EOL . $name . ':' . $e -> getCode () . ':' . $e -> getMessage () . PHP_EOL ; update_application ( $app , $e -> getCode () . ':' . $e -> getMessage (), []); return ; } Compression Also worth noting that json_app_get supports compressed data via base64 encoded gzip. If base64 encoding is detected on the the SNMP return, it will be gunzipped and then parsed. https://github.com/librenms/librenms-agent/blob/master/utils/librenms_return_optimizer may be used to optimize JSON returns. Application Data Storage The $app model is supplied for each application poller and graph. You may access and update the $app->data field to store arrays of data the Application model. When you call update_application() the $app model will be saved along with any changes to the data field. // set the varaible data to $foo $app->data = [ 'item_A' => 123, 'item_B' => 4.5, 'type' => 'foo', 'other_items' => [ 'a', 'b', 'c' ], ]; // save the change $app->save(); // var_dump the contents of the variable var_dump($app->data);","title":"Applications"},{"location":"Developing/Application-Notes/#notes-on-application-development","text":"","title":"Notes On Application Development"},{"location":"Developing/Application-Notes/#librenms-json-snmp-extends","text":"The polling function json_app_get makes it easy to poll complex data using SNMP extends and JSON. The following exceptions are provided by it. It takes three parameters, in order in the list below. Integer :: Device ID to fetch it for. String :: The extend name. For example, if 'zfs' is passed it will be converted to 'nsExtendOutputFull.3.122.102.115'. Integer :: Minimum expected version of the JSON return. The required keys for the returned JSON are as below. version :: The version of the snmp extend script. Should be numeric and at least 1. error :: Error code from the snmp extend script. Should be > 0 (0 will be ignored and negatives are reserved) errorString :: Text to describe the error. data :: An key with an array with the data to be used. The supported exceptions are as below. JsonAppPollingFailedException :: Empty return from SNMP. JsonAppParsingFailedException :: Could not parse the JSON JsonAppBlankJsonException :: Blank JSON. JsonAppMissingKeysException :: Missing required keys. JsonAppWrongVersionException :: Older version than supported. JsonAppExtendErroredException :: Polling and parsing was good, but the returned data has an error set. This may be checked via $e->getParsedJson() and then checking the keys error and errorString. The error value can be accessed via $e->getCode(). The output can be accessed via $->getOutput() Only returned JsonAppParsingFailedException. The parsed JSON can be access via $e->getParsedJson(). An example below from includes/polling/applications/zfs.inc.php ... try { $zfs = json_app_get ( $device , $name , 1 )[ 'data' ]; } catch ( JsonAppMissingKeysException $e ) { //old version with out the data key $zfs = $e -> getParsedJson (); } catch ( JsonAppException $e ) { echo PHP_EOL . $name . ':' . $e -> getCode () . ':' . $e -> getMessage () . PHP_EOL ; update_application ( $app , $e -> getCode () . ':' . $e -> getMessage (), []); return ; }","title":"LibreNMS JSON SNMP Extends"},{"location":"Developing/Application-Notes/#compression","text":"Also worth noting that json_app_get supports compressed data via base64 encoded gzip. If base64 encoding is detected on the the SNMP return, it will be gunzipped and then parsed. https://github.com/librenms/librenms-agent/blob/master/utils/librenms_return_optimizer may be used to optimize JSON returns.","title":"Compression"},{"location":"Developing/Application-Notes/#application-data-storage","text":"The $app model is supplied for each application poller and graph. You may access and update the $app->data field to store arrays of data the Application model. When you call update_application() the $app model will be saved along with any changes to the data field. // set the varaible data to $foo $app->data = [ 'item_A' => 123, 'item_B' => 4.5, 'type' => 'foo', 'other_items' => [ 'a', 'b', 'c' ], ]; // save the change $app->save(); // var_dump the contents of the variable var_dump($app->data);","title":"Application Data Storage"},{"location":"Developing/Code-Structure/","text":"Code structure This document will try and provide a good overview of how the code is structured within LibreNMS. We will go through the main directories and provide information on how and when they are used. LibreNMS now uses Laravel for much of it's frontend (webui) and database code. Much of the Laravel documentation applies: https://laravel.com/docs/structure Directories from the (filtered) structure tree below are some of the directories that will be most interesting during development: . \u251c\u2500 app \u251c\u2500 database \u2502 \u2514\u2500 migrations \u251c\u2500 doc \u251c\u2500 html \u2502 \u251c\u2500 css \u2502 \u2502 \u2514\u2500 custom \u2502 \u2514\u2500 js \u251c\u2500 includes \u2502 \u251c\u2500 definitions \u2502 \u251c\u2500 discovery \u2502 \u251c\u2500 html \u2502 \u2502 \u251c\u2500 forms \u2502 \u2502 \u251c\u2500 graphs \u2502 \u2502 \u251c\u2500 pages \u2502 \u2502 \u2514\u2500 reports \u2502 \u2514\u2500 polling \u251c\u2500 LibreNMS \u251c\u2500 logs \u251c\u2500 mibs \u2514\u2500 rrd doc/ This is the location of all the documentation for LibreNMS, this is in GitHub markdown format and can be viewed online app/ Most Laravel and Eloquent classes should be under this directory. LibreNMS/ Classes that don't belong to the Laravel application belong in this directory, with a directory structure that matches the namespace. One class per file. See PSR-0 for details. html/ All legacy web accessible files are located here. New pages should follow the Laravel conventions. html/api_v0.php This is the API routing file which directs users to the correct API function based on the API endpoint call. html/index.php This is the main file which all links within LibreNMS are parsed through. It loads the majority of the relevant includes needed for the control panel to function. CSS and JS files are also loaded here. html/css/ All used CSS files are located here. html/css/custom/ This is a directory you can put custom css files into that won't interfere with auto updates html/js/ All used JS files are located here. includes/ This directory is quite big and contains all the files to make the cli and polling / discovery to work. This code is not currently accessible from Laravel code (intentionally). includes/discovery/, includes/polling/ All the discovery and polling code. The format is usually quite similar between discovery and polling. Both are made up of modules and the files within the relevant directories will match that module. So for instance if you want to update the os detection for a device, you would look in includes/discovery/os/ for a file named after the operating system such as linux: includes/discovery/linux.inc.php . Within here you would update or add support for newer OS'. This is the same for polling as well. includes/html/ This is where the majority of the website core files are located. These tend to be files that contain functions or often used code segments that can be included where needed rather than duplicating code. includes/html/forms/ This directory contains all of the files that are dynamically included from an ajax call to ajax/form. includes/html/api_functions.inc.php All of the functions and calls for the API are located here. includes/html/functions.inc.php This contains the majority of functions used throughout the standard web ui. includes/html/graphs/ This directory contains global and OS specific graph definitions. includes/html/reports/ In here is a list of of files that generate PDF reports available to the user. These are dynamically called in from html/pdf.php based on the report the user requests. includes/html/table/ This directory contains all of the ajax calls when generating the table of data. Most have been converted over so if you are planning to add a new table of data then you will do so here for all of the back end data calls. includes/html/pages/ This directory contains the URL structure when browsing the Web UI. So for example /devices/ is actually a call to includes/html/pages/devices.inc.php , /device/tab=ports/ is includes/html/pages/device/ports.inc.php . logs/ Contains the main librenms.log file by default, but can also contain your web server's logs, poller logs, and other items. mibs/ Here is where all of the mibs are located. Generally standard mibs should be in the root directory and specific vendor mibs should be in their own subdirectory. rrd/ Simple enough, this is where all of the rrd files are created. They are stored in directory based on the device hostname. database/migrations Contains all the database migrations. See Laravel docs for additional info: https://laravel.com/docs/migrations In general to create a new table you should run: php artisan make:model ModelName -m -c -r","title":"Code Structure"},{"location":"Developing/Code-Structure/#code-structure","text":"This document will try and provide a good overview of how the code is structured within LibreNMS. We will go through the main directories and provide information on how and when they are used. LibreNMS now uses Laravel for much of it's frontend (webui) and database code. Much of the Laravel documentation applies: https://laravel.com/docs/structure Directories from the (filtered) structure tree below are some of the directories that will be most interesting during development: . \u251c\u2500 app \u251c\u2500 database \u2502 \u2514\u2500 migrations \u251c\u2500 doc \u251c\u2500 html \u2502 \u251c\u2500 css \u2502 \u2502 \u2514\u2500 custom \u2502 \u2514\u2500 js \u251c\u2500 includes \u2502 \u251c\u2500 definitions \u2502 \u251c\u2500 discovery \u2502 \u251c\u2500 html \u2502 \u2502 \u251c\u2500 forms \u2502 \u2502 \u251c\u2500 graphs \u2502 \u2502 \u251c\u2500 pages \u2502 \u2502 \u2514\u2500 reports \u2502 \u2514\u2500 polling \u251c\u2500 LibreNMS \u251c\u2500 logs \u251c\u2500 mibs \u2514\u2500 rrd","title":"Code structure"},{"location":"Developing/Code-Structure/#doc","text":"This is the location of all the documentation for LibreNMS, this is in GitHub markdown format and can be viewed online","title":"doc/"},{"location":"Developing/Code-Structure/#app","text":"Most Laravel and Eloquent classes should be under this directory.","title":"app/"},{"location":"Developing/Code-Structure/#librenms","text":"Classes that don't belong to the Laravel application belong in this directory, with a directory structure that matches the namespace. One class per file. See PSR-0 for details.","title":"LibreNMS/"},{"location":"Developing/Code-Structure/#html","text":"All legacy web accessible files are located here. New pages should follow the Laravel conventions.","title":"html/"},{"location":"Developing/Code-Structure/#htmlapi_v0php","text":"This is the API routing file which directs users to the correct API function based on the API endpoint call.","title":"html/api_v0.php"},{"location":"Developing/Code-Structure/#htmlindexphp","text":"This is the main file which all links within LibreNMS are parsed through. It loads the majority of the relevant includes needed for the control panel to function. CSS and JS files are also loaded here.","title":"html/index.php"},{"location":"Developing/Code-Structure/#htmlcss","text":"All used CSS files are located here.","title":"html/css/"},{"location":"Developing/Code-Structure/#htmlcsscustom","text":"This is a directory you can put custom css files into that won't interfere with auto updates","title":"html/css/custom/"},{"location":"Developing/Code-Structure/#htmljs","text":"All used JS files are located here.","title":"html/js/"},{"location":"Developing/Code-Structure/#includes","text":"This directory is quite big and contains all the files to make the cli and polling / discovery to work. This code is not currently accessible from Laravel code (intentionally).","title":"includes/"},{"location":"Developing/Code-Structure/#includesdiscovery-includespolling","text":"All the discovery and polling code. The format is usually quite similar between discovery and polling. Both are made up of modules and the files within the relevant directories will match that module. So for instance if you want to update the os detection for a device, you would look in includes/discovery/os/ for a file named after the operating system such as linux: includes/discovery/linux.inc.php . Within here you would update or add support for newer OS'. This is the same for polling as well.","title":"includes/discovery/, includes/polling/"},{"location":"Developing/Code-Structure/#includeshtml","text":"This is where the majority of the website core files are located. These tend to be files that contain functions or often used code segments that can be included where needed rather than duplicating code.","title":"includes/html/"},{"location":"Developing/Code-Structure/#includeshtmlforms","text":"This directory contains all of the files that are dynamically included from an ajax call to ajax/form.","title":"includes/html/forms/"},{"location":"Developing/Code-Structure/#includeshtmlapi_functionsincphp","text":"All of the functions and calls for the API are located here.","title":"includes/html/api_functions.inc.php"},{"location":"Developing/Code-Structure/#includeshtmlfunctionsincphp","text":"This contains the majority of functions used throughout the standard web ui.","title":"includes/html/functions.inc.php"},{"location":"Developing/Code-Structure/#includeshtmlgraphs","text":"This directory contains global and OS specific graph definitions.","title":"includes/html/graphs/"},{"location":"Developing/Code-Structure/#includeshtmlreports","text":"In here is a list of of files that generate PDF reports available to the user. These are dynamically called in from html/pdf.php based on the report the user requests.","title":"includes/html/reports/"},{"location":"Developing/Code-Structure/#includeshtmltable","text":"This directory contains all of the ajax calls when generating the table of data. Most have been converted over so if you are planning to add a new table of data then you will do so here for all of the back end data calls.","title":"includes/html/table/"},{"location":"Developing/Code-Structure/#includeshtmlpages","text":"This directory contains the URL structure when browsing the Web UI. So for example /devices/ is actually a call to includes/html/pages/devices.inc.php , /device/tab=ports/ is includes/html/pages/device/ports.inc.php .","title":"includes/html/pages/"},{"location":"Developing/Code-Structure/#logs","text":"Contains the main librenms.log file by default, but can also contain your web server's logs, poller logs, and other items.","title":"logs/"},{"location":"Developing/Code-Structure/#mibs","text":"Here is where all of the mibs are located. Generally standard mibs should be in the root directory and specific vendor mibs should be in their own subdirectory.","title":"mibs/"},{"location":"Developing/Code-Structure/#rrd","text":"Simple enough, this is where all of the rrd files are created. They are stored in directory based on the device hostname.","title":"rrd/"},{"location":"Developing/Code-Structure/#databasemigrations","text":"Contains all the database migrations. See Laravel docs for additional info: https://laravel.com/docs/migrations In general to create a new table you should run: php artisan make:model ModelName -m -c -r","title":"database/migrations"},{"location":"Developing/Creating-Documentation/","text":"Creating Documentation One of the goals of the LibreNMS project is to enable users to get all of the help they need from our documentation. The documentation uses the markdown markup language and is generated with mkdocs . To edit or create markdown you only need a text editor, but it is recommended to build your docs before submitting, in order to check them visually. The section on this page has instructions for this step. Writing docs When you are adding a new feature or extension, we need to have full documentation to go along with it. It's quite simple to do this: Find the relevant directory to store your new document in, General, Support and Extensions are the most likely choices. Think of a descriptive name that's not too long, it should match what they may be looking for or describes the feature. Add the new document into the nav section of mkdocs.yml if it needs to appear in the table of contents Ensure the first line contains: source: path/to/file.md - don't include the initial doc/ . In the body of the document, be descriptive but keep things simple. Some tips: If the document could cover different distros like CentOS and Ubuntu please try and include the information for them all. If that's not possible then at least put a placeholder in asking for contributions. Ensure you use the correct formatting for commands and code blocks by wrapping one liners in backticks or blocks in ```. Put content into sub-headings where possible to organise the content. If you rename a file, please add a redirect for the old file in mkdocs.yml like so: - redirects : redirect_maps : 'old/page.md' : 'new/page.md' Please ensure you add the document to the relevant section within pages of mkdocs.yml so that it's in the correct menu and is built. Forgetting this step will result in your document never seeing the light of day :) Formatting docs Our docs are based on Markdown using mkdocs which adheres to markdown specs and nothing more, because of that we also import a couple of extra libraries: pymdownx.tasklist pymdownx.tilde This means you can use: ~~strikethrough~~ to perform strikethrough - [X] List items Url's can be made [like this](https://www.librenms.org) like this Code can be placed in `` for single line or ``` for multiline. # Can be used for main headings which translates to a

            tag, increasing the # 's will increase the hX tags. ### Can be used for sub-headings which will appear in the TOC to the left. Settings should be prefixed with !!! setting \"\" Markdown CheatSheet Link Building docs This is achieved with mkdocs , a python package. Install the required packages. pip install mkdocs mkdocs-exclude mkdocs-material mkdocs-macros-plugin mkdocs-minify-plugin mkdocs-redirects If you encounter permissions issues, these might be reoslved by using the user option, with whatever user you are building as, e.g. -u librenms A configuration file for building LibreNMS docs is already included in the distribution: /opt/librenms/mkdocs.yml . The various configuration directives are documented here . Build from the librenms base directory: cd /opt/librenms . Building is simple: mkdocs build This will output all the documentation in html format to /opt/librenms/out (this folder will be ignored from any commits). Viewing docs mkdocs includes it's own light-weight webserver for this purpose. Viewing is as simple as running the following command: $ mkdocs serve INFO - Building documentation... <..> INFO - Documentation built in 12.54 seconds <..> INFO - Serving on http://127.0.0.1:8000 <..> INFO - Start watching changes Now you will find the complete set of LibreNMS documentation by opening your browser to localhost:8000 . Note it is not necessary to build before viewing as the serve command will do this for you. Also the server will update the documents it is serving whenever changes to the markdown are made, such as in another terminal. Viewing docs from another machine By default the server will only listen for connections from the local machine. If you are building on a different machine you can use the following directive to listen on all interfaces: mkdocs serve --dev-addr=0.0.0.0:8000 WARNING: this is not a secure webserver, do this at your own risk, with appropriate host security and do not leave the server running.","title":"Creating Documentation"},{"location":"Developing/Creating-Documentation/#creating-documentation","text":"One of the goals of the LibreNMS project is to enable users to get all of the help they need from our documentation. The documentation uses the markdown markup language and is generated with mkdocs . To edit or create markdown you only need a text editor, but it is recommended to build your docs before submitting, in order to check them visually. The section on this page has instructions for this step.","title":"Creating Documentation"},{"location":"Developing/Creating-Documentation/#writing-docs","text":"When you are adding a new feature or extension, we need to have full documentation to go along with it. It's quite simple to do this: Find the relevant directory to store your new document in, General, Support and Extensions are the most likely choices. Think of a descriptive name that's not too long, it should match what they may be looking for or describes the feature. Add the new document into the nav section of mkdocs.yml if it needs to appear in the table of contents Ensure the first line contains: source: path/to/file.md - don't include the initial doc/ . In the body of the document, be descriptive but keep things simple. Some tips: If the document could cover different distros like CentOS and Ubuntu please try and include the information for them all. If that's not possible then at least put a placeholder in asking for contributions. Ensure you use the correct formatting for commands and code blocks by wrapping one liners in backticks or blocks in ```. Put content into sub-headings where possible to organise the content. If you rename a file, please add a redirect for the old file in mkdocs.yml like so: - redirects : redirect_maps : 'old/page.md' : 'new/page.md' Please ensure you add the document to the relevant section within pages of mkdocs.yml so that it's in the correct menu and is built. Forgetting this step will result in your document never seeing the light of day :)","title":"Writing docs"},{"location":"Developing/Creating-Documentation/#formatting-docs","text":"Our docs are based on Markdown using mkdocs which adheres to markdown specs and nothing more, because of that we also import a couple of extra libraries: pymdownx.tasklist pymdownx.tilde This means you can use: ~~strikethrough~~ to perform strikethrough - [X] List items Url's can be made [like this](https://www.librenms.org) like this Code can be placed in `` for single line or ``` for multiline. # Can be used for main headings which translates to a

            tag, increasing the # 's will increase the hX tags. ### Can be used for sub-headings which will appear in the TOC to the left. Settings should be prefixed with !!! setting \"\" Markdown CheatSheet Link","title":"Formatting docs"},{"location":"Developing/Creating-Documentation/#building-docs","text":"This is achieved with mkdocs , a python package. Install the required packages. pip install mkdocs mkdocs-exclude mkdocs-material mkdocs-macros-plugin mkdocs-minify-plugin mkdocs-redirects If you encounter permissions issues, these might be reoslved by using the user option, with whatever user you are building as, e.g. -u librenms A configuration file for building LibreNMS docs is already included in the distribution: /opt/librenms/mkdocs.yml . The various configuration directives are documented here . Build from the librenms base directory: cd /opt/librenms . Building is simple: mkdocs build This will output all the documentation in html format to /opt/librenms/out (this folder will be ignored from any commits).","title":"Building docs"},{"location":"Developing/Creating-Documentation/#viewing-docs","text":"mkdocs includes it's own light-weight webserver for this purpose. Viewing is as simple as running the following command: $ mkdocs serve INFO - Building documentation... <..> INFO - Documentation built in 12.54 seconds <..> INFO - Serving on http://127.0.0.1:8000 <..> INFO - Start watching changes Now you will find the complete set of LibreNMS documentation by opening your browser to localhost:8000 . Note it is not necessary to build before viewing as the serve command will do this for you. Also the server will update the documents it is serving whenever changes to the markdown are made, such as in another terminal.","title":"Viewing docs"},{"location":"Developing/Creating-Documentation/#viewing-docs-from-another-machine","text":"By default the server will only listen for connections from the local machine. If you are building on a different machine you can use the following directive to listen on all interfaces: mkdocs serve --dev-addr=0.0.0.0:8000 WARNING: this is not a secure webserver, do this at your own risk, with appropriate host security and do not leave the server running.","title":"Viewing docs from another machine"},{"location":"Developing/Creating-Release/","text":"Creating a release GitHub You can create a new release on GitHub . Enter the tag version that month, i.e for September 2016 you would enter 201609 . Enter a title, we usually use August 2016 Release Enter a placeholder for the body, we will edit this later. Create changelog For this, we assume you are using the master branch to create the release against. We now generate the changelog using the GitHub API itself so it shouldn't matter what state your local branch is in so long as it has the code to generate the changelog itself. Using the GitHub API means we can use the labels associated with merged pull requests to categorise the changelog. We also then record who made the pull request to thank them in the changelog itself. You will be asked for a GitHub personal access token. You can generate this here . No permissions should be needed so just give it a name and click Generate Token . You can then export the token as an environment variable GH_TOKEN or place it in your .env file. The basic command to run is by using artisan . Here you pass new tag (1.41) and previous tag (1.40). For further help run php artisan release:tag --help . This will generate a changelog up to the latest master branch, if you want it to be done against something else then pass the latest pull request number with --pr $PR_NUMBER . php artisan release:tag 1 .41 1 .40 Now commit and push the change that has been made to doc/General/Changelog.md . Once the pull request has been merged in for the Changelog, you can create a new release on GitHub . Create two threads on the community site: A changelog thread example An info thread example Tweet it Facebook it Google Plus it LinkedIn it","title":"Creating Release"},{"location":"Developing/Creating-Release/#creating-a-release","text":"","title":"Creating a release"},{"location":"Developing/Creating-Release/#github","text":"You can create a new release on GitHub . Enter the tag version that month, i.e for September 2016 you would enter 201609 . Enter a title, we usually use August 2016 Release Enter a placeholder for the body, we will edit this later.","title":"GitHub"},{"location":"Developing/Creating-Release/#create-changelog","text":"For this, we assume you are using the master branch to create the release against. We now generate the changelog using the GitHub API itself so it shouldn't matter what state your local branch is in so long as it has the code to generate the changelog itself. Using the GitHub API means we can use the labels associated with merged pull requests to categorise the changelog. We also then record who made the pull request to thank them in the changelog itself. You will be asked for a GitHub personal access token. You can generate this here . No permissions should be needed so just give it a name and click Generate Token . You can then export the token as an environment variable GH_TOKEN or place it in your .env file. The basic command to run is by using artisan . Here you pass new tag (1.41) and previous tag (1.40). For further help run php artisan release:tag --help . This will generate a changelog up to the latest master branch, if you want it to be done against something else then pass the latest pull request number with --pr $PR_NUMBER . php artisan release:tag 1 .41 1 .40 Now commit and push the change that has been made to doc/General/Changelog.md . Once the pull request has been merged in for the Changelog, you can create a new release on GitHub . Create two threads on the community site: A changelog thread example An info thread example Tweet it Facebook it Google Plus it LinkedIn it","title":"Create changelog"},{"location":"Developing/Dynamic-Config/","text":"Adding new config settings Adding support for users to update a new config option via the WebUI is now a lot easier for general options. This document shows you how to add a new config option and even section to the WebUI. Config settings are defined in misc/config_definitions.json You should give a little thought to the name of your config setting. For example: a good setting for snmp community, would be snmp.community . The dot notation is path and when the config is hydrated, it is converted to a nested array. If the user is overriding the option in config.php it would use the format $config['snmp']['community'] Translation The config definition system inherently supports translation. You must add the English names in the resoures/lang/en/settings.php file (and other languages if you can). To update the javascript translation files, run: ./lnms translation:generate Definition Format For snmp.community, this is the definition: \"snmp.community\" : { \"group\" : \"poller\" , \"section\" : \"snmp\" , \"order\" : 2 , \"type\" : \"array\" , \"default\" : [ \"public\" ] } Fields All fields are optional. To show in the web ui, group and section are required, order is recommended. type : Defines the type, there are a few predefined types and custom types can be defined and implemented in a vue.js component default : the default value for this setting options : the options for the select type. An object with {\"value1\": \"display string\", \"value2\": \"display string\"} validate : Defines more complex validation than the default simple type check. Uses Laravel validation syntax. group : The web ui tab this is under section : A panel grouping settings in the web ui order : The order to display this setting within the section Predefined Types string : A string integer : A number boolean : A simple toggle switch array : A list of values that can be added, removed, and re-ordered. select : A dropdown box with predefined options. Requires the option field. email : Will validate the input is the correct format for an email password : Will mask the value of the input (but does not keep it fully private) Custom Types You may set the type field to a custom type and define a Vue.js component to display it to the user. The Vue.js component should be named as \"SettingType\" where type is the custom type entered with the first letter capitalized. Vue.js components exist in the resources/js/components directory. Here is an empty component named SettingType (make sure to rename it). It pulls in BaseSetting mixin for basic setting code to reuse. You should review the BaseSetting component. Using Vue.js is beyond the scope of this document. Documentation can be found at vuejs.org .","title":"Dynamic Config"},{"location":"Developing/Dynamic-Config/#adding-new-config-settings","text":"Adding support for users to update a new config option via the WebUI is now a lot easier for general options. This document shows you how to add a new config option and even section to the WebUI. Config settings are defined in misc/config_definitions.json You should give a little thought to the name of your config setting. For example: a good setting for snmp community, would be snmp.community . The dot notation is path and when the config is hydrated, it is converted to a nested array. If the user is overriding the option in config.php it would use the format $config['snmp']['community']","title":"Adding new config settings"},{"location":"Developing/Dynamic-Config/#translation","text":"The config definition system inherently supports translation. You must add the English names in the resoures/lang/en/settings.php file (and other languages if you can). To update the javascript translation files, run: ./lnms translation:generate","title":"Translation"},{"location":"Developing/Dynamic-Config/#definition-format","text":"For snmp.community, this is the definition: \"snmp.community\" : { \"group\" : \"poller\" , \"section\" : \"snmp\" , \"order\" : 2 , \"type\" : \"array\" , \"default\" : [ \"public\" ] }","title":"Definition Format"},{"location":"Developing/Dynamic-Config/#fields","text":"All fields are optional. To show in the web ui, group and section are required, order is recommended. type : Defines the type, there are a few predefined types and custom types can be defined and implemented in a vue.js component default : the default value for this setting options : the options for the select type. An object with {\"value1\": \"display string\", \"value2\": \"display string\"} validate : Defines more complex validation than the default simple type check. Uses Laravel validation syntax. group : The web ui tab this is under section : A panel grouping settings in the web ui order : The order to display this setting within the section","title":"Fields"},{"location":"Developing/Dynamic-Config/#predefined-types","text":"string : A string integer : A number boolean : A simple toggle switch array : A list of values that can be added, removed, and re-ordered. select : A dropdown box with predefined options. Requires the option field. email : Will validate the input is the correct format for an email password : Will mask the value of the input (but does not keep it fully private)","title":"Predefined Types"},{"location":"Developing/Dynamic-Config/#custom-types","text":"You may set the type field to a custom type and define a Vue.js component to display it to the user. The Vue.js component should be named as \"SettingType\" where type is the custom type entered with the first letter capitalized. Vue.js components exist in the resources/js/components directory. Here is an empty component named SettingType (make sure to rename it). It pulls in BaseSetting mixin for basic setting code to reuse. You should review the BaseSetting component. Using Vue.js is beyond the scope of this document. Documentation can be found at vuejs.org .","title":"Custom Types"},{"location":"Developing/Getting-Started/","text":"Get ready to contribute to LibreNMS This document is intended to help you get your local environment set up to contribute code to the LibreNMS project. Setting up a development environment When starting to develop, it may be tempting to just make changes on your production server, but that will make things harder for you. Taking a little time to set up somewhere to work on code changes can really help. Possible options: A Linux computer, VM, or container Another directory on your LibreNMS server Windows Subsystem for Linux Set up your development git clone Follow the documentation on using git Install development dependencies ./scripts/composer_wrapper.php install Set variables in .env , including database settings. Which could be a local or remote MySQL server including your production DB. APP_ENV=local APP_DEBUG=true ... Start a development webserver ./lnms serve Access the Web UI at http://localhost:8000 Automated testing LibreNMS uses continuous integration to test code changes to help reduce bugs. This also helps guarantee the changes you contribute won't be broken in the future. You can find out more in our Validating Code Documentation The default database connection for automated testing is testing . To override the database parameters for unit tests, configure your .env file accordingly. The defaults (from config/database.php ) are: DB_TEST_DRIVER=\"mysql\" # PDO driver DB_TEST_HOST=\"localhost\" # hostname or IP address DB_TEST_PORT=\"\" # port DB_TEST_DATABASE=\"librenms_phpunit_78hunjuybybh\" # database DB_TEST_USERNAME=\"root\" # username DB_TEST_PASSWORD=\"\" # password DB_TEST_SOCKET=\"\" # unix socket path Polling debug output You can see detailed info by running your polling code in debug mode by adding a -d flag. ./discovery.php -d -h HOSTNAME lnms device:poll HOSTNAME -vv Inspecting variables Sometimes you want to find out what a variable contains (such as the data return from an snmpwalk). You can dump one or more variables and halt execution with the dd() function. dd ( $variable1 , $variable2 ); Inspecting web pages Installing the development dependencies and setting APP_DEBUG enables the Laravel Debugbar This will allow you to inspect page generation and errors right in your web browser. Better code completion in IDEs and editors You can generate some files to improve code completion. (These file are not updated automatically, so you may need to re-run these command periodically) ./lnms ide-helper:generate ./lnms ide-helper:models -N Emulating devices You can capture and emulate devices using Snmpsim . LibreNMS has a set of scripts to make it easier to work with snmprec files. LibreNMS Snmpsim helpers Laravel documentation You can find a lot of how LibreNMS works by following the Laravel Documentation","title":"Getting Started"},{"location":"Developing/Getting-Started/#get-ready-to-contribute-to-librenms","text":"This document is intended to help you get your local environment set up to contribute code to the LibreNMS project.","title":"Get ready to contribute to LibreNMS"},{"location":"Developing/Getting-Started/#setting-up-a-development-environment","text":"When starting to develop, it may be tempting to just make changes on your production server, but that will make things harder for you. Taking a little time to set up somewhere to work on code changes can really help. Possible options: A Linux computer, VM, or container Another directory on your LibreNMS server Windows Subsystem for Linux","title":"Setting up a development environment"},{"location":"Developing/Getting-Started/#set-up-your-development-git-clone","text":"Follow the documentation on using git Install development dependencies ./scripts/composer_wrapper.php install Set variables in .env , including database settings. Which could be a local or remote MySQL server including your production DB. APP_ENV=local APP_DEBUG=true ... Start a development webserver ./lnms serve Access the Web UI at http://localhost:8000","title":"Set up your development git clone"},{"location":"Developing/Getting-Started/#automated-testing","text":"LibreNMS uses continuous integration to test code changes to help reduce bugs. This also helps guarantee the changes you contribute won't be broken in the future. You can find out more in our Validating Code Documentation The default database connection for automated testing is testing . To override the database parameters for unit tests, configure your .env file accordingly. The defaults (from config/database.php ) are: DB_TEST_DRIVER=\"mysql\" # PDO driver DB_TEST_HOST=\"localhost\" # hostname or IP address DB_TEST_PORT=\"\" # port DB_TEST_DATABASE=\"librenms_phpunit_78hunjuybybh\" # database DB_TEST_USERNAME=\"root\" # username DB_TEST_PASSWORD=\"\" # password DB_TEST_SOCKET=\"\" # unix socket path","title":"Automated testing"},{"location":"Developing/Getting-Started/#polling-debug-output","text":"You can see detailed info by running your polling code in debug mode by adding a -d flag. ./discovery.php -d -h HOSTNAME lnms device:poll HOSTNAME -vv","title":"Polling debug output"},{"location":"Developing/Getting-Started/#inspecting-variables","text":"Sometimes you want to find out what a variable contains (such as the data return from an snmpwalk). You can dump one or more variables and halt execution with the dd() function. dd ( $variable1 , $variable2 );","title":"Inspecting variables"},{"location":"Developing/Getting-Started/#inspecting-web-pages","text":"Installing the development dependencies and setting APP_DEBUG enables the Laravel Debugbar This will allow you to inspect page generation and errors right in your web browser.","title":"Inspecting web pages"},{"location":"Developing/Getting-Started/#better-code-completion-in-ides-and-editors","text":"You can generate some files to improve code completion. (These file are not updated automatically, so you may need to re-run these command periodically) ./lnms ide-helper:generate ./lnms ide-helper:models -N","title":"Better code completion in IDEs and editors"},{"location":"Developing/Getting-Started/#emulating-devices","text":"You can capture and emulate devices using Snmpsim . LibreNMS has a set of scripts to make it easier to work with snmprec files. LibreNMS Snmpsim helpers","title":"Emulating devices"},{"location":"Developing/Getting-Started/#laravel-documentation","text":"You can find a lot of how LibreNMS works by following the Laravel Documentation","title":"Laravel documentation"},{"location":"Developing/Merging-Pull-Requests/","text":"Merging Pull Requests GitHub We will now build the monthly change log from our GitHub commits. When merging a commit, please ensure you: Click the Merge pull request button Give the merge a descriptive but short title For the commit message prepend it with one of the following tags for the pull request to appear in the changelog: devices: or newdevice: For new device support. feature: or feat: To indicate this is a new or updated feature webui: or web: To indicate this is an update to the WebUI fix: or bugfix: To show this is a bug fix. refactoring: or refactor: When the changes are refactoring a large portion of code You can reference an issue number with #xyz , i.e #1234 Use the Confirm squash and merge button to merge. Example commits Feature feature: Added new availability map #4401 New device newdevice: Added support for Cisco ASA #4402","title":"Merging Pull Requests"},{"location":"Developing/Merging-Pull-Requests/#merging-pull-requests","text":"","title":"Merging Pull Requests"},{"location":"Developing/Merging-Pull-Requests/#github","text":"We will now build the monthly change log from our GitHub commits. When merging a commit, please ensure you: Click the Merge pull request button Give the merge a descriptive but short title For the commit message prepend it with one of the following tags for the pull request to appear in the changelog: devices: or newdevice: For new device support. feature: or feat: To indicate this is a new or updated feature webui: or web: To indicate this is an update to the WebUI fix: or bugfix: To show this is a bug fix. refactoring: or refactor: When the changes are refactoring a large portion of code You can reference an issue number with #xyz , i.e #1234 Use the Confirm squash and merge button to merge.","title":"GitHub"},{"location":"Developing/Merging-Pull-Requests/#example-commits","text":"","title":"Example commits"},{"location":"Developing/Merging-Pull-Requests/#feature","text":"feature: Added new availability map #4401","title":"Feature"},{"location":"Developing/Merging-Pull-Requests/#new-device","text":"newdevice: Added support for Cisco ASA #4402","title":"New device"},{"location":"Developing/SNMP-Traps/","text":"Creating snmp trap handlers You must have a working snmptrapd. See SNMP TRAP HANDLER Make sure the MIB is loaded from the trap you are adding. Edit /etc/systemd/system/snmptrapd.service.d/mibs.conf to add it then restart snmptrapd. MIBDIRS option is not recursive, so you need to specify each directory individually. Create a new class in LibreNMS\\Snmptrap\\Handlers that implements the LibreNMS\\Interfaces\\SnmptrapHandler interface. For example: . * * @package LibreNMS * @link https://www.librenms.org */ namespace LibreNMS\\Snmptrap\\Handlers ; use App\\Models\\Device ; use LibreNMS\\Enum\\Severity ; use LibreNMS\\Interfaces\\SnmptrapHandler ; use LibreNMS\\Snmptrap\\Trap ; class ColdBoot implements SnmptrapHandler { /** * Handle snmptrap. * Data is pre-parsed and delivered as a Trap. * * @param Device $device * @param Trap $trap * @return void */ public function handle ( Device $device , Trap $trap ) { $trap -> log ( 'SNMP Trap: Device ' . $device -> displayName () . ' cold booted' , $device -> device_id , 'reboot' , Severity :: Warning ); } } where number on the end means color of the eventlog: Severity::Ok = green Severity::Info = cyan Severity::Notice = blue Severity::Warning = yellow Severity::Error = red Register the mapping in the config/snmptraps.php file. Make sure to use the full trap OID and correct class. 'SNMPv2-MIB::coldStart' => \\LibreNMS\\Snmptrap\\Handlers\\ColdBoot :: class , The handle function inside your new class will receive a LibreNMS/Snmptrap/Trap object containing the parsed trap. It is common to update the database and create event log entries within the handle function. Getting information from the Trap Source information $trap -> getDevice (); // gets Device model for the device associated with this trap $trap -> ip ; // gets source IP of this trap $trap -> getTrapOid (); // returns the string you registered your class with Retrieving data from the Trap $trap -> getOidData ( 'IF-MIB::ifDescr.114' ); getOidData() requires the full name including any additional index. You can use these functions to search the OID keys. $trap -> findOid ( 'ifDescr' ); // returns the first oid key that contains the string $trap -> findOids ( 'ifDescr' ); // returns all oid keys containing the string Advanced If the above isn't adequate, you can get the entire trap text: $trap -> raw ; Tests Submitting new traps requires them to be fully tested. You can find many examples in the tests/Feature/SnmpTraps/ directory. Here is a basic example of a test that trap handler only creates a log message. If your trap modifies the database, you should also test that it does so. assertTrapLogsMessage ( rawTrap : <<< 'TRAP' {{ hostname }} UDP : [{{ ip }}] : 44298 -> [ 192.168 . 5.5 ] : 162 DISMAN - EVENT - MIB :: sysUpTimeInstance 0 : 0 : 1 : 12.7 SNMPv2 - MIB :: snmpTrapOID . 0 SNMPv2 - MIB :: coldStart TRAP , log : 'SNMP Trap: Device {{ hostname }} cold booted' , // The log message sent failureMessage : 'Failed to handle SNMPv2-MIB::coldStart' , // an informative message to let user know what failed args : [ 4 , 'reboot' ], // the additional arguments to the log method ); } }","title":"SNMP Traps"},{"location":"Developing/SNMP-Traps/#creating-snmp-trap-handlers","text":"You must have a working snmptrapd. See SNMP TRAP HANDLER Make sure the MIB is loaded from the trap you are adding. Edit /etc/systemd/system/snmptrapd.service.d/mibs.conf to add it then restart snmptrapd. MIBDIRS option is not recursive, so you need to specify each directory individually. Create a new class in LibreNMS\\Snmptrap\\Handlers that implements the LibreNMS\\Interfaces\\SnmptrapHandler interface. For example: . * * @package LibreNMS * @link https://www.librenms.org */ namespace LibreNMS\\Snmptrap\\Handlers ; use App\\Models\\Device ; use LibreNMS\\Enum\\Severity ; use LibreNMS\\Interfaces\\SnmptrapHandler ; use LibreNMS\\Snmptrap\\Trap ; class ColdBoot implements SnmptrapHandler { /** * Handle snmptrap. * Data is pre-parsed and delivered as a Trap. * * @param Device $device * @param Trap $trap * @return void */ public function handle ( Device $device , Trap $trap ) { $trap -> log ( 'SNMP Trap: Device ' . $device -> displayName () . ' cold booted' , $device -> device_id , 'reboot' , Severity :: Warning ); } } where number on the end means color of the eventlog: Severity::Ok = green Severity::Info = cyan Severity::Notice = blue Severity::Warning = yellow Severity::Error = red Register the mapping in the config/snmptraps.php file. Make sure to use the full trap OID and correct class. 'SNMPv2-MIB::coldStart' => \\LibreNMS\\Snmptrap\\Handlers\\ColdBoot :: class , The handle function inside your new class will receive a LibreNMS/Snmptrap/Trap object containing the parsed trap. It is common to update the database and create event log entries within the handle function.","title":"Creating snmp trap handlers"},{"location":"Developing/SNMP-Traps/#getting-information-from-the-trap","text":"","title":"Getting information from the Trap"},{"location":"Developing/SNMP-Traps/#source-information","text":"$trap -> getDevice (); // gets Device model for the device associated with this trap $trap -> ip ; // gets source IP of this trap $trap -> getTrapOid (); // returns the string you registered your class with","title":"Source information"},{"location":"Developing/SNMP-Traps/#retrieving-data-from-the-trap","text":"$trap -> getOidData ( 'IF-MIB::ifDescr.114' ); getOidData() requires the full name including any additional index. You can use these functions to search the OID keys. $trap -> findOid ( 'ifDescr' ); // returns the first oid key that contains the string $trap -> findOids ( 'ifDescr' ); // returns all oid keys containing the string","title":"Retrieving data from the Trap"},{"location":"Developing/SNMP-Traps/#advanced","text":"If the above isn't adequate, you can get the entire trap text: $trap -> raw ;","title":"Advanced"},{"location":"Developing/SNMP-Traps/#tests","text":"Submitting new traps requires them to be fully tested. You can find many examples in the tests/Feature/SnmpTraps/ directory. Here is a basic example of a test that trap handler only creates a log message. If your trap modifies the database, you should also test that it does so. assertTrapLogsMessage ( rawTrap : <<< 'TRAP' {{ hostname }} UDP : [{{ ip }}] : 44298 -> [ 192.168 . 5.5 ] : 162 DISMAN - EVENT - MIB :: sysUpTimeInstance 0 : 0 : 1 : 12.7 SNMPv2 - MIB :: snmpTrapOID . 0 SNMPv2 - MIB :: coldStart TRAP , log : 'SNMP Trap: Device {{ hostname }} cold booted' , // The log message sent failureMessage : 'Failed to handle SNMPv2-MIB::coldStart' , // an informative message to let user know what failed args : [ 4 , 'reboot' ], // the additional arguments to the log method ); } }","title":"Tests"},{"location":"Developing/Sensor-State-Support/","text":"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 are 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 For YAML based state discovery: mib : NETBOTZV2-MIB modules : sensors : state : data : - oid : dryContactSensorTable value : dryContactSensorValue num_oid : '.1.3.6.1.4.1.5528.100.4.2.1.1.2.{{ $index }}' descr : dryContactSensorLabel group : Contact Sensors index : 'dryContactSensor.{{ $index }}' state_name : dryContactSensor states : - { value : -1 , generic : 3 , graph : 0 , descr : 'null' } - { value : 0 , generic : 0 , graph : 0 , descr : open } - { value : 1 , generic : 2 , graph : 0 , descr : closed } - oid : doorSwitchSensorTable value : doorSwitchSensorValue num_oid : '.1.3.6.1.4.1.5528.100.4.2.2.1.2.{{ $index }}' descr : doorSwitchSensorLabel group : Switch Sensors index : 'doorSwitchSensor.{{ $index }}' state_name : doorSwitchSensor states : - { value : -1 , generic : 3 , graph : 0 , descr : 'null' } - { value : 0 , generic : 0 , graph : 0 , descr : open } - { value : 1 , generic : 2 , graph : 0 , descr : closed } - oid : cameraMotionSensorTable value : cameraMotionSensorValue num_oid : '.1.3.6.1.4.1.5528.100.4.2.3.1.2.{{ $index }}' descr : cameraMotionSensorLabel group : Camera Motion Sensors index : 'cameraMotionSensor.{{ $index }}' state_name : cameraMotionSensor states : - { value : -1 , generic : 3 , graph : 0 , descr : 'null' } - { value : 0 , generic : 0 , graph : 0 , descr : noMotion } - { value : 1 , generic : 2 , graph : 0 , descr : motionDetected } - oid : otherStateSensorTable value : otherStateSensorErrorStatus num_oid : '.1.3.6.1.4.1.5528.100.4.2.10.1.3.{{ $index }}' descr : otherStateSensorLabel index : '{{ $index }}' state_name : otherStateSensorErrorStatus states : - { value : 0 , generic : 0 , graph : 0 , descr : normal } - { value : 1 , generic : 1 , graph : 0 , descr : info } - { value : 2 , generic : 1 , graph : 0 , descr : warning } - { value : 3 , generic : 2 , graph : 0 , descr : error } - { value : 4 , generic : 2 , graph : 0 , descr : critical } - { value : 5 , generic : 2 , graph : 0 , descr : failure } Advanced Example For advanced state discovery: This example will be based on a Cisco power supply sensor and is all it takes to have sensor state support for Cisco power supplies in Cisco switches. The file should be located in /includes/discovery/sensors/state/cisco.inc.php. 1 , 'generic' => 0 , 'graph' => 0 , 'descr' => 'normal' ], [ 'value' => 2 , 'generic' => 1 , 'graph' => 0 , 'descr' => 'warning' ], [ 'value' => 3 , 'generic' => 2 , 'graph' => 0 , 'descr' => 'critical' ], [ 'value' => 4 , 'generic' => 3 , 'graph' => 0 , 'descr' => 'shutdown' ], [ 'value' => 5 , 'generic' => 3 , 'graph' => 0 , 'descr' => 'notPresent' ], [ 'value' => 6 , 'generic' => 2 , 'graph' => 0 , 'descr' => 'notFunctioning' ], ]; create_state_index ( $state_name , $states ); $num_oid = '.1.3.6.1.4.1.9.9.13.1.5.1.3.' ; foreach ( $oids as $index => $entry ) { //Discover Sensors discover_sensor ( $valid [ 'sensor' ], 'state' , $device , $num_oid . $index , $index , $state_name , $entry [ 'ciscoEnvMonSupplyStatusDescr' ], '1' , '1' , null , null , null , null , $entry [ 'ciscoEnvMonSupplyState' ], 'snmp' , $index ); //Create Sensor To State Index create_sensor_to_state_index ( $device , $state_name , $index ); } }","title":"Sensor State Support"},{"location":"Developing/Sensor-State-Support/#sensor-state-support","text":"","title":"Sensor State Support"},{"location":"Developing/Sensor-State-Support/#introduction","text":"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.","title":"Introduction"},{"location":"Developing/Sensor-State-Support/#logic","text":"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.","title":"Logic"},{"location":"Developing/Sensor-State-Support/#sensors","text":"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.","title":"Sensors"},{"location":"Developing/Sensor-State-Support/#state_indexes","text":"Is where we keep track of which state sensors we monitor.","title":"state_indexes"},{"location":"Developing/Sensor-State-Support/#state_translations","text":"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 are derived from Nagios: 0 = OK 1 = Warning 2 = Critical 3 = Unknown","title":"state_translations"},{"location":"Developing/Sensor-State-Support/#sensors_to_state_indexes","text":"Is as you might have guessed, where the sensor_id is mapped to a state_index_id.","title":"sensors_to_state_indexes"},{"location":"Developing/Sensor-State-Support/#example","text":"For YAML based state discovery: mib : NETBOTZV2-MIB modules : sensors : state : data : - oid : dryContactSensorTable value : dryContactSensorValue num_oid : '.1.3.6.1.4.1.5528.100.4.2.1.1.2.{{ $index }}' descr : dryContactSensorLabel group : Contact Sensors index : 'dryContactSensor.{{ $index }}' state_name : dryContactSensor states : - { value : -1 , generic : 3 , graph : 0 , descr : 'null' } - { value : 0 , generic : 0 , graph : 0 , descr : open } - { value : 1 , generic : 2 , graph : 0 , descr : closed } - oid : doorSwitchSensorTable value : doorSwitchSensorValue num_oid : '.1.3.6.1.4.1.5528.100.4.2.2.1.2.{{ $index }}' descr : doorSwitchSensorLabel group : Switch Sensors index : 'doorSwitchSensor.{{ $index }}' state_name : doorSwitchSensor states : - { value : -1 , generic : 3 , graph : 0 , descr : 'null' } - { value : 0 , generic : 0 , graph : 0 , descr : open } - { value : 1 , generic : 2 , graph : 0 , descr : closed } - oid : cameraMotionSensorTable value : cameraMotionSensorValue num_oid : '.1.3.6.1.4.1.5528.100.4.2.3.1.2.{{ $index }}' descr : cameraMotionSensorLabel group : Camera Motion Sensors index : 'cameraMotionSensor.{{ $index }}' state_name : cameraMotionSensor states : - { value : -1 , generic : 3 , graph : 0 , descr : 'null' } - { value : 0 , generic : 0 , graph : 0 , descr : noMotion } - { value : 1 , generic : 2 , graph : 0 , descr : motionDetected } - oid : otherStateSensorTable value : otherStateSensorErrorStatus num_oid : '.1.3.6.1.4.1.5528.100.4.2.10.1.3.{{ $index }}' descr : otherStateSensorLabel index : '{{ $index }}' state_name : otherStateSensorErrorStatus states : - { value : 0 , generic : 0 , graph : 0 , descr : normal } - { value : 1 , generic : 1 , graph : 0 , descr : info } - { value : 2 , generic : 1 , graph : 0 , descr : warning } - { value : 3 , generic : 2 , graph : 0 , descr : error } - { value : 4 , generic : 2 , graph : 0 , descr : critical } - { value : 5 , generic : 2 , graph : 0 , descr : failure }","title":"Example"},{"location":"Developing/Sensor-State-Support/#advanced-example","text":"For advanced state discovery: This example will be based on a Cisco power supply sensor and is all it takes to have sensor state support for Cisco power supplies in Cisco switches. The file should be located in /includes/discovery/sensors/state/cisco.inc.php. 1 , 'generic' => 0 , 'graph' => 0 , 'descr' => 'normal' ], [ 'value' => 2 , 'generic' => 1 , 'graph' => 0 , 'descr' => 'warning' ], [ 'value' => 3 , 'generic' => 2 , 'graph' => 0 , 'descr' => 'critical' ], [ 'value' => 4 , 'generic' => 3 , 'graph' => 0 , 'descr' => 'shutdown' ], [ 'value' => 5 , 'generic' => 3 , 'graph' => 0 , 'descr' => 'notPresent' ], [ 'value' => 6 , 'generic' => 2 , 'graph' => 0 , 'descr' => 'notFunctioning' ], ]; create_state_index ( $state_name , $states ); $num_oid = '.1.3.6.1.4.1.9.9.13.1.5.1.3.' ; foreach ( $oids as $index => $entry ) { //Discover Sensors discover_sensor ( $valid [ 'sensor' ], 'state' , $device , $num_oid . $index , $index , $state_name , $entry [ 'ciscoEnvMonSupplyStatusDescr' ], '1' , '1' , null , null , null , null , $entry [ 'ciscoEnvMonSupplyState' ], 'snmp' , $index ); //Create Sensor To State Index create_sensor_to_state_index ( $device , $state_name , $index ); } }","title":"Advanced Example"},{"location":"Developing/Support-New-OS/","text":"This document is broken down into the relevant sections depending on what support you are adding. During all of these examples we will be using the OS of pulse as the example OS we will add. Adding the initial detection. Adding Memory and CPU information. Adding Health / Sensor information. Adding Wireless Sensor information. Adding custom graphs. Adding Unit tests (required). Optional Settings We currently have a script in pre-beta stages that can help speed up the process of deploying a new OS. It has support for add sensors in a basic form (except state sensors). In this example, we will add a new OS called test-os using the device ID 101 that has already been added. It will be of the type network and belongs to the vendor, Cisco: ./scripts/new-os.php -h 101 -o test-os -t network -v cisco The process will then step you through the process with some more questions. Please be warned, this is currently pre-beta and may cause some issues. Please let us know of any on Discord .","title":"Intro"},{"location":"Developing/Using-Git/","text":"Git can have a bit of a steep learning curve, stick with it as it is worth learning the basics 2 at least. If you want to help develop LibreNMS and haven't really used Git before then this quick primer will help you get started. Some assumptions: Work is being done on a Linux box. LibreNMS is to be installed in /opt/librenms You have git installed. You have a GitHub Account . You are using ssh to connect to GitHub (If not, replace git@github.com:/yourusername/librenms.git with https://github.com/yourusername/librenms.git . Replace yourusername with your GitHub username. Fork LibreNMS repo You do this directly within GitHub , click the 'Fork' button near the top right. If you are associated with multiple organisations within GitHub then you might need to select which account you want to push the fork to. Prepare your git environment These are the defaults that are recommended. git config branch.autosetupmerge true git config --global user.name \"John Doe\" git config --global user.email johndoe@example.com Clone the repo Ok so now that you have forked the repo, you now need to clone it to your local install where you can then make the changes you need and submit them back. cd /opt/ git clone git@github.com:/yourusername/librenms.git Add Upstream repo To be able to pull in changes from the master LibreNMS repo you need to have it setup on your system. git remote add upstream https://github.com/librenms/librenms.git Now you have two configured remotes: origin: This is your repository, you can push and pull changes here. upstream: This is the main LibreNMS repository and you can only pull changes. Workflow guide As you become more familiar you may find a better workflow that fits your needs, until then this should be a safe workflow for you to follow. Before you start work on a new branch / feature. Make sure you are up to date. cd /opt/librenms git checkout master git pull upstream master git push origin master At this stage it's worth pointing out that we have some standard checks that are performed when you submit a pull request, you can run these checks yourself to be sure no issues are present in your pull request. Now, create a new branch to do you work on. It's important that you do this as you are then able to work on more than one feature at a time and submit them as pull requests individually. If you did all your work in the master branch then it gets a bit messy! You need to give your branch a name. If an issue is open (or closed on GitHub) then you can use that, in this example if the issue number is 123 then we will use issue-123. If a post exists on the community forum then you can use the post id like community-123. You're also welcome to use any arbitrary name for your branch but try and make it relevant to what the branch is. git checkout -b issue-123 Now, code away. Make the changes you need, test, change and test again :) When you are ready to submit the updates as a pull request then commit away. git add path/to/new/files/or/folders git commit -a -m 'Added feature to do X, Y and Z' git push origin issue-123 If you need to rebase against master then you can do this with: git pull upstream master git push origin issue-123 If after do this you get some merge conflicts then you need to resolve these before carrying on. Please try to squash all commits into one, this isn't essential as we can do this when we merge but it would be helpful to do this before you submit your pull request. Now you will be ready to submit a pull request from within GitHub. To do this, go to your GitHub page for the LibreNMS repo. Now select the branch you have just been working on (issue-123) from the drop down to the left and then click 'Pull Request'. Fill in the details to describe the work you have done and click 'Create pull request'. Thanks for your first pull request :) Ok, that should get you started on the contributing path. If you have any other questions then stop by our Discord Server Hints and tips Undo last commit git reset --soft 'HEAD^' Remove specific commit git revert Restore deleted file git checkout $(git rev-list -n 1 HEAD -- \"$file\")^ -- \"$file\" Merge last two commits git rebase --interactive HEAD~2 In the text file that opens, change the last commit to squash from pick then save an exit. For more tips take a look at Oh shit, git!","title":"Using Git"},{"location":"Developing/Using-Git/#fork-librenms-repo","text":"You do this directly within GitHub , click the 'Fork' button near the top right. If you are associated with multiple organisations within GitHub then you might need to select which account you want to push the fork to.","title":"Fork LibreNMS repo"},{"location":"Developing/Using-Git/#prepare-your-git-environment","text":"These are the defaults that are recommended. git config branch.autosetupmerge true git config --global user.name \"John Doe\" git config --global user.email johndoe@example.com","title":"Prepare your git environment"},{"location":"Developing/Using-Git/#clone-the-repo","text":"Ok so now that you have forked the repo, you now need to clone it to your local install where you can then make the changes you need and submit them back. cd /opt/ git clone git@github.com:/yourusername/librenms.git","title":"Clone the repo"},{"location":"Developing/Using-Git/#add-upstream-repo","text":"To be able to pull in changes from the master LibreNMS repo you need to have it setup on your system. git remote add upstream https://github.com/librenms/librenms.git Now you have two configured remotes: origin: This is your repository, you can push and pull changes here. upstream: This is the main LibreNMS repository and you can only pull changes.","title":"Add Upstream repo"},{"location":"Developing/Using-Git/#workflow-guide","text":"As you become more familiar you may find a better workflow that fits your needs, until then this should be a safe workflow for you to follow. Before you start work on a new branch / feature. Make sure you are up to date. cd /opt/librenms git checkout master git pull upstream master git push origin master At this stage it's worth pointing out that we have some standard checks that are performed when you submit a pull request, you can run these checks yourself to be sure no issues are present in your pull request. Now, create a new branch to do you work on. It's important that you do this as you are then able to work on more than one feature at a time and submit them as pull requests individually. If you did all your work in the master branch then it gets a bit messy! You need to give your branch a name. If an issue is open (or closed on GitHub) then you can use that, in this example if the issue number is 123 then we will use issue-123. If a post exists on the community forum then you can use the post id like community-123. You're also welcome to use any arbitrary name for your branch but try and make it relevant to what the branch is. git checkout -b issue-123 Now, code away. Make the changes you need, test, change and test again :) When you are ready to submit the updates as a pull request then commit away. git add path/to/new/files/or/folders git commit -a -m 'Added feature to do X, Y and Z' git push origin issue-123 If you need to rebase against master then you can do this with: git pull upstream master git push origin issue-123 If after do this you get some merge conflicts then you need to resolve these before carrying on. Please try to squash all commits into one, this isn't essential as we can do this when we merge but it would be helpful to do this before you submit your pull request. Now you will be ready to submit a pull request from within GitHub. To do this, go to your GitHub page for the LibreNMS repo. Now select the branch you have just been working on (issue-123) from the drop down to the left and then click 'Pull Request'. Fill in the details to describe the work you have done and click 'Create pull request'. Thanks for your first pull request :) Ok, that should get you started on the contributing path. If you have any other questions then stop by our Discord Server","title":"Workflow guide"},{"location":"Developing/Using-Git/#hints-and-tips","text":"Undo last commit git reset --soft 'HEAD^' Remove specific commit git revert Restore deleted file git checkout $(git rev-list -n 1 HEAD -- \"$file\")^ -- \"$file\" Merge last two commits git rebase --interactive HEAD~2 In the text file that opens, change the last commit to squash from pick then save an exit. For more tips take a look at Oh shit, git!","title":"Hints and tips"},{"location":"Developing/Validating-Code/","text":"Validating Code As part of the pull request process with GitHub we run some automated build tests to ensure that the code is error free, standards compliant and our test suite builds successfully. Rather than submit a pull request and wait for the results, you can run these checks yourself to ensure a more seamless merge. All of these commands should be run from within the librenms directory and can be run as the librenms user unless otherwise noted. Install composer (you can skip this if composer is already installed). curl -sS https://getcomposer.org/installer | php Composer will now be installed into /opt/librenms/composer.phar. Now install the dependencies we require: ./composer.phar install Once composer is installed you can now run the code validation script: ./lnms dev:check If you see Tests ok, submit away :) then all is well. If you see other output then it should contain what you need to resolve the issues and re-test. Git Hooks Git has a hook system which you can use to trigger checks at various stages. Utilising the ./lnms dev:check you can make this part of your commit process. Add ./lnms dev:check to your .git/hooks/pre-commit : echo \"/opt/librenms/lnms dev:check\" >> /opt/librenms/.git/hooks/pre-commit chmod +x /opt/librenms/.git/hooks/pre-commit","title":"Validating Code"},{"location":"Developing/Validating-Code/#validating-code","text":"As part of the pull request process with GitHub we run some automated build tests to ensure that the code is error free, standards compliant and our test suite builds successfully. Rather than submit a pull request and wait for the results, you can run these checks yourself to ensure a more seamless merge. All of these commands should be run from within the librenms directory and can be run as the librenms user unless otherwise noted. Install composer (you can skip this if composer is already installed). curl -sS https://getcomposer.org/installer | php Composer will now be installed into /opt/librenms/composer.phar. Now install the dependencies we require: ./composer.phar install Once composer is installed you can now run the code validation script: ./lnms dev:check If you see Tests ok, submit away :) then all is well. If you see other output then it should contain what you need to resolve the issues and re-test.","title":"Validating Code"},{"location":"Developing/Validating-Code/#git-hooks","text":"Git has a hook system which you can use to trigger checks at various stages. Utilising the ./lnms dev:check you can make this part of your commit process. Add ./lnms dev:check to your .git/hooks/pre-commit : echo \"/opt/librenms/lnms dev:check\" >> /opt/librenms/.git/hooks/pre-commit chmod +x /opt/librenms/.git/hooks/pre-commit","title":"Git Hooks"},{"location":"Developing/os/Custom-Graphs/","text":"First we define our graphs in includes/definitions.inc.php to share our work and contribute in the development of LibreNMS. :-) (or place in config.php if you don't plan to contribute) // Pulse Secure Graphs $config [ 'graph_types' ][ 'device' ][ 'pulse_sessions' ] = [ 'section' => 'firewall' , 'order' => 0 , 'descr' => 'Active Sessions' ]; $config [ 'graph_types' ][ 'device' ][ 'pulse_users' ] = [ 'section' => 'firewall' , 'order' => 0 , 'descr' => 'Active Users' ]; Polling OS OS polling is not necessarily where custom polling should be done, please speak to one of the core devs in Discord for guidance. Let's update our example file to add additional polling: includes/polling/os/pulse.inc.php We declare two specific graphs for users and sessions numbers. Theses two graphs will be displayed on the firewall section of the graphs tab as it was written in the definition include file. addDataset ( 'users' , 'GAUGE' , 0 ); $fields = array ( 'users' => $users , ); $tags = compact ( 'rrd_def' ); data_update ( $device , 'pulse_users' , $tags , $fields ); $os -> enableGraph ( 'pulse_users' ); } $sessions = snmp_get ( $device , 'iveConcurrentUsers.0' , '-OQv' , 'PULSESECURE-PSG-MIB' ); if ( is_numeric ( $sessions )) { $rrd_def = RrdDefinition :: make () -> addDataset ( 'sessions' , 'GAUGE' , 0 ); $fields = array ( 'sessions' => $sessions , ); $tags = compact ( 'rrd_def' ); data_update ( $device , 'pulse_sessions' , $tags , $fields ); $os -> enableGraph ( 'pulse_sessions' ); } Displaying The specific graphs are not displayed automatically so we need to write the following PHP code: Pulse Sessions includes/html/graphs/device/pulse_sessions.inc.php addDataset ( 'users' , 'GAUGE' , 0 ); $fields = array ( 'users' => $users , ); $tags = compact ( 'rrd_def' ); data_update ( $device , 'pulse_users' , $tags , $fields ); $os -> enableGraph ( 'pulse_users' ); } $sessions = snmp_get ( $device , 'iveConcurrentUsers.0' , '-OQv' , 'PULSESECURE-PSG-MIB' ); if ( is_numeric ( $sessions )) { $rrd_def = RrdDefinition :: make () -> addDataset ( 'sessions' , 'GAUGE' , 0 ); $fields = array ( 'sessions' => $sessions , ); $tags = compact ( 'rrd_def' ); data_update ( $device , 'pulse_sessions' , $tags , $fields ); $os -> enableGraph ( 'pulse_sessions' ); }","title":"Polling OS"},{"location":"Developing/os/Custom-Graphs/#displaying","text":"The specific graphs are not displayed automatically so we need to write the following PHP code: Pulse Sessions includes/html/graphs/device/pulse_sessions.inc.php =, <, >, starts, ends, contains, regex, in_array, not_starts, not_ends, not_contains, not_regex, not_in_array, exists Example: skip_values : - oid : sensorName op : 'not_in_array' value : [ 'sensor1' , 'sensor2' ] skip_values : - oid : sensorOptionalOID op : 'exists' value : false temperature : data : - oid : hwOpticalModuleInfoTable value : hwEntityOpticalTemperature descr : '{{ $entPhysicalName }}' index : '{{ $index }}' skip_values : - oid : hwEntityOpticalMode op : '=' value : '1' If you aren't able to use yaml to perform the sensor discovery, you will most likely need to use Advanced health discovery. Advanced health discovery If you can't use the yaml files as above, then you will need to create the discovery code in php. If it is possible to create via yaml, php discovery will likely be rejected due to the much higher chance of later problems, so it is highly suggested to use yaml. The directory structure for sensor information is includes/discovery/sensors/$class/$os.inc.php . The format of all the sensors follows the same code format which is to collect sensor information via SNMP and then call the discover_sensor() function; except state sensors which requires additional code. Sensor information is commonly found in an ENTITY mib supplied by device's vendor in the form of a table. Other mib tables may be used as well. Sensor information is first collected by includes/discovery/sensors/pre_cache/$os.inc.php . This program will pull in data from mib tables into a $pre_cache array that can then be used in includes/discovery/sensors/$class/$os.inc.php to extract specific values which are then passed to discover_sensor() . discover_sensor() Accepts the following arguments: &$valid = This is always $valid['sensor'], do not pass any other values. $class = Required. This is the sensor class from the table above (i.e humidity). $device = Required. This is the $device array. $oid = Required. This must be the numerical OID for where the data can be found, i.e .1.2.3.4.5.6.7.0 $index = Required. This must be unique for this sensor class, device and type. Typically it's the index from the table being walked, or it could be the name of the OID if it's a single value. $type = Required. This should be the OS name, i.e. pulse. $descr = Required. This is a descriptive value for the sensor. Some devices will provide names to use. $divisor = Defaults to 1. This is used to divide the returned value. $multiplier = Defaults to 1. This is used to multiply the returned value. $low_limit = Defaults to null. Sets the low threshold limit for the sensor, used in alerting to report out range sensors. $low_warn_limit = Defaults to null. Sets the low warning limit for the sensor, used in alerting to report near out of range sensors. $warn_limit = Defaults to null. Sets the high warning limit for the sensor, used in alerting to report near out of range sensors. $high_limit = Defaults to null. Sets the high limit for the sensor, used in alerting to report out range sensors. $current = Defaults to null. Can be used to set the current value on discovery. Poller will update this on the next poll cycle anyway. $poller_type = Defaults to snmp. Things like the unix-agent can set different values but for the most part this should be left as snmp. $entPhysicalIndex = Defaults to null. Sets the entPhysicalIndex to be used to look up further hardware if available. $entPhysicalIndex_measured = Defaults to null. Sets the type of entPhysicalIndex used, i.e ports. $user_func = Defaults to null. You can provide a function name for the sensors value to be processed through (i.e. Convert fahrenheit to celsius use fahrenheit_to_celsius ) $group = Defaults to null. Groups sensors together under in the webui, displaying this text. $rrd_type = Default to 'GAUGE'. Allows to change the type of the RRD file created for this sensor. More details can be found here in the RRD documentation: https://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html For the majority of devices, this is all that's required to add support for a sensor. Polling is done based on the data gathered using discover_sensor() . If custom polling is needed then the file format is similar to discovery: includes/polling/sensors/$class/$os.inc.php . Whilst it's possible to perform additional snmp queries within polling this should be avoided where possible. The value for the OID is already available as $sensor_value . Graphing is performed automatically for sensors, no custom graphing is required or supported. Adding a new sensor class You will need to add code for your new sensor class in the following existing files: app/Models/Sensor.php : add a free icon from Font Awesome in the $icons array. doc/Developing/os/Health-Information.md : documentation for every sensor class is mandatory. includes/discovery/sensors.inc.php : add the sensor class to the $run_sensors array. includes/discovery/functions.inc.php : optional - if sensible low_limit and high_limit values are guessable when a SNMP-retrievable threshold is not available, add a case for the sensor class to the sensor_limit() and/or sensor_low_limit() functions. LibreNMS/Util/ObjectCache.php : optional - choose menu grouping for the sensor class. includes/html/pages/device/health.inc.php : add a dbFetchCell(), $datas[], and $type_text[] entry for the sensor class. includes/html/pages/device/overview.inc.php : add require 'overview/sensors/$class.inc.php' in the desired order for the device overview page. includes/html/pages/health.inc.php : add a $type_text[] entry for the sensor class. lang/en/sensors.php : add human-readable names and units for the sensor class in English, feel free to do so for other languages as well. Create and populate new files for the sensor class in the following places: includes/discovery/sensors/$class/ : create the folder where advanced php-based discovery files are stored. Not used for yaml discovery. ======= includes/html/pages/device/health.inc.php : add a dbFetchCell(), $datas[], and $type_text[] entry for the sensor class. includes/html/pages/device/overview.inc.php : add require 'overview/sensors/$class.inc.php' in the desired order for the device overview page. includes/html/pages/health.inc.php : add a $type_text[] entry for the sensor class. lang/en/sensors.php : add human-readable names and units for the sensor class in English, feel free to do so for other languages as well. Create and populate new files for the sensor class in the following places: includes/discovery/sensors/$class/ : create the folder where advanced php-based discovery files are stored. Not used for yaml discovery. includes/html/graphs/device/$class.inc.php : define unit names used in RRDtool graphs. includes/html/graphs/sensor/$class.inc.php : define various parameters for RRDtool graphs. includes/html/pages/device/health/$class.inc.php includes/html/pages/device/overview/sensors/$class.inc.php includes/html/pages/health/$class.inc.php Advanced health sensor example This example shows how to build sensors using the advanced method. In this example we will be collecting optical power level (dBm) from Adva FSP150CC family MetroE devices. This example will assume an understanding of SNMP and MIBs. First we setup includes/discovery/sensors/pre_cache/adva_fsp150.inc as shown below. The first line walks the cmEntityObject table to get information about the chassis and line cards. From this information we extract the model type which will identify which tables in the CM-Facility-Mib the ports are populated in. The program then reads the appropriate table into the $pre_cache array adva_fsp150_ports . This array will have OID indexies for each port, which we will use later to identify our sensor OIDs. $pre_cache['adva_fsp150'] = snmpwalk_cache_multi_oid($device, 'cmEntityObjects', [], 'CM-ENTITY-MIB', null, '-OQUbs'); $neType = $pre_cache['adva_fsp150'][1]['neType']; if ($neType == 'ccxg116pro') { $pre_cache['adva_fsp150_ports'] = snmpwalk_cache_multi_oid($device, 'cmEthernetTrafficPortTable', $pre_cache['adva_fsp150_ports'], 'CM-FACILITY-MIB', null, '-OQUbs'); } else { $pre_cache['adva_fsp150_ports'] = snmpwalk_cache_multi_oid($device, 'cmEthernetNetPortTable', $pre_cache['adva_fsp150_ports'], 'CM-FACILITY-MIB', null, '-OQUbs'); $pre_cache['adva_fsp150_ports'] = snmpwalk_cache_multi_oid($device, 'cmEthernetAccPortTable', $pre_cache['adva_fsp150_ports'], 'CM-FACILITY-MIB', null, '-OQUbs'); } Next we are going to build our sensor discovery code. These are optical readings, so the file will be created as the dBm sensor type in includes/discover/sensors/dbm/adva_fsp150.inc.php . Below is a snippet of the code: foreach ($pre_cache['adva_fsp150_ports'] as $index => $entry) { if ($entry['cmEthernetTrafficPortMediaType'] == 'fiber') { //Discover received power level $oidRx = '.1.3.6.1.4.1.2544.1.12.5.1.21.1.34.' . $index . '.3'; $oidTx = '.1.3.6.1.4.1.2544.1.12.5.1.21.1.33.' . $index . '.3'; $currentRx = snmp_get($device, $oidRx, '-Oqv', 'CM-PERFORMANCE-MIB', '/opt/librenms/mibs/adva'); $currentTx = snmp_get($device, $oidTx, '-Oqv', 'CM-PERFORMANCE-MIB', '/opt/librenms/mibs/adva'); if ($currentRx != 0 || $currentTx != 0) { $entPhysicalIndex = $entry['cmEthernetTrafficPortIfIndex']; $entPhysicalIndex_measured = 'ports'; $descrRx = dbFetchCell('SELECT `ifName` FROM `ports` WHERE `ifIndex`= ? AND `device_id` = ?', [$entry['cmEthernetTrafficPortIfIndex'], $device['device_id']]) . ' Rx Power'; discover_sensor( $valid['sensor'], 'dbm', $device, $oidRx, 'cmEthernetTrafficPortStatsOPR.' . $index, 'adva_fsp150', $descrRx, $divisor, $multiplier, null, null, null, null, $currentRx, 'snmp', $entPhysicalIndex, $entPhysicalIndex_measured ); $descrTx = dbFetchCell('SELECT `ifName` FROM `ports` WHERE `ifIndex`= ? AND `device_id` = ?', [$entry['cmEthernetTrafficPortIfIndex'], $device['device_id']]) . ' Tx Power'; discover_sensor( $valid['sensor'], 'dbm', $device, $oidTx, 'cmEthernetTrafficPortStatsOPT.' . $index, 'adva_fsp150', $descrTx, $divisor, $multiplier, null, null, null, null, $currentTx, 'snmp', $entPhysicalIndex, $entPhysicalIndex_measured ); } } } First the program will loop through each port's index value. In the case of Advas, the ports are names Ethernet 1-1-1-1, 1-1-1-2, etc, and they are indexed as oid.1.1.1.1, oid.1.1.1.2, etc in the mib. Next the program checks which table the port exists in and that the connector type is 'fiber'. There are other port tables in the full code that were ommitted from the example for brevity. Copper media won't have optical readings, so if the media type isn't fiber we skip discovery for that port. The next two lines build the OIDs for getting the optical receive and transmit values using the $index for the port. Using the OIDs the program gets the current receive and transmit values ($currentRx and $currentTx repectively) to verify the values are not 0. Not all SFPs collect digital optical monitoring (DOM) data, in the case of Adva the value of both transmit and recieve will be 0 if DOM is not available. While 0 is a valid value for optical power, its extremely unlikely that both will be 0 if DOM is present. If DOM is not available, then the program stops discovery for that port. Note that while this is the case with Adva, other vendors may differ in how they handle optics that do not supply DOM. Please check your vendor's mibs. Next the program assigns the values of $entPhysicalIndex and $entPhysicalIndex_measured. In this case $entPhysicalIndex is set to the value of the cmEthernetTrafficPortIfIndex so that it is associated with port. This will also allow the sensor graphs to show up on the associated port's page in the GUI in addition to the Health page. Following that the program uses a database call to get the description of the port which will be used as the title for the graph in the GUI. Lastly the program calls discover_sensor() and passes the information collected in the previous steps. The null values are for low, low warning, high, and high warning values, which are not collected in the Adva's MIB. You can manually run discovery to verify the code works by running ./discovery.php -h $device_id -m sensors . You can use -v to see what calls are being used during discovery and -d to see debug output. In the output under #### Load disco module sensors #### you can see a list of sensors types. If there is a + a sensor is added, if there is a - one was deleted, and a . means no change. If there is nothing next to the sensor type then the sensor was not discovered. There is is also information about changes to the database and RRD files at the bottom. [librenms@nms-test ~]$ ./discovery.php -h 2 -m sensors LibreNMS Discovery 164.113.194.250 2 adva_fsp150 #### Load disco module core #### >> Runtime for discovery module 'core': 0.0240 seconds with 66536 bytes >> SNMP: [2/0.06s] MySQL: [3/0.00s] RRD: [0/0.00s] #### Unload disco module core #### #### Load disco module sensors #### Pre-cache adva_fsp150: ENTITY-SENSOR: Caching OIDs: entPhysicalDescr entPhysicalName entPhySensorType entPhySensorScale entPhySensorPrecision entPhySensorValue entPhySensorOperStatus Airflow: Current: . Charge: Dbm: Adva FSP-150 dBm.. Fanspeed: Frequency: Humidity: Load: Power: Power_consumed: Power_factor: Runtime: Signal: State: Count: Temperature: .. Tv_signal: Bitrate: Voltage: . Snr: Pressure: Cooling: Delay: Quality_factor: Chromatic_dispersion: Ber: Eer: Waterflow: Percent: >> Runtime for discovery module 'sensors': 3.9340 seconds with 190024 bytes >> SNMP: [16/3.89s] MySQL: [36/0.03s] RRD: [0/0.00s] #### Unload disco module sensors #### Discovered in 5.521 seconds SNMP [18/3.96s]: Get[8/0.81s] Getnext[0/0.00s] Walk[10/3.15s] MySQL [41/0.03s]: Cell[10/0.01s] Row[-4/-0.00s] Rows[31/0.02s] Column[0/0.00s] Update[2/0.00s] Insert[2/0.00s] Delete[0/0.00s] RRD [0/0.00s]: Update[0/0.00s] Create [0/0.00s] Other[0/0.00s]","title":"Health Information"},{"location":"Developing/os/Health-Information/#sensors","text":"This document will guide you through adding health / sensor information for your new device. Currently, we have support for the following health metrics along with the values we expect to see the data in: Class Measurement airflow cfm ber ratio charge % chromatic_dispersion ps/nm cooling W count # current A dbm dBm delay s eer eer fanspeed rpm frequency Hz humidity % load % loss % power W power_consumed kWh power_factor ratio pressure kPa quality_factor dB runtime Min signal dBm snr SNR state # temperature C tv_signal dBmV bitrate bps voltage V waterflow l/m percent %","title":"Sensors"},{"location":"Developing/os/Health-Information/#simple-health-discovery","text":"We have support for defining health / sensor discovery using YAML files so that you don't need to know how to write PHP. Please note that DISPLAY-HINTS are disabled so ensure you use the correct divisor / multiplier if applicable. All yaml files are located in includes/definitions/discovery/$os.yaml . Defining the information here is not always possible and is heavily reliant on vendors being sensible with the MIBs they generate. Only snmp walks are supported, and you must provide a sane table that can be traversed and contains all the data you need. We will use netbotz as an example here. includes/definitions/discovery/netbotz.yaml mib : NETBOTZV2-MIB modules : sensors : airflow : options : skip_value_lt : 0 data : - oid : airFlowSensorTable value : airFlowSensorValue divisor : 10 num_oid : '.1.3.6.1.4.1.5528.100.4.1.5.1.2.{{ $index }}' descr : '{{ $airFlowSensorLabel }}' index : 'airFlowSensorValue.{{ $index }}' At the top you can define one or more mibs to be used in the lookup of data: mib: NETBOTZV2-MIB For use of multiple MIB files separate them with a colon: mib: NETBOTZV2-MIB:SECOND-MIB For data: you have the following options: The only sensor we have defined here is airflow. The available options are as follows: oid (required): This is the name of the table you want to snmp walk for data. value (optional): This is the key within the table that contains the value. If not provided will use oid num_oid (required for PullRequests): If not provided, this parameter should be computed automatically by discovery process. This parameter is still required to submit a pull request. This is the numerical OID that contains value . This should usually include {{ $index }} . In case the index is a string, {{ $index_string }} can be used instead. divisor (optional): This is the divisor to use against the returned value . multiplier (optional): This is the multiplier to use against the returned value . low_limit (optional): This is the critical low threshold that value should be (used in alerting). If an OID is specified then divisor / multiplier are used. low_warn_limit (optional): This is the warning low threshold that value should be (used in alerting). If an OID is specified then divisor / multiplier are used. warn_limit (optional): This is the warning high threshold that value should be (used in alerting). If an OID is specified then divisor / multiplier are used. high_limit (optional): This is the critical high threshold that value should be (used in alerting). If an OID is specified then divisor / multiplier are used. descr (required): The visible label for this sensor. It can be a key with in the table or a static string, optionally using {{ index }} . group (optional): Groups sensors together under in the webui, displaying this text. Not specifying this will put the sensors in the default group. index (optional): This is the index value we use to uniquely identify this sensor. {{ $index }} will be replaced by the index from the snmp walk. skip_values (optional): This is an array of values we should skip over (see note below). skip_value_lt (optional): If sensor value is less than this, skip the discovery. skip_value_gt (optional): If sensor value is greater than this, skip the discovery. entPhysicalIndex (optional): If the sensor belongs to a physical entity then you can specify the index here. entPhysicalIndex_measured (optional): If the sensor belongs to a physical entity then you can specify the entity type here. user_func (optional): You can provide a function name for the sensors value to be processed through (i.e. Convert fahrenheit to celsius use fahrenheit_to_celsius ) snmp_flags (optional): this sets the flags to be sent to snmpwalk, it overrides flags set on the sensor type and os. The default is '-OQUb' . A common issue is dealing with string indexes, setting '-OQUsbe' will change them to numeric oids. Setting ['-OQUsbe', '-Pu'] will also allow _ in oid names. You can find more in the Man Page rrd_type (optional): You can change the type of the RRD file that will be created to store the data. By default, type GAUGE is used. More details can be found here: https://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html For options: you have the following available: divisor : This is the divisor to use against the returned value . multiplier : This is the multiplier to use against the returned value . skip_values : This is an array of values we should skip over (see note below). skip_value_lt : If sensor value is less than this, skip the discovery. skip_value_gt : If sensor value is greater than this, skip the discovery. Multiple variables can be used in the sensor's definition. The syntax is {{ $variable }} . Any oid in the current table can be used, as well as pre_cached data. The index ($index) and the sub_indexes (in case the oid is indexed multiple times) are also available: if $index=\"1.20\", then $subindex0=\"1\" and $subindex1=\"20\". When referencing an oid in another table the full index will be used to match the other table. If this is undesirable, you may use a single sub index by appending the sub index after a colon to the variable name. Example {{ $ifName:2 }} skip_values can also compare items within the OID table against values. The index of the sensor is used to retrieve the value from the OID, unless a target index is appended to the OID. Additionally, you may check fields from the device. Comparisons behave on a logical OR basis when chained, so only one of them needs to be matched for that particular sensor to be skipped during discovery. An example of this is below: skip_values : - oid : sensUnit op : '!=' value : 4 - oid : sensConfig.0 op : '!=' value : 1 - device : hardware op : 'contains' value : 'rev2' op can be any of the following operators : =, !=, ==, !==, <=, >=, <, >, starts, ends, contains, regex, in_array, not_starts, not_ends, not_contains, not_regex, not_in_array, exists Example: skip_values : - oid : sensorName op : 'not_in_array' value : [ 'sensor1' , 'sensor2' ] skip_values : - oid : sensorOptionalOID op : 'exists' value : false temperature : data : - oid : hwOpticalModuleInfoTable value : hwEntityOpticalTemperature descr : '{{ $entPhysicalName }}' index : '{{ $index }}' skip_values : - oid : hwEntityOpticalMode op : '=' value : '1' If you aren't able to use yaml to perform the sensor discovery, you will most likely need to use Advanced health discovery.","title":"Simple health discovery"},{"location":"Developing/os/Health-Information/#advanced-health-discovery","text":"If you can't use the yaml files as above, then you will need to create the discovery code in php. If it is possible to create via yaml, php discovery will likely be rejected due to the much higher chance of later problems, so it is highly suggested to use yaml. The directory structure for sensor information is includes/discovery/sensors/$class/$os.inc.php . The format of all the sensors follows the same code format which is to collect sensor information via SNMP and then call the discover_sensor() function; except state sensors which requires additional code. Sensor information is commonly found in an ENTITY mib supplied by device's vendor in the form of a table. Other mib tables may be used as well. Sensor information is first collected by includes/discovery/sensors/pre_cache/$os.inc.php . This program will pull in data from mib tables into a $pre_cache array that can then be used in includes/discovery/sensors/$class/$os.inc.php to extract specific values which are then passed to discover_sensor() . discover_sensor() Accepts the following arguments: &$valid = This is always $valid['sensor'], do not pass any other values. $class = Required. This is the sensor class from the table above (i.e humidity). $device = Required. This is the $device array. $oid = Required. This must be the numerical OID for where the data can be found, i.e .1.2.3.4.5.6.7.0 $index = Required. This must be unique for this sensor class, device and type. Typically it's the index from the table being walked, or it could be the name of the OID if it's a single value. $type = Required. This should be the OS name, i.e. pulse. $descr = Required. This is a descriptive value for the sensor. Some devices will provide names to use. $divisor = Defaults to 1. This is used to divide the returned value. $multiplier = Defaults to 1. This is used to multiply the returned value. $low_limit = Defaults to null. Sets the low threshold limit for the sensor, used in alerting to report out range sensors. $low_warn_limit = Defaults to null. Sets the low warning limit for the sensor, used in alerting to report near out of range sensors. $warn_limit = Defaults to null. Sets the high warning limit for the sensor, used in alerting to report near out of range sensors. $high_limit = Defaults to null. Sets the high limit for the sensor, used in alerting to report out range sensors. $current = Defaults to null. Can be used to set the current value on discovery. Poller will update this on the next poll cycle anyway. $poller_type = Defaults to snmp. Things like the unix-agent can set different values but for the most part this should be left as snmp. $entPhysicalIndex = Defaults to null. Sets the entPhysicalIndex to be used to look up further hardware if available. $entPhysicalIndex_measured = Defaults to null. Sets the type of entPhysicalIndex used, i.e ports. $user_func = Defaults to null. You can provide a function name for the sensors value to be processed through (i.e. Convert fahrenheit to celsius use fahrenheit_to_celsius ) $group = Defaults to null. Groups sensors together under in the webui, displaying this text. $rrd_type = Default to 'GAUGE'. Allows to change the type of the RRD file created for this sensor. More details can be found here in the RRD documentation: https://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html For the majority of devices, this is all that's required to add support for a sensor. Polling is done based on the data gathered using discover_sensor() . If custom polling is needed then the file format is similar to discovery: includes/polling/sensors/$class/$os.inc.php . Whilst it's possible to perform additional snmp queries within polling this should be avoided where possible. The value for the OID is already available as $sensor_value . Graphing is performed automatically for sensors, no custom graphing is required or supported.","title":"Advanced health discovery"},{"location":"Developing/os/Health-Information/#adding-a-new-sensor-class","text":"You will need to add code for your new sensor class in the following existing files: app/Models/Sensor.php : add a free icon from Font Awesome in the $icons array. doc/Developing/os/Health-Information.md : documentation for every sensor class is mandatory. includes/discovery/sensors.inc.php : add the sensor class to the $run_sensors array. includes/discovery/functions.inc.php : optional - if sensible low_limit and high_limit values are guessable when a SNMP-retrievable threshold is not available, add a case for the sensor class to the sensor_limit() and/or sensor_low_limit() functions. LibreNMS/Util/ObjectCache.php : optional - choose menu grouping for the sensor class. includes/html/pages/device/health.inc.php : add a dbFetchCell(), $datas[], and $type_text[] entry for the sensor class. includes/html/pages/device/overview.inc.php : add require 'overview/sensors/$class.inc.php' in the desired order for the device overview page. includes/html/pages/health.inc.php : add a $type_text[] entry for the sensor class. lang/en/sensors.php : add human-readable names and units for the sensor class in English, feel free to do so for other languages as well. Create and populate new files for the sensor class in the following places: includes/discovery/sensors/$class/ : create the folder where advanced php-based discovery files are stored. Not used for yaml discovery. ======= includes/html/pages/device/health.inc.php : add a dbFetchCell(), $datas[], and $type_text[] entry for the sensor class. includes/html/pages/device/overview.inc.php : add require 'overview/sensors/$class.inc.php' in the desired order for the device overview page. includes/html/pages/health.inc.php : add a $type_text[] entry for the sensor class. lang/en/sensors.php : add human-readable names and units for the sensor class in English, feel free to do so for other languages as well. Create and populate new files for the sensor class in the following places: includes/discovery/sensors/$class/ : create the folder where advanced php-based discovery files are stored. Not used for yaml discovery. includes/html/graphs/device/$class.inc.php : define unit names used in RRDtool graphs. includes/html/graphs/sensor/$class.inc.php : define various parameters for RRDtool graphs. includes/html/pages/device/health/$class.inc.php includes/html/pages/device/overview/sensors/$class.inc.php includes/html/pages/health/$class.inc.php","title":"Adding a new sensor class"},{"location":"Developing/os/Health-Information/#advanced-health-sensor-example","text":"This example shows how to build sensors using the advanced method. In this example we will be collecting optical power level (dBm) from Adva FSP150CC family MetroE devices. This example will assume an understanding of SNMP and MIBs. First we setup includes/discovery/sensors/pre_cache/adva_fsp150.inc as shown below. The first line walks the cmEntityObject table to get information about the chassis and line cards. From this information we extract the model type which will identify which tables in the CM-Facility-Mib the ports are populated in. The program then reads the appropriate table into the $pre_cache array adva_fsp150_ports . This array will have OID indexies for each port, which we will use later to identify our sensor OIDs. $pre_cache['adva_fsp150'] = snmpwalk_cache_multi_oid($device, 'cmEntityObjects', [], 'CM-ENTITY-MIB', null, '-OQUbs'); $neType = $pre_cache['adva_fsp150'][1]['neType']; if ($neType == 'ccxg116pro') { $pre_cache['adva_fsp150_ports'] = snmpwalk_cache_multi_oid($device, 'cmEthernetTrafficPortTable', $pre_cache['adva_fsp150_ports'], 'CM-FACILITY-MIB', null, '-OQUbs'); } else { $pre_cache['adva_fsp150_ports'] = snmpwalk_cache_multi_oid($device, 'cmEthernetNetPortTable', $pre_cache['adva_fsp150_ports'], 'CM-FACILITY-MIB', null, '-OQUbs'); $pre_cache['adva_fsp150_ports'] = snmpwalk_cache_multi_oid($device, 'cmEthernetAccPortTable', $pre_cache['adva_fsp150_ports'], 'CM-FACILITY-MIB', null, '-OQUbs'); } Next we are going to build our sensor discovery code. These are optical readings, so the file will be created as the dBm sensor type in includes/discover/sensors/dbm/adva_fsp150.inc.php . Below is a snippet of the code: foreach ($pre_cache['adva_fsp150_ports'] as $index => $entry) { if ($entry['cmEthernetTrafficPortMediaType'] == 'fiber') { //Discover received power level $oidRx = '.1.3.6.1.4.1.2544.1.12.5.1.21.1.34.' . $index . '.3'; $oidTx = '.1.3.6.1.4.1.2544.1.12.5.1.21.1.33.' . $index . '.3'; $currentRx = snmp_get($device, $oidRx, '-Oqv', 'CM-PERFORMANCE-MIB', '/opt/librenms/mibs/adva'); $currentTx = snmp_get($device, $oidTx, '-Oqv', 'CM-PERFORMANCE-MIB', '/opt/librenms/mibs/adva'); if ($currentRx != 0 || $currentTx != 0) { $entPhysicalIndex = $entry['cmEthernetTrafficPortIfIndex']; $entPhysicalIndex_measured = 'ports'; $descrRx = dbFetchCell('SELECT `ifName` FROM `ports` WHERE `ifIndex`= ? AND `device_id` = ?', [$entry['cmEthernetTrafficPortIfIndex'], $device['device_id']]) . ' Rx Power'; discover_sensor( $valid['sensor'], 'dbm', $device, $oidRx, 'cmEthernetTrafficPortStatsOPR.' . $index, 'adva_fsp150', $descrRx, $divisor, $multiplier, null, null, null, null, $currentRx, 'snmp', $entPhysicalIndex, $entPhysicalIndex_measured ); $descrTx = dbFetchCell('SELECT `ifName` FROM `ports` WHERE `ifIndex`= ? AND `device_id` = ?', [$entry['cmEthernetTrafficPortIfIndex'], $device['device_id']]) . ' Tx Power'; discover_sensor( $valid['sensor'], 'dbm', $device, $oidTx, 'cmEthernetTrafficPortStatsOPT.' . $index, 'adva_fsp150', $descrTx, $divisor, $multiplier, null, null, null, null, $currentTx, 'snmp', $entPhysicalIndex, $entPhysicalIndex_measured ); } } } First the program will loop through each port's index value. In the case of Advas, the ports are names Ethernet 1-1-1-1, 1-1-1-2, etc, and they are indexed as oid.1.1.1.1, oid.1.1.1.2, etc in the mib. Next the program checks which table the port exists in and that the connector type is 'fiber'. There are other port tables in the full code that were ommitted from the example for brevity. Copper media won't have optical readings, so if the media type isn't fiber we skip discovery for that port. The next two lines build the OIDs for getting the optical receive and transmit values using the $index for the port. Using the OIDs the program gets the current receive and transmit values ($currentRx and $currentTx repectively) to verify the values are not 0. Not all SFPs collect digital optical monitoring (DOM) data, in the case of Adva the value of both transmit and recieve will be 0 if DOM is not available. While 0 is a valid value for optical power, its extremely unlikely that both will be 0 if DOM is present. If DOM is not available, then the program stops discovery for that port. Note that while this is the case with Adva, other vendors may differ in how they handle optics that do not supply DOM. Please check your vendor's mibs. Next the program assigns the values of $entPhysicalIndex and $entPhysicalIndex_measured. In this case $entPhysicalIndex is set to the value of the cmEthernetTrafficPortIfIndex so that it is associated with port. This will also allow the sensor graphs to show up on the associated port's page in the GUI in addition to the Health page. Following that the program uses a database call to get the description of the port which will be used as the title for the graph in the GUI. Lastly the program calls discover_sensor() and passes the information collected in the previous steps. The null values are for low, low warning, high, and high warning values, which are not collected in the Adva's MIB. You can manually run discovery to verify the code works by running ./discovery.php -h $device_id -m sensors . You can use -v to see what calls are being used during discovery and -d to see debug output. In the output under #### Load disco module sensors #### you can see a list of sensors types. If there is a + a sensor is added, if there is a - one was deleted, and a . means no change. If there is nothing next to the sensor type then the sensor was not discovered. There is is also information about changes to the database and RRD files at the bottom. [librenms@nms-test ~]$ ./discovery.php -h 2 -m sensors LibreNMS Discovery 164.113.194.250 2 adva_fsp150 #### Load disco module core #### >> Runtime for discovery module 'core': 0.0240 seconds with 66536 bytes >> SNMP: [2/0.06s] MySQL: [3/0.00s] RRD: [0/0.00s] #### Unload disco module core #### #### Load disco module sensors #### Pre-cache adva_fsp150: ENTITY-SENSOR: Caching OIDs: entPhysicalDescr entPhysicalName entPhySensorType entPhySensorScale entPhySensorPrecision entPhySensorValue entPhySensorOperStatus Airflow: Current: . Charge: Dbm: Adva FSP-150 dBm.. Fanspeed: Frequency: Humidity: Load: Power: Power_consumed: Power_factor: Runtime: Signal: State: Count: Temperature: .. Tv_signal: Bitrate: Voltage: . Snr: Pressure: Cooling: Delay: Quality_factor: Chromatic_dispersion: Ber: Eer: Waterflow: Percent: >> Runtime for discovery module 'sensors': 3.9340 seconds with 190024 bytes >> SNMP: [16/3.89s] MySQL: [36/0.03s] RRD: [0/0.00s] #### Unload disco module sensors #### Discovered in 5.521 seconds SNMP [18/3.96s]: Get[8/0.81s] Getnext[0/0.00s] Walk[10/3.15s] MySQL [41/0.03s]: Cell[10/0.01s] Row[-4/-0.00s] Rows[31/0.02s] Column[0/0.00s] Update[2/0.00s] Insert[2/0.00s] Delete[0/0.00s] RRD [0/0.00s]: Update[0/0.00s] Create [0/0.00s] Other[0/0.00s]","title":"Advanced health sensor example"},{"location":"Developing/os/Initial-Detection/","text":"This document will provide the information you should need to add basic detection for a new OS. Discovery OS discovery is how LibreNMS detects which OS should be used for a device. Generally detection should use sysObjectID or sysDescr, but you can also snmpget an oid and check for a value. snmpget is discouraged because it slows down all os detections, not just the added os. To begin, create the new OS file which should be called includes/definitions/pulse.yaml . Here is a working example: os : pulse text : 'Pulse Secure' type : firewall icon : pulse over : - { graph : device_bits , text : 'Device Traffic' } - { graph : device_processor , text : 'CPU Usage' } - { graph : device_mempool , text : 'Memory Usage' } discovery : - sysObjectID : - .1.3.6.1.4.1.12532. over : This is a list of the graphs which will be shown within the device header bar (mini graphs top right). discovery : Here we are detecting this new OS using sysObjectID, this is the preferred method for detection. Other options are available: sysObjectID The preferred operator. Checks if the sysObjectID starts with one of the strings under this item sysDescr Use this in addition to sysObjectID if required. Check that the sysDescr contains one of the strings under this item sysObjectID_regex Please avoid use of this. Checks if the sysObjectID matches one of the regex statements under this item sysDescr_regex Please avoid use of this. Checks if the sysDescr matches one of the regex statements under this item snmpget Do not use this unless none of the other methods work. Fetch an oid and compare it against a value. discovery : - snmpget : - oid : - op : <[\"=\",\"!=\",\"==\",\"!==\",\"<=\",\">=\",\"<\",\">\",\"starts\",\"ends\",\"contains\",\"regex\",\"not_starts\",\"not_ends\",\"not_contains\",\"not_regex\",\"in_array\",\"not_in_array\",\"exists\"]> - value : <'string' | boolean> _except You can add this to any of the above to exclude that element. As an example: discovery : - sysObjectID : - .1.3.6.1.4.1.12532. sysDescr_except : - 'Not some pulse' group : You can group certain OS' together by using group, for instance ios, nx-os, iosxr are all within a group called cisco. bad_ifXEntry : This is a list of models for which to tell LibreNMS that the device doesn't support ifXEntry and to ignore it: bad_ifXEntry : - cisco1941 - cisco886Va - cisco2811 mib_dir : You can use this to specify an additional directory to look in for MIBs. An array is not accepted, only one directory may be specified. mib_dir : juniper poller_modules : This is a list of poller modules to either enable (1) or disable (0). Check misc/config_definitions.json to see which modules are enabled/disabled by default. poller_modules : cisco-ace-serverfarms : false cisco-ace-loadbalancer : false discovery_modules : This is the list of discovery modules to either enable (1) or disable (0). Check misc/config_definitions.json to see which modules are enabled/disabled by default. discovery_modules : cisco-cef : true slas : true cisco-mac-accounting : false Discovery Logic YAML is converted to an array in PHP. Consider the following YAML: discovery : - sysObjectID : foo - sysDescr : [ snafu , exodar ] sysObjectID : bar This is how the discovery array would look in PHP: [ [ \"sysObjectID\" => \"foo\" , ], [ \"sysDescr\" => [ \"snafu\" , \"exodar\" , ], \"sysObjectID\" => \"bar\" , ] ] The logic for the discovery is as follows: One of the first level items must match ALL of the second level items must match (sysObjectID, sysDescr) One of the third level items (foo, [snafu,exodar], bar) must match So, considering the example: sysObjectID: foo, sysDescr: ANYTHING matches sysObjectID: bar, sysDescr: ANYTHING does not match sysObjectID: bar, sysDescr: exodar matches sysObjectID: bar, sysDescr: snafu matches OS discovery OS discovery collects additional standardized data about the OS. These are specified in the discovery yaml includes/definitions/discovery/.yaml or LibreNMS/OS/.php if more complex collection is required. version The version of the OS running on the device. hardware The hardware version for the device. For example: 'WS-C3560X-24T-S' features Features for the device, for example a list of enabled software features. serial The main serial number of the device. Yaml based OS discovery sysDescr_regex apply a regex or list of regexes to the sysDescr to extract named groups, this data has the lowest precedence specify an oid or list of oids to attempt to pull the data from, the first non-empty response will be used _regex parse the value out of the returned oid data, must use a named group _template combine multiple oid results together to create a final string value. The result is trimmed. _replace An array of replacements ['search regex', 'replace'] or regex to remove hardware_mib MIB used to translate sysObjectID to get hardware. hardware_regex can process the result. modules : os : sysDescr_regex : '/(?MSM\\S+) .* Serial number (?\\S+) - Firmware version (?\\S+)/' features : UPS-MIB::upsIdentAttachedDevices.0 hardware : - ENTITY-MIB::entPhysicalName.1 - ENTITY-MIB::entPhysicalHardwareRev.1 hardware_template : '{{ ENTITY-MIB::entPhysicalName.1 }} {{ ENTITY-MIB::entPhysicalHardwareRev.1 }}' serial : ENTITY-MIB::entPhysicalSerialNum.1 version : ENTITY-MIB::entPhysicalSoftwareRev.1 version_regex : '/V(?.*)/' PHP based OS discovery public function discoverOS ( \\App\\Models\\Device $device ) : void { $info = snmp_getnext_multi ( $this -> getDeviceArray (), [ 'enclosureModel' , 'enclosureSerialNum' , 'entPhysicalFirmwareRev' ], '-OQUs' , 'NAS-MIB:ENTITY-MIB' ); $device -> version = $info [ 'entPhysicalFirmwareRev' ]; $device -> hardware = $info [ 'enclosureModel' ]; $device -> serial = $info [ 'enclosureSerialNum' ]; } MIBs If the device has MIBs available and you use it in the detection then you can add these in. It is highly recommended that you add mibs to a vendor specific directory. For instance HP mibs are in mibs/hp . Please ensure that these directories are specified in the yaml detection file, see mib_dir above. Icon and Logo It is highly recommended to use SVG images where possible, these scale and provide a nice visual image for users with HiDPI screens. If you can't find SVG images then please use png. Create an SVG image of the icon and logo. Legacy PNG bitmaps are also supported but look bad on HiDPI. A vector image should not contain padding. The file should not be larger than 20 Kb. Simplify paths to reduce large files. Use plain SVG without gzip compression. The SVG root element must not contain length and width attributes, only viewBox. Icon Save the icon SVG to html/images/os/$os.svg . Icons should look good when viewed at 32x32 px. Square icons are preferred to full logos with text. Remove small ornaments that are almost not visible when displayed with 32px width (e.g. \u00ae or \u2122). Logo Save the logo SVG to html/images/logos/$os.svg . Logos can be any dimension, but often are wide and contain the company name. If a logo is not present, the icon will be used. Hints Hints for Inkscape : You can open a PDF or EPS to extract the logo. Ungroup elements to isolate the logo. Use Path -> Simplify to simplify paths of large files. Use File -> Document Properties\u2026 -> Resize page to content\u2026 to remove padding. Use File -> Clean up document to remove unused gradients, patterns, or markers. Use File -> Save As -> Plain SVG to save the final image. By optimizing the SVG you can shrink the file size in some cases to less than 20 %. SVG Optimizer does a great job. There is also an online version . The final check Discovery ./discovery.php -d -h HOSTNAME Polling lnms device:poll HOSTNAME At this step we should see all the values retrieved in LibreNMS. Note: If you have made a number of changes to either the OS's Discovery files, it's possible earlier edits have been cached. As such, if you do not get expected behaviour when completing the final check above, try removing the cache file first: rm -f cache/os_defs.cache","title":"Initial Detection"},{"location":"Developing/os/Initial-Detection/#discovery","text":"OS discovery is how LibreNMS detects which OS should be used for a device. Generally detection should use sysObjectID or sysDescr, but you can also snmpget an oid and check for a value. snmpget is discouraged because it slows down all os detections, not just the added os. To begin, create the new OS file which should be called includes/definitions/pulse.yaml . Here is a working example: os : pulse text : 'Pulse Secure' type : firewall icon : pulse over : - { graph : device_bits , text : 'Device Traffic' } - { graph : device_processor , text : 'CPU Usage' } - { graph : device_mempool , text : 'Memory Usage' } discovery : - sysObjectID : - .1.3.6.1.4.1.12532. over : This is a list of the graphs which will be shown within the device header bar (mini graphs top right). discovery : Here we are detecting this new OS using sysObjectID, this is the preferred method for detection. Other options are available: sysObjectID The preferred operator. Checks if the sysObjectID starts with one of the strings under this item sysDescr Use this in addition to sysObjectID if required. Check that the sysDescr contains one of the strings under this item sysObjectID_regex Please avoid use of this. Checks if the sysObjectID matches one of the regex statements under this item sysDescr_regex Please avoid use of this. Checks if the sysDescr matches one of the regex statements under this item snmpget Do not use this unless none of the other methods work. Fetch an oid and compare it against a value. discovery : - snmpget : - oid : - op : <[\"=\",\"!=\",\"==\",\"!==\",\"<=\",\">=\",\"<\",\">\",\"starts\",\"ends\",\"contains\",\"regex\",\"not_starts\",\"not_ends\",\"not_contains\",\"not_regex\",\"in_array\",\"not_in_array\",\"exists\"]> - value : <'string' | boolean> _except You can add this to any of the above to exclude that element. As an example: discovery : - sysObjectID : - .1.3.6.1.4.1.12532. sysDescr_except : - 'Not some pulse' group : You can group certain OS' together by using group, for instance ios, nx-os, iosxr are all within a group called cisco. bad_ifXEntry : This is a list of models for which to tell LibreNMS that the device doesn't support ifXEntry and to ignore it: bad_ifXEntry : - cisco1941 - cisco886Va - cisco2811 mib_dir : You can use this to specify an additional directory to look in for MIBs. An array is not accepted, only one directory may be specified. mib_dir : juniper poller_modules : This is a list of poller modules to either enable (1) or disable (0). Check misc/config_definitions.json to see which modules are enabled/disabled by default. poller_modules : cisco-ace-serverfarms : false cisco-ace-loadbalancer : false discovery_modules : This is the list of discovery modules to either enable (1) or disable (0). Check misc/config_definitions.json to see which modules are enabled/disabled by default. discovery_modules : cisco-cef : true slas : true cisco-mac-accounting : false","title":"Discovery"},{"location":"Developing/os/Initial-Detection/#discovery-logic","text":"YAML is converted to an array in PHP. Consider the following YAML: discovery : - sysObjectID : foo - sysDescr : [ snafu , exodar ] sysObjectID : bar This is how the discovery array would look in PHP: [ [ \"sysObjectID\" => \"foo\" , ], [ \"sysDescr\" => [ \"snafu\" , \"exodar\" , ], \"sysObjectID\" => \"bar\" , ] ] The logic for the discovery is as follows: One of the first level items must match ALL of the second level items must match (sysObjectID, sysDescr) One of the third level items (foo, [snafu,exodar], bar) must match So, considering the example: sysObjectID: foo, sysDescr: ANYTHING matches sysObjectID: bar, sysDescr: ANYTHING does not match sysObjectID: bar, sysDescr: exodar matches sysObjectID: bar, sysDescr: snafu matches","title":"Discovery Logic"},{"location":"Developing/os/Initial-Detection/#os-discovery","text":"OS discovery collects additional standardized data about the OS. These are specified in the discovery yaml includes/definitions/discovery/.yaml or LibreNMS/OS/.php if more complex collection is required. version The version of the OS running on the device. hardware The hardware version for the device. For example: 'WS-C3560X-24T-S' features Features for the device, for example a list of enabled software features. serial The main serial number of the device.","title":"OS discovery"},{"location":"Developing/os/Initial-Detection/#yaml-based-os-discovery","text":"sysDescr_regex apply a regex or list of regexes to the sysDescr to extract named groups, this data has the lowest precedence specify an oid or list of oids to attempt to pull the data from, the first non-empty response will be used _regex parse the value out of the returned oid data, must use a named group _template combine multiple oid results together to create a final string value. The result is trimmed. _replace An array of replacements ['search regex', 'replace'] or regex to remove hardware_mib MIB used to translate sysObjectID to get hardware. hardware_regex can process the result. modules : os : sysDescr_regex : '/(?MSM\\S+) .* Serial number (?\\S+) - Firmware version (?\\S+)/' features : UPS-MIB::upsIdentAttachedDevices.0 hardware : - ENTITY-MIB::entPhysicalName.1 - ENTITY-MIB::entPhysicalHardwareRev.1 hardware_template : '{{ ENTITY-MIB::entPhysicalName.1 }} {{ ENTITY-MIB::entPhysicalHardwareRev.1 }}' serial : ENTITY-MIB::entPhysicalSerialNum.1 version : ENTITY-MIB::entPhysicalSoftwareRev.1 version_regex : '/V(?.*)/'","title":"Yaml based OS discovery"},{"location":"Developing/os/Initial-Detection/#php-based-os-discovery","text":"public function discoverOS ( \\App\\Models\\Device $device ) : void { $info = snmp_getnext_multi ( $this -> getDeviceArray (), [ 'enclosureModel' , 'enclosureSerialNum' , 'entPhysicalFirmwareRev' ], '-OQUs' , 'NAS-MIB:ENTITY-MIB' ); $device -> version = $info [ 'entPhysicalFirmwareRev' ]; $device -> hardware = $info [ 'enclosureModel' ]; $device -> serial = $info [ 'enclosureSerialNum' ]; }","title":"PHP based OS discovery"},{"location":"Developing/os/Initial-Detection/#mibs","text":"If the device has MIBs available and you use it in the detection then you can add these in. It is highly recommended that you add mibs to a vendor specific directory. For instance HP mibs are in mibs/hp . Please ensure that these directories are specified in the yaml detection file, see mib_dir above.","title":"MIBs"},{"location":"Developing/os/Initial-Detection/#icon-and-logo","text":"It is highly recommended to use SVG images where possible, these scale and provide a nice visual image for users with HiDPI screens. If you can't find SVG images then please use png. Create an SVG image of the icon and logo. Legacy PNG bitmaps are also supported but look bad on HiDPI. A vector image should not contain padding. The file should not be larger than 20 Kb. Simplify paths to reduce large files. Use plain SVG without gzip compression. The SVG root element must not contain length and width attributes, only viewBox.","title":"Icon and Logo"},{"location":"Developing/os/Initial-Detection/#icon","text":"Save the icon SVG to html/images/os/$os.svg . Icons should look good when viewed at 32x32 px. Square icons are preferred to full logos with text. Remove small ornaments that are almost not visible when displayed with 32px width (e.g. \u00ae or \u2122).","title":"Icon"},{"location":"Developing/os/Initial-Detection/#logo","text":"Save the logo SVG to html/images/logos/$os.svg . Logos can be any dimension, but often are wide and contain the company name. If a logo is not present, the icon will be used.","title":"Logo"},{"location":"Developing/os/Initial-Detection/#hints","text":"Hints for Inkscape : You can open a PDF or EPS to extract the logo. Ungroup elements to isolate the logo. Use Path -> Simplify to simplify paths of large files. Use File -> Document Properties\u2026 -> Resize page to content\u2026 to remove padding. Use File -> Clean up document to remove unused gradients, patterns, or markers. Use File -> Save As -> Plain SVG to save the final image. By optimizing the SVG you can shrink the file size in some cases to less than 20 %. SVG Optimizer does a great job. There is also an online version .","title":"Hints"},{"location":"Developing/os/Initial-Detection/#the-final-check","text":"Discovery ./discovery.php -d -h HOSTNAME Polling lnms device:poll HOSTNAME At this step we should see all the values retrieved in LibreNMS. Note: If you have made a number of changes to either the OS's Discovery files, it's possible earlier edits have been cached. As such, if you do not get expected behaviour when completing the final check above, try removing the cache file first: rm -f cache/os_defs.cache","title":"The final check"},{"location":"Developing/os/Mem-CPU-Information/","text":"This document will guide you through adding detection for Memory / Processor for your new device. Memory LibreNMS will attempt to detect memory statistics using the standard HOST-RESOURCES-MIB and UCD-SNMP-MIB MIBs. To detect non-standard MIBs, they can be defined via Yaml. YAML In order to successfully detect memory amount and usage, two of the for keys below are required. Some OS only provide a usage percentage, which will work, but a total RAM amount will not be displayed. total used free percent_used includes/definitions/discovery/mempools/arubaos.yaml mempools : data : - total : WLSX-SWITCH-MIB::sysXMemorySize used : WLSX-SWITCH-MIB::sysXMemoryUsed precision : 1024 The code can also interpret table based OIDs and supports many of the same features as Health Sensors including {{ }} parsing, skip_values, and precache. Valid data entry keys: oid oid to walk to collect processor data total oid or integer total memory size in bytes (or precision) used oid memory used in bytes (or precision) free oid memory free in bytes (or precision) percent_used oid of percentage of used memory descr A visible description of the memory measurement defaults to \"Memory\" warn_percent Usage percentage to used for alert purposes precision precision for all byte values, typically a power of 2 (1024 for example) class used to generate rrd filename, defaults to system. If system, buffers, and cached exist they will be combined to calculate available memory. type used to generate rrd filename, defaults to the os name index used to generate rrd filename, defaults to the oid index skip_values skip values see Health Sensors for specification snmp_flags additional net-snmp flags Custom Processor Discovery and Polling If you need to implement custom discovery or polling you can implement the MempoolsDiscovery interface and the MempoolsPolling interface in the OS class. MempoolsPolling is optional, standard polling will be used based on OIDs stored in the database. OS Class files reside under LibreNMS\\OS , this will add more data to the snmprec file Review data. If you modified the snmprec (don't modify json manually) run ./scripts/save-test-data.php -o example-os -m Run lnms dev:check unit --db --snmpsim If the tests succeed submit a pull request JSON Application Test Writing Using ./scripts/json-app-tool.php First you will need a good example JSON output produced via SNMP extend in question. Read the help via ./scripts/json-app-tool.php -h . Generate the SNMPrec data via ./scripts/json-app-tool.php -a appName -s > ./tests/snmpsim/linux_appName-v1.snmprec . If the SNMP extend name OID different than the application name, then you will need to pass the -S flag for over riding that. Generate the test JSON data via ./scripts/json-app-tool.php -a appName -t > ./tests/data/linux_appName-v1.json . Update the generated './tests/data/linux_appName-v1.json' making sure that all the expected metrics are present. This assumes that everything under .data in the JSON will be collapsed and used. During test runs if it does not appear to be detecting the app and it has a different app name and SNMP extend name OID, make sure that -S is set properly and that 'includes/discovery/applications.inc.php' has been updated.","title":"Test Units"},{"location":"Developing/os/Test-Units/#tests","text":"Tests ensure LibreNMS works as expected, now and in the future. New OS should provide as much test data as needed and added test data for existing OS is welcome. Saved snmp data can be found in tests/snmpsim/*.snmprec and saved database data can be found in tests/data/*.json . Please review this for any sensitive data before submitting. When replacing data, make sure it is modified in a consistent manner. We utilise snmpsim to do unit testing. For OS discovery, we can mock snmpsim, but for other tests you will need it installed and functioning. We run snmpsim during our integration tests, but not by default when running lnms dev:check . You can install snmpsim with the command pip3 install snmpsim .","title":"Tests"},{"location":"Developing/os/Test-Units/#capturing-test-data","text":"If test data already exists If test data already exists, but is for a different device/configuration with the same OS. Then you should use the --variant (-v) option to specify a different variant of the OS, this will be tested completely separate from other variants. If there is only one variant, please do not specify one.","title":"Capturing test data"},{"location":"Developing/os/Test-Units/#1-collect-snmp-data","text":"./scripts/collect-snmp-data.php is provided to make it easy to collect data for tests. Running collect-snmp-data.php with the --hostname (-h) allows you to capture all data used to discover and poll a device already added to LibreNMS. Make sure to re-run the script if you add additional support. Check the command-line help for more options.","title":"1. Collect SNMP data"},{"location":"Developing/os/Test-Units/#2-save-test-data","text":"After you have collected snmp data, run ./scripts/save-test-data.php with the --os (-o) option to dump the post discovery and post poll database entries to json files. This step requires snmpsim, if you are having issues, the maintainers may help you generate it from the snmprec you created in the previous step. Generally, you will only need to collect data once. After you have the data you need in the snmprec file, you can just use save-test-data.php to update the database dump (json) after that.","title":"2. Save test data"},{"location":"Developing/os/Test-Units/#running-tests","text":"Note: To run tests, ensure you have executed ./scripts/composer_wrapper.php install from your LibreNMS root directory. This will read composer.json and install any dependencies required. After you have saved your test data, you should run lnms dev:check verify they pass. To run the full suite of tests enable database and snmpsim reliant tests: lnms dev:check unit --db --snmpsim","title":"Running tests"},{"location":"Developing/os/Test-Units/#specific-os","text":"lnms dev:check unit -o osname","title":"Specific OS"},{"location":"Developing/os/Test-Units/#specific-module","text":"lnms dev:check unit -m modulename","title":"Specific Module"},{"location":"Developing/os/Test-Units/#using-snmpsim-for-testing","text":"You can run snmpsim to access test data by running lnms dev:simulate You may then run snmp queries against it using the os (and variant) as the community and 127.1.6.1:1161 as the host. snmpget -v 2c -c ios_c3560e 127 .1.6.1:1161 sysDescr.0","title":"Using snmpsim for testing"},{"location":"Developing/os/Test-Units/#snmprec-format","text":"Snmprec files are simple files that store the snmp data. The data format is simple with three columns: numeric oid, type code, and data. Here is an example snippet. 1.3.6.1.2.1.1.1.0|4|Pulse Secure,LLC,MAG-2600,8.0R14 (build 41869) 1.3.6.1.2.1.1.2.0|6|1.3.6.1.4.1.12532.254.1.1 During testing LibreNMS will use any info in the snmprec file for snmp calls. This one provides sysDescr ( .1.3.6.1.2.1.1.1.0 , 4 = Octet String) and sysObjectID ( .1.3.6.1.2.1.1.2.0 , 6 = Object Identifier), which is the minimum that should be provided for new snmprec files. To look up the numeric OID and type of an string OID with snmptranslate: snmptranslate -On -Td SNMPv2-MIB::sysDescr.0 List of SNMP data types: Type Value OCTET STRING 4 HEX STRING 4x Integer32 2 NULL 5 OBJECT IDENTIFIER 6 IpAddress 64 Counter32 65 Gauge32 66 TimeTicks 67 Opaque 68 Counter64 70 Hex encoded strings (4x) should be used for any strings that contain line returns.","title":"Snmprec format"},{"location":"Developing/os/Test-Units/#new-discoverypoller-modules","text":"New discovery or poller modules should define database capture parameters in /tests/module_tables.yaml .","title":"New discovery/poller modules"},{"location":"Developing/os/Test-Units/#example-workflow","text":"If the base os ( .snmprec) already contains test data for the module you are testing or that data conflicts with your new data, you must use a variant to store your test data (-v).","title":"Example workflow"},{"location":"Developing/os/Test-Units/#add-initial-detection","text":"Add device to LibreNMS. It is generic and device_id = 42 Run ./scripts/collect-snmp-data.php -h 42 , initial snmprec will be created Add initial detection for example-os Run discovery to make sure it detects properly ./discovery.php -h 42 Add any additional os items like version, hardware, features, or serial. If there is additional snmp data required, run ./scripts/collect-snmp-data.php -h 42 Run ./scripts/save-test-data.php -o example-os to update the dumped database data. Review data. If you modified the snmprec or code (don't modify json manually) run ./scripts/save-test-data.php -o example-os -m os Run lnms dev:check unit --db --snmpsim If the tests succeed submit a pull request","title":"Add initial detection"},{"location":"Developing/os/Test-Units/#additional-module-support-or-test-data","text":"Add code to support module or support already exists. ./scripts/collect-snmp-data.php -h 42 -m , this will add more data to the snmprec file Review data. If you modified the snmprec (don't modify json manually) run ./scripts/save-test-data.php -o example-os -m Run lnms dev:check unit --db --snmpsim If the tests succeed submit a pull request","title":"Additional module support or test data"},{"location":"Developing/os/Test-Units/#json-application-test-writing-using-scriptsjson-app-toolphp","text":"First you will need a good example JSON output produced via SNMP extend in question. Read the help via ./scripts/json-app-tool.php -h . Generate the SNMPrec data via ./scripts/json-app-tool.php -a appName -s > ./tests/snmpsim/linux_appName-v1.snmprec . If the SNMP extend name OID different than the application name, then you will need to pass the -S flag for over riding that. Generate the test JSON data via ./scripts/json-app-tool.php -a appName -t > ./tests/data/linux_appName-v1.json . Update the generated './tests/data/linux_appName-v1.json' making sure that all the expected metrics are present. This assumes that everything under .data in the JSON will be collapsed and used. During test runs if it does not appear to be detecting the app and it has a different app name and SNMP extend name OID, make sure that -S is set properly and that 'includes/discovery/applications.inc.php' has been updated.","title":"JSON Application Test Writing Using ./scripts/json-app-tool.php"},{"location":"Developing/os/Wireless-Sensors/","text":"This document will guide you through adding wireless sensors for your new wireless device. Currently we have support for the following wireless metrics along with the values we expect to see the data in: Type Measurement Interface Description ap-count % WirelessApCountDiscovery The number of APs attached to this controller capacity % WirelessCapacityDiscovery The % of operating rate vs theoretical max ccq % WirelessCcqDiscovery The Client Connection Quality channel count WirelessChannelDiscovery The channel, use of frequency is preferred cell count WirelessCellDiscovery The cell in a multicell technology clients count WirelessClientsDiscovery The number of clients connected to/managed by this device distance km WirelessDistanceDiscovery The distance of a radio link in Kilometers error-rate bps WirelessErrorRateDiscovery The rate of errored packets or bits, etc error-ratio % WirelessErrorRatioDiscovery The percent of errored packets or bits, etc errors count WirelessErrorsDiscovery The total bits of errored packets or bits, etc frequency MHz WirelessFrequencyDiscovery The frequency of the radio in MHz, channels can be converted mse dB WirelessMseDiscovery The Mean Square Error noise-floor dBm WirelessNoiseFloorDiscovery The amount of noise received by the radio power dBm WirelessPowerDiscovery The power of transmit or receive, including signal level quality % WirelessQualityDiscovery The % of quality of the link, 100% = perfect link rate bps WirelessRateDiscovery The negotiated rate of the connection (not data transfer) rssi dBm WirelessRssiDiscovery The Received Signal Strength Indicator snr dB WirelessSnrDiscovery The Signal to Noise ratio, which is signal - noise floor sinr dB WirelessSinrDiscovery The Signal-to-Interference-plus-Noise Ratio rsrq dB WirelessRsrqDiscovery The Reference Signal Received Quality rsrp dBm WirelessRsrpDiscovery The Reference Signals Received Power xpi dBm WirelessXpiDiscovery The Cross Polar Interference values ssr dB WirelessSsrDiscovery The Signal strength ratio, the ratio(or difference) of Vertical rx power to Horizontal rx power utilization % WirelessUtilizationDiscovery The % of utilization compared to the current rate You will need to create a new OS class for your os if one doesn't exist under LibreNMS/OS . The name of this file should be the os name in camel case for example airos -> Airos , ios-wlc -> IosWlc . Your new OS class should extend LibreNMS\\OS and implement the interfaces for the sensors your os supports. namespace LibreNMS\\OS ; use LibreNMS\\Device\\WirelessSensor ; use LibreNMS\\Interfaces\\Discovery\\Sensors\\WirelessClientsDiscovery ; use LibreNMS\\OS ; class Airos extends OS implements WirelessClientsDiscovery { public function discoverWirelessClients () { $oid = '.1.3.6.1.4.1.41112.1.4.5.1.15.1' ; //UBNT-AirMAX-MIB::ubntWlStatStaCount.1 return array ( new WirelessSensor ( 'clients' , $this -> getDeviceId (), $oid , 'airos' , 1 , 'Clients' ) ); } } All discovery interfaces will require you to return an array of WirelessSensor objects. new WirelessSensor() Accepts the following arguments: $type = Required. This is the sensor class from the table above (i.e humidity). $device_id = Required. You can get this value with $this->getDeviceId() $oids = Required. This must be the numerical OID for where the data can be found, i.e .1.2.3.4.5.6.7.0. If this is an array of oids, you should probably specify an $aggregator. $subtype = Required. This should be the OS name, i.e airos. $index = Required. This must be unique for this sensor type, device and subtype. Typically it's the index from the table being walked or it could be the name of the OID if it's a single value. $description = Required. This is a descriptive value for the sensor. Shown to the user, if this is a per-ssid statistic, using SSID: $ssid here is appropriate $current = Defaults to null. Can be used to set the current value on discovery. If this is null the values will be polled right away and if they do not return valid value(s), the sensor will not be discovered. Supplying a value here implies you have already verified this sensor is valid. $multiplier = Defaults to 1. This is used to multiply the returned value. $divisor = Defaults to 1. This is used to divided the returned value. $aggregator = Defaults to sum. Valid values: sum, avg. This will combine multiple values from multiple oids into one. $access_point_id = Defaults to null. If this is a wireless controller, you can link sensors to entries in the access_points table. $high_limit = Defaults to null. Sets the high limit for the sensor, used in alerting to report out range sensors. $low_limit = Defaults to null. Sets the low threshold limit for the sensor, used in alerting to report out range sensors. $high_warn = Defaults to null. Sets the high warning limit for the sensor, used in alerting to report near out of range sensors. $low_warn = Defaults to null. Sets the low warning limit for the sensor, used in alerting to report near out of range sensors. $entPhysicalIndex = Defaults to null. Sets the entPhysicalIndex to be used to look up further hardware if available. $entPhysicalIndexMeasured = Defaults to null. Sets the type of entPhysicalIndex used, i.e ports. Polling is done automatically based on the discovered data. If for some reason you need to override polling, you can implement the required polling interface in LibreNMS/Interfaces/Polling/Sensors . Using the polling interfaces should be avoided if possible. Graphing is performed automatically for wireless sensors, no custom graphing is required or supported.","title":"Wireless Sensors"},{"location":"Extensions/Agent-Setup/","text":"Check_MK Setup The agent can be used to gather data from remote systems you can use LibreNMS in combination with check_mk (found here ). The agent can be extended to include data about applications on the remote system. Installation Linux / BSD Make sure that systemd or xinetd is installed on the host you want to run the agent on. The agent uses TCP-Port 6556, please allow access from the LibreNMS host and poller nodes if you're using the Distributed Polling setup. On each of the hosts you would like to use the agent on, you need to do the following: 1: Clone the librenms-agent repository: cd /opt/ git clone https://github.com/librenms/librenms-agent.git cd librenms-agent 2: Copy the relevant check_mk_agent to /usr/bin : linux freebsd cp check_mk_agent /usr/bin/check_mk_agent cp check_mk_agent_freebsd /usr/bin/check_mk_agent chmod +x /usr/bin/check_mk_agent 3: Copy the service file(s) into place. xinetd systemd cp check_mk_xinetd /etc/xinetd.d/check_mk cp check_mk@.service check_mk.socket /etc/systemd/system 4: Create the relevant directories. mkdir -p /usr/lib/check_mk_agent/plugins /usr/lib/check_mk_agent/local 5: Copy each of the scripts from agent-local/ into /usr/lib/check_mk_agent/local that you require to be graphed. You can find detail setup instructions for specific applications above. 6: Make each one executable that you want to use with chmod +x /usr/lib/check_mk_agent/local/$script 7: Enable the check_mk service xinetd systemd /etc/init.d/xinetd restart systemctl enable check_mk.socket && systemctl start check_mk.socket 8: Login to the LibreNMS web interface and edit the device you want to monitor. Under the modules section, ensure that unix-agent is enabled. 9: Then under Applications, enable the apps that you plan to monitor. 10: Wait for around 10 minutes and you should start seeing data in your graphs under Apps for the device. Restrict the devices on which the agent listens: Linux systemd If you want to restrict which network adapter the agent listens on, do the following: 1: Edit /etc/systemd/system/check_mk.socket 2: Under the [Socket] section, add a new line BindToDevice= and the name of your network adapter. 3: If the script has already been enabled in systemd, you may need to issue a systemctl daemon-reload and then systemctl restart check_mk.socket Windows Grab version 1.2.6b5 of the check_mk agent from the check_mk github repo (exe/msi or compile it yourself depending on your usage): https://github.com/tribe29/checkmk/tree/v1.2.6b5/agents/windows Run the msi / exe Make sure your LibreNMS instance can reach TCP port 6556 on your target.","title":"Check_MK Setup"},{"location":"Extensions/Agent-Setup/#check_mk-setup","text":"The agent can be used to gather data from remote systems you can use LibreNMS in combination with check_mk (found here ). The agent can be extended to include data about applications on the remote system.","title":"Check_MK Setup"},{"location":"Extensions/Agent-Setup/#installation","text":"","title":"Installation"},{"location":"Extensions/Agent-Setup/#linux-bsd","text":"Make sure that systemd or xinetd is installed on the host you want to run the agent on. The agent uses TCP-Port 6556, please allow access from the LibreNMS host and poller nodes if you're using the Distributed Polling setup. On each of the hosts you would like to use the agent on, you need to do the following: 1: Clone the librenms-agent repository: cd /opt/ git clone https://github.com/librenms/librenms-agent.git cd librenms-agent 2: Copy the relevant check_mk_agent to /usr/bin : linux freebsd cp check_mk_agent /usr/bin/check_mk_agent cp check_mk_agent_freebsd /usr/bin/check_mk_agent chmod +x /usr/bin/check_mk_agent 3: Copy the service file(s) into place. xinetd systemd cp check_mk_xinetd /etc/xinetd.d/check_mk cp check_mk@.service check_mk.socket /etc/systemd/system 4: Create the relevant directories. mkdir -p /usr/lib/check_mk_agent/plugins /usr/lib/check_mk_agent/local 5: Copy each of the scripts from agent-local/ into /usr/lib/check_mk_agent/local that you require to be graphed. You can find detail setup instructions for specific applications above. 6: Make each one executable that you want to use with chmod +x /usr/lib/check_mk_agent/local/$script 7: Enable the check_mk service xinetd systemd /etc/init.d/xinetd restart systemctl enable check_mk.socket && systemctl start check_mk.socket 8: Login to the LibreNMS web interface and edit the device you want to monitor. Under the modules section, ensure that unix-agent is enabled. 9: Then under Applications, enable the apps that you plan to monitor. 10: Wait for around 10 minutes and you should start seeing data in your graphs under Apps for the device.","title":"Linux / BSD"},{"location":"Extensions/Agent-Setup/#restrict-the-devices-on-which-the-agent-listens-linux-systemd","text":"If you want to restrict which network adapter the agent listens on, do the following: 1: Edit /etc/systemd/system/check_mk.socket 2: Under the [Socket] section, add a new line BindToDevice= and the name of your network adapter. 3: If the script has already been enabled in systemd, you may need to issue a systemctl daemon-reload and then systemctl restart check_mk.socket","title":"Restrict the devices on which the agent listens: Linux systemd"},{"location":"Extensions/Agent-Setup/#windows","text":"Grab version 1.2.6b5 of the check_mk agent from the check_mk github repo (exe/msi or compile it yourself depending on your usage): https://github.com/tribe29/checkmk/tree/v1.2.6b5/agents/windows Run the msi / exe Make sure your LibreNMS instance can reach TCP port 6556 on your target.","title":"Windows"},{"location":"Extensions/Applications/","text":"Applications You can use Application support to graph performance statistics of many applications. Different applications support a variety of ways to collect data: By direct connection to the application snmpd extend The agent . The monitoring of applications could be added before or after the hosts have been added to LibreNMS. If multiple methods of collection are listed you only need to enable one. SNMP Extend When using the snmp extend method, the application discovery module will pick up which applications you have set up for monitoring automatically, even if the device is already in LibreNMS. The application discovery module is enabled by default for most *nix operating systems, but in some cases you will need to manually enable the application discovery module. SUDO One major thing to keep in mind when using SNMP extend is these run as the snmpd user that can be an unprivileged user. In these situations you need to use sudo. To test if you need sudo, first check the user snmpd is running as. Then test if you can run the extend script as that user without issue. For example if snmpd is running as 'Debian-snmp' and we want to run the extend for proxmox, we check that the following run without error: sudo -u Debian-snmp /usr/local/bin/proxmox If it doesn't work, then you will need to use sudo with the extend command. For the example above, that would mean adding the line below to the sudoers file: Debian-snmp ALL = NOPASSWD: /usr/local/bin/proxmox Finally we would need to add sudo to the extend command, which would look like that for proxmox: extend proxmox /usr/bin/sudo /usr/local/bin/proxmox JSON Return Optimization Using librenms_return_optimizer While the json_app_get does allow for more complex and larger data to be easily returned by a extend and the data to then be worked with, this can also sometimes result in large returns that occasionally don't play nice with SNMP on some networks. librenms_return_optimizer fixes this via taking the extend output piped to it, gzipping it, and then converting it to base64. The later is needed as net-snmp does not play that nice with binary data, converting most of the non-printable characters to . . This does add a bit of additional overhead to the gzipped data, but still tends to be result in a return that is usually a third of the size for JSONs items. The change required is fairly simply. So for the portactivity example below... extend portactivity /etc/snmp/extends/portactivity smtps,http,imap,imaps,postgresql,https,ldap,ldaps,nfsd,syslog-conn,ssh,matrix,gitea Would become this... extend portactivity /usr/local/bin/lnms_return_optimizer -- /etc/snmp/extends/portactivity smtps,http,imap,imaps,postgresql,https,ldap,ldaps,nfsd,syslog-conn,ssh,matrix,gitea The requirements for this are Perl, MIME::Base64, and Gzip::Faster. Installing on FreeBSD... pkg install p5-MIME-Base64 p5-Gzip-Faster wget wget https://raw.githubusercontent.com/librenms/librenms-agent/master/utils/librenms_return_optimizer -O /usr/local/bin/librenms_return_optimizer chmod +x /usr/local/bin/librenms_return_optimizer Installing on Debian... apt-get install zlib1g-dev cpanminus wget cpanm Gzip::Faster cpanm MIME::Base64 wget https://raw.githubusercontent.com/librenms/librenms-agent/master/utils/librenms_return_optimizer -O /usr/local/bin/librenms_return_optimizer chmod +x /usr/local/bin/librenms_return_optimizer Currently supported applications as are below. backupninja certificate chronyd dhcp-stats docker fail2ban fbsd-nfs-client fbsd-nfs-server gpsd mailcow-postfix mdadm ntp-client ntp-server portactivity powerdns powermon puppet-agent pureftpd redis seafile supervisord ups-apcups zfs The following apps have extends that have native support for this, if congiured to do so. suricata Enable the application discovery module Edit the device for which you want to add this support Click on the Modules tab and enable the applications module. This will be automatically saved, and you should get a green confirmation pop-up message. After you have enabled the application module, it would be wise to then also enable which applications you want to monitor, in the rare case where LibreNMS does not automatically detect it. Note : Only do this if an application was not auto-discovered by LibreNMS during discovery and polling. Enable the application(s) to be discovered Go to the device you have just enabled the application module for. Click on the Applications tab and select the applications you want to monitor. This will also be automatically saved, and you should get a green confirmation pop-up message. Agent The unix-agent does not have a discovery module, only a poller module. That poller module is always disabled by default. It needs to be manually enabled if using the agent. Some applications will be automatically enabled by the unix-agent poller module. It is better to ensure that your application is enabled for monitoring. You can check by following the steps under the SNMP Extend heading. Apache Either use SNMP extend or use the agent. Note that you need to install and configure the Apache mod_status module before trying the script. SNMP Extend Download the script onto the desired host (the host must be added to LibreNMS devices) wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/apache-stats.py -O /etc/snmp/apache-stats.py Make the script executable chmod +x /etc/snmp/apache-stats.py Create the cache directory, '/var/cache/librenms/' and make sure that it is owned by the user running the SNMP daemon. mkdir -p /var/cache/librenms/ Verify it is working by running /etc/snmp/apache-stats.py Package urllib3 for python3 needs to be installed. In Debian-based systems for example you can achieve this by issuing: apt-get install python3-urllib3 Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend apache /etc/snmp/apache-stats.py Restart snmpd on your host Test by running snmpwalk localhost NET-SNMP-EXTEND-MIB::nsExtendOutput2Table Agent Install the agent on this device if it isn't already and copy the apache script to /usr/lib/check_mk_agent/local/ Verify it is working by running /usr/lib/check_mk_agent/local/apache (If you get error like \"Can't locate LWP/Simple.pm\". libwww-perl needs to be installed: apt-get install libwww-perl) Create the cache directory, '/var/cache/librenms/' and make sure that it is owned by the user running the SNMP daemon. mkdir -p /var/cache/librenms/ On the device page in Librenms, edit your host and check the Apache under the Applications tab. Asterisk A small shell script that reports various Asterisk call status. SNMP Extend Download the asterisk script to /etc/snmp/ on your asterisk server. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/asterisk -O /etc/snmp/asterisk Make the script executable chmod +x /etc/snmp/asterisk Configure ASCLI in the script. Verify it is working by running /etc/snmp/asterisk Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend asterisk /etc/snmp/asterisk Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. backupninja A small shell script that reports status of last backupninja backup. SNMP Extend Download the backupninja script to /etc/snmp/backupninja.py on your backuped server. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/backupninja.py -O /etc/snmp/backupninja.py` Make the script executable: chmod +x /etc/snmp/backupninja.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend backupninja /etc/snmp/backupninja.py Restart snmpd on your host BIND9 aka named Create stats file with appropriate permissions: touch /var/cache/bind/stats chown bind:bind /var/cache/bind/stats Change user:group to the user and group that's running bind/named. Bind/named configuration: options { ... statistics-file \"/var/cache/bind/stats\"; zone-statistics yes; ... }; Restart your bind9/named after changing the configuration. Verify that everything works by executing rndc stats && cat /var/cache/bind/stats . In case you get a Permission Denied error, make sure you changed the ownership correctly. Also be aware that this file is appended to each time rndc stats is called. Given this it is suggested you setup file rotation for it. Alternatively you can also set zero_stats to 1 in the config. The script for this also requires the Perl module File::ReadBackwards . FreeBSD => p5-File-ReadBackwards CentOS/RedHat => perl-File-ReadBackwards Debian/Ubuntu => libfile-readbackwards-perl If it is not available, it can be installed by cpan -i File::ReadBackwards . You may possibly need to configure the agent/extend script as well. The config file's path defaults to the same path as the script, but with .config appended. So if the script is located at /etc/snmp/bind , the config file will be /etc/snmp/bind.config . Alternatively you can also specify a config via -c $file . Anything starting with a # is comment. The format for variables are $variable=$value. Empty lines are ignored. Spaces and tabs at either the start or end of a line are ignored. Content of an example /etc/snmp/bind.config . Please edit with your own settings. rndc = The path to rndc. Default: /usr/bin/env rndc call_rndc = A 0/1 boolean on whether or not to call rndc stats. Suggest to set to 0 if using netdata. Default: 1 stats_file = The path to the named stats file. Default: /var/cache/bind/stats agent = A 0/1 boolean for if this is being used as a LibreNMS agent or not. Default: 0 zero_stats = A 0/1 boolean for if the stats file should be zeroed first. Default: 0 (1 if guessed) If you want to guess at the configuration, call the script with -g and it will print out what it thinks it should be. SNMP Extend Copy the bind shell script, to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/bind -O /etc/snmp/bind Make the script executable chmod +x /etc/snmp/bind Edit your snmpd.conf file and add: extend bind /etc/snmp/bind Restart snmpd on the host in question. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Agent Install the agent on this device if it isn't already and copy the script to /usr/lib/check_mk_agent/local/bind via wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/bind -O /usr/lib/check_mk_agent/local/bind Make the script executable chmod +x /usr/lib/check_mk_agent/local/bind Set the variable 'agent' to '1' in the config. BIRD2 The BIRD Internet Routing Daemon (BGP) Due to the lack of SNMP support in the BIRD daemon, this application extracts all configured BGP protocols and parses it into LibreNMS. This application supports both IPv4 and IPv6 Peer processing. SNMP Extend Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend bird2 '/usr/bin/sudo /usr/sbin/birdc -r show protocols all' Edit your sudo users (usually visudo ) and add at the bottom: Debian-snmp ALL=(ALL) NOPASSWD: /usr/sbin/birdc If your snmp daemon is running on a user that isnt Debian-snmp make sure that user has the correct permission to execute birdc Verify the time format for bird2 is defined. Otherwise iso short ms (hh:mm:ss) is the default value that will be used. Which is not compatible with the datetime parsing logic used to parse the output from the bird show command. timeformat protocol is the one important to be defibned for the bird2 app parsing logic to work. Example starting point using Bird2 shorthand iso long (YYYY-MM-DD hh:mm:ss): timeformat base iso long; timeformat log iso long; timeformat protocol iso long; timeformat route iso long; Timezone can be manually specified, example \"%F %T %z\" (YYYY-MM-DD hh:mm:ss +11:45). See the Bird 2 docs for more information Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Certificate A small python3 script that checks age and remaining validity of certificates This script needs following packages on Debian/Ubuntu Systems: python3 python3-openssl Content of an example /etc/snmp/certificate.json . Please edit with your own settings. {\"domains\": [ {\"fqdn\": \"www.mydomain.com\"}, {\"fqdn\": \"some.otherdomain.org\", \"port\": 8443}, {\"fqdn\": \"personal.domain.net\"}, {\"fqdn\": \"selfsignedcert_host.domain.com\", \"cert_location\": \"/etc/pki/tls/certs/localhost.pem\"} ] } a. (Required): Key 'domains' contains a list of domains to check. b. (Optional): You can define a port. By default it checks on port 443. c. (Optional): You may define a certificate location for self-signed certificates. SNMP Extend Copy the shell script to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/certificate.py -O /etc/snmp/certificate.py Make the script executable chmod +x /etc/snmp/certificate.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend certificate /etc/snmp/certificate.py Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. BorgBackup SNMP Extend Copy the shell script to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/borgbackup -O /etc/snmp/borgbackup Make the script executable chmod +x /etc/snmp/borgbackup Install depends. # FreeBSD pkg p5-Config-Tiny p5-JSON p5-File-Slurp p5-MIME-Base64 p5-String-ShellQuote # Debian apt-get install libconfig-tiny-perl libjson-perl libfile-slurp-perl libmime-base64-perl libstring-shellquote-perl # generic cpanm cpanm Config::Tiny File::Slurp JSON MIME::Base64 String::ShellQuote Set it up in cron. */5 * * * /etc/snmp/borgbackup 2> /dev/null > /dev/null Configure it. See further down below or /etc/snmp/borgbackup --help . Add the following to the SNMPD config. extend borgbackup /bin/cat /var/cache/borgbackup_extend/extend_return Restart SNMPD and wait for the device to rediscover or tell it to manually. Config The config file is a ini file and handled by Config::Tiny . - mode :: single or multi, for if this is a single repo or for multiple repos. - Default :: single - repo :: Directory for the borg backup repo. - Default :: undef - passphrase :: Passphrase for the borg backup repo. - Default :: undef - passcommand :: Passcommand for the borg backup repo. - Default :: undef For single repos all those variables are in the root section of the config, so lets the repo is at '/backup/borg' with a passphrase of '1234abc'. repo=/backup/borg repo=1234abc For multi, each section outside of the root represents a repo. So if there is '/backup/borg1' with a passphrase of 'foobar' and '/backup/derp' with a passcommand of 'pass show backup' it would be like below. mode=multi [borg1] repo=/backup/borg1 passphrase=foobar [derp] repo=/backup/derp passcommand=pass show backup If 'passphrase' and 'passcommand' are both specified, then passcommand is used. Metrics The metrics are all from .data.totals in the extend return. Value Type Description errored repos Total number of repos that info could not be fetched for. locked repos Total number of locked repos locked_for seconds Longest time any repo has been locked. time_since_last_modified seconds Largest time - mtime for the repo nonce total_chunks chunks Total number of chunks total_csize bytes Total compressed size of all archives in all repos. total_size byes Total uncompressed size of all archives in all repos. total_unique_chunks chunks Total number of unique chuckes in all repos. unique_csize bytes Total deduplicated size of all archives in all repos. unique_size chunks Total number of chunks in all repos. CAPEv2 Copy the shell script to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/cape -O /etc/snmp/cape Make the script executable chmod +x /etc/snmp/cape Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend cape /etc/snmp/cape Install the required packages. apt-get install libfile-readbackwards-perl libjson-perl libconfig-tiny-perl libdbi-perl libfile-slurp-perl libstatistics-lite-perl Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. C.H.I.P C.H.I.P. is a $9 R8 based tiny computer ideal for small projects. Further details: https://getchip.com/pages/chip Copy the shell script to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/chip.sh -O /etc/snmp/power-stat.sh Make the script executable chmod +x /etc/snmp/power-stat.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend power-stat /etc/snmp/power-stat.sh Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Docker Stats It gathers metrics about the docker containers, including: - cpu percentage - memory usage - container size - uptime - Totals per status This script requires python3 and the pip module python-dateutil SNMP Extend Install pip module pip3 install python-dateutil Copy the shell script to the desired host. By default, it will only show the status for containers that are running. To include all containers modify the constant in the script at the top of the file and change it to ONLY_RUNNING_CONTAINERS = False wget https://github.com/librenms/librenms-agent/raw/master/snmp/docker-stats.py -O /etc/snmp/docker-stats.py Make the script executable chmod +x /etc/snmp/docker-stats.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend docker /etc/snmp/docker-stats.py If your run Debian, you need to add the Debian-snmp user to the docker group usermod -a -G docker Debian-snmp Restart snmpd on your host systemctl restart snmpd Entropy A small shell script that checks your system's available random entropy. SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/entropy.sh -O /etc/snmp/entropy.sh Make the script executable chmod +x /etc/snmp/entropy.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend entropy /etc/snmp/entropy.sh Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. EXIM Stats SNMP extend script to get your exim stats data into your host. SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/exim-stats.sh -O /etc/snmp/exim-stats.sh Make the script executable chmod +x /etc/snmp/exim-stats.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend exim-stats /etc/snmp/exim-stats.sh If you are using sudo edit your sudo users (usually visudo ) and add at the bottom: snmp ALL=(ALL) NOPASSWD: /etc/snmp/exim-stats.sh, /usr/bin/exim* Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Fail2ban SNMP Extend Copy the shell script, fail2ban, to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/fail2ban -O /etc/snmp/fail2ban Make the script executable chmod +x /etc/snmp/fail2ban Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend fail2ban /etc/snmp/fail2ban If you want to use the cache, it is as below, by using the -c switch. extend fail2ban /etc/snmp/fail2ban -c If you want to use the cache and update it if needed, this can by using the -c and -U switches. extend fail2ban /etc/snmp/fail2ban -c -U If you need to specify a custom location for the fail2ban-client, that can be done via the -f switch. extend fail2ban /etc/snmp/fail2ban -f /foo/bin/fail2ban-client If not specified, \"/usr/bin/env fail2ban-client\" is used. Restart snmpd on your host If you wish to use caching, add the following to /etc/crontab and restart cron. */3 * * * * root /etc/snmp/fail2ban -u Restart or reload cron on your system. If you have more than a few jails configured, you may need to use caching as each jail needs to be polled and fail2ban-client can't do so in a timely manner for than a few. This can result in failure of other SNMP information being polled. For additional details of the switches, please see the POD in the script it self at the top. FreeBSD NFS Client SNMP Extend Copy the shell script, fbsdnfsserver, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/fbsdnfsclient -O /etc/snmp/fbsdnfsclient Make the script executable chmod +x /etc/snmp/fbsdnfsclient Edit your snmpd.conf file and add: extend fbsdnfsclient /etc/snmp/fbsdnfsclient Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. FreeBSD NFS Server SNMP Extend Copy the shell script, fbsdnfsserver, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/fbsdnfsserver -O /etc/snmp/fbsdnfsserver Make the script executable chmod +x /etc/snmp/fbsdnfsserver Edit your snmpd.conf file and add: extend fbsdnfsserver /etc/snmp/fbsdnfsserver Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. FreeRADIUS The FreeRADIUS application extension requires that status_server be enabled in your FreeRADIUS config. For more information see: https://wiki.freeradius.org/config/Status You should note that status requests increment the FreeRADIUS request stats. So LibreNMS polls will ultimately be reflected in your stats/charts. Go to your FreeRADIUS configuration directory (usually /etc/raddb or /etc/freeradius). cd sites-enabled ln -s ../sites-available/status status Restart FreeRADIUS. You should be able to test with the radclient as follows... echo \"Message-Authenticator = 0x00, FreeRADIUS-Statistics-Type = 31, Response-Packet-Type = Access-Accept\" | \\ radclient -x localhost:18121 status adminsecret Note that adminsecret is the default secret key in status_server. Change if you've modified this. SNMP Extend Copy the freeradius shell script, to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/freeradius.sh -O /etc/snmp/freeradius.sh Make the script executable chmod +x /etc/snmp/freeradius.sh If you've made any changes to the FreeRADIUS status_server config (secret key, port, etc.) edit freeradius.sh and adjust the config variable accordingly. Edit your snmpd.conf file and add: extend freeradius /etc/snmp/freeradius.sh Restart snmpd on the host in question. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Agent Install the script to your agent wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/freeradius.sh -O /usr/lib/check_mk_agent/local/freeradius.sh` Make the script executable chmod +x /usr/lib/check_mk_agent/local/freeradius.sh If you've made any changes to the FreeRADIUS status_server config (secret key, port, etc.) edit freeradius.sh and adjust the config variable accordingly. Edit the freeradius.sh script and set the variable 'AGENT' to '1' in the config. Freeswitch A small shell script that reports various Freeswitch call status. Agent Install the agent on this device if it isn't already and copy the freeswitch script to /usr/lib/check_mk_agent/local/ wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/freeswitch -O /usr/lib/check_mk_agent/local/freeswitch` Make the script executable chmod +x /usr/lib/check_mk_agent/local/freeswitch Configure FSCLI in the script. You may also have to create an /etc/fs_cli.conf file if your fs_cli command requires authentication. Verify it is working by running /usr/lib/check_mk_agent/local/freeswitch SNMP Extend Download the script onto the desired host wget https://github.com/librenms/librenms-agent/raw/master/agent-local/freeswitch -O /etc/snmp/freeswitch Make the script executable chmod +x /etc/snmp/freeswitch Configure FSCLI in the script. You may also have to create an /etc/fs_cli.conf file if your fs_cli command requires authentication. Verify it is working by running /etc/snmp/freeswitch Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend freeswitch /etc/snmp/freeswitch Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. GPSD SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/gpsd -O /etc/snmp/gpsd Make the script executable chmod +x /etc/snmp/gpsd Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend gpsd /etc/snmp/gpsd Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading at the top of the page. Agent Install the agent on this device if it isn't already and copy the gpsd script to /usr/lib/check_mk_agent/local/ You may need to configure $server or $port . Verify it is working by running /usr/lib/check_mk_agent/local/gpsd HV Monitor HV Monitor provides a generic way to monitor hypervisors. Currently CBSD+bhyve on FreeBSD and Libvirt+QEMU on Linux are support. For more information see HV::Monitor on Github or MetaCPAN . SNMP Extend Install the SNMP Extend. For Debian based systems this is as below. apt-get install zlib1g-dev cpanminus libjson-perl cpanm HV::Monitor And on FreeBSD as below. pkg install p5-App-cpanminus p5-JSON p5-MIME-Base64 p5-Gzip-Faster cpanm HV::Monitor Set it up to be be ran by cron by root. Yes, you can directly call this script from SNMPD, but be aware, especially with Libvirt, there is a very real possibility of the snmpget timing out, especially if a VM is spinning up/down as virsh domstats can block for a few seconds or so then. */5 * * * * /usr/local/bin/hv_monitor > /var/cache/hv_monitor.json -c 2> /dev/null Setup snmpd.conf as below. extend hv-monitor /bin/cat /var/cache/hv_monitor.json Restart SNMPD. Either wait for it to be re-discovered or manually enable it. Icecast Shell script that reports load average/memory/open-files stats of Icecast SNMP Extend Copy the shell script, icecast-stats.sh, to the desired host (the host must be added to LibreNMS devices) wget https://github.com/librenms/librenms-agent/raw/master/snmp/icecast-stats.sh -O /etc/snmp/icecast-stats.sh Make the script executable chmod +x /etc/snmp/icecast-stats.sh Verify it is working by running /etc/snmp/icecast-stats.sh Edit your snmpd.conf file (usually /etc/snmp/icecast-stats.sh ) and add: extend icecast /etc/snmp/icecast-stats.sh ISC DHCP Stats A small python3 script that reports current DHCP leases stats and pool usage of ISC DHCP Server. Also you have to install the dhcpd-pools and the required Perl modules. Under Ubuntu/Debian just run apt install cpanminus ; cpanm Net::ISC::DHCPd::Leases Mime::Base64 File::Slurp or under FreeBSD pkg install p5-JSON p5-MIME-Base64 p5-App-cpanminus p5-File-Slurp ; cpanm Net::ISC::DHCPd::Leases . SNMP Extend Copy the shell script to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/dhcp -O /etc/snmp/dhcp Make the script executable chmod +x /etc/snmp/dhcp Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: # without using cron extend dhcpstats /etc/snmp/dhcp -Z # using cron extend dhcpstats /bin/cat /var/cache/dhcp_extend If on a slow system running it via cron may be needed. */5 * * * * /etc/snmp/dhcp -Z -w /var/cache/dhcp_extend The following options are also supported. Option Description -c $file Path to dhcpd.conf. -l $file Path to lease file. -Z Enable GZip+Base64 compression. -d Do not de-dup. -w $file File to write it out to. Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Logsize SNMP Extend Download the script and make it executable. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/logsize -O /etc/snmp/logsize chmod +x /etc/snmp/logsize Install the requirements. # FreeBSD pkg install p5-File-Find-Rule p5-JSON p5-TOML p5-Time-Piece p5-MIME-Base64 p5-File-Slurp p5-Statistics-Lite # Debian apt-get install cpanminus cpanm File::Find::Rule JSON TOML Time::Piece MIME::Base64 File::Slurp Statistics::Lite Configure the config at /usr/local/etc/logsize.conf . You can find the documentation for the config file in the extend. Below is a small example. # monitor log sizes of logs directly udner /var/log [sets.var_log] dir=\"/var/log/\" # monitor remote logs from network devices [sets.remote_network] dir=\"/var/log/remote/network/\" # monitor remote logs from windows sources [sets.remote_windows] dir=\"/var/log/remote/windows/\" # monitor suricata flows logs sizes [sets.suricata_flows] dir=\"/var/log/suricata/flows/current\" If the directories all readable via SNMPD, this script can be ran via snmpd. Otherwise it needs setup in cron. Similarly is processing a large number of files, it may also need setup in cron if it takes the script awhile to run. */5 * * * * /etc/snmp/logsize -b 2> /dev/null > /dev/null Make sure that /var/cache/logsize_extend exists and is writable by the user running the extend. mkdir -p /var/cache/logsize_extend Configure it in the SNMPD config. # if not using cron extend logsize /etc/snmp/logsize -b # if using cron extend logsize /bin/cat /var/cache/logsize_extend/extend_return linux_config_files linux_config_files is an application intended to monitor a Linux distribution's configuration files via that distribution's configuration management tool/system. At this time, ONLY RPM-based (Fedora/RHEL) SYSTEMS ARE SUPPORTED utilizing the rpmconf tool. The linux_config_files application collects and graphs the total count of configuration files that are out of sync and graphs that number. Fedora/RHEL: Rpmconf is a utility that analyzes rpm configuration files using the RPM Package Manager. Rpmconf reports when a new configuration file standard has been issued for an upgraded/downgraded piece of software. Typically, rpmconf is used to provide a diff of the current configuration file versus the new, standard configuration file. The administrator can then choose to install the new configuration file or keep the old one. SNMP Extend Copy the python script, linux_config_files.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/linux_config_files.py -O /etc/snmp/linux_config_files.py Make the script executable chmod +x /etc/snmp/linux_config_files.py Edit your snmpd.conf file and add: extend linux_config_files /etc/snmp/linux_config_files.py (Optional on an RPM-based distribution) Create a /etc/snmp/linux_config_files.json file and specify the following: \"pkg_system\" - String designating the distribution name of the system. At the moment only \"rpm\" is supported [\"rpm\"] \"pkg_tool_cmd\" - String path to the package tool binary [\"/sbin/rpmconf\"] { \"pkg_system\": \"rpm\", \"pkg_tool_cmd\": \"/bin/rpmconf\", } Restart snmpd. Linux Softnet Stat SNMP Extend 1: Install the depends, which on a Debian based system would be as below. apt-get install -y cpanminus zlib1g-dev cpanm File::Slurp MIME::Base64 JSON Gzip::Faster Download the script into the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/linux_softnet_stat -O /etc/snmp/linux_softnet_stat Make the script executable chmod +x /etc/snmp/linux_softnet_stat Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend linux_softnet_stat /etc/snmp/linux_softnet_stat -b Then either enable the application Linux Softnet Stat or wait for it to be re-discovered. mailcow-dockerized postfix SNMP Extend Download the script into the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/mailcow-dockerized-postfix -O /etc/snmp/mailcow-dockerized-postfix Make the script executable chmod +x /etc/snmp/mailcow-dockerized-postfix Maybe you will need to install pflogsumm on debian based OS. Please check if you have package installed. Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend mailcow-postfix /etc/snmp/mailcow-dockerized-postfix Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Mailscanner SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/mailscanner.php -O /etc/snmp/mailscanner.php Make the script executable chmod +x /etc/snmp/mailscanner.php Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend mailscanner /etc/snmp/mailscanner.php Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Mdadm It allows you to checks mdadm health and array data This script require: jq SNMP Extend Install jq sudo apt install jq Download the script onto the desired host. sudo wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/mdadm -O /etc/snmp/mdadm Make the script executable sudo chmod +x /etc/snmp/mdadm Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend mdadm /etc/snmp/mdadm Verify it is working by running sudo /etc/snmp/mdadm Restart snmpd on your host sudo service snmpd restart The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. MegaRAID This software from Broadcom/LSI let you monitor MegaRAID controller. Download the external software and follow the included install instructions. Add the following line to your snmpd.conf file (usually /etc/snmp/snmpd.conf) pass .1.3.6.1.4.1.3582 /usr/sbin/lsi_mrdsnmpmain Restart snmpd on your host Memcached SNMP Extend Copy the memcached script to /etc/snmp/ on your remote server. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/memcached -O /etc/snmp/memcached Make the script executable: chmod +x /etc/snmp/memcached Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend memcached /etc/snmp/memcached Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Mojo CAPE Submit SNMP This assumes you've already configured mojo_cape_submit from CAPE::Utils. Add the following to snmpd.conf and restarted SNMPD extend mojo_cape_submit /usr/local/bin/mojo_cape_submit_extend Then just wait for the machine in question to be rediscovered or enabled it in the device settings app page. Munin Agent Install the script to your agent: wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/munin -O /usr/lib/check_mk_agent/local/munin Make the script executable chmod +x /usr/lib/check_mk_agent/local/munin Create the munin scripts dir: mkdir -p /usr/share/munin/munin-scripts Install your munin scripts into the above directory. To create your own custom munin scripts, please see this example: #!/bin/bash if [ \" $1 \" = \"config\" ] ; then echo 'graph_title Some title' echo 'graph_args --base 1000 -l 0' #not required echo 'graph_vlabel Some label' echo 'graph_scale no' #not required, can be yes/no echo 'graph_category system' #Choose something meaningful, can be anything echo 'graph_info This graph shows something awesome.' #Short desc echo 'foobar.label Label for your unit' # Repeat these two lines as much as you like echo 'foobar.info Desc for your unit.' exit 0 fi echo -n \"foobar.value \" $( date +%s ) #Populate a value, here unix-timestamp MySQL Create the cache directory, '/var/cache/librenms/' and make sure that it is owned by the user running the SNMP daemon. mkdir -p /var/cache/librenms/ The MySQL script requires PHP-CLI and the PHP MySQL extension, so please verify those are installed. CentOS (May vary based on PHP version) yum install php-cli php-mysql Debian (May vary based on PHP version) apt-get install php-cli php-mysql Unlike most other scripts, the MySQL script requires a configuration file mysql.cnf in the same directory as the extend or agent script with following content: snmpd_nginx.te module snmpd_nginx 1.0; require { type httpd_t; type http_port_t; type snmpd_t; class tcp_socket name_connect; } #============= snmpd_t ============== allow snmpd_t http_port_t:tcp_socket name_connect; EOF checkmodule -M -m -o snmpd_nginx.mod snmpd_nginx.te semodule_package -o snmpd_nginx.pp -m snmpd_nginx.mod semodule -i snmpd_nginx.pp Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Agent Install the agent on this device if it isn't already and copy the nginx script to /usr/lib/check_mk_agent/local/ NFS Server Export the NFS stats from as server. SNMP Extend Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add : extend nfs-server /bin/cat /proc/net/rpc/nfsd find out where cat is located using : which cat reload snmpd service to activate the configuration NTP Client A shell script that gets stats from ntp client. SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/ntp-client -O /etc/snmp/ntp-client Make the script executable chmod +x /etc/snmp/ntp-client Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ntp-client /etc/snmp/ntp-client Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. NTP Server aka NTPD A shell script that gets stats from ntp server (ntpd). SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/ntp-server.sh -O /etc/snmp/ntp-server.sh Make the script executable chmod +x /etc/snmp/ntp-server.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ntp-server /etc/snmp/ntp-server.sh Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Chronyd A shell script that gets the stats from chronyd and exports them with SNMP Extend. SNMP Extend Download the shell script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/chrony -O /etc/snmp/chrony Make the script executable chmod +x /etc/snmp/chrony Edit the snmpd.conf file to include the extend by adding the following line to the end of the config file: extend chronyd /etc/snmp/chrony Note: Some distributions need sudo-permissions for the script to work with SNMP Extend. See the instructions on the section SUDO for more information. Restart snmpd service on the host Application should be auto-discovered and its stats presented on the Apps-page on the host. Note: Applications module needs to be enabled on the host or globally for the statistics to work as intended. Nvidia GPU SNMP Extend Copy the shell script, nvidia, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/nvidia -O /etc/snmp/nvidia Make the script executable chmod +x /etc/snmp/nvidia Edit your snmpd.conf file and add: extend nvidia /etc/snmp/nvidia Restart snmpd on your host. Verify you have nvidia-smi installed, which it generally should be if you have the driver from Nvida installed. The GPU numbering on the graphs will correspond to how the nvidia-smi sees them as being. For questions about what the various values are/mean, please see the nvidia-smi man file under the section covering dmon. Opensearch\\Elasticsearch SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/opensearch -O /etc/snmp/opensearch Make it executable chmod +x /etc/snmp/opensearch Install the required Perl dependencies. # FreeBSD pkg install p5-JSON p5-libwww # Debian/Ubuntu apt-get install libjson-perl libwww-perl # cpanm cpanm JSON Libwww Update your snmpd.conf. extend opensearch /bin/cat /var/cache/opensearch.json Update root crontab with. This is required as it will this will likely time out otherwise. Use */1 if you want to have the most recent stats when polled or to */5 if you just want at exactly a 5 minute interval. */5 * * * * /etc/snmp/opensearch > /var/cache/opensearch.json Enable it or wait for the device to be re-disocvered. Open Grid Scheduler Shell script to track the OGS/GE jobs running on clusters. SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/rocks.sh -O /etc/snmp/rocks.sh Make the script executable chmod +x /etc/snmp/rocks.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ogs /etc/snmp/rocks.sh Restart snmpd. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Opensips Script that reports load-average/memory/open-files stats of Opensips SNMP Extend Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/opensips-stats.sh -O /etc/snmp/opensips-stats.sh Make the script executable: chmod +x /etc/snmp/opensips-stats.sh Verify it is working by running /etc/snmp/opensips-stats.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend opensips /etc/snmp/opensips-stats.sh OS Updates A small shell script that checks your system package manager for any available updates. Supports apt-get/pacman/yum/zypper package managers. For pacman users automatically refreshing the database, it is recommended you use an alternative database location --dbpath=/var/lib/pacman/checkupdate SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/osupdate -O /etc/snmp/osupdate Make the script executable chmod +x /etc/snmp/osupdate Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend osupdate /etc/snmp/osupdate Restart snmpd on your host Note : apt-get depends on an updated package index. There are several ways to have your system run apt-get update automatically. The easiest is to create /etc/apt/apt.conf.d/10periodic and pasting the following in it: APT::Periodic::Update-Package-Lists \"1\"; . If you have apticron, cron-apt or apt-listchanges installed and configured, chances are that packages are already updated periodically . The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Agent Install the agent on this device if it isn't already and copy the osupdate script to /usr/lib/check_mk_agent/local/ Then uncomment the line towards the top marked to be uncommented if using it as a agent. PHP-FPM SNMP Extend Copy the shell script, phpfpmsp, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/phpfpmsp -O /etc/snmp/phpfpmsp Make the script executable chmod +x /etc/snmp/phpfpmsp Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend phpfpmsp /etc/snmp/phpfpmsp Edit /etc/snmp/phpfpmsp to include the status URL for the PHP-FPM pool you are monitoring. Restart snmpd on your host It is worth noting that this only monitors a single pool. If you want to monitor multiple pools, this won't do it. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Agent Install the agent on this device if it isn't already and copy the phpfpmsp script to /usr/lib/check_mk_agent/local/ Pi-hole SNMP Extend Copy the shell script, pi-hole, to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/pi-hole -O /etc/snmp/pi-hole Make the script executable chmod +x /etc/snmp/pi-hole Edit your snmpd.conf file and add: extend pi-hole /etc/snmp/pi-hole To get all data you must get your API auth token from Pi-hole server and change the API_AUTH_KEY entry inside the snmp script. Restard snmpd. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Portactivity SNMP Extend Install missing packages - Ubuntu is shown below. apt install libparse-netstat-perl apt install libjson-perl Copy the Perl script to the desired host (the host must be added to LibreNMS devices) wget https://github.com/librenms/librenms-agent/raw/master/snmp/portactivity -O /etc/snmp/portactivity Make the script executable chmod +x /etc/snmp/portactivity Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend portactivity /etc/snmp/portactivity -p http,ldap,imap Will monitor HTTP, LDAP, and IMAP. The -p switch specifies what ports to use. This is a comma seperated list. These must be found in '/etc/services' or where ever NSS is set to fetch it from. If not, it will throw an error. If you want to JSON returned by it to be printed in a pretty format use the -P flag. Restart snmpd on your host. Please note that for only TCP[46] services are supported. Postfix SNMP Extend Copy the shell script, postfix-queues, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/postfix-queues -O /etc/snmp/postfix-queues Copy the Perl script, postfixdetailed, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/postfixdetailed -O /etc/snmp/postfixdetailed Make both scripts executable chmod +x /etc/snmp/postfixdetailed /etc/snmp/postfix-queues Edit your snmpd.conf file and add: extend mailq /etc/snmp/postfix-queues extend postfixdetailed /etc/snmp/postfixdetailed Restart snmpd. Install pflogsumm for your OS. Make sure the cache file in /etc/snmp/postfixdetailed is some place that snmpd can write too. This file is used for tracking changes between various values between each time it is called by snmpd. Also make sure the path for pflogsumm is correct. Run /etc/snmp/postfixdetailed to create the initial cache file so you don't end up with some crazy initial starting value. Please note that each time /etc/snmp/postfixdetailed is ran, the cache file is updated, so if this happens in between LibreNMS doing it then the values will be thrown off for that polling period. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. NOTE: If using RHEL for your postfix server, qshape must be installed manually as it is not officially supported. CentOs 6 rpms seem to work without issues. Postgres SNMP Extend Copy the shell script, postgres, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/postgres -O /etc/snmp/postgres Make the script executable chmod +x /etc/snmp/postgres Edit your snmpd.conf file and add: extend postgres /etc/snmp/postgres Restart snmpd on your host Install the Nagios check check_postgres.pl on your system: https://github.com/bucardo/check_postgres Verify the path to check_postgres.pl in /etc/snmp/postgres is correct. (Optional) If you wish to change the DB username (default: pgsql), enable the postgres DB in totalling (e.g. set ignorePG to 0, default: 1), or set a hostname for check_postgres.pl to connect to (default: the Unix Socket postgresql is running on), then create the file /etc/snmp/postgres.config with the following contents (note that not all of them need be defined, just whichever you'd like to change): DBuser=monitoring ignorePG=0 DBhost=localhost Note that if you are using netdata or the like, you may wish to set ignorePG to 1 or otherwise that total will be very skewed on systems with light or moderate usage. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. PowerDNS An authoritative DNS server: https://www.powerdns.com/auth.html SNMP Extend Copy the shell script, powerdns.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/powerdns.py -O /etc/snmp/powerdns.py Make the script executable chmod +x /etc/snmp/powerdns.py Edit your snmpd.conf file and add: extend powerdns /etc/snmp/powerdns.py Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Agent Install the agent on this device if it isn't already and copy the powerdns script to /usr/lib/check_mk_agent/local/ PowerDNS Recursor A recursive DNS server: https://www.powerdns.com/recursor.html Direct The LibreNMS polling host must be able to connect to port 8082 on the monitored device. The web-server must be enabled, see the Recursor docs: https://doc.powerdns.com/md/recursor/settings/#webserver Variables $config['apps']['powerdns-recursor']['api-key'] required, this is defined in the Recursor config $config['apps']['powerdns-recursor']['port'] numeric, defines the port to connect to PowerDNS Recursor on. The default is 8082 $config['apps']['powerdns-recursor']['https'] true or false, defaults to use http. SNMP Extend Copy the shell script, powerdns-recursor, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/powerdns-recursor -O /etc/snmp/powerdns-recursor Make the script executable chmod +x /etc/snmp/powerdns-recursor Edit your snmpd.conf file and add: extend powerdns-recursor /etc/snmp/powerdns-recursor Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Agent Install the agent on this device if it isn't already and copy the powerdns-recursor script to /usr/lib/check_mk_agent/local/ This script uses rec_control get-all to collect stats. PowerDNS-dnsdist SNMP Extend Copy the BASH script to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/powerdns-dnsdist -O /etc/snmp/powerdns-dnsdist Make the script executable chmod +x /etc/snmp/powerdns-dnsdist Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend powerdns-dnsdist /etc/snmp/powerdns-dnsdist Restart snmpd on your host. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. PowerMon PowerMon tracks the power usage on your host and can report on both consumption and cost, using a python script installed on the host. PowerMon consumption graph Currently the script uses one of two methods to determine current power usage: ACPI via libsensors HP-Health (HP Proliant servers only) The ACPI method is quite unreliable as it is usually only implemented by battery-powered devices, e.g. laptops. YMMV. However, it's possible to support any method as long as it can return a power value, usually in Watts. TIP: You can achieve this by adding a method and a function for that method to the script. It should be called by getData() and return a dictionary. Because the methods are unreliable for all hardware, you need to declare to the script which method to use. The are several options to assist with testing, see --help . SNMP Extend Initial setup Download the python script onto the host: wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/powermon-snmp.py -O /usr/local/bin/powermon-snmp.py Make the script executable: chmod +x /usr/local/bin/powermon-snmp.py Edit the script and set the cost per kWh for your supply. You must uncomment this line for the script to work: vi /usr/local/bin/powermon-snmp.py #costPerkWh = 0.15 Choose you method below: Method 1. sensors Method 2. hpasmcli Install dependencies: dnf install lm_sensors pip install PySensors Test the script from the command-line. For example: $ /usr/local/bin/powermon-snmp.py -m sensors -n -p { \"meter\": { \"0\": { \"reading\": 0.0 } }, \"psu\": {}, \"supply\": { \"rate\": 0.15 }, \"reading\": \"0.0\" } If you see a reading of 0.0 it is likely this method is not supported for your system. If not, continue. Obtain the hp-health package for your system. Generally there are three options: Standalone package from HPE Support From the HP Management Component Pack (MCP). Included in the HP Service Pack for Proliant (SPP) If you've downloaded the standalone package, install it. For example: rpm -ivh hp-health-10.91-1878.11.rhel8.x86_64.rpm Check the service is running: systemctl status hp-health Test the script from the command-line. For example: $ /usr/local/bin/powermon-snmp.py -m hpasmcli -n -p { \"meter\": { \"1\": { \"reading\": 338.0 } }, \"psu\": { \"1\": { \"present\": \"Yes\", \"redundant\": \"No\", \"condition\": \"Ok\", \"hotplug\": \"Supported\", \"reading\": 315.0 }, \"2\": { \"present\": \"Yes\", \"redundant\": \"No\", \"condition\": \"FAILED\", \"hotplug\": \"Supported\" } }, \"supply\": { \"rate\": 0.224931 }, \"reading\": 338.0 } If you see a reading of 0.0 it is likely this method is not supported for your system. If not, continue. Finishing Up Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add the following: extend powermon /usr/local/bin/powermon-snmp.py -m hpasmcli NOTE: Avoid using other script options in the snmpd config as the results may not be interpreted correctly by LibreNMS. Reload your snmpd service: systemctl reload snmpd You're now ready to enable the application in LibreNMS. Privoxy For this to work, the following log items need enabled for Privoxy. debug 2 # show each connection status debug 512 # Common Log Format debug 1024 # Log the destination for requests Privoxy didn't let through, and the reason why. debug 4096 # Startup banner and warnings debug 8192 # Non-fatal errors SNMP Extend Download the extend and make sure it is executable. wget https://github.com/librenms/librenms-agent/raw/master/snmp/privoxy -O /etc/snmp/privoxy chmod +x /etc/snmp/privoxy Install the depdenencies. # FreeBSD pkg install p5-File-ReadBackwards p5-Time-Piece p5-JSON p5-IPC-Run3 p5-Gzip-Faster p5-MIME-Base64 # Debian apt-get install cpanminus zlib1g cpanm File::ReadBackwards Time::Piece JSON IPC::Run3 MIME::Base64 Gzip::Faster Add the extend to snmpd.conf and restart snmpd. extend privoxy /etc/snmp/privoxy If your logfile is not at /var/log/privoxy/logfile , that may be changed via the -f option. If privoxy-log-parser.pl is not found in your standard $PATH setting, you may will need up call the extend via /usr/bin/env with a $PATH set to something that includes it. Once that is done, just wait for the server to be rediscovered or just enable it manually. Pwrstatd Pwrstatd (commonly known as powerpanel) is an application/service available from CyberPower to monitor their PSUs over USB. It is currently capable of reading the status of only one PSU connected via USB at a time. The powerpanel software is available here: https://www.cyberpowersystems.com/products/software/power-panel-personal/ SNMP Extend Copy the python script, pwrstatd.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/pwrstatd.py -O /etc/snmp/pwrstatd.py Make the script executable chmod +x /etc/snmp/pwrstatd.py Edit your snmpd.conf file and add: extend pwrstatd /etc/snmp/pwrstatd.py (Optional) Create a /etc/snmp/pwrstatd.json file and specify the path to the pwrstat executable [the default path is /sbin/pwrstat]: { \"pwrstat_cmd\": \"/sbin/pwrstat\" } Restart snmpd. Proxmox For Proxmox 4.4+ install the libpve-apiclient-perl package apt install libpve-apiclient-perl Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/proxmox -O /usr/local/bin/proxmox Make the script executable chmod +x /usr/local/bin/proxmox Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend proxmox /usr/local/bin/proxmox Note: if your snmpd doesn't run as root, you might have to invoke the script using sudo and modify the \"extend\" line extend proxmox /usr/bin/sudo /usr/local/bin/proxmox after, edit your sudo users (usually visudo ) and add at the bottom: Debian-snmp ALL=(ALL) NOPASSWD: /usr/local/bin/proxmox Restart snmpd on your host Puppet Agent SNMP extend script to get your Puppet Agent data into your host. SNMP Extend Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/puppet_agent.py -O /etc/snmp/puppet_agent.py Make the script executable chmod +x /etc/snmp/puppet_agent.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend puppet-agent /etc/snmp/puppet_agent.py The Script needs python3-yaml package to be installed. Per default script searches for on of this files: /var/cache/puppet/state/last_run_summary.yaml /opt/puppetlabs/puppet/cache/state/last_run_summary.yaml optionally you can add a specific summary file with creating /etc/snmp/puppet.json { \"agent\": { \"summary_file\": \"/my/custom/path/to/summary_file\" } } custom summary file has highest priority Restart snmpd on the host PureFTPd SNMP extend script to monitor PureFTPd. SNMP Extend Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/pureftpd.py -O /etc/snmp/pureftpd.py Make the script executable chmod +x /etc/snmp/pureftpd.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend pureftpd sudo /etc/snmp/pureftpd.py Edit your sudo users (usually visudo ) and add at the bottom: snmp ALL=(ALL) NOPASSWD: /etc/snmp/pureftpd.py or the path where your pure-ftpwho is located If pure-ftpwho is not located in /usr/sbin you will also need to create a config file, which is named pureftpd.json. The file has to be located in /etc/snmp/. {\"pureftpwho_cmd\": \"/usr/sbin/pure-ftpwho\" } Restart snmpd on your host Raspberry PI SNMP extend script to get your PI data into your host. SNMP Extend Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/raspberry.sh -O /etc/snmp/raspberry.sh Make the script executable chmod +x /etc/snmp/raspberry.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend raspberry /usr/bin/sudo /bin/sh /etc/snmp/raspberry.sh Edit your sudo users (usually visudo ) and add at the bottom: snmp ALL=(ALL) NOPASSWD: /bin/sh /etc/snmp/raspberry.sh Note: If you are using Raspian, the default user is Debian-snmp . Change snmp above to Debian-snmp . You can verify the user snmpd is using with ps aux | grep snmpd Restart snmpd on PI host Raspberry Pi GPIO Monitor SNMP extend script to monitor your IO pins or sensor modules connected to your GPIO header. SNMP Extend 1: Make sure you have wiringpi installed on your Raspberry Pi. In Debian-based systems for example you can achieve this by issuing: apt-get install wiringpi 2: Download the script to your Raspberry Pi. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/rpigpiomonitor.php -O /etc/snmp/rpigpiomonitor.php 3: (optional) Download the example configuration to your Raspberry Pi. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/rpigpiomonitor.ini -O /etc/snmp/rpigpiomonitor.ini 4: Make the script executable: chmod +x /etc/snmp/rpigpiomonitor.php 5: Create or edit your rpigpiomonitor.ini file according to your needs. 6: Check your configuration with rpigpiomonitor.php -validate 7: Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend rpigpiomonitor /etc/snmp/rpigpiomonitor.php 8: Restart snmpd on your Raspberry Pi and, if your Raspberry Pi is already present in LibreNMS, perform a manual rediscover. Redis Script to monitor your Redis Server SNMP Extend Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/redis.py -O /etc/snmp/redis.py Make the script executable chmod +x /etc/snmp/redis.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend redis /etc/snmp/redis.py (Optional) If you have SELinux in Enforcing mode, you must add a module so the script can get redis informations and write them: cat << EOF > snmpd_redis.te module snmpd_redis 1.0; require { type tmp_t; type redis_port_t; type snmpd_t; class tcp_socket name_connect; class dir { add_name write }; } #============= snmpd_t ============== allow snmpd_t redis_port_t:tcp_socket name_connect; allow snmpd_t tmp_t:dir { write add_name }; EOF checkmodule -M -m -o snmpd_redis.mod snmpd_redis.te semodule_package -o snmpd_redis.pp -m snmpd_redis.mod semodule -i snmpd_redis.pp Agent Install the agent on this device if it isn't already and copy the redis script to /usr/lib/check_mk_agent/local/ RRDCached Install/Setup: For Install/Setup Local Librenms RRDCached: Please see RRDCached Will collect stats by: 1. Connecting directly to the associated device on port 42217 2. Monitor thru snmp with SNMP extend, as outlined below 3. Connecting to the rrdcached server specified by the rrdcached setting SNMP extend script to monitor your (remote) RRDCached via snmp SNMP Extend Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/rrdcached -O /etc/snmp/rrdcached Make the script executable chmod +x /etc/snmp/rrdcached Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend rrdcached /etc/snmp/rrdcached SDFS info A small shell script that exportfs SDFS volume info. SNMP Extend Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/sdfsinfo -O /etc/snmp/sdfsinfo Make the script executable chmod +x /etc/snmp/sdfsinfo Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend sdfsinfo /etc/snmp/sdfsinfo Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Seafile SNMP extend script to monitor your Seafile Server SNMP Extend Copy the Python script, seafile.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/seafile.py -O /etc/snmp/seafile.py Also you have to install the requests Package for Python3. Under Ubuntu/Debian just run apt install python3-requests Make the script executable chmod +x /etc/snmp/seafile.py Edit your snmpd.conf file and add: extend seafile /etc/snmp/seafile.py You will also need to create the config file, which is named seafile.json . The script has to be located at /etc/snmp/. {\"url\": \"https://seafile.mydomain.org\", \"username\": \"some_admin_login@mail.address\", \"password\": \"password\", \"account_identifier\": \"name\" \"hide_monitoring_account\": true } The variables are as below. url = Url how to get access to Seafile Server username = Login to Seafile Server. It is important that used Login has admin privileges. Otherwise most API calls will be denied. password = Password to the configured login. account_identifier = Defines how user accounts are listed in RRD Graph. Options are: name, email hide_monitoring_account = With this Boolean you can hide the Account which you use to access Seafile API Note: It is recommended to use a dedicated Administrator account for monitoring. SMART SNMP Extend Copy the Perl script, smart, to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/smart-v1 -O /etc/snmp/smart Install the depends. # FreeBSD pkg install p5-JSON p5-MIME-Base64 smartmontools # Debian apt-get install cpanminus smartmontools cpanm MIME::Base64 JSON # CentOS dnf install smartmontools perl-JSON perl-MIME-Base64 Make the script executable chmod +x /etc/snmp/smart Edit your snmpd.conf file and add: extend smart /etc/snmp/smart You will also need to create the config file, which defaults to the same path as the script, but with .config appended. So if the script is located at /etc/snmp/smart, the config file will be /etc/snmp/smart.config . Alternatively you can also specific a config via -c . Anything starting with a # is comment. The format for variables is $variable=$value. Empty lines are ignored. Spaces and tabes at either the start or end of a line are ignored. Any line with out a matched variable or # are treated as a disk. #This is a comment cache=/var/cache/smart smartctl=/usr/bin/env smartctl useSN=1 ada0 ada1 da5 /dev/da5 -d sat twl0,0 /dev/twl0 -d 3ware,0 twl0,1 /dev/twl0 -d 3ware,1 twl0,2 /dev/twl0 -d 3ware,2 The variables are as below. cache = The path to the cache file to use. Default: /var/cache/smart smartctl = The path to use for smartctl. Default: /usr/bin/env smartctl useSN = If set to 1, it will use the disks SN for reporting instead of the device name. 1 is the default. 0 will use the device name. A disk line is can be as simple as just a disk name under /dev/. Such as in the config above The line \"ada0\" would resolve to \"/dev/ada0\" and would be called with no special argument. If a line has a space in it, everything before the space is treated as the disk name and is what used for reporting and everything after that is used as the argument to be passed to smartctl. If you want to guess at the configuration, call it with -g and it will print out what it thinks it should be. Restart snmpd on your host If you have a large number of more than one or two disks on a system, you should consider adding this to cron. Also make sure the cache file is some place it can be written to. */5 * * * * /etc/snmp/smart -u If your snmp agent runs as user \"snmp\", edit your sudo users (usually visudo ) and add at the bottom: snmp ALL=(ALL) NOPASSWD: /etc/snmp/smart, /usr/bin/env smartctl and modify your snmpd.conf file accordingly, sudo can be excluded if running it via cron: extend smart /usr/bin/sudo /etc/snmp/smart The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Optionally setup nightly self tests for the disks. The exend will run the specified test on all configured disks if called with the -t flag and the name of the SMART test to run. 0 0 * * * /etc/snmp/smart -t long Sneck This is for replacing Nagios/Icinga or the LibreNMS service integration in regards to NRPE. This allows LibreNMS to query what checks were ran on the server and keep track of totals of OK, WARNING, CRITICAL, and UNKNOWN statuses. The big advantage over this compared to a NRPE are as below. It does not need to know what checks are configured on it. Also does not need to wait for the tests to run as sneck is meant to be ran via cron and the then return the cache when queried via SNMP, meaning a lot faster response time, especially if slow checks are being performed. Works over proxied SNMP connections. Included are alert examples. Although for setting up custom ones, the metrics below are provided. Metric Description ok Total OK checks warning Total WARNING checks critical Total CRITICAL checks unknown Total UNKNOWN checks errored Total checks that errored time_to_polling Differnce in seconds between when polling data was generated and when polled time_to_polling_abs The absolute value of time_to_polling. check_$CHECK Exit status of a specific check $CHECK is equal to the name of the check in question. So foo would be check_foo The standard Nagios/Icinga style exit codes are used and those are as below. Exit Meaning 0 okay 1 warning 2 critical 3+ unknown To use time_to_polling , it will need to enabled via setting the config item below. The default is false. Unless set to true, this value will default to 0. If enabling this, one will want to make sure that NTP is in use every were or it will alert if it goes over a difference of 540s. lnms config:set app.sneck.polling_time_diff true For more information on Sneck, check it out at MetaCPAN or Github . For poking systems using Sneck, also check out boop_snoot if one wants to query those systems via the CLI. Docs on it at MetaCPAN and Github . SNMP Extend Install the extend. # FreeBSD pkg install p5-JSON p5-File-Slurp p5-MIME-Base64 p5-Gzip-Faster p5-App-cpanminus cpanm Monitoring::Sneck # Debian based systems apt-get install zlib1g-dev cpanminus cpanm Monitoring::Sneck Configure any of the checks you want to run in /usr/local/etc/sneck.conf . You con find it documented here . Set it up in cron. This will mean you don't need to wait for all the checks to complete when polled via SNMP, which for like SMART or other long running checks will mean it timing out. Also means it does not need called via sudo as well. */5 * * * * /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin /usr/local/bin/sneck -u 2> /dev/null > /dev/null Set it up in the snmpd config and restart snmpd. The -c flag will tell read it to read from cache instead of rerunning the checks. extend sneck /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin /usr/local/bin/sneck -c In LibreNMS, enable the application for the server in question or wait for auto discovery to find it. Squid SNMP Proxy Enable SNMP for Squid like below, if you have not already, and restart it. acl snmppublic snmp_community public snmp_port 3401 snmp_access allow snmppublic localhost snmp_access deny all Restart squid on your host. Edit your snmpd.conf file and add, making sure you have the same community, host, and port as above: proxy -v 2c -Cc -c public 127.0.0.1:3401 1.3.6.1.4.1.3495 For more advanced information on Squid and SNMP or setting up proxying for net-snmp, please see the links below. http://wiki.squid-cache.org/Features/Snmp http://www.net-snmp.org/wiki/index.php/Snmpd_proxy Supervisord It shows you the totals per status and also the uptime per process. That way you can add alerts for instance when there are process in state FATAL . SNMP Extend Copy the python script to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/supervisord.py -O /etc/snmp/supervisord.py Notice that this will use the default unix socket path. Modify the unix_socket_path variable in the script if your path differs from the default. Make the script executable chmod +x /etc/snmp/supervisord.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend supervisord /etc/snmp/supervisord.py Restart snmpd on your host systemctl restart snmpd Sagan For metrics the stats are migrated as below from the stats JSON. f_drop_percent and drop_percent are computed based on the found data. Instance Key Stats JSON Key uptime .stats.uptime total .stats.captured.total drop .stats.captured.drop ignore .stats.captured.ignore threshold .stats.captured.theshold after .stats.captured.after match .stats.captured.match bytes .stats.captured.bytes_total bytes_ignored .stats.captured.bytes_ignored max_bytes_log_line .stats.captured.max_bytes_log_line eps .stats.captured.eps f_total .stats.flow.total f_dropped .stats.flow.dropped Those keys are appended with the name of the instance running with _ between the instance name and instance metric key. So uptime for ids would be ids_uptime . The default is named 'ids' unless otherwise specified via the extend. There is a special instance name of .total which is the total of all the instances. So if you want the total eps, the metric would be .total_eps . Also worth noting that the alert value is the highest one found among all the instances. SNMP Extend Install the extend. cpanm Sagan::Monitoring Setup cron. Below is a example. */5 * * * * /usr/local/bin/sagan_stat_check > /dev/null Configure snmpd.conf extend sagan-stats /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin sagan_stat_check -c Restart snmpd on your system. You will want to make sure that sagan is setup to with the values set below for stats-json processor, for a single instance setup.. enabled: yes time: 300 subtract_old_values: true filename: \"$LOG_PATH/stats.json\" Any configuration of sagan_stat_check should be done in the cron setup. If the default does not work, check the docs for it at MetaCPAN for sagan_stat_check Socket Statistics (ss) The Socket Statistics application polls ss and scrapes socket statuses. Individual sockets and address-families may be filtered out within the script's optional configuration JSON file. The following socket types are polled directly. Filtering a socket type will disable direct polling as-well-as indirect polling within any address-families that list the socket type as their child: dccp (also exists within address-families \"inet\" and \"inet6\") mptcp (also exists within address-families \"inet\" and \"inet6\") raw (also exists within address-families \"inet\" and \"inet6\") sctp (also exists within address-families \"inet\" and \"inet6\") tcp (also exists within address-families \"inet\" and \"inet6\") udp (also exists within address-families \"inet\" and \"inet6\") xdp The following socket types are polled within an address-family only: inet6 (within address-family \"inet6\") p_dgr (within address-family \"link\") p_raw (within address-family \"link\") ti_dg (within address-family \"tipc\") ti_rd (within address-family \"tipc\") ti_sq (within address-family \"tipc\") ti_st (within address-family \"tipc\") v_dgr (within address-family \"vsock\") v_str (within address-family \"vsock\") unknown (within address-families \"inet\", \"inet6\", \"link\", \"tipc\", and \"vsock\") The following address-families are polled directly and have their child socket types tab-indented below them. Filtering a socket type (see \"1\" above) will filter it from the address-family. Filtering an address-family will filter out all of its child socket types. However, if those socket types are not DIRECTLY filtered out (see \"1\" above), then they will continue to be monitored either directly or within other address-families in which they exist: inet dccp mptcp raw sctp tcp udp unknown inet6 dccp icmp6 mptcp raw sctp tcp udp unknown link p_dgr p_raw unknown netlink tipc ti_dg ti_rd ti_sq ti_st unknown unix u_dgr u_seq u_str vsock v_dgr v_str unknown SNMP Extend Copy the python script, ss.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/ss.py -O /etc/snmp/ss.py Make the script executable chmod +x /etc/snmp/ss.py Edit your snmpd.conf file and add: extend ss /etc/snmp/ss.py (Optional) Create a /etc/snmp/ss.json file and specify: \"ss_cmd\" - String path to the ss binary: [\"/sbin/ss\"] \"socket_types\" - A comma-delimited list of socket types to include. The following socket types are valid: dccp, icmp6, mptcp, p_dgr, p_raw, raw, sctp, tcp, ti_dg, ti_rd, ti_sq, ti_st, u_dgr, u_seq, u_str, udp, unknown, v_dgr, v_dgr, xdp. Please note that the \"unknown\" socket type is represented in /sbin/ss output with the netid \"???\". Please also note that the p_dgr and p_raw socket types are specific to the \"link\" address family; the ti_dg, ti_rd, ti_sq, and ti_st socket types are specific to the \"tipc\" address family; the u_dgr, u_seq, and u_str socket types are specific to the \"unix\" address family; and the v_dgr and v_str socket types are specific to the \"vsock\" address family. Filtering out the parent address families for the aforementioned will also filter out their specific socket types. Specifying \"all\" includes all of the socket types. For example: to include only tcp, udp, icmp6 sockets, you would specify \"tcp,udp,icmp6\": [\"all\"] \"addr_families\" - A comma-delimited list of address families to include. The following families are valid: inet, inet6, link, netlink, tipc, unix, vsock. As mentioned above under (b), filtering out the link, tipc, unix, or vsock address families will also filter out their respective socket types. Specifying \"all\" includes all of the families. For example: to include only inet and inet6 families, you would specify \"inet,inet6\": [\"all\"] { \"ss_cmd\": \"/sbin/ss\", \"socket_types\": \"all\" \"addr_families\": \"all\" } In order to filter out uncommon/unused socket types, the following JSON configuration is recommended: { \"ss_cmd\": \"/sbin/ss\", \"socket_types\": \"icmp6,p_dgr,p_raw,raw,tcp,u_dgr,u_seq,u_str,udp\", \"addr_families\": \"inet,inet6,link,netlink,unix\" } (Optional) If SELinux is in Enforcing mode, you must add a module so the script can poll sockets: cat << EOF > snmpd_ss.te module snmp_ss 1.0; require { type snmpd_t; class netlink_tcpdiag_socket { bind create getattr nlmsg_read read setopt write }; } #============= snmpd_t ============== allow snmpd_t self:netlink_tcpdiag_socket { bind create getattr nlmsg_read read setopt write }; EOF checkmodule -M -m -o snmpd_ss.mod snmpd_ss.te semodule_package -o snmpd_ss.pp -m snmpd_ss.mod semodule -i snmpd_ss.pp Restart snmpd. Suricata SNMP Extend Install the extend. cpanm Suricata::Monitoring Setup cron. Below is a example. */5 * * * * /usr/local/bin/suricata_stat_check > /dev/null Configure snmpd.conf extend suricata-stats /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin suricata_stat_check -c Or if you want to use try compressing the return via Base64+GZIP... extend suricata-stats /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin suricata_stat_check -c -b Restart snmpd on your system. You will want to make sure Suricata is set to output the stats to the eve file once a minute. This will help make sure that it won't be to far back in the file and will make sure it is recent when the cronjob runs. Any configuration of suricata_stat_check should be done in the cron setup. If the default does not work, check the docs for it at MetaCPAN for suricata_stat_check Suricata Extract SNMP Add the following to your snmpd config and restart. Path may have to be adjusted depending on where suricata_extract_submit_extend is installed to. extend suricata_extract /usr/local/bin/suricata_extract_submit_extend Then just wait for the system to be rediscovered or enable it manually for the server in question. Systemd The systemd application polls systemd and scrapes systemd units' load, activation, and sub states. SNMP Extend Copy the python script, systemd.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/systemd.py -O /etc/snmp/systemd.py Make the script executable chmod +x /etc/snmp/systemd.py Edit your snmpd.conf file and add: extend systemd /etc/snmp/systemd.py (Optional) Create a /etc/snmp/systemd.json file and specify: \"systemctl_cmd\" - String path to the systemctl binary [Default: \"/usr/bin/systemctl\"] \"include_inactive_units\" - True/False string to include inactive units in results [Default: \"False\"] { \"systemctl_cmd\": \"/bin/systemctl\", \"include_inactive_units\": \"True\" } (Optional) If you have SELinux in Enforcing mode, you must add a module so the script can access systemd state: cat << EOF > snmpd_systemctl.te module snmpd_systemctl 1.0; require { type snmpd_t; type systemd_systemctl_exec_t; type init_t; class file { execute execute_no_trans map open read }; class unix_stream_socket connectto; class system status; } #============= snmpd_t ============== allow snmpd_t init_t:system status; allow snmpd_t init_t:unix_stream_socket connectto; allow snmpd_t systemd_systemctl_exec_t:file { execute execute_no_trans map open read }; EOF checkmodule -M -m -o snmpd_systemctl.mod snmpd_systemctl.te semodule_package -o snmpd_systemctl.pp -m snmpd_systemctl.mod semodule -i snmpd_systemctl.pp Restart snmpd. TinyDNS aka djbdns Agent Install the agent on this device if it isn't already and copy the tinydns script to /usr/lib/check_mk_agent/local/ Note : We assume that you use DJB's Daemontools to start/stop tinydns. And that your tinydns instance is located in /service/dns , adjust this path if necessary. Replace your log 's run file, typically located in /service/dns/log/run with: #!/bin/sh exec setuidgid dnslog tinystats ./main/tinystats/ multilog t n3 s250000 ./main/ Create tinystats directory and chown: mkdir /service/dns/log/main/tinystats chown dnslog:nofiles /service/dns/log/main/tinystats Restart TinyDNS and Daemontools: /etc/init.d/svscan restart Note : Some say svc -t /service/dns is enough, on my install (Gentoo) it doesn't rehook the logging and I'm forced to restart it entirely. Unbound Unbound configuration: # Enable extended statistics. server: extended-statistics: yes statistics-cumulative: yes remote-control: control-enable: yes control-interface: 127.0.0.1 Restart your unbound after changing the configuration, verify it is working by running unbound-control stats . Option 1. SNMP Extend (Preferred and easiest method) Copy the shell script, unbound, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/unbound -O /etc/snmp/unbound Make the script executable chmod +x /etc/snmp/unbound Edit your snmpd.conf file and add: extend unbound /usr/bin/sudo /etc/snmp/unbound Restart snmpd. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Option 2. Agent Install the agent on this device if it isn't already and copy the unbound.sh script to /usr/lib/check_mk_agent/local/ UPS-nut A small shell script that exports nut ups status. SNMP Extend Copy the shell script, unbound, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/ups-nut.sh -O /etc/snmp/ups-nut.sh Make the script executable chmod +x /etc/snmp/ups-nut.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ups-nut /etc/snmp/ups-nut.sh Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Optionally if you have multiple UPS or your UPS is not named APCUPS you can specify its name as an argument into /etc/snmp/ups-nut.sh extend ups-nut /etc/snmp/ups-nut.sh ups1 extend ups-nut /etc/snmp/ups-nut.sh ups2 UPS-apcups A small shell script that exports apcacess ups status. SNMP Extend Copy the shell script, unbound, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/ups-apcups -O /etc/snmp/ups-apcups Make the script executable chmod +x /etc/snmp/ups-apcups Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ups-apcups /etc/snmp/ups-apcups If 'apcaccess' is not in the PATH enviromental variable snmpd is using, you may need to do something like below. extend ups-apcups/usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin /etc/snmp/ups-apcups Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Voip-monitor Shell script that reports cpu-load/memory/open-files files stats of Voip Monitor SNMP Extend Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/voipmon-stats.sh -O /etc/snmp/voipmon-stats.sh Make the script executable chmod +x /etc/snmp/voipmon-stats.sh Edit your snmpd.conf file (usually /etc/snmp/voipmon-stats.sh ) and add: extend voipmon /etc/snmp/voipmon-stats.sh Wireguard The Wireguard application polls the Wireguard service and scrapes all client statistics for all interfaces configured as Wireguard interfaces. SNMP Extend Copy the python script, wireguard.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/wireguard.py -O /etc/snmp/wireguard.py Make the script executable chmod +x /etc/snmp/wireguard.py Edit your snmpd.conf file and add: extend wireguard /etc/snmp/wireguard.py Create a /etc/snmp/wireguard.json file and specify: (optional) \"wg_cmd\" - String path to the wg binary [\"/usr/bin/wg\"] \"public_key_to_arbitrary_name\" - A dictionary to convert between the publickey assigned to the client (specified in the wireguard interface conf file) to an arbitrary, friendly name. The friendly names MUST be unique within each interface. Also note that the interface name and friendly names are used in the RRD filename, so using special characters is highly discouraged. { \"wg_cmd\": \"/bin/wg\", \"public_key_to_arbitrary_name\": { \"wg0\": { \"z1iSIymFEFi/PS8rR19AFBle7O4tWowMWuFzHO7oRlE=\": \"client1\", \"XqWJRE21Fw1ke47mH1yPg/lyWqCCfjkIXiS6JobuhTI=\": \"server.domain.com\" } } } Restart snmpd. ZFS SNMP Extend 1: Install the depends. ### FreeBSD pkg install p5-JSON p5-MIME-Base64 p5-Gzip-Faster ### Debian apt-get install -y cpanminus zlib1g-dev cpanm Mime::Base64 JSON Gzip::Faster 2: Fetch the script in question and make it executable. wget https://github.com/librenms/librenms-agent/raw/master/snmp/zfs -O /etc/snmp/zfs chmod +x /etc/snmp/zfs 3: Add the following to snmpd.conf and restart snmpd. extend zfs /etc/snmp/zfs","title":"Applications"},{"location":"Extensions/Applications/#applications","text":"You can use Application support to graph performance statistics of many applications. Different applications support a variety of ways to collect data: By direct connection to the application snmpd extend The agent . The monitoring of applications could be added before or after the hosts have been added to LibreNMS. If multiple methods of collection are listed you only need to enable one.","title":"Applications"},{"location":"Extensions/Applications/#snmp-extend","text":"When using the snmp extend method, the application discovery module will pick up which applications you have set up for monitoring automatically, even if the device is already in LibreNMS. The application discovery module is enabled by default for most *nix operating systems, but in some cases you will need to manually enable the application discovery module.","title":"SNMP Extend"},{"location":"Extensions/Applications/#sudo","text":"One major thing to keep in mind when using SNMP extend is these run as the snmpd user that can be an unprivileged user. In these situations you need to use sudo. To test if you need sudo, first check the user snmpd is running as. Then test if you can run the extend script as that user without issue. For example if snmpd is running as 'Debian-snmp' and we want to run the extend for proxmox, we check that the following run without error: sudo -u Debian-snmp /usr/local/bin/proxmox If it doesn't work, then you will need to use sudo with the extend command. For the example above, that would mean adding the line below to the sudoers file: Debian-snmp ALL = NOPASSWD: /usr/local/bin/proxmox Finally we would need to add sudo to the extend command, which would look like that for proxmox: extend proxmox /usr/bin/sudo /usr/local/bin/proxmox","title":"SUDO"},{"location":"Extensions/Applications/#json-return-optimization-using-librenms_return_optimizer","text":"While the json_app_get does allow for more complex and larger data to be easily returned by a extend and the data to then be worked with, this can also sometimes result in large returns that occasionally don't play nice with SNMP on some networks. librenms_return_optimizer fixes this via taking the extend output piped to it, gzipping it, and then converting it to base64. The later is needed as net-snmp does not play that nice with binary data, converting most of the non-printable characters to . . This does add a bit of additional overhead to the gzipped data, but still tends to be result in a return that is usually a third of the size for JSONs items. The change required is fairly simply. So for the portactivity example below... extend portactivity /etc/snmp/extends/portactivity smtps,http,imap,imaps,postgresql,https,ldap,ldaps,nfsd,syslog-conn,ssh,matrix,gitea Would become this... extend portactivity /usr/local/bin/lnms_return_optimizer -- /etc/snmp/extends/portactivity smtps,http,imap,imaps,postgresql,https,ldap,ldaps,nfsd,syslog-conn,ssh,matrix,gitea The requirements for this are Perl, MIME::Base64, and Gzip::Faster. Installing on FreeBSD... pkg install p5-MIME-Base64 p5-Gzip-Faster wget wget https://raw.githubusercontent.com/librenms/librenms-agent/master/utils/librenms_return_optimizer -O /usr/local/bin/librenms_return_optimizer chmod +x /usr/local/bin/librenms_return_optimizer Installing on Debian... apt-get install zlib1g-dev cpanminus wget cpanm Gzip::Faster cpanm MIME::Base64 wget https://raw.githubusercontent.com/librenms/librenms-agent/master/utils/librenms_return_optimizer -O /usr/local/bin/librenms_return_optimizer chmod +x /usr/local/bin/librenms_return_optimizer Currently supported applications as are below. backupninja certificate chronyd dhcp-stats docker fail2ban fbsd-nfs-client fbsd-nfs-server gpsd mailcow-postfix mdadm ntp-client ntp-server portactivity powerdns powermon puppet-agent pureftpd redis seafile supervisord ups-apcups zfs The following apps have extends that have native support for this, if congiured to do so. suricata","title":"JSON Return Optimization Using librenms_return_optimizer"},{"location":"Extensions/Applications/#enable-the-application-discovery-module","text":"Edit the device for which you want to add this support Click on the Modules tab and enable the applications module. This will be automatically saved, and you should get a green confirmation pop-up message. After you have enabled the application module, it would be wise to then also enable which applications you want to monitor, in the rare case where LibreNMS does not automatically detect it. Note : Only do this if an application was not auto-discovered by LibreNMS during discovery and polling.","title":"Enable the application discovery module"},{"location":"Extensions/Applications/#enable-the-applications-to-be-discovered","text":"Go to the device you have just enabled the application module for. Click on the Applications tab and select the applications you want to monitor. This will also be automatically saved, and you should get a green confirmation pop-up message.","title":"Enable the application(s) to be discovered"},{"location":"Extensions/Applications/#agent","text":"The unix-agent does not have a discovery module, only a poller module. That poller module is always disabled by default. It needs to be manually enabled if using the agent. Some applications will be automatically enabled by the unix-agent poller module. It is better to ensure that your application is enabled for monitoring. You can check by following the steps under the SNMP Extend heading.","title":"Agent"},{"location":"Extensions/Applications/#apache","text":"Either use SNMP extend or use the agent. Note that you need to install and configure the Apache mod_status module before trying the script.","title":"Apache"},{"location":"Extensions/Applications/#snmp-extend_1","text":"Download the script onto the desired host (the host must be added to LibreNMS devices) wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/apache-stats.py -O /etc/snmp/apache-stats.py Make the script executable chmod +x /etc/snmp/apache-stats.py Create the cache directory, '/var/cache/librenms/' and make sure that it is owned by the user running the SNMP daemon. mkdir -p /var/cache/librenms/ Verify it is working by running /etc/snmp/apache-stats.py Package urllib3 for python3 needs to be installed. In Debian-based systems for example you can achieve this by issuing: apt-get install python3-urllib3 Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend apache /etc/snmp/apache-stats.py Restart snmpd on your host Test by running snmpwalk localhost NET-SNMP-EXTEND-MIB::nsExtendOutput2Table","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_1","text":"Install the agent on this device if it isn't already and copy the apache script to /usr/lib/check_mk_agent/local/ Verify it is working by running /usr/lib/check_mk_agent/local/apache (If you get error like \"Can't locate LWP/Simple.pm\". libwww-perl needs to be installed: apt-get install libwww-perl) Create the cache directory, '/var/cache/librenms/' and make sure that it is owned by the user running the SNMP daemon. mkdir -p /var/cache/librenms/ On the device page in Librenms, edit your host and check the Apache under the Applications tab.","title":"Agent"},{"location":"Extensions/Applications/#asterisk","text":"A small shell script that reports various Asterisk call status.","title":"Asterisk"},{"location":"Extensions/Applications/#snmp-extend_2","text":"Download the asterisk script to /etc/snmp/ on your asterisk server. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/asterisk -O /etc/snmp/asterisk Make the script executable chmod +x /etc/snmp/asterisk Configure ASCLI in the script. Verify it is working by running /etc/snmp/asterisk Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend asterisk /etc/snmp/asterisk Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#backupninja","text":"A small shell script that reports status of last backupninja backup.","title":"backupninja"},{"location":"Extensions/Applications/#snmp-extend_3","text":"Download the backupninja script to /etc/snmp/backupninja.py on your backuped server. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/backupninja.py -O /etc/snmp/backupninja.py` Make the script executable: chmod +x /etc/snmp/backupninja.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend backupninja /etc/snmp/backupninja.py Restart snmpd on your host","title":"SNMP Extend"},{"location":"Extensions/Applications/#bind9-aka-named","text":"Create stats file with appropriate permissions: touch /var/cache/bind/stats chown bind:bind /var/cache/bind/stats Change user:group to the user and group that's running bind/named. Bind/named configuration: options { ... statistics-file \"/var/cache/bind/stats\"; zone-statistics yes; ... }; Restart your bind9/named after changing the configuration. Verify that everything works by executing rndc stats && cat /var/cache/bind/stats . In case you get a Permission Denied error, make sure you changed the ownership correctly. Also be aware that this file is appended to each time rndc stats is called. Given this it is suggested you setup file rotation for it. Alternatively you can also set zero_stats to 1 in the config. The script for this also requires the Perl module File::ReadBackwards . FreeBSD => p5-File-ReadBackwards CentOS/RedHat => perl-File-ReadBackwards Debian/Ubuntu => libfile-readbackwards-perl If it is not available, it can be installed by cpan -i File::ReadBackwards . You may possibly need to configure the agent/extend script as well. The config file's path defaults to the same path as the script, but with .config appended. So if the script is located at /etc/snmp/bind , the config file will be /etc/snmp/bind.config . Alternatively you can also specify a config via -c $file . Anything starting with a # is comment. The format for variables are $variable=$value. Empty lines are ignored. Spaces and tabs at either the start or end of a line are ignored. Content of an example /etc/snmp/bind.config . Please edit with your own settings. rndc = The path to rndc. Default: /usr/bin/env rndc call_rndc = A 0/1 boolean on whether or not to call rndc stats. Suggest to set to 0 if using netdata. Default: 1 stats_file = The path to the named stats file. Default: /var/cache/bind/stats agent = A 0/1 boolean for if this is being used as a LibreNMS agent or not. Default: 0 zero_stats = A 0/1 boolean for if the stats file should be zeroed first. Default: 0 (1 if guessed) If you want to guess at the configuration, call the script with -g and it will print out what it thinks it should be.","title":"BIND9 aka named"},{"location":"Extensions/Applications/#snmp-extend_4","text":"Copy the bind shell script, to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/bind -O /etc/snmp/bind Make the script executable chmod +x /etc/snmp/bind Edit your snmpd.conf file and add: extend bind /etc/snmp/bind Restart snmpd on the host in question. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_2","text":"Install the agent on this device if it isn't already and copy the script to /usr/lib/check_mk_agent/local/bind via wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/bind -O /usr/lib/check_mk_agent/local/bind Make the script executable chmod +x /usr/lib/check_mk_agent/local/bind Set the variable 'agent' to '1' in the config.","title":"Agent"},{"location":"Extensions/Applications/#bird2","text":"The BIRD Internet Routing Daemon (BGP) Due to the lack of SNMP support in the BIRD daemon, this application extracts all configured BGP protocols and parses it into LibreNMS. This application supports both IPv4 and IPv6 Peer processing.","title":"BIRD2"},{"location":"Extensions/Applications/#snmp-extend_5","text":"Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend bird2 '/usr/bin/sudo /usr/sbin/birdc -r show protocols all' Edit your sudo users (usually visudo ) and add at the bottom: Debian-snmp ALL=(ALL) NOPASSWD: /usr/sbin/birdc If your snmp daemon is running on a user that isnt Debian-snmp make sure that user has the correct permission to execute birdc Verify the time format for bird2 is defined. Otherwise iso short ms (hh:mm:ss) is the default value that will be used. Which is not compatible with the datetime parsing logic used to parse the output from the bird show command. timeformat protocol is the one important to be defibned for the bird2 app parsing logic to work. Example starting point using Bird2 shorthand iso long (YYYY-MM-DD hh:mm:ss): timeformat base iso long; timeformat log iso long; timeformat protocol iso long; timeformat route iso long; Timezone can be manually specified, example \"%F %T %z\" (YYYY-MM-DD hh:mm:ss +11:45). See the Bird 2 docs for more information Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#certificate","text":"A small python3 script that checks age and remaining validity of certificates This script needs following packages on Debian/Ubuntu Systems: python3 python3-openssl Content of an example /etc/snmp/certificate.json . Please edit with your own settings. {\"domains\": [ {\"fqdn\": \"www.mydomain.com\"}, {\"fqdn\": \"some.otherdomain.org\", \"port\": 8443}, {\"fqdn\": \"personal.domain.net\"}, {\"fqdn\": \"selfsignedcert_host.domain.com\", \"cert_location\": \"/etc/pki/tls/certs/localhost.pem\"} ] } a. (Required): Key 'domains' contains a list of domains to check. b. (Optional): You can define a port. By default it checks on port 443. c. (Optional): You may define a certificate location for self-signed certificates.","title":"Certificate"},{"location":"Extensions/Applications/#snmp-extend_6","text":"Copy the shell script to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/certificate.py -O /etc/snmp/certificate.py Make the script executable chmod +x /etc/snmp/certificate.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend certificate /etc/snmp/certificate.py Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#borgbackup","text":"","title":"BorgBackup"},{"location":"Extensions/Applications/#snmp-extend_7","text":"Copy the shell script to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/borgbackup -O /etc/snmp/borgbackup Make the script executable chmod +x /etc/snmp/borgbackup Install depends. # FreeBSD pkg p5-Config-Tiny p5-JSON p5-File-Slurp p5-MIME-Base64 p5-String-ShellQuote # Debian apt-get install libconfig-tiny-perl libjson-perl libfile-slurp-perl libmime-base64-perl libstring-shellquote-perl # generic cpanm cpanm Config::Tiny File::Slurp JSON MIME::Base64 String::ShellQuote Set it up in cron. */5 * * * /etc/snmp/borgbackup 2> /dev/null > /dev/null Configure it. See further down below or /etc/snmp/borgbackup --help . Add the following to the SNMPD config. extend borgbackup /bin/cat /var/cache/borgbackup_extend/extend_return Restart SNMPD and wait for the device to rediscover or tell it to manually.","title":"SNMP Extend"},{"location":"Extensions/Applications/#config","text":"The config file is a ini file and handled by Config::Tiny . - mode :: single or multi, for if this is a single repo or for multiple repos. - Default :: single - repo :: Directory for the borg backup repo. - Default :: undef - passphrase :: Passphrase for the borg backup repo. - Default :: undef - passcommand :: Passcommand for the borg backup repo. - Default :: undef For single repos all those variables are in the root section of the config, so lets the repo is at '/backup/borg' with a passphrase of '1234abc'. repo=/backup/borg repo=1234abc For multi, each section outside of the root represents a repo. So if there is '/backup/borg1' with a passphrase of 'foobar' and '/backup/derp' with a passcommand of 'pass show backup' it would be like below. mode=multi [borg1] repo=/backup/borg1 passphrase=foobar [derp] repo=/backup/derp passcommand=pass show backup If 'passphrase' and 'passcommand' are both specified, then passcommand is used.","title":"Config"},{"location":"Extensions/Applications/#metrics","text":"The metrics are all from .data.totals in the extend return. Value Type Description errored repos Total number of repos that info could not be fetched for. locked repos Total number of locked repos locked_for seconds Longest time any repo has been locked. time_since_last_modified seconds Largest time - mtime for the repo nonce total_chunks chunks Total number of chunks total_csize bytes Total compressed size of all archives in all repos. total_size byes Total uncompressed size of all archives in all repos. total_unique_chunks chunks Total number of unique chuckes in all repos. unique_csize bytes Total deduplicated size of all archives in all repos. unique_size chunks Total number of chunks in all repos.","title":"Metrics"},{"location":"Extensions/Applications/#capev2","text":"Copy the shell script to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/cape -O /etc/snmp/cape Make the script executable chmod +x /etc/snmp/cape Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend cape /etc/snmp/cape Install the required packages. apt-get install libfile-readbackwards-perl libjson-perl libconfig-tiny-perl libdbi-perl libfile-slurp-perl libstatistics-lite-perl Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"CAPEv2"},{"location":"Extensions/Applications/#chip","text":"C.H.I.P. is a $9 R8 based tiny computer ideal for small projects. Further details: https://getchip.com/pages/chip Copy the shell script to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/chip.sh -O /etc/snmp/power-stat.sh Make the script executable chmod +x /etc/snmp/power-stat.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend power-stat /etc/snmp/power-stat.sh Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"C.H.I.P"},{"location":"Extensions/Applications/#docker-stats","text":"It gathers metrics about the docker containers, including: - cpu percentage - memory usage - container size - uptime - Totals per status This script requires python3 and the pip module python-dateutil","title":"Docker Stats"},{"location":"Extensions/Applications/#snmp-extend_8","text":"Install pip module pip3 install python-dateutil Copy the shell script to the desired host. By default, it will only show the status for containers that are running. To include all containers modify the constant in the script at the top of the file and change it to ONLY_RUNNING_CONTAINERS = False wget https://github.com/librenms/librenms-agent/raw/master/snmp/docker-stats.py -O /etc/snmp/docker-stats.py Make the script executable chmod +x /etc/snmp/docker-stats.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend docker /etc/snmp/docker-stats.py If your run Debian, you need to add the Debian-snmp user to the docker group usermod -a -G docker Debian-snmp Restart snmpd on your host systemctl restart snmpd","title":"SNMP Extend"},{"location":"Extensions/Applications/#entropy","text":"A small shell script that checks your system's available random entropy.","title":"Entropy"},{"location":"Extensions/Applications/#snmp-extend_9","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/entropy.sh -O /etc/snmp/entropy.sh Make the script executable chmod +x /etc/snmp/entropy.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend entropy /etc/snmp/entropy.sh Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#exim-stats","text":"SNMP extend script to get your exim stats data into your host.","title":"EXIM Stats"},{"location":"Extensions/Applications/#snmp-extend_10","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/exim-stats.sh -O /etc/snmp/exim-stats.sh Make the script executable chmod +x /etc/snmp/exim-stats.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend exim-stats /etc/snmp/exim-stats.sh If you are using sudo edit your sudo users (usually visudo ) and add at the bottom: snmp ALL=(ALL) NOPASSWD: /etc/snmp/exim-stats.sh, /usr/bin/exim* Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#fail2ban","text":"","title":"Fail2ban"},{"location":"Extensions/Applications/#snmp-extend_11","text":"Copy the shell script, fail2ban, to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/fail2ban -O /etc/snmp/fail2ban Make the script executable chmod +x /etc/snmp/fail2ban Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend fail2ban /etc/snmp/fail2ban If you want to use the cache, it is as below, by using the -c switch. extend fail2ban /etc/snmp/fail2ban -c If you want to use the cache and update it if needed, this can by using the -c and -U switches. extend fail2ban /etc/snmp/fail2ban -c -U If you need to specify a custom location for the fail2ban-client, that can be done via the -f switch. extend fail2ban /etc/snmp/fail2ban -f /foo/bin/fail2ban-client If not specified, \"/usr/bin/env fail2ban-client\" is used. Restart snmpd on your host If you wish to use caching, add the following to /etc/crontab and restart cron. */3 * * * * root /etc/snmp/fail2ban -u Restart or reload cron on your system. If you have more than a few jails configured, you may need to use caching as each jail needs to be polled and fail2ban-client can't do so in a timely manner for than a few. This can result in failure of other SNMP information being polled. For additional details of the switches, please see the POD in the script it self at the top.","title":"SNMP Extend"},{"location":"Extensions/Applications/#freebsd-nfs-client","text":"","title":"FreeBSD NFS Client"},{"location":"Extensions/Applications/#snmp-extend_12","text":"Copy the shell script, fbsdnfsserver, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/fbsdnfsclient -O /etc/snmp/fbsdnfsclient Make the script executable chmod +x /etc/snmp/fbsdnfsclient Edit your snmpd.conf file and add: extend fbsdnfsclient /etc/snmp/fbsdnfsclient Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#freebsd-nfs-server","text":"","title":"FreeBSD NFS Server"},{"location":"Extensions/Applications/#snmp-extend_13","text":"Copy the shell script, fbsdnfsserver, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/fbsdnfsserver -O /etc/snmp/fbsdnfsserver Make the script executable chmod +x /etc/snmp/fbsdnfsserver Edit your snmpd.conf file and add: extend fbsdnfsserver /etc/snmp/fbsdnfsserver Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#freeradius","text":"The FreeRADIUS application extension requires that status_server be enabled in your FreeRADIUS config. For more information see: https://wiki.freeradius.org/config/Status You should note that status requests increment the FreeRADIUS request stats. So LibreNMS polls will ultimately be reflected in your stats/charts. Go to your FreeRADIUS configuration directory (usually /etc/raddb or /etc/freeradius). cd sites-enabled ln -s ../sites-available/status status Restart FreeRADIUS. You should be able to test with the radclient as follows... echo \"Message-Authenticator = 0x00, FreeRADIUS-Statistics-Type = 31, Response-Packet-Type = Access-Accept\" | \\ radclient -x localhost:18121 status adminsecret Note that adminsecret is the default secret key in status_server. Change if you've modified this.","title":"FreeRADIUS"},{"location":"Extensions/Applications/#snmp-extend_14","text":"Copy the freeradius shell script, to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/freeradius.sh -O /etc/snmp/freeradius.sh Make the script executable chmod +x /etc/snmp/freeradius.sh If you've made any changes to the FreeRADIUS status_server config (secret key, port, etc.) edit freeradius.sh and adjust the config variable accordingly. Edit your snmpd.conf file and add: extend freeradius /etc/snmp/freeradius.sh Restart snmpd on the host in question. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_3","text":"Install the script to your agent wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/freeradius.sh -O /usr/lib/check_mk_agent/local/freeradius.sh` Make the script executable chmod +x /usr/lib/check_mk_agent/local/freeradius.sh If you've made any changes to the FreeRADIUS status_server config (secret key, port, etc.) edit freeradius.sh and adjust the config variable accordingly. Edit the freeradius.sh script and set the variable 'AGENT' to '1' in the config.","title":"Agent"},{"location":"Extensions/Applications/#freeswitch","text":"A small shell script that reports various Freeswitch call status.","title":"Freeswitch"},{"location":"Extensions/Applications/#agent_4","text":"Install the agent on this device if it isn't already and copy the freeswitch script to /usr/lib/check_mk_agent/local/ wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/freeswitch -O /usr/lib/check_mk_agent/local/freeswitch` Make the script executable chmod +x /usr/lib/check_mk_agent/local/freeswitch Configure FSCLI in the script. You may also have to create an /etc/fs_cli.conf file if your fs_cli command requires authentication. Verify it is working by running /usr/lib/check_mk_agent/local/freeswitch","title":"Agent"},{"location":"Extensions/Applications/#snmp-extend_15","text":"Download the script onto the desired host wget https://github.com/librenms/librenms-agent/raw/master/agent-local/freeswitch -O /etc/snmp/freeswitch Make the script executable chmod +x /etc/snmp/freeswitch Configure FSCLI in the script. You may also have to create an /etc/fs_cli.conf file if your fs_cli command requires authentication. Verify it is working by running /etc/snmp/freeswitch Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend freeswitch /etc/snmp/freeswitch Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#gpsd","text":"","title":"GPSD"},{"location":"Extensions/Applications/#snmp-extend_16","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/gpsd -O /etc/snmp/gpsd Make the script executable chmod +x /etc/snmp/gpsd Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend gpsd /etc/snmp/gpsd Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading at the top of the page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_5","text":"Install the agent on this device if it isn't already and copy the gpsd script to /usr/lib/check_mk_agent/local/ You may need to configure $server or $port . Verify it is working by running /usr/lib/check_mk_agent/local/gpsd","title":"Agent"},{"location":"Extensions/Applications/#hv-monitor","text":"HV Monitor provides a generic way to monitor hypervisors. Currently CBSD+bhyve on FreeBSD and Libvirt+QEMU on Linux are support. For more information see HV::Monitor on Github or MetaCPAN .","title":"HV Monitor"},{"location":"Extensions/Applications/#snmp-extend_17","text":"Install the SNMP Extend. For Debian based systems this is as below. apt-get install zlib1g-dev cpanminus libjson-perl cpanm HV::Monitor And on FreeBSD as below. pkg install p5-App-cpanminus p5-JSON p5-MIME-Base64 p5-Gzip-Faster cpanm HV::Monitor Set it up to be be ran by cron by root. Yes, you can directly call this script from SNMPD, but be aware, especially with Libvirt, there is a very real possibility of the snmpget timing out, especially if a VM is spinning up/down as virsh domstats can block for a few seconds or so then. */5 * * * * /usr/local/bin/hv_monitor > /var/cache/hv_monitor.json -c 2> /dev/null Setup snmpd.conf as below. extend hv-monitor /bin/cat /var/cache/hv_monitor.json Restart SNMPD. Either wait for it to be re-discovered or manually enable it.","title":"SNMP Extend"},{"location":"Extensions/Applications/#icecast","text":"Shell script that reports load average/memory/open-files stats of Icecast","title":"Icecast"},{"location":"Extensions/Applications/#snmp-extend_18","text":"Copy the shell script, icecast-stats.sh, to the desired host (the host must be added to LibreNMS devices) wget https://github.com/librenms/librenms-agent/raw/master/snmp/icecast-stats.sh -O /etc/snmp/icecast-stats.sh Make the script executable chmod +x /etc/snmp/icecast-stats.sh Verify it is working by running /etc/snmp/icecast-stats.sh Edit your snmpd.conf file (usually /etc/snmp/icecast-stats.sh ) and add: extend icecast /etc/snmp/icecast-stats.sh","title":"SNMP Extend"},{"location":"Extensions/Applications/#isc-dhcp-stats","text":"A small python3 script that reports current DHCP leases stats and pool usage of ISC DHCP Server. Also you have to install the dhcpd-pools and the required Perl modules. Under Ubuntu/Debian just run apt install cpanminus ; cpanm Net::ISC::DHCPd::Leases Mime::Base64 File::Slurp or under FreeBSD pkg install p5-JSON p5-MIME-Base64 p5-App-cpanminus p5-File-Slurp ; cpanm Net::ISC::DHCPd::Leases .","title":"ISC DHCP Stats"},{"location":"Extensions/Applications/#snmp-extend_19","text":"Copy the shell script to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/dhcp -O /etc/snmp/dhcp Make the script executable chmod +x /etc/snmp/dhcp Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: # without using cron extend dhcpstats /etc/snmp/dhcp -Z # using cron extend dhcpstats /bin/cat /var/cache/dhcp_extend If on a slow system running it via cron may be needed. */5 * * * * /etc/snmp/dhcp -Z -w /var/cache/dhcp_extend The following options are also supported. Option Description -c $file Path to dhcpd.conf. -l $file Path to lease file. -Z Enable GZip+Base64 compression. -d Do not de-dup. -w $file File to write it out to. Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#logsize","text":"","title":"Logsize"},{"location":"Extensions/Applications/#snmp-extend_20","text":"Download the script and make it executable. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/logsize -O /etc/snmp/logsize chmod +x /etc/snmp/logsize Install the requirements. # FreeBSD pkg install p5-File-Find-Rule p5-JSON p5-TOML p5-Time-Piece p5-MIME-Base64 p5-File-Slurp p5-Statistics-Lite # Debian apt-get install cpanminus cpanm File::Find::Rule JSON TOML Time::Piece MIME::Base64 File::Slurp Statistics::Lite Configure the config at /usr/local/etc/logsize.conf . You can find the documentation for the config file in the extend. Below is a small example. # monitor log sizes of logs directly udner /var/log [sets.var_log] dir=\"/var/log/\" # monitor remote logs from network devices [sets.remote_network] dir=\"/var/log/remote/network/\" # monitor remote logs from windows sources [sets.remote_windows] dir=\"/var/log/remote/windows/\" # monitor suricata flows logs sizes [sets.suricata_flows] dir=\"/var/log/suricata/flows/current\" If the directories all readable via SNMPD, this script can be ran via snmpd. Otherwise it needs setup in cron. Similarly is processing a large number of files, it may also need setup in cron if it takes the script awhile to run. */5 * * * * /etc/snmp/logsize -b 2> /dev/null > /dev/null Make sure that /var/cache/logsize_extend exists and is writable by the user running the extend. mkdir -p /var/cache/logsize_extend Configure it in the SNMPD config. # if not using cron extend logsize /etc/snmp/logsize -b # if using cron extend logsize /bin/cat /var/cache/logsize_extend/extend_return","title":"SNMP Extend"},{"location":"Extensions/Applications/#linux_config_files","text":"linux_config_files is an application intended to monitor a Linux distribution's configuration files via that distribution's configuration management tool/system. At this time, ONLY RPM-based (Fedora/RHEL) SYSTEMS ARE SUPPORTED utilizing the rpmconf tool. The linux_config_files application collects and graphs the total count of configuration files that are out of sync and graphs that number. Fedora/RHEL: Rpmconf is a utility that analyzes rpm configuration files using the RPM Package Manager. Rpmconf reports when a new configuration file standard has been issued for an upgraded/downgraded piece of software. Typically, rpmconf is used to provide a diff of the current configuration file versus the new, standard configuration file. The administrator can then choose to install the new configuration file or keep the old one.","title":"linux_config_files"},{"location":"Extensions/Applications/#snmp-extend_21","text":"Copy the python script, linux_config_files.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/linux_config_files.py -O /etc/snmp/linux_config_files.py Make the script executable chmod +x /etc/snmp/linux_config_files.py Edit your snmpd.conf file and add: extend linux_config_files /etc/snmp/linux_config_files.py (Optional on an RPM-based distribution) Create a /etc/snmp/linux_config_files.json file and specify the following: \"pkg_system\" - String designating the distribution name of the system. At the moment only \"rpm\" is supported [\"rpm\"] \"pkg_tool_cmd\" - String path to the package tool binary [\"/sbin/rpmconf\"] { \"pkg_system\": \"rpm\", \"pkg_tool_cmd\": \"/bin/rpmconf\", } Restart snmpd.","title":"SNMP Extend"},{"location":"Extensions/Applications/#linux-softnet-stat","text":"","title":"Linux Softnet Stat"},{"location":"Extensions/Applications/#snmp-extend_22","text":"1: Install the depends, which on a Debian based system would be as below. apt-get install -y cpanminus zlib1g-dev cpanm File::Slurp MIME::Base64 JSON Gzip::Faster Download the script into the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/linux_softnet_stat -O /etc/snmp/linux_softnet_stat Make the script executable chmod +x /etc/snmp/linux_softnet_stat Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend linux_softnet_stat /etc/snmp/linux_softnet_stat -b Then either enable the application Linux Softnet Stat or wait for it to be re-discovered.","title":"SNMP Extend"},{"location":"Extensions/Applications/#mailcow-dockerized-postfix","text":"","title":"mailcow-dockerized postfix"},{"location":"Extensions/Applications/#snmp-extend_23","text":"Download the script into the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/mailcow-dockerized-postfix -O /etc/snmp/mailcow-dockerized-postfix Make the script executable chmod +x /etc/snmp/mailcow-dockerized-postfix Maybe you will need to install pflogsumm on debian based OS. Please check if you have package installed. Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend mailcow-postfix /etc/snmp/mailcow-dockerized-postfix Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#mailscanner","text":"","title":"Mailscanner"},{"location":"Extensions/Applications/#snmp-extend_24","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/mailscanner.php -O /etc/snmp/mailscanner.php Make the script executable chmod +x /etc/snmp/mailscanner.php Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend mailscanner /etc/snmp/mailscanner.php Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#mdadm","text":"It allows you to checks mdadm health and array data This script require: jq","title":"Mdadm"},{"location":"Extensions/Applications/#snmp-extend_25","text":"Install jq sudo apt install jq Download the script onto the desired host. sudo wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/mdadm -O /etc/snmp/mdadm Make the script executable sudo chmod +x /etc/snmp/mdadm Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend mdadm /etc/snmp/mdadm Verify it is working by running sudo /etc/snmp/mdadm Restart snmpd on your host sudo service snmpd restart The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#megaraid","text":"This software from Broadcom/LSI let you monitor MegaRAID controller. Download the external software and follow the included install instructions. Add the following line to your snmpd.conf file (usually /etc/snmp/snmpd.conf) pass .1.3.6.1.4.1.3582 /usr/sbin/lsi_mrdsnmpmain Restart snmpd on your host","title":"MegaRAID"},{"location":"Extensions/Applications/#memcached","text":"","title":"Memcached"},{"location":"Extensions/Applications/#snmp-extend_26","text":"Copy the memcached script to /etc/snmp/ on your remote server. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/memcached -O /etc/snmp/memcached Make the script executable: chmod +x /etc/snmp/memcached Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend memcached /etc/snmp/memcached Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#mojo-cape-submit","text":"","title":"Mojo CAPE Submit"},{"location":"Extensions/Applications/#snmp","text":"This assumes you've already configured mojo_cape_submit from CAPE::Utils. Add the following to snmpd.conf and restarted SNMPD extend mojo_cape_submit /usr/local/bin/mojo_cape_submit_extend Then just wait for the machine in question to be rediscovered or enabled it in the device settings app page.","title":"SNMP"},{"location":"Extensions/Applications/#munin","text":"","title":"Munin"},{"location":"Extensions/Applications/#agent_6","text":"Install the script to your agent: wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/munin -O /usr/lib/check_mk_agent/local/munin Make the script executable chmod +x /usr/lib/check_mk_agent/local/munin Create the munin scripts dir: mkdir -p /usr/share/munin/munin-scripts Install your munin scripts into the above directory. To create your own custom munin scripts, please see this example: #!/bin/bash if [ \" $1 \" = \"config\" ] ; then echo 'graph_title Some title' echo 'graph_args --base 1000 -l 0' #not required echo 'graph_vlabel Some label' echo 'graph_scale no' #not required, can be yes/no echo 'graph_category system' #Choose something meaningful, can be anything echo 'graph_info This graph shows something awesome.' #Short desc echo 'foobar.label Label for your unit' # Repeat these two lines as much as you like echo 'foobar.info Desc for your unit.' exit 0 fi echo -n \"foobar.value \" $( date +%s ) #Populate a value, here unix-timestamp","title":"Agent"},{"location":"Extensions/Applications/#mysql","text":"Create the cache directory, '/var/cache/librenms/' and make sure that it is owned by the user running the SNMP daemon. mkdir -p /var/cache/librenms/ The MySQL script requires PHP-CLI and the PHP MySQL extension, so please verify those are installed. CentOS (May vary based on PHP version) yum install php-cli php-mysql Debian (May vary based on PHP version) apt-get install php-cli php-mysql Unlike most other scripts, the MySQL script requires a configuration file mysql.cnf in the same directory as the extend or agent script with following content: snmpd_nginx.te module snmpd_nginx 1.0; require { type httpd_t; type http_port_t; type snmpd_t; class tcp_socket name_connect; } #============= snmpd_t ============== allow snmpd_t http_port_t:tcp_socket name_connect; EOF checkmodule -M -m -o snmpd_nginx.mod snmpd_nginx.te semodule_package -o snmpd_nginx.pp -m snmpd_nginx.mod semodule -i snmpd_nginx.pp Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_8","text":"Install the agent on this device if it isn't already and copy the nginx script to /usr/lib/check_mk_agent/local/","title":"Agent"},{"location":"Extensions/Applications/#nfs-server","text":"Export the NFS stats from as server.","title":"NFS Server"},{"location":"Extensions/Applications/#snmp-extend_29","text":"Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add : extend nfs-server /bin/cat /proc/net/rpc/nfsd find out where cat is located using : which cat reload snmpd service to activate the configuration","title":"SNMP Extend"},{"location":"Extensions/Applications/#ntp-client","text":"A shell script that gets stats from ntp client.","title":"NTP Client"},{"location":"Extensions/Applications/#snmp-extend_30","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/ntp-client -O /etc/snmp/ntp-client Make the script executable chmod +x /etc/snmp/ntp-client Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ntp-client /etc/snmp/ntp-client Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#ntp-server-aka-ntpd","text":"A shell script that gets stats from ntp server (ntpd).","title":"NTP Server aka NTPD"},{"location":"Extensions/Applications/#snmp-extend_31","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/ntp-server.sh -O /etc/snmp/ntp-server.sh Make the script executable chmod +x /etc/snmp/ntp-server.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ntp-server /etc/snmp/ntp-server.sh Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#chronyd","text":"A shell script that gets the stats from chronyd and exports them with SNMP Extend.","title":"Chronyd"},{"location":"Extensions/Applications/#snmp-extend_32","text":"Download the shell script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/chrony -O /etc/snmp/chrony Make the script executable chmod +x /etc/snmp/chrony Edit the snmpd.conf file to include the extend by adding the following line to the end of the config file: extend chronyd /etc/snmp/chrony Note: Some distributions need sudo-permissions for the script to work with SNMP Extend. See the instructions on the section SUDO for more information. Restart snmpd service on the host Application should be auto-discovered and its stats presented on the Apps-page on the host. Note: Applications module needs to be enabled on the host or globally for the statistics to work as intended.","title":"SNMP Extend"},{"location":"Extensions/Applications/#nvidia-gpu","text":"","title":"Nvidia GPU"},{"location":"Extensions/Applications/#snmp-extend_33","text":"Copy the shell script, nvidia, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/nvidia -O /etc/snmp/nvidia Make the script executable chmod +x /etc/snmp/nvidia Edit your snmpd.conf file and add: extend nvidia /etc/snmp/nvidia Restart snmpd on your host. Verify you have nvidia-smi installed, which it generally should be if you have the driver from Nvida installed. The GPU numbering on the graphs will correspond to how the nvidia-smi sees them as being. For questions about what the various values are/mean, please see the nvidia-smi man file under the section covering dmon.","title":"SNMP Extend"},{"location":"Extensions/Applications/#opensearchelasticsearch","text":"","title":"Opensearch\\Elasticsearch"},{"location":"Extensions/Applications/#snmp-extend_34","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/opensearch -O /etc/snmp/opensearch Make it executable chmod +x /etc/snmp/opensearch Install the required Perl dependencies. # FreeBSD pkg install p5-JSON p5-libwww # Debian/Ubuntu apt-get install libjson-perl libwww-perl # cpanm cpanm JSON Libwww Update your snmpd.conf. extend opensearch /bin/cat /var/cache/opensearch.json Update root crontab with. This is required as it will this will likely time out otherwise. Use */1 if you want to have the most recent stats when polled or to */5 if you just want at exactly a 5 minute interval. */5 * * * * /etc/snmp/opensearch > /var/cache/opensearch.json Enable it or wait for the device to be re-disocvered.","title":"SNMP Extend"},{"location":"Extensions/Applications/#open-grid-scheduler","text":"Shell script to track the OGS/GE jobs running on clusters.","title":"Open Grid Scheduler"},{"location":"Extensions/Applications/#snmp-extend_35","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/rocks.sh -O /etc/snmp/rocks.sh Make the script executable chmod +x /etc/snmp/rocks.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ogs /etc/snmp/rocks.sh Restart snmpd. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#opensips","text":"Script that reports load-average/memory/open-files stats of Opensips","title":"Opensips"},{"location":"Extensions/Applications/#snmp-extend_36","text":"Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/opensips-stats.sh -O /etc/snmp/opensips-stats.sh Make the script executable: chmod +x /etc/snmp/opensips-stats.sh Verify it is working by running /etc/snmp/opensips-stats.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend opensips /etc/snmp/opensips-stats.sh","title":"SNMP Extend"},{"location":"Extensions/Applications/#os-updates","text":"A small shell script that checks your system package manager for any available updates. Supports apt-get/pacman/yum/zypper package managers. For pacman users automatically refreshing the database, it is recommended you use an alternative database location --dbpath=/var/lib/pacman/checkupdate","title":"OS Updates"},{"location":"Extensions/Applications/#snmp-extend_37","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/osupdate -O /etc/snmp/osupdate Make the script executable chmod +x /etc/snmp/osupdate Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend osupdate /etc/snmp/osupdate Restart snmpd on your host Note : apt-get depends on an updated package index. There are several ways to have your system run apt-get update automatically. The easiest is to create /etc/apt/apt.conf.d/10periodic and pasting the following in it: APT::Periodic::Update-Package-Lists \"1\"; . If you have apticron, cron-apt or apt-listchanges installed and configured, chances are that packages are already updated periodically . The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_9","text":"Install the agent on this device if it isn't already and copy the osupdate script to /usr/lib/check_mk_agent/local/ Then uncomment the line towards the top marked to be uncommented if using it as a agent.","title":"Agent"},{"location":"Extensions/Applications/#php-fpm","text":"","title":"PHP-FPM"},{"location":"Extensions/Applications/#snmp-extend_38","text":"Copy the shell script, phpfpmsp, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/phpfpmsp -O /etc/snmp/phpfpmsp Make the script executable chmod +x /etc/snmp/phpfpmsp Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend phpfpmsp /etc/snmp/phpfpmsp Edit /etc/snmp/phpfpmsp to include the status URL for the PHP-FPM pool you are monitoring. Restart snmpd on your host It is worth noting that this only monitors a single pool. If you want to monitor multiple pools, this won't do it. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_10","text":"Install the agent on this device if it isn't already and copy the phpfpmsp script to /usr/lib/check_mk_agent/local/","title":"Agent"},{"location":"Extensions/Applications/#pi-hole","text":"","title":"Pi-hole"},{"location":"Extensions/Applications/#snmp-extend_39","text":"Copy the shell script, pi-hole, to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/pi-hole -O /etc/snmp/pi-hole Make the script executable chmod +x /etc/snmp/pi-hole Edit your snmpd.conf file and add: extend pi-hole /etc/snmp/pi-hole To get all data you must get your API auth token from Pi-hole server and change the API_AUTH_KEY entry inside the snmp script. Restard snmpd. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#portactivity","text":"","title":"Portactivity"},{"location":"Extensions/Applications/#snmp-extend_40","text":"Install missing packages - Ubuntu is shown below. apt install libparse-netstat-perl apt install libjson-perl Copy the Perl script to the desired host (the host must be added to LibreNMS devices) wget https://github.com/librenms/librenms-agent/raw/master/snmp/portactivity -O /etc/snmp/portactivity Make the script executable chmod +x /etc/snmp/portactivity Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend portactivity /etc/snmp/portactivity -p http,ldap,imap Will monitor HTTP, LDAP, and IMAP. The -p switch specifies what ports to use. This is a comma seperated list. These must be found in '/etc/services' or where ever NSS is set to fetch it from. If not, it will throw an error. If you want to JSON returned by it to be printed in a pretty format use the -P flag. Restart snmpd on your host. Please note that for only TCP[46] services are supported.","title":"SNMP Extend"},{"location":"Extensions/Applications/#postfix","text":"","title":"Postfix"},{"location":"Extensions/Applications/#snmp-extend_41","text":"Copy the shell script, postfix-queues, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/postfix-queues -O /etc/snmp/postfix-queues Copy the Perl script, postfixdetailed, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/postfixdetailed -O /etc/snmp/postfixdetailed Make both scripts executable chmod +x /etc/snmp/postfixdetailed /etc/snmp/postfix-queues Edit your snmpd.conf file and add: extend mailq /etc/snmp/postfix-queues extend postfixdetailed /etc/snmp/postfixdetailed Restart snmpd. Install pflogsumm for your OS. Make sure the cache file in /etc/snmp/postfixdetailed is some place that snmpd can write too. This file is used for tracking changes between various values between each time it is called by snmpd. Also make sure the path for pflogsumm is correct. Run /etc/snmp/postfixdetailed to create the initial cache file so you don't end up with some crazy initial starting value. Please note that each time /etc/snmp/postfixdetailed is ran, the cache file is updated, so if this happens in between LibreNMS doing it then the values will be thrown off for that polling period. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. NOTE: If using RHEL for your postfix server, qshape must be installed manually as it is not officially supported. CentOs 6 rpms seem to work without issues.","title":"SNMP Extend"},{"location":"Extensions/Applications/#postgres","text":"","title":"Postgres"},{"location":"Extensions/Applications/#snmp-extend_42","text":"Copy the shell script, postgres, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/postgres -O /etc/snmp/postgres Make the script executable chmod +x /etc/snmp/postgres Edit your snmpd.conf file and add: extend postgres /etc/snmp/postgres Restart snmpd on your host Install the Nagios check check_postgres.pl on your system: https://github.com/bucardo/check_postgres Verify the path to check_postgres.pl in /etc/snmp/postgres is correct. (Optional) If you wish to change the DB username (default: pgsql), enable the postgres DB in totalling (e.g. set ignorePG to 0, default: 1), or set a hostname for check_postgres.pl to connect to (default: the Unix Socket postgresql is running on), then create the file /etc/snmp/postgres.config with the following contents (note that not all of them need be defined, just whichever you'd like to change): DBuser=monitoring ignorePG=0 DBhost=localhost Note that if you are using netdata or the like, you may wish to set ignorePG to 1 or otherwise that total will be very skewed on systems with light or moderate usage. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#powerdns","text":"An authoritative DNS server: https://www.powerdns.com/auth.html","title":"PowerDNS"},{"location":"Extensions/Applications/#snmp-extend_43","text":"Copy the shell script, powerdns.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/powerdns.py -O /etc/snmp/powerdns.py Make the script executable chmod +x /etc/snmp/powerdns.py Edit your snmpd.conf file and add: extend powerdns /etc/snmp/powerdns.py Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_11","text":"Install the agent on this device if it isn't already and copy the powerdns script to /usr/lib/check_mk_agent/local/","title":"Agent"},{"location":"Extensions/Applications/#powerdns-recursor","text":"A recursive DNS server: https://www.powerdns.com/recursor.html","title":"PowerDNS Recursor"},{"location":"Extensions/Applications/#direct","text":"The LibreNMS polling host must be able to connect to port 8082 on the monitored device. The web-server must be enabled, see the Recursor docs: https://doc.powerdns.com/md/recursor/settings/#webserver","title":"Direct"},{"location":"Extensions/Applications/#variables","text":"$config['apps']['powerdns-recursor']['api-key'] required, this is defined in the Recursor config $config['apps']['powerdns-recursor']['port'] numeric, defines the port to connect to PowerDNS Recursor on. The default is 8082 $config['apps']['powerdns-recursor']['https'] true or false, defaults to use http.","title":"Variables"},{"location":"Extensions/Applications/#snmp-extend_44","text":"Copy the shell script, powerdns-recursor, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/powerdns-recursor -O /etc/snmp/powerdns-recursor Make the script executable chmod +x /etc/snmp/powerdns-recursor Edit your snmpd.conf file and add: extend powerdns-recursor /etc/snmp/powerdns-recursor Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_12","text":"Install the agent on this device if it isn't already and copy the powerdns-recursor script to /usr/lib/check_mk_agent/local/ This script uses rec_control get-all to collect stats.","title":"Agent"},{"location":"Extensions/Applications/#powerdns-dnsdist","text":"","title":"PowerDNS-dnsdist"},{"location":"Extensions/Applications/#snmp-extend_45","text":"Copy the BASH script to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/powerdns-dnsdist -O /etc/snmp/powerdns-dnsdist Make the script executable chmod +x /etc/snmp/powerdns-dnsdist Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend powerdns-dnsdist /etc/snmp/powerdns-dnsdist Restart snmpd on your host. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#powermon","text":"PowerMon tracks the power usage on your host and can report on both consumption and cost, using a python script installed on the host. PowerMon consumption graph Currently the script uses one of two methods to determine current power usage: ACPI via libsensors HP-Health (HP Proliant servers only) The ACPI method is quite unreliable as it is usually only implemented by battery-powered devices, e.g. laptops. YMMV. However, it's possible to support any method as long as it can return a power value, usually in Watts. TIP: You can achieve this by adding a method and a function for that method to the script. It should be called by getData() and return a dictionary. Because the methods are unreliable for all hardware, you need to declare to the script which method to use. The are several options to assist with testing, see --help .","title":"PowerMon"},{"location":"Extensions/Applications/#snmp-extend_46","text":"","title":"SNMP Extend"},{"location":"Extensions/Applications/#initial-setup","text":"Download the python script onto the host: wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/powermon-snmp.py -O /usr/local/bin/powermon-snmp.py Make the script executable: chmod +x /usr/local/bin/powermon-snmp.py Edit the script and set the cost per kWh for your supply. You must uncomment this line for the script to work: vi /usr/local/bin/powermon-snmp.py #costPerkWh = 0.15 Choose you method below: Method 1. sensors Method 2. hpasmcli Install dependencies: dnf install lm_sensors pip install PySensors Test the script from the command-line. For example: $ /usr/local/bin/powermon-snmp.py -m sensors -n -p { \"meter\": { \"0\": { \"reading\": 0.0 } }, \"psu\": {}, \"supply\": { \"rate\": 0.15 }, \"reading\": \"0.0\" } If you see a reading of 0.0 it is likely this method is not supported for your system. If not, continue. Obtain the hp-health package for your system. Generally there are three options: Standalone package from HPE Support From the HP Management Component Pack (MCP). Included in the HP Service Pack for Proliant (SPP) If you've downloaded the standalone package, install it. For example: rpm -ivh hp-health-10.91-1878.11.rhel8.x86_64.rpm Check the service is running: systemctl status hp-health Test the script from the command-line. For example: $ /usr/local/bin/powermon-snmp.py -m hpasmcli -n -p { \"meter\": { \"1\": { \"reading\": 338.0 } }, \"psu\": { \"1\": { \"present\": \"Yes\", \"redundant\": \"No\", \"condition\": \"Ok\", \"hotplug\": \"Supported\", \"reading\": 315.0 }, \"2\": { \"present\": \"Yes\", \"redundant\": \"No\", \"condition\": \"FAILED\", \"hotplug\": \"Supported\" } }, \"supply\": { \"rate\": 0.224931 }, \"reading\": 338.0 } If you see a reading of 0.0 it is likely this method is not supported for your system. If not, continue.","title":"Initial setup"},{"location":"Extensions/Applications/#finishing-up","text":"Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add the following: extend powermon /usr/local/bin/powermon-snmp.py -m hpasmcli NOTE: Avoid using other script options in the snmpd config as the results may not be interpreted correctly by LibreNMS. Reload your snmpd service: systemctl reload snmpd You're now ready to enable the application in LibreNMS.","title":"Finishing Up"},{"location":"Extensions/Applications/#privoxy","text":"For this to work, the following log items need enabled for Privoxy. debug 2 # show each connection status debug 512 # Common Log Format debug 1024 # Log the destination for requests Privoxy didn't let through, and the reason why. debug 4096 # Startup banner and warnings debug 8192 # Non-fatal errors","title":"Privoxy"},{"location":"Extensions/Applications/#snmp-extend_47","text":"Download the extend and make sure it is executable. wget https://github.com/librenms/librenms-agent/raw/master/snmp/privoxy -O /etc/snmp/privoxy chmod +x /etc/snmp/privoxy Install the depdenencies. # FreeBSD pkg install p5-File-ReadBackwards p5-Time-Piece p5-JSON p5-IPC-Run3 p5-Gzip-Faster p5-MIME-Base64 # Debian apt-get install cpanminus zlib1g cpanm File::ReadBackwards Time::Piece JSON IPC::Run3 MIME::Base64 Gzip::Faster Add the extend to snmpd.conf and restart snmpd. extend privoxy /etc/snmp/privoxy If your logfile is not at /var/log/privoxy/logfile , that may be changed via the -f option. If privoxy-log-parser.pl is not found in your standard $PATH setting, you may will need up call the extend via /usr/bin/env with a $PATH set to something that includes it. Once that is done, just wait for the server to be rediscovered or just enable it manually.","title":"SNMP Extend"},{"location":"Extensions/Applications/#pwrstatd","text":"Pwrstatd (commonly known as powerpanel) is an application/service available from CyberPower to monitor their PSUs over USB. It is currently capable of reading the status of only one PSU connected via USB at a time. The powerpanel software is available here: https://www.cyberpowersystems.com/products/software/power-panel-personal/","title":"Pwrstatd"},{"location":"Extensions/Applications/#snmp-extend_48","text":"Copy the python script, pwrstatd.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/pwrstatd.py -O /etc/snmp/pwrstatd.py Make the script executable chmod +x /etc/snmp/pwrstatd.py Edit your snmpd.conf file and add: extend pwrstatd /etc/snmp/pwrstatd.py (Optional) Create a /etc/snmp/pwrstatd.json file and specify the path to the pwrstat executable [the default path is /sbin/pwrstat]: { \"pwrstat_cmd\": \"/sbin/pwrstat\" } Restart snmpd.","title":"SNMP Extend"},{"location":"Extensions/Applications/#proxmox","text":"For Proxmox 4.4+ install the libpve-apiclient-perl package apt install libpve-apiclient-perl Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/proxmox -O /usr/local/bin/proxmox Make the script executable chmod +x /usr/local/bin/proxmox Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend proxmox /usr/local/bin/proxmox Note: if your snmpd doesn't run as root, you might have to invoke the script using sudo and modify the \"extend\" line extend proxmox /usr/bin/sudo /usr/local/bin/proxmox after, edit your sudo users (usually visudo ) and add at the bottom: Debian-snmp ALL=(ALL) NOPASSWD: /usr/local/bin/proxmox Restart snmpd on your host","title":"Proxmox"},{"location":"Extensions/Applications/#puppet-agent","text":"SNMP extend script to get your Puppet Agent data into your host.","title":"Puppet Agent"},{"location":"Extensions/Applications/#snmp-extend_49","text":"Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/puppet_agent.py -O /etc/snmp/puppet_agent.py Make the script executable chmod +x /etc/snmp/puppet_agent.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend puppet-agent /etc/snmp/puppet_agent.py The Script needs python3-yaml package to be installed. Per default script searches for on of this files: /var/cache/puppet/state/last_run_summary.yaml /opt/puppetlabs/puppet/cache/state/last_run_summary.yaml optionally you can add a specific summary file with creating /etc/snmp/puppet.json { \"agent\": { \"summary_file\": \"/my/custom/path/to/summary_file\" } } custom summary file has highest priority Restart snmpd on the host","title":"SNMP Extend"},{"location":"Extensions/Applications/#pureftpd","text":"SNMP extend script to monitor PureFTPd.","title":"PureFTPd"},{"location":"Extensions/Applications/#snmp-extend_50","text":"Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/pureftpd.py -O /etc/snmp/pureftpd.py Make the script executable chmod +x /etc/snmp/pureftpd.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend pureftpd sudo /etc/snmp/pureftpd.py Edit your sudo users (usually visudo ) and add at the bottom: snmp ALL=(ALL) NOPASSWD: /etc/snmp/pureftpd.py or the path where your pure-ftpwho is located If pure-ftpwho is not located in /usr/sbin you will also need to create a config file, which is named pureftpd.json. The file has to be located in /etc/snmp/. {\"pureftpwho_cmd\": \"/usr/sbin/pure-ftpwho\" } Restart snmpd on your host","title":"SNMP Extend"},{"location":"Extensions/Applications/#raspberry-pi","text":"SNMP extend script to get your PI data into your host.","title":"Raspberry PI"},{"location":"Extensions/Applications/#snmp-extend_51","text":"Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/raspberry.sh -O /etc/snmp/raspberry.sh Make the script executable chmod +x /etc/snmp/raspberry.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend raspberry /usr/bin/sudo /bin/sh /etc/snmp/raspberry.sh Edit your sudo users (usually visudo ) and add at the bottom: snmp ALL=(ALL) NOPASSWD: /bin/sh /etc/snmp/raspberry.sh Note: If you are using Raspian, the default user is Debian-snmp . Change snmp above to Debian-snmp . You can verify the user snmpd is using with ps aux | grep snmpd Restart snmpd on PI host","title":"SNMP Extend"},{"location":"Extensions/Applications/#raspberry-pi-gpio-monitor","text":"SNMP extend script to monitor your IO pins or sensor modules connected to your GPIO header.","title":"Raspberry Pi GPIO Monitor"},{"location":"Extensions/Applications/#snmp-extend_52","text":"1: Make sure you have wiringpi installed on your Raspberry Pi. In Debian-based systems for example you can achieve this by issuing: apt-get install wiringpi 2: Download the script to your Raspberry Pi. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/rpigpiomonitor.php -O /etc/snmp/rpigpiomonitor.php 3: (optional) Download the example configuration to your Raspberry Pi. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/rpigpiomonitor.ini -O /etc/snmp/rpigpiomonitor.ini 4: Make the script executable: chmod +x /etc/snmp/rpigpiomonitor.php 5: Create or edit your rpigpiomonitor.ini file according to your needs. 6: Check your configuration with rpigpiomonitor.php -validate 7: Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend rpigpiomonitor /etc/snmp/rpigpiomonitor.php 8: Restart snmpd on your Raspberry Pi and, if your Raspberry Pi is already present in LibreNMS, perform a manual rediscover.","title":"SNMP Extend"},{"location":"Extensions/Applications/#redis","text":"Script to monitor your Redis Server","title":"Redis"},{"location":"Extensions/Applications/#snmp-extend_53","text":"Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/redis.py -O /etc/snmp/redis.py Make the script executable chmod +x /etc/snmp/redis.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend redis /etc/snmp/redis.py (Optional) If you have SELinux in Enforcing mode, you must add a module so the script can get redis informations and write them: cat << EOF > snmpd_redis.te module snmpd_redis 1.0; require { type tmp_t; type redis_port_t; type snmpd_t; class tcp_socket name_connect; class dir { add_name write }; } #============= snmpd_t ============== allow snmpd_t redis_port_t:tcp_socket name_connect; allow snmpd_t tmp_t:dir { write add_name }; EOF checkmodule -M -m -o snmpd_redis.mod snmpd_redis.te semodule_package -o snmpd_redis.pp -m snmpd_redis.mod semodule -i snmpd_redis.pp","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_13","text":"Install the agent on this device if it isn't already and copy the redis script to /usr/lib/check_mk_agent/local/","title":"Agent"},{"location":"Extensions/Applications/#rrdcached","text":"Install/Setup: For Install/Setup Local Librenms RRDCached: Please see RRDCached Will collect stats by: 1. Connecting directly to the associated device on port 42217 2. Monitor thru snmp with SNMP extend, as outlined below 3. Connecting to the rrdcached server specified by the rrdcached setting SNMP extend script to monitor your (remote) RRDCached via snmp","title":"RRDCached"},{"location":"Extensions/Applications/#snmp-extend_54","text":"Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/rrdcached -O /etc/snmp/rrdcached Make the script executable chmod +x /etc/snmp/rrdcached Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend rrdcached /etc/snmp/rrdcached","title":"SNMP Extend"},{"location":"Extensions/Applications/#sdfs-info","text":"A small shell script that exportfs SDFS volume info.","title":"SDFS info"},{"location":"Extensions/Applications/#snmp-extend_55","text":"Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/sdfsinfo -O /etc/snmp/sdfsinfo Make the script executable chmod +x /etc/snmp/sdfsinfo Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend sdfsinfo /etc/snmp/sdfsinfo Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#seafile","text":"SNMP extend script to monitor your Seafile Server","title":"Seafile"},{"location":"Extensions/Applications/#snmp-extend_56","text":"Copy the Python script, seafile.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/seafile.py -O /etc/snmp/seafile.py Also you have to install the requests Package for Python3. Under Ubuntu/Debian just run apt install python3-requests Make the script executable chmod +x /etc/snmp/seafile.py Edit your snmpd.conf file and add: extend seafile /etc/snmp/seafile.py You will also need to create the config file, which is named seafile.json . The script has to be located at /etc/snmp/. {\"url\": \"https://seafile.mydomain.org\", \"username\": \"some_admin_login@mail.address\", \"password\": \"password\", \"account_identifier\": \"name\" \"hide_monitoring_account\": true } The variables are as below. url = Url how to get access to Seafile Server username = Login to Seafile Server. It is important that used Login has admin privileges. Otherwise most API calls will be denied. password = Password to the configured login. account_identifier = Defines how user accounts are listed in RRD Graph. Options are: name, email hide_monitoring_account = With this Boolean you can hide the Account which you use to access Seafile API Note: It is recommended to use a dedicated Administrator account for monitoring.","title":"SNMP Extend"},{"location":"Extensions/Applications/#smart","text":"","title":"SMART"},{"location":"Extensions/Applications/#snmp-extend_57","text":"Copy the Perl script, smart, to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/smart-v1 -O /etc/snmp/smart Install the depends. # FreeBSD pkg install p5-JSON p5-MIME-Base64 smartmontools # Debian apt-get install cpanminus smartmontools cpanm MIME::Base64 JSON # CentOS dnf install smartmontools perl-JSON perl-MIME-Base64 Make the script executable chmod +x /etc/snmp/smart Edit your snmpd.conf file and add: extend smart /etc/snmp/smart You will also need to create the config file, which defaults to the same path as the script, but with .config appended. So if the script is located at /etc/snmp/smart, the config file will be /etc/snmp/smart.config . Alternatively you can also specific a config via -c . Anything starting with a # is comment. The format for variables is $variable=$value. Empty lines are ignored. Spaces and tabes at either the start or end of a line are ignored. Any line with out a matched variable or # are treated as a disk. #This is a comment cache=/var/cache/smart smartctl=/usr/bin/env smartctl useSN=1 ada0 ada1 da5 /dev/da5 -d sat twl0,0 /dev/twl0 -d 3ware,0 twl0,1 /dev/twl0 -d 3ware,1 twl0,2 /dev/twl0 -d 3ware,2 The variables are as below. cache = The path to the cache file to use. Default: /var/cache/smart smartctl = The path to use for smartctl. Default: /usr/bin/env smartctl useSN = If set to 1, it will use the disks SN for reporting instead of the device name. 1 is the default. 0 will use the device name. A disk line is can be as simple as just a disk name under /dev/. Such as in the config above The line \"ada0\" would resolve to \"/dev/ada0\" and would be called with no special argument. If a line has a space in it, everything before the space is treated as the disk name and is what used for reporting and everything after that is used as the argument to be passed to smartctl. If you want to guess at the configuration, call it with -g and it will print out what it thinks it should be. Restart snmpd on your host If you have a large number of more than one or two disks on a system, you should consider adding this to cron. Also make sure the cache file is some place it can be written to. */5 * * * * /etc/snmp/smart -u If your snmp agent runs as user \"snmp\", edit your sudo users (usually visudo ) and add at the bottom: snmp ALL=(ALL) NOPASSWD: /etc/snmp/smart, /usr/bin/env smartctl and modify your snmpd.conf file accordingly, sudo can be excluded if running it via cron: extend smart /usr/bin/sudo /etc/snmp/smart The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Optionally setup nightly self tests for the disks. The exend will run the specified test on all configured disks if called with the -t flag and the name of the SMART test to run. 0 0 * * * /etc/snmp/smart -t long","title":"SNMP Extend"},{"location":"Extensions/Applications/#sneck","text":"This is for replacing Nagios/Icinga or the LibreNMS service integration in regards to NRPE. This allows LibreNMS to query what checks were ran on the server and keep track of totals of OK, WARNING, CRITICAL, and UNKNOWN statuses. The big advantage over this compared to a NRPE are as below. It does not need to know what checks are configured on it. Also does not need to wait for the tests to run as sneck is meant to be ran via cron and the then return the cache when queried via SNMP, meaning a lot faster response time, especially if slow checks are being performed. Works over proxied SNMP connections. Included are alert examples. Although for setting up custom ones, the metrics below are provided. Metric Description ok Total OK checks warning Total WARNING checks critical Total CRITICAL checks unknown Total UNKNOWN checks errored Total checks that errored time_to_polling Differnce in seconds between when polling data was generated and when polled time_to_polling_abs The absolute value of time_to_polling. check_$CHECK Exit status of a specific check $CHECK is equal to the name of the check in question. So foo would be check_foo The standard Nagios/Icinga style exit codes are used and those are as below. Exit Meaning 0 okay 1 warning 2 critical 3+ unknown To use time_to_polling , it will need to enabled via setting the config item below. The default is false. Unless set to true, this value will default to 0. If enabling this, one will want to make sure that NTP is in use every were or it will alert if it goes over a difference of 540s. lnms config:set app.sneck.polling_time_diff true For more information on Sneck, check it out at MetaCPAN or Github . For poking systems using Sneck, also check out boop_snoot if one wants to query those systems via the CLI. Docs on it at MetaCPAN and Github .","title":"Sneck"},{"location":"Extensions/Applications/#snmp-extend_58","text":"Install the extend. # FreeBSD pkg install p5-JSON p5-File-Slurp p5-MIME-Base64 p5-Gzip-Faster p5-App-cpanminus cpanm Monitoring::Sneck # Debian based systems apt-get install zlib1g-dev cpanminus cpanm Monitoring::Sneck Configure any of the checks you want to run in /usr/local/etc/sneck.conf . You con find it documented here . Set it up in cron. This will mean you don't need to wait for all the checks to complete when polled via SNMP, which for like SMART or other long running checks will mean it timing out. Also means it does not need called via sudo as well. */5 * * * * /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin /usr/local/bin/sneck -u 2> /dev/null > /dev/null Set it up in the snmpd config and restart snmpd. The -c flag will tell read it to read from cache instead of rerunning the checks. extend sneck /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin /usr/local/bin/sneck -c In LibreNMS, enable the application for the server in question or wait for auto discovery to find it.","title":"SNMP Extend"},{"location":"Extensions/Applications/#squid","text":"","title":"Squid"},{"location":"Extensions/Applications/#snmp-proxy","text":"Enable SNMP for Squid like below, if you have not already, and restart it. acl snmppublic snmp_community public snmp_port 3401 snmp_access allow snmppublic localhost snmp_access deny all Restart squid on your host. Edit your snmpd.conf file and add, making sure you have the same community, host, and port as above: proxy -v 2c -Cc -c public 127.0.0.1:3401 1.3.6.1.4.1.3495 For more advanced information on Squid and SNMP or setting up proxying for net-snmp, please see the links below. http://wiki.squid-cache.org/Features/Snmp http://www.net-snmp.org/wiki/index.php/Snmpd_proxy","title":"SNMP Proxy"},{"location":"Extensions/Applications/#supervisord","text":"It shows you the totals per status and also the uptime per process. That way you can add alerts for instance when there are process in state FATAL .","title":"Supervisord"},{"location":"Extensions/Applications/#snmp-extend_59","text":"Copy the python script to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/supervisord.py -O /etc/snmp/supervisord.py Notice that this will use the default unix socket path. Modify the unix_socket_path variable in the script if your path differs from the default. Make the script executable chmod +x /etc/snmp/supervisord.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend supervisord /etc/snmp/supervisord.py Restart snmpd on your host systemctl restart snmpd","title":"SNMP Extend"},{"location":"Extensions/Applications/#sagan","text":"For metrics the stats are migrated as below from the stats JSON. f_drop_percent and drop_percent are computed based on the found data. Instance Key Stats JSON Key uptime .stats.uptime total .stats.captured.total drop .stats.captured.drop ignore .stats.captured.ignore threshold .stats.captured.theshold after .stats.captured.after match .stats.captured.match bytes .stats.captured.bytes_total bytes_ignored .stats.captured.bytes_ignored max_bytes_log_line .stats.captured.max_bytes_log_line eps .stats.captured.eps f_total .stats.flow.total f_dropped .stats.flow.dropped Those keys are appended with the name of the instance running with _ between the instance name and instance metric key. So uptime for ids would be ids_uptime . The default is named 'ids' unless otherwise specified via the extend. There is a special instance name of .total which is the total of all the instances. So if you want the total eps, the metric would be .total_eps . Also worth noting that the alert value is the highest one found among all the instances.","title":"Sagan"},{"location":"Extensions/Applications/#snmp-extend_60","text":"Install the extend. cpanm Sagan::Monitoring Setup cron. Below is a example. */5 * * * * /usr/local/bin/sagan_stat_check > /dev/null Configure snmpd.conf extend sagan-stats /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin sagan_stat_check -c Restart snmpd on your system. You will want to make sure that sagan is setup to with the values set below for stats-json processor, for a single instance setup.. enabled: yes time: 300 subtract_old_values: true filename: \"$LOG_PATH/stats.json\" Any configuration of sagan_stat_check should be done in the cron setup. If the default does not work, check the docs for it at MetaCPAN for sagan_stat_check","title":"SNMP Extend"},{"location":"Extensions/Applications/#socket-statistics-ss","text":"The Socket Statistics application polls ss and scrapes socket statuses. Individual sockets and address-families may be filtered out within the script's optional configuration JSON file. The following socket types are polled directly. Filtering a socket type will disable direct polling as-well-as indirect polling within any address-families that list the socket type as their child: dccp (also exists within address-families \"inet\" and \"inet6\") mptcp (also exists within address-families \"inet\" and \"inet6\") raw (also exists within address-families \"inet\" and \"inet6\") sctp (also exists within address-families \"inet\" and \"inet6\") tcp (also exists within address-families \"inet\" and \"inet6\") udp (also exists within address-families \"inet\" and \"inet6\") xdp The following socket types are polled within an address-family only: inet6 (within address-family \"inet6\") p_dgr (within address-family \"link\") p_raw (within address-family \"link\") ti_dg (within address-family \"tipc\") ti_rd (within address-family \"tipc\") ti_sq (within address-family \"tipc\") ti_st (within address-family \"tipc\") v_dgr (within address-family \"vsock\") v_str (within address-family \"vsock\") unknown (within address-families \"inet\", \"inet6\", \"link\", \"tipc\", and \"vsock\") The following address-families are polled directly and have their child socket types tab-indented below them. Filtering a socket type (see \"1\" above) will filter it from the address-family. Filtering an address-family will filter out all of its child socket types. However, if those socket types are not DIRECTLY filtered out (see \"1\" above), then they will continue to be monitored either directly or within other address-families in which they exist: inet dccp mptcp raw sctp tcp udp unknown inet6 dccp icmp6 mptcp raw sctp tcp udp unknown link p_dgr p_raw unknown netlink tipc ti_dg ti_rd ti_sq ti_st unknown unix u_dgr u_seq u_str vsock v_dgr v_str unknown","title":"Socket Statistics (ss)"},{"location":"Extensions/Applications/#snmp-extend_61","text":"Copy the python script, ss.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/ss.py -O /etc/snmp/ss.py Make the script executable chmod +x /etc/snmp/ss.py Edit your snmpd.conf file and add: extend ss /etc/snmp/ss.py (Optional) Create a /etc/snmp/ss.json file and specify: \"ss_cmd\" - String path to the ss binary: [\"/sbin/ss\"] \"socket_types\" - A comma-delimited list of socket types to include. The following socket types are valid: dccp, icmp6, mptcp, p_dgr, p_raw, raw, sctp, tcp, ti_dg, ti_rd, ti_sq, ti_st, u_dgr, u_seq, u_str, udp, unknown, v_dgr, v_dgr, xdp. Please note that the \"unknown\" socket type is represented in /sbin/ss output with the netid \"???\". Please also note that the p_dgr and p_raw socket types are specific to the \"link\" address family; the ti_dg, ti_rd, ti_sq, and ti_st socket types are specific to the \"tipc\" address family; the u_dgr, u_seq, and u_str socket types are specific to the \"unix\" address family; and the v_dgr and v_str socket types are specific to the \"vsock\" address family. Filtering out the parent address families for the aforementioned will also filter out their specific socket types. Specifying \"all\" includes all of the socket types. For example: to include only tcp, udp, icmp6 sockets, you would specify \"tcp,udp,icmp6\": [\"all\"] \"addr_families\" - A comma-delimited list of address families to include. The following families are valid: inet, inet6, link, netlink, tipc, unix, vsock. As mentioned above under (b), filtering out the link, tipc, unix, or vsock address families will also filter out their respective socket types. Specifying \"all\" includes all of the families. For example: to include only inet and inet6 families, you would specify \"inet,inet6\": [\"all\"] { \"ss_cmd\": \"/sbin/ss\", \"socket_types\": \"all\" \"addr_families\": \"all\" } In order to filter out uncommon/unused socket types, the following JSON configuration is recommended: { \"ss_cmd\": \"/sbin/ss\", \"socket_types\": \"icmp6,p_dgr,p_raw,raw,tcp,u_dgr,u_seq,u_str,udp\", \"addr_families\": \"inet,inet6,link,netlink,unix\" } (Optional) If SELinux is in Enforcing mode, you must add a module so the script can poll sockets: cat << EOF > snmpd_ss.te module snmp_ss 1.0; require { type snmpd_t; class netlink_tcpdiag_socket { bind create getattr nlmsg_read read setopt write }; } #============= snmpd_t ============== allow snmpd_t self:netlink_tcpdiag_socket { bind create getattr nlmsg_read read setopt write }; EOF checkmodule -M -m -o snmpd_ss.mod snmpd_ss.te semodule_package -o snmpd_ss.pp -m snmpd_ss.mod semodule -i snmpd_ss.pp Restart snmpd.","title":"SNMP Extend"},{"location":"Extensions/Applications/#suricata","text":"","title":"Suricata"},{"location":"Extensions/Applications/#snmp-extend_62","text":"Install the extend. cpanm Suricata::Monitoring Setup cron. Below is a example. */5 * * * * /usr/local/bin/suricata_stat_check > /dev/null Configure snmpd.conf extend suricata-stats /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin suricata_stat_check -c Or if you want to use try compressing the return via Base64+GZIP... extend suricata-stats /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin suricata_stat_check -c -b Restart snmpd on your system. You will want to make sure Suricata is set to output the stats to the eve file once a minute. This will help make sure that it won't be to far back in the file and will make sure it is recent when the cronjob runs. Any configuration of suricata_stat_check should be done in the cron setup. If the default does not work, check the docs for it at MetaCPAN for suricata_stat_check","title":"SNMP Extend"},{"location":"Extensions/Applications/#suricata-extract","text":"","title":"Suricata Extract"},{"location":"Extensions/Applications/#snmp_1","text":"Add the following to your snmpd config and restart. Path may have to be adjusted depending on where suricata_extract_submit_extend is installed to. extend suricata_extract /usr/local/bin/suricata_extract_submit_extend Then just wait for the system to be rediscovered or enable it manually for the server in question.","title":"SNMP"},{"location":"Extensions/Applications/#systemd","text":"The systemd application polls systemd and scrapes systemd units' load, activation, and sub states.","title":"Systemd"},{"location":"Extensions/Applications/#snmp-extend_63","text":"Copy the python script, systemd.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/systemd.py -O /etc/snmp/systemd.py Make the script executable chmod +x /etc/snmp/systemd.py Edit your snmpd.conf file and add: extend systemd /etc/snmp/systemd.py (Optional) Create a /etc/snmp/systemd.json file and specify: \"systemctl_cmd\" - String path to the systemctl binary [Default: \"/usr/bin/systemctl\"] \"include_inactive_units\" - True/False string to include inactive units in results [Default: \"False\"] { \"systemctl_cmd\": \"/bin/systemctl\", \"include_inactive_units\": \"True\" } (Optional) If you have SELinux in Enforcing mode, you must add a module so the script can access systemd state: cat << EOF > snmpd_systemctl.te module snmpd_systemctl 1.0; require { type snmpd_t; type systemd_systemctl_exec_t; type init_t; class file { execute execute_no_trans map open read }; class unix_stream_socket connectto; class system status; } #============= snmpd_t ============== allow snmpd_t init_t:system status; allow snmpd_t init_t:unix_stream_socket connectto; allow snmpd_t systemd_systemctl_exec_t:file { execute execute_no_trans map open read }; EOF checkmodule -M -m -o snmpd_systemctl.mod snmpd_systemctl.te semodule_package -o snmpd_systemctl.pp -m snmpd_systemctl.mod semodule -i snmpd_systemctl.pp Restart snmpd.","title":"SNMP Extend"},{"location":"Extensions/Applications/#tinydns-aka-djbdns","text":"","title":"TinyDNS aka djbdns"},{"location":"Extensions/Applications/#agent_14","text":"Install the agent on this device if it isn't already and copy the tinydns script to /usr/lib/check_mk_agent/local/ Note : We assume that you use DJB's Daemontools to start/stop tinydns. And that your tinydns instance is located in /service/dns , adjust this path if necessary. Replace your log 's run file, typically located in /service/dns/log/run with: #!/bin/sh exec setuidgid dnslog tinystats ./main/tinystats/ multilog t n3 s250000 ./main/ Create tinystats directory and chown: mkdir /service/dns/log/main/tinystats chown dnslog:nofiles /service/dns/log/main/tinystats Restart TinyDNS and Daemontools: /etc/init.d/svscan restart Note : Some say svc -t /service/dns is enough, on my install (Gentoo) it doesn't rehook the logging and I'm forced to restart it entirely.","title":"Agent"},{"location":"Extensions/Applications/#unbound","text":"Unbound configuration: # Enable extended statistics. server: extended-statistics: yes statistics-cumulative: yes remote-control: control-enable: yes control-interface: 127.0.0.1 Restart your unbound after changing the configuration, verify it is working by running unbound-control stats .","title":"Unbound"},{"location":"Extensions/Applications/#option-1-snmp-extend-preferred-and-easiest-method","text":"Copy the shell script, unbound, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/unbound -O /etc/snmp/unbound Make the script executable chmod +x /etc/snmp/unbound Edit your snmpd.conf file and add: extend unbound /usr/bin/sudo /etc/snmp/unbound Restart snmpd. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"Option 1. SNMP Extend (Preferred and easiest method)"},{"location":"Extensions/Applications/#option-2-agent","text":"Install the agent on this device if it isn't already and copy the unbound.sh script to /usr/lib/check_mk_agent/local/","title":"Option 2. Agent"},{"location":"Extensions/Applications/#ups-nut","text":"A small shell script that exports nut ups status.","title":"UPS-nut"},{"location":"Extensions/Applications/#snmp-extend_64","text":"Copy the shell script, unbound, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/ups-nut.sh -O /etc/snmp/ups-nut.sh Make the script executable chmod +x /etc/snmp/ups-nut.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ups-nut /etc/snmp/ups-nut.sh Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Optionally if you have multiple UPS or your UPS is not named APCUPS you can specify its name as an argument into /etc/snmp/ups-nut.sh extend ups-nut /etc/snmp/ups-nut.sh ups1 extend ups-nut /etc/snmp/ups-nut.sh ups2","title":"SNMP Extend"},{"location":"Extensions/Applications/#ups-apcups","text":"A small shell script that exports apcacess ups status.","title":"UPS-apcups"},{"location":"Extensions/Applications/#snmp-extend_65","text":"Copy the shell script, unbound, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/ups-apcups -O /etc/snmp/ups-apcups Make the script executable chmod +x /etc/snmp/ups-apcups Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ups-apcups /etc/snmp/ups-apcups If 'apcaccess' is not in the PATH enviromental variable snmpd is using, you may need to do something like below. extend ups-apcups/usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin /etc/snmp/ups-apcups Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#voip-monitor","text":"Shell script that reports cpu-load/memory/open-files files stats of Voip Monitor","title":"Voip-monitor"},{"location":"Extensions/Applications/#snmp-extend_66","text":"Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/voipmon-stats.sh -O /etc/snmp/voipmon-stats.sh Make the script executable chmod +x /etc/snmp/voipmon-stats.sh Edit your snmpd.conf file (usually /etc/snmp/voipmon-stats.sh ) and add: extend voipmon /etc/snmp/voipmon-stats.sh","title":"SNMP Extend"},{"location":"Extensions/Applications/#wireguard","text":"The Wireguard application polls the Wireguard service and scrapes all client statistics for all interfaces configured as Wireguard interfaces.","title":"Wireguard"},{"location":"Extensions/Applications/#snmp-extend_67","text":"Copy the python script, wireguard.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/wireguard.py -O /etc/snmp/wireguard.py Make the script executable chmod +x /etc/snmp/wireguard.py Edit your snmpd.conf file and add: extend wireguard /etc/snmp/wireguard.py Create a /etc/snmp/wireguard.json file and specify: (optional) \"wg_cmd\" - String path to the wg binary [\"/usr/bin/wg\"] \"public_key_to_arbitrary_name\" - A dictionary to convert between the publickey assigned to the client (specified in the wireguard interface conf file) to an arbitrary, friendly name. The friendly names MUST be unique within each interface. Also note that the interface name and friendly names are used in the RRD filename, so using special characters is highly discouraged. { \"wg_cmd\": \"/bin/wg\", \"public_key_to_arbitrary_name\": { \"wg0\": { \"z1iSIymFEFi/PS8rR19AFBle7O4tWowMWuFzHO7oRlE=\": \"client1\", \"XqWJRE21Fw1ke47mH1yPg/lyWqCCfjkIXiS6JobuhTI=\": \"server.domain.com\" } } } Restart snmpd.","title":"SNMP Extend"},{"location":"Extensions/Applications/#zfs","text":"","title":"ZFS"},{"location":"Extensions/Applications/#snmp-extend_68","text":"1: Install the depends. ### FreeBSD pkg install p5-JSON p5-MIME-Base64 p5-Gzip-Faster ### Debian apt-get install -y cpanminus zlib1g-dev cpanm Mime::Base64 JSON Gzip::Faster 2: Fetch the script in question and make it executable. wget https://github.com/librenms/librenms-agent/raw/master/snmp/zfs -O /etc/snmp/zfs chmod +x /etc/snmp/zfs 3: Add the following to snmpd.conf and restart snmpd. extend zfs /etc/snmp/zfs","title":"SNMP Extend"},{"location":"Extensions/Authentication/","text":"Authentication Options LibreNMS supports multiple authentication modules along with Two Factor Auth . Here we will provide configuration details for these modules. Alternatively, you can use Socialite Providers which supports a wide variety of social/OAuth/SAML authentication methods. Available authentication modules MySQL: mysql Active Directory: active_directory LDAP: ldap Radius: radius HTTP Auth: http-auth , ad_authorization , ldap_authorization Single Sign-on: sso \u26a0\ufe0f When enabling a new authentication module, the local users will no longer be available to log in. Enable authentication module To enable a particular authentication module you need to set this up in config.php. Please note that only ONE module can be enabled. LibreNMS doesn't support multiple authentication mechanisms at the same time. auth/general lnms config:set auth_mechanism mysql User levels and User account type 1: Normal User : You will need to assign device / port permissions for users at this level. 5: Global Read : Read only Administrator. 10: Administrator : This is a global read/write admin account. 11: Demo Account : Provides full read/write with certain restrictions (i.e can't delete devices). Note Oxidized configs can often contain sensitive data. Because of that only Administrator account type can see configs. Note for SELinux users When using SELinux on the LibreNMS server, you need to allow Apache (httpd) to connect LDAP/Active Directory server, this is disabled by default. You can use SELinux Booleans to allow network access to LDAP resources with this command: setsebool -P httpd_can_connect_ldap = 1 Testing authentication You can test authentication with this script: ./scripts/auth_test.php Enable debug output to troubleshoot issues MySQL Authentication auth/general lnms config:set auth_mechanism mysql This is default option with LibreNMS so you should have already have the following configuration setup in your environment file (.env). DB_HOST=HOSTNAME DB_DATABASE=DBNAME DB_USERNAME=DBUSER DB_PASSWORD=\"DBPASS\" Active Directory Authentication auth/general lnms config:set auth_mechanism active_directory Install php-ldap or php8.1-ldap , making sure to install the same version as PHP. If you have issues with secure LDAP try setting auth/ad lnms config:set auth_ad_check_certificates 0 this will ignore certificate errors. Require actual membership of the configured groups auth/ad lnms config:set auth_ad_require_groupmembership 1 If you set auth_ad_require_groupmembership to 1, the authenticated user has to be a member of the specific group. Otherwise all users can authenticate, and will be either level 0 or you may set auth_ad_global_read to 1 and all users will have read only access unless otherwise specified. Old account cleanup Cleanup of old accounts is done by checking the authlog. You will need to set the number of days when old accounts will be purged AUTOMATICALLY by daily.sh. Please ensure that you set the authlog_purge value to be greater than active_directory.users_purge otherwise old users won't be removed. Sample configuration auth/general lnms config:set auth_mechanism active_directory lnms config:set auth_ad_url ldaps://server.example.com lnms config:set auth_ad_domain lnms config:set auth_ad_base_dn dc = example,dc = com lnms config:set auth_ad_check_certificates true lnms config:set auth_ad_binduser examplebinduser lnms config:set auth_ad_bindpassword examplepassword lnms config:set auth_ad_timeout 5 lnms config:set auth_ad_debug false lnms config:set active_directory.users_purge 30 lnms config:set auth_ad_require_groupmembership true lnms config:set auth_ad_groups.ad-admingroup.level 10 lnms config:set auth_ad_groups.ad-usergroup.level 5 Replace ad-admingroup with your Active Directory admin-user group and ad-usergroup with your standard user group. It is highly suggested to create a bind user, otherwise \"remember me\", alerting users, and the API will not work. Active Directory redundancy You can set two Active Directory servers by editing the auth_ad_url setting like this example: auth/ad lnms config:set auth_ad_url \"ldaps://dc1.example.com ldaps://dc2.example.com\" Active Directory LDAP filters You can add an LDAP filter to be ANDed with the builtin user filter ( (sAMAccountName=$username) ). The defaults are: auth/ad lnms config:set auth_ad_user_filter \"(objectclass=user)\" lnms config:set auth_ad_group_filter \"(objectclass=group)\" This yields (&(objectclass=user)(sAMAccountName=$username)) for the user filter and (&(objectclass=group)(sAMAccountName=$group)) for the group filter. SELinux configuration On RHEL / CentOS / Fedora, in order for LibreNMS to reach Active Directory, you need to allow LDAP requests in SELinux: setsebool -P httpd_can_connect_ldap 1 LDAP Authentication auth/general lnms config:set auth_mechanism ldap Install php_ldap or php7.0-ldap , making sure to install the same version as PHP. Standard config auth/ldap lnms config:set auth_ldap_server ldap.example.com lnms config:set auth_ldap_suffix ',ou=People,dc=example,dc=com' lnms config:set auth_ldap_groupbase 'ou=groups,dc=example,dc=com' lnms config:set auth_ldap_groups.admin.level 10 lnms config:set auth_ldap_groups.pfy.level 5 lnms config:set auth_ldap_groups.support.level 1 Additional options (usually not needed) auth/ldap lnms config:set auth_ldap_version 3 lnms config:set auth_ldap_port 389 lnms config:set auth_ldap_starttls true lnms config:set auth_ldap_prefix 'uid=' lnms config:set auth_ldap_group 'cn=groupname,ou=groups,dc=example,dc=com' lnms config:set auth_ldap_groupmemberattr memberUid lnms config:set auth_ldap_groupmembertype username lnms config:set auth_ldap_uid_attribute uidnumber lnms config:set auth_ldap_timeout 5 lnms config:set auth_ldap_emailattr mail lnms config:set auth_ldap_attr.uid uid lnms config:set auth_ldap_debug false lnms config:set auth_ldap_userdn true lnms config:set auth_ldap_userlist_filter service = informatique lnms config:set auth_ldap_wildcard_ou false lnms config:set auth_ldap_cacertfile /opt/librenms/ldap-ca-cert lnms config:set auth_ldap_ignorecert false LDAP bind user (optional) If your ldap server does not allow anonymous bind, it is highly suggested to create a bind user, otherwise \"remember me\", alerting users, and the API will not work. auth/ldap lnms config:set auth_ldap_binduser ldapbind lnms config:set auth_ldap_binddn 'CN=John.Smith,CN=Users,DC=MyDomain,DC=com' lnms config:set auth_ldap_bindpassword password LDAP server redundancy You can set two LDAP servers by editing the auth_ldap_server like this example: auth/ldap lnms config:set auth_ldap_server ldaps://dir1.example.com ldaps://dir2.example.com An example config setup for use with Jumpcloud LDAP as a service is: auth/ldap lnms config:set auth_mechanism ldap lnms config:set auth_ldap_version 3 lnms config:set auth_ldap_server ldap.jumpcloud.com lnms config:set auth_ldap_port 389 lnms config:set auth_ldap_prefix 'uid=' ; lnms config:set auth_ldap_suffix ',ou=Users,o={id},dc=jumpcloud,dc=com' lnms config:set auth_ldap_groupbase 'ou=Users,o={id},dc=jumpcloud,dc=com' lnms config:set auth_ldap_groupmemberattr member lnms config:set auth_ldap_groups. { group } .level 10 lnms config:set auth_ldap_userdn true Replace {id} with the unique ID provided by Jumpcloud. Replace {group} with the unique group name created in Jumpcloud. This field is case sensitive. Note: If you have multiple user groups to define individual access levels replace the auth_ldap_groups line with the following: auth/ldap lnms config:set auth_ldap_groups. { admin_group } .level 10 ] lnms config:set auth_ldap_groups.global_readonly_group.level 5 SELinux configuration On RHEL / CentOS / Fedora, in order for LibreNMS to reach LDAP, you need to allow LDAP requests in SELinux: setsebool -P httpd_can_connect_ldap 1 Radius Authentication Please note that a mysql user is created for each user the logs in successfully. Users are assigned the user role by default, unless radius sends a reply attribute with a role. You can change the default role(s) by setting auth/radius lnms config:set radius.default_roles '[\"csr\"]' The attribute Filter-ID is a standard Radius-Reply-Attribute (string) that can be assigned a specially formatted string to assign a single role to the user. The string to send in Filter-ID reply attribute must start with librenms_role_ followed by the role name. For example to set the admin role send librenms_role_admin . The following strings correspond to the built-in roles, but any defined role can be used: - librenms_role_normal - Sets the normal user level. - librenms_role_admin - Sets the administrator level. - librenms_role_global-read - Sets the global read level LibreNMS will ignore any other strings sent in Filter-ID and revert to default role that is set in your config. $config [ 'radius' ][ 'hostname' ] = 'localhost' ; $config [ 'radius' ][ 'port' ] = '1812' ; $config [ 'radius' ][ 'secret' ] = 'testing123' ; $config [ 'radius' ][ 'timeout' ] = 3 ; $config [ 'radius' ][ 'users_purge' ] = 14 ; // Purge users who haven't logged in for 14 days. $config [ 'radius' ][ 'default_level' ] = 1 ; // Set the default user level when automatically creating a user. Radius Huntgroup Freeradius has a function called Radius Huntgroup which allows to send different attributes based on NAS. This may be utilized if you already use Filter-ID in your environment and also want to use radius with LibreNMS. Old account cleanup Cleanup of old accounts is done by checking the authlog. You will need to set the number of days when old accounts will be purged AUTOMATICALLY by daily.sh. Please ensure that you set the $config['authlog_purge'] value to be greater than $config['radius']['users_purge'] otherwise old users won't be removed. HTTP Authentication Config option: http-auth LibreNMS will expect the user to have authenticated via your webservice already. At this stage it will need to assign a userlevel for that user which is done in one of two ways: A user exists in MySQL still where the usernames match up. A global guest user (which still needs to be added into MySQL: $config [ 'http_auth_guest' ] = \"guest\" ; This will then assign the userlevel for guest to all authenticated users. HTTP Authentication / AD Authorization Config option: ad-authorization This module is a combination of http-auth and active_directory LibreNMS will expect the user to have authenticated via your webservice already (e.g. using Kerberos Authentication in Apache) but will use Active Directory lookups to determine and assign the userlevel of a user. The userlevel will be calculated by using AD group membership information as the active_directory module does. The configuration is the same as for the active_directory module with two extra, optional options: auth_ad_binduser and auth_ad_bindpassword. These should be set to a AD user with read capabilities in your AD Domain in order to be able to perform searches. If these options are omitted, the module will attempt an anonymous bind (which then of course must be allowed by your Active Directory server(s)). There is also one extra option for controlling user information caching: auth_ldap_cache_ttl. This option allows to control how long user information (user_exists, userid, userlevel) are cached within the PHP Session. The default value is 300 seconds. To disable this caching (highly discourage) set this option to 0. $config [ 'auth_ad_binduser' ] = \"ad_binduser\" ; $config [ 'auth_ad_bindpassword' ] = \"ad_bindpassword\" ; $config [ 'auth_ldap_cache_ttl' ] = 300 ; HTTP Authentication / LDAP Authorization Config option: ldap-authorization This module is a combination of http-auth and ldap LibreNMS will expect the user to have authenticated via your webservice already (e.g. using Kerberos Authentication in Apache) but will use LDAP to determine and assign the userlevel of a user. The userlevel will be calculated by using LDAP group membership information as the ldap module does. The configuration is similar to the ldap module with one extra option: auth_ldap_cache_ttl. This option allows to control how long user information (user_exists, userid, userlevel) are cached within the PHP Session. The default value is 300 seconds. To disabled this caching (highly discourage) set this option to 0. Standard config $config [ 'auth_mechanism' ] = 'ldap-authorization' ; $config [ 'auth_ldap_server' ] = 'ldap.example.com' ; // Set server(s), space separated. Prefix with ldaps:// for ssl $config [ 'auth_ldap_suffix' ] = ',ou=People,dc=example,dc=com' ; // appended to usernames $config [ 'auth_ldap_groupbase' ] = 'ou=groups,dc=example,dc=com' ; // all groups must be inside this $config [ 'auth_ldap_groups' ][ 'admin' ][ 'roles' ] = [ 'admin' ]; // set admin group to admin role $config [ 'auth_ldap_groups' ][ 'pfy' ][ 'roles' ] = [ 'global-read' ]; // set pfy group to global read only role $config [ 'auth_ldap_groups' ][ 'support' ][ 'roles' ] = [ 'user' ]; // set support group as a normal user Additional options (usually not needed) $config [ 'auth_ldap_version' ] = 3 ; # v2 or v3 $config [ 'auth_ldap_port' ] = 389 ; // 389 or 636 for ssl $config [ 'auth_ldap_starttls' ] = True ; // Enable TLS on port 389 $config [ 'auth_ldap_prefix' ] = 'uid=' ; // prepended to usernames $config [ 'auth_ldap_group' ] = 'cn=groupname,ou=groups,dc=example,dc=com' ; // generic group with level 0 $config [ 'auth_ldap_groupmemberattr' ] = 'memberUid' ; // attribute to use to see if a user is a member of a group $config [ 'auth_ldap_groupmembertype' ] = 'username' ; // username type to find group members by, either username (default), fulldn or puredn $config [ 'auth_ldap_emailattr' ] = 'mail' ; // attribute for email address $config [ 'auth_ldap_attr.uid' ] = 'uid' ; // attribute to check username against $config [ 'auth_ldap_userlist_filter' ] = 'service=informatique' ; // Replace 'service=informatique' by your ldap filter to limit the number of responses if you have an ldap directory with thousand of users $config [ 'auth_ldap_cache_ttl' ] = 300 ; LDAP bind user (optional) If your ldap server does not allow anonymous bind, it is highly suggested to create a bind user, otherwise \"remember me\", alerting users, and the API will not work. $config [ 'auth_ldap_binduser' ] = 'ldapbind' ; // will use auth_ldap_prefix and auth_ldap_suffix #$config['auth_ldap_binddn'] = 'CN=John.Smith,CN=Users,DC=MyDomain,DC=com'; // overrides binduser $config [ 'auth_ldap_bindpassword' ] = 'password' ; View/embedded graphs without being logged into LibreNMS webui/graph ```bash lnms config:set allow_unauth_graphs_cidr ['127.0.0.1/32'] lnms config:set allow_unauth_graphs true ``` Single Sign-on The single sign-on mechanism is used to integrate with third party authentication providers that are managed outside of LibreNMS - such as ADFS, Shibboleth, EZProxy, BeyondCorp, and others. A large number of these methods use SAML the module has been written assuming the use of SAML, and therefore these instructions contain some SAML terminology, but it should be possible to use any software that works in a similar way. In order to make use of the single sign-on module, you need to have an Identity Provider up and running, and know how to configure your Relying Party to pass attributes to LibreNMS via header injection or environment variables. Setting these up is outside of the scope of this documentation. As this module deals with authentication, it is extremely careful about validating the configuration - if it finds that certain values in the configuration are not set, it will reject access rather than try and guess. Basic Configuration To get up and running, all you need to do is configure the following values: $config [ 'auth_mechanism' ] = \"sso\" ; $config [ 'sso' ][ 'mode' ] = \"env\" ; $config [ 'sso' ][ 'group_strategy' ] = \"static\" ; $config [ 'sso' ][ 'static_level' ] = 10 ; This, along with the defaults, sets up a basic Single Sign-on setup that: Reads values from environment variables Automatically creates users when they're first seen Automatically updates users with new values Gives everyone privilege level 10 This happens to mimic the behaviour of http-auth , so if this is the kind of setup you want, you're probably better of just going and using that mechanism. Security If there is a proxy involved (e.g. EZProxy, Azure AD Application Proxy, NGINX, mod_proxy) it's essential that you have some means in place to prevent headers being injected between the proxy and the end user, and also prevent end users from contacting LibreNMS directly. This should also apply to user connections to the proxy itself - the proxy must not be allowed to blindly pass through HTTP headers. mod security _ should be considered a minimum, with a full WAF being strongly recommended. This advice applies to the IDP too. The mechanism includes very basic protection, in the form of an IP whitelist with should contain the source addresses of your proxies: $config [ 'sso' ][ 'trusted_proxies' ] = [ '127.0.0.1/8' , '::1/128' , '192.0.2.0' , '2001:DB8::' ]; This configuration item should contain an array with a list of IP addresses or CIDR prefixes that are allowed to connect to LibreNMS and supply environment variables or headers. Advanced Configuration Options User Attribute If for some reason your relying party doesn't store the username in REMOTE_USER , you can override this choice. $config [ 'sso' ][ 'user_attr' ] = 'HTTP_UID' ; Note that the user lookup is a little special - normally headers are prefixed with HTTP_ , however this is not the case for remote user - it's a special case. If you're using something different you need to figure out of the HTTP_ prefix is required or not yourself. Automatic User Create/Update These are enabled by default: $config [ 'sso' ][ 'create_users' ] = true ; $config [ 'sso' ][ 'update_users' ] = true ; If these are not enabled, user logins will be (somewhat silently) rejected unless an administrator has created the account in advance. Note that in the case of SAML federations, unless release of the users true identity has been negotiated with the IDP, the username (probably ePTID) is not likely to be predicable. Personalisation If the attributes are being populated, you can instruct the mechanism to add additional information to the user's database entry: $config [ 'sso' ][ 'email_attr' ] = \"mail\" ; $config [ 'sso' ][ 'realname_attr' ] = \"displayName\" ; $config [ 'sso' ][ 'descr_attr' ] = \"unscoped-affiliation Group Strategies Static As used above, static gives every single user the same privilege level. If you're working with a small team, or don't need access control, this is probably suitable. Attribute $config [ 'sso' ][ 'group_strategy' ] = \"attribute\" ; $config [ 'sso' ][ 'level_attr' ] = \"entitlement\" ; If your Relying Party is capable of calculating the necessary privilege level, you can configure the module to read the privilege number straight from an attribute. sso_level_attr should contain the name of the attribute that the Relying Party exposes to LibreNMS - as long as sso_mode is correctly set, the mechanism should find the value. Group Map This is the most flexible (and complex) way of assigning privileges. $config [ 'sso' ][ 'group_strategy' ] = \"map\" ; $config [ 'sso' ][ 'group_attr' ] = \"member\" ; $config [ 'sso' ][ 'group_level_map' ] = [ 'librenms-admins' => 10 , 'librenms-readers' => 1 , 'librenms-billingcontacts' => 5 ]; $config [ 'sso' ][ 'group_delimiter' ] = ';' ; This mechanism expects to find a delimited list of groups within the attribute that sso_group_attr points to. This should be an associative array of group name keys, with privilege levels as values. The mechanism will scan the list and find the highest privilege level that the user is entitled to, and assign that value to the user. If there are no matches between the user's groups and the sso_group_level_map , the user will be assigned the privilege level specified in the sso_static_level variable, with a default of 0 (no access). This feature can be used to provide a default access level (such as read-only) to all authenticated users. Additionally, this format may be specific to Shibboleth; other relying party software may need changes to the mechanism (e.g. mod_auth_mellon may create pseudo arrays). There is an optional value for sites with large numbers of groups: $config [ 'sso' ][ 'group_filter' ] = \"/librenms-(.*)/i\" ; This filter causes the mechanism to only consider groups matching a regular expression. Logout Behaviour LibreNMS has no capability to log out a user authenticated via Single Sign-On - that responsibility falls to the Relying Party. If your Relying Party has a magic URL that needs to be called to end a session, you can configure LibreNMS to direct the user to it: # Example for Shibboleth $config [ 'auth_logout_handler' ] = '/Shibboleth.sso/Logout' ; # Example for oauth2-proxy $config [ 'auth_logout_handler' ] = '/oauth2/sign_out' ; This option functions independently of the Single Sign-on mechanism. Complete Configuration This configuration works on my deployment with a Shibboleth relying party, injecting environment variables, with the IDP supplying a list of groups. $config [ 'auth_mechanism' ] = 'sso' ; $config [ 'auth_logout_handler' ] = '/Shibboleth.sso/Logout' ; $config [ 'sso' ][ 'mode' ] = 'env' ; $config [ 'sso' ][ 'create_users' ] = true ; $config [ 'sso' ][ 'update_users' ] = true ; $config [ 'sso' ][ 'realname_attr' ] = 'displayName' ; $config [ 'sso' ][ 'email_attr' ] = 'mail' ; $config [ 'sso' ][ 'group_strategy' ] = 'map' ; $config [ 'sso' ][ 'group_attr' ] = 'member' ; $config [ 'sso' ][ 'group_filter' ] = '/(librenms-.*)/i' ; $config [ 'sso' ][ 'group_delimiter' ] = ';' ; $config [ 'sso' ][ 'group_level_map' ] = [ 'librenms-demo' => 11 , 'librenms-globaladmin' => 10 , 'librenms-globalread' => 5 , 'librenms-lowpriv' => 1 ];","title":"Authentication Options"},{"location":"Extensions/Authentication/#authentication-options","text":"LibreNMS supports multiple authentication modules along with Two Factor Auth . Here we will provide configuration details for these modules. Alternatively, you can use Socialite Providers which supports a wide variety of social/OAuth/SAML authentication methods.","title":"Authentication Options"},{"location":"Extensions/Authentication/#available-authentication-modules","text":"MySQL: mysql Active Directory: active_directory LDAP: ldap Radius: radius HTTP Auth: http-auth , ad_authorization , ldap_authorization Single Sign-on: sso \u26a0\ufe0f When enabling a new authentication module, the local users will no longer be available to log in.","title":"Available authentication modules"},{"location":"Extensions/Authentication/#enable-authentication-module","text":"To enable a particular authentication module you need to set this up in config.php. Please note that only ONE module can be enabled. LibreNMS doesn't support multiple authentication mechanisms at the same time. auth/general lnms config:set auth_mechanism mysql","title":"Enable authentication module"},{"location":"Extensions/Authentication/#user-levels-and-user-account-type","text":"1: Normal User : You will need to assign device / port permissions for users at this level. 5: Global Read : Read only Administrator. 10: Administrator : This is a global read/write admin account. 11: Demo Account : Provides full read/write with certain restrictions (i.e can't delete devices). Note Oxidized configs can often contain sensitive data. Because of that only Administrator account type can see configs.","title":"User levels and User account type"},{"location":"Extensions/Authentication/#note-for-selinux-users","text":"When using SELinux on the LibreNMS server, you need to allow Apache (httpd) to connect LDAP/Active Directory server, this is disabled by default. You can use SELinux Booleans to allow network access to LDAP resources with this command: setsebool -P httpd_can_connect_ldap = 1","title":"Note for SELinux users"},{"location":"Extensions/Authentication/#testing-authentication","text":"You can test authentication with this script: ./scripts/auth_test.php Enable debug output to troubleshoot issues","title":"Testing authentication"},{"location":"Extensions/Authentication/#mysql-authentication","text":"auth/general lnms config:set auth_mechanism mysql This is default option with LibreNMS so you should have already have the following configuration setup in your environment file (.env). DB_HOST=HOSTNAME DB_DATABASE=DBNAME DB_USERNAME=DBUSER DB_PASSWORD=\"DBPASS\"","title":"MySQL Authentication"},{"location":"Extensions/Authentication/#active-directory-authentication","text":"auth/general lnms config:set auth_mechanism active_directory Install php-ldap or php8.1-ldap , making sure to install the same version as PHP. If you have issues with secure LDAP try setting auth/ad lnms config:set auth_ad_check_certificates 0 this will ignore certificate errors.","title":"Active Directory Authentication"},{"location":"Extensions/Authentication/#require-actual-membership-of-the-configured-groups","text":"auth/ad lnms config:set auth_ad_require_groupmembership 1 If you set auth_ad_require_groupmembership to 1, the authenticated user has to be a member of the specific group. Otherwise all users can authenticate, and will be either level 0 or you may set auth_ad_global_read to 1 and all users will have read only access unless otherwise specified.","title":"Require actual membership of the configured groups"},{"location":"Extensions/Authentication/#old-account-cleanup","text":"Cleanup of old accounts is done by checking the authlog. You will need to set the number of days when old accounts will be purged AUTOMATICALLY by daily.sh. Please ensure that you set the authlog_purge value to be greater than active_directory.users_purge otherwise old users won't be removed.","title":"Old account cleanup"},{"location":"Extensions/Authentication/#sample-configuration","text":"auth/general lnms config:set auth_mechanism active_directory lnms config:set auth_ad_url ldaps://server.example.com lnms config:set auth_ad_domain lnms config:set auth_ad_base_dn dc = example,dc = com lnms config:set auth_ad_check_certificates true lnms config:set auth_ad_binduser examplebinduser lnms config:set auth_ad_bindpassword examplepassword lnms config:set auth_ad_timeout 5 lnms config:set auth_ad_debug false lnms config:set active_directory.users_purge 30 lnms config:set auth_ad_require_groupmembership true lnms config:set auth_ad_groups.ad-admingroup.level 10 lnms config:set auth_ad_groups.ad-usergroup.level 5 Replace ad-admingroup with your Active Directory admin-user group and ad-usergroup with your standard user group. It is highly suggested to create a bind user, otherwise \"remember me\", alerting users, and the API will not work.","title":"Sample configuration"},{"location":"Extensions/Authentication/#active-directory-redundancy","text":"You can set two Active Directory servers by editing the auth_ad_url setting like this example: auth/ad lnms config:set auth_ad_url \"ldaps://dc1.example.com ldaps://dc2.example.com\"","title":"Active Directory redundancy"},{"location":"Extensions/Authentication/#active-directory-ldap-filters","text":"You can add an LDAP filter to be ANDed with the builtin user filter ( (sAMAccountName=$username) ). The defaults are: auth/ad lnms config:set auth_ad_user_filter \"(objectclass=user)\" lnms config:set auth_ad_group_filter \"(objectclass=group)\" This yields (&(objectclass=user)(sAMAccountName=$username)) for the user filter and (&(objectclass=group)(sAMAccountName=$group)) for the group filter.","title":"Active Directory LDAP filters"},{"location":"Extensions/Authentication/#selinux-configuration","text":"On RHEL / CentOS / Fedora, in order for LibreNMS to reach Active Directory, you need to allow LDAP requests in SELinux: setsebool -P httpd_can_connect_ldap 1","title":"SELinux configuration"},{"location":"Extensions/Authentication/#ldap-authentication","text":"auth/general lnms config:set auth_mechanism ldap Install php_ldap or php7.0-ldap , making sure to install the same version as PHP.","title":"LDAP Authentication"},{"location":"Extensions/Authentication/#standard-config","text":"auth/ldap lnms config:set auth_ldap_server ldap.example.com lnms config:set auth_ldap_suffix ',ou=People,dc=example,dc=com' lnms config:set auth_ldap_groupbase 'ou=groups,dc=example,dc=com' lnms config:set auth_ldap_groups.admin.level 10 lnms config:set auth_ldap_groups.pfy.level 5 lnms config:set auth_ldap_groups.support.level 1","title":"Standard config"},{"location":"Extensions/Authentication/#additional-options-usually-not-needed","text":"auth/ldap lnms config:set auth_ldap_version 3 lnms config:set auth_ldap_port 389 lnms config:set auth_ldap_starttls true lnms config:set auth_ldap_prefix 'uid=' lnms config:set auth_ldap_group 'cn=groupname,ou=groups,dc=example,dc=com' lnms config:set auth_ldap_groupmemberattr memberUid lnms config:set auth_ldap_groupmembertype username lnms config:set auth_ldap_uid_attribute uidnumber lnms config:set auth_ldap_timeout 5 lnms config:set auth_ldap_emailattr mail lnms config:set auth_ldap_attr.uid uid lnms config:set auth_ldap_debug false lnms config:set auth_ldap_userdn true lnms config:set auth_ldap_userlist_filter service = informatique lnms config:set auth_ldap_wildcard_ou false lnms config:set auth_ldap_cacertfile /opt/librenms/ldap-ca-cert lnms config:set auth_ldap_ignorecert false","title":"Additional options (usually not needed)"},{"location":"Extensions/Authentication/#ldap-bind-user-optional","text":"If your ldap server does not allow anonymous bind, it is highly suggested to create a bind user, otherwise \"remember me\", alerting users, and the API will not work. auth/ldap lnms config:set auth_ldap_binduser ldapbind lnms config:set auth_ldap_binddn 'CN=John.Smith,CN=Users,DC=MyDomain,DC=com' lnms config:set auth_ldap_bindpassword password","title":"LDAP bind user (optional)"},{"location":"Extensions/Authentication/#ldap-server-redundancy","text":"You can set two LDAP servers by editing the auth_ldap_server like this example: auth/ldap lnms config:set auth_ldap_server ldaps://dir1.example.com ldaps://dir2.example.com An example config setup for use with Jumpcloud LDAP as a service is: auth/ldap lnms config:set auth_mechanism ldap lnms config:set auth_ldap_version 3 lnms config:set auth_ldap_server ldap.jumpcloud.com lnms config:set auth_ldap_port 389 lnms config:set auth_ldap_prefix 'uid=' ; lnms config:set auth_ldap_suffix ',ou=Users,o={id},dc=jumpcloud,dc=com' lnms config:set auth_ldap_groupbase 'ou=Users,o={id},dc=jumpcloud,dc=com' lnms config:set auth_ldap_groupmemberattr member lnms config:set auth_ldap_groups. { group } .level 10 lnms config:set auth_ldap_userdn true Replace {id} with the unique ID provided by Jumpcloud. Replace {group} with the unique group name created in Jumpcloud. This field is case sensitive. Note: If you have multiple user groups to define individual access levels replace the auth_ldap_groups line with the following: auth/ldap lnms config:set auth_ldap_groups. { admin_group } .level 10 ] lnms config:set auth_ldap_groups.global_readonly_group.level 5","title":"LDAP server redundancy"},{"location":"Extensions/Authentication/#selinux-configuration_1","text":"On RHEL / CentOS / Fedora, in order for LibreNMS to reach LDAP, you need to allow LDAP requests in SELinux: setsebool -P httpd_can_connect_ldap 1","title":"SELinux configuration"},{"location":"Extensions/Authentication/#radius-authentication","text":"Please note that a mysql user is created for each user the logs in successfully. Users are assigned the user role by default, unless radius sends a reply attribute with a role. You can change the default role(s) by setting auth/radius lnms config:set radius.default_roles '[\"csr\"]' The attribute Filter-ID is a standard Radius-Reply-Attribute (string) that can be assigned a specially formatted string to assign a single role to the user. The string to send in Filter-ID reply attribute must start with librenms_role_ followed by the role name. For example to set the admin role send librenms_role_admin . The following strings correspond to the built-in roles, but any defined role can be used: - librenms_role_normal - Sets the normal user level. - librenms_role_admin - Sets the administrator level. - librenms_role_global-read - Sets the global read level LibreNMS will ignore any other strings sent in Filter-ID and revert to default role that is set in your config. $config [ 'radius' ][ 'hostname' ] = 'localhost' ; $config [ 'radius' ][ 'port' ] = '1812' ; $config [ 'radius' ][ 'secret' ] = 'testing123' ; $config [ 'radius' ][ 'timeout' ] = 3 ; $config [ 'radius' ][ 'users_purge' ] = 14 ; // Purge users who haven't logged in for 14 days. $config [ 'radius' ][ 'default_level' ] = 1 ; // Set the default user level when automatically creating a user.","title":"Radius Authentication"},{"location":"Extensions/Authentication/#radius-huntgroup","text":"Freeradius has a function called Radius Huntgroup which allows to send different attributes based on NAS. This may be utilized if you already use Filter-ID in your environment and also want to use radius with LibreNMS.","title":"Radius Huntgroup"},{"location":"Extensions/Authentication/#old-account-cleanup_1","text":"Cleanup of old accounts is done by checking the authlog. You will need to set the number of days when old accounts will be purged AUTOMATICALLY by daily.sh. Please ensure that you set the $config['authlog_purge'] value to be greater than $config['radius']['users_purge'] otherwise old users won't be removed.","title":"Old account cleanup"},{"location":"Extensions/Authentication/#http-authentication","text":"Config option: http-auth LibreNMS will expect the user to have authenticated via your webservice already. At this stage it will need to assign a userlevel for that user which is done in one of two ways: A user exists in MySQL still where the usernames match up. A global guest user (which still needs to be added into MySQL: $config [ 'http_auth_guest' ] = \"guest\" ; This will then assign the userlevel for guest to all authenticated users.","title":"HTTP Authentication"},{"location":"Extensions/Authentication/#http-authentication-ad-authorization","text":"Config option: ad-authorization This module is a combination of http-auth and active_directory LibreNMS will expect the user to have authenticated via your webservice already (e.g. using Kerberos Authentication in Apache) but will use Active Directory lookups to determine and assign the userlevel of a user. The userlevel will be calculated by using AD group membership information as the active_directory module does. The configuration is the same as for the active_directory module with two extra, optional options: auth_ad_binduser and auth_ad_bindpassword. These should be set to a AD user with read capabilities in your AD Domain in order to be able to perform searches. If these options are omitted, the module will attempt an anonymous bind (which then of course must be allowed by your Active Directory server(s)). There is also one extra option for controlling user information caching: auth_ldap_cache_ttl. This option allows to control how long user information (user_exists, userid, userlevel) are cached within the PHP Session. The default value is 300 seconds. To disable this caching (highly discourage) set this option to 0. $config [ 'auth_ad_binduser' ] = \"ad_binduser\" ; $config [ 'auth_ad_bindpassword' ] = \"ad_bindpassword\" ; $config [ 'auth_ldap_cache_ttl' ] = 300 ;","title":"HTTP Authentication / AD Authorization"},{"location":"Extensions/Authentication/#http-authentication-ldap-authorization","text":"Config option: ldap-authorization This module is a combination of http-auth and ldap LibreNMS will expect the user to have authenticated via your webservice already (e.g. using Kerberos Authentication in Apache) but will use LDAP to determine and assign the userlevel of a user. The userlevel will be calculated by using LDAP group membership information as the ldap module does. The configuration is similar to the ldap module with one extra option: auth_ldap_cache_ttl. This option allows to control how long user information (user_exists, userid, userlevel) are cached within the PHP Session. The default value is 300 seconds. To disabled this caching (highly discourage) set this option to 0.","title":"HTTP Authentication / LDAP Authorization"},{"location":"Extensions/Authentication/#standard-config_1","text":"$config [ 'auth_mechanism' ] = 'ldap-authorization' ; $config [ 'auth_ldap_server' ] = 'ldap.example.com' ; // Set server(s), space separated. Prefix with ldaps:// for ssl $config [ 'auth_ldap_suffix' ] = ',ou=People,dc=example,dc=com' ; // appended to usernames $config [ 'auth_ldap_groupbase' ] = 'ou=groups,dc=example,dc=com' ; // all groups must be inside this $config [ 'auth_ldap_groups' ][ 'admin' ][ 'roles' ] = [ 'admin' ]; // set admin group to admin role $config [ 'auth_ldap_groups' ][ 'pfy' ][ 'roles' ] = [ 'global-read' ]; // set pfy group to global read only role $config [ 'auth_ldap_groups' ][ 'support' ][ 'roles' ] = [ 'user' ]; // set support group as a normal user","title":"Standard config"},{"location":"Extensions/Authentication/#additional-options-usually-not-needed_1","text":"$config [ 'auth_ldap_version' ] = 3 ; # v2 or v3 $config [ 'auth_ldap_port' ] = 389 ; // 389 or 636 for ssl $config [ 'auth_ldap_starttls' ] = True ; // Enable TLS on port 389 $config [ 'auth_ldap_prefix' ] = 'uid=' ; // prepended to usernames $config [ 'auth_ldap_group' ] = 'cn=groupname,ou=groups,dc=example,dc=com' ; // generic group with level 0 $config [ 'auth_ldap_groupmemberattr' ] = 'memberUid' ; // attribute to use to see if a user is a member of a group $config [ 'auth_ldap_groupmembertype' ] = 'username' ; // username type to find group members by, either username (default), fulldn or puredn $config [ 'auth_ldap_emailattr' ] = 'mail' ; // attribute for email address $config [ 'auth_ldap_attr.uid' ] = 'uid' ; // attribute to check username against $config [ 'auth_ldap_userlist_filter' ] = 'service=informatique' ; // Replace 'service=informatique' by your ldap filter to limit the number of responses if you have an ldap directory with thousand of users $config [ 'auth_ldap_cache_ttl' ] = 300 ;","title":"Additional options (usually not needed)"},{"location":"Extensions/Authentication/#ldap-bind-user-optional_1","text":"If your ldap server does not allow anonymous bind, it is highly suggested to create a bind user, otherwise \"remember me\", alerting users, and the API will not work. $config [ 'auth_ldap_binduser' ] = 'ldapbind' ; // will use auth_ldap_prefix and auth_ldap_suffix #$config['auth_ldap_binddn'] = 'CN=John.Smith,CN=Users,DC=MyDomain,DC=com'; // overrides binduser $config [ 'auth_ldap_bindpassword' ] = 'password' ;","title":"LDAP bind user (optional)"},{"location":"Extensions/Authentication/#viewembedded-graphs-without-being-logged-into-librenms","text":"webui/graph ```bash lnms config:set allow_unauth_graphs_cidr ['127.0.0.1/32'] lnms config:set allow_unauth_graphs true ```","title":"View/embedded graphs without being logged into LibreNMS"},{"location":"Extensions/Authentication/#single-sign-on","text":"The single sign-on mechanism is used to integrate with third party authentication providers that are managed outside of LibreNMS - such as ADFS, Shibboleth, EZProxy, BeyondCorp, and others. A large number of these methods use SAML the module has been written assuming the use of SAML, and therefore these instructions contain some SAML terminology, but it should be possible to use any software that works in a similar way. In order to make use of the single sign-on module, you need to have an Identity Provider up and running, and know how to configure your Relying Party to pass attributes to LibreNMS via header injection or environment variables. Setting these up is outside of the scope of this documentation. As this module deals with authentication, it is extremely careful about validating the configuration - if it finds that certain values in the configuration are not set, it will reject access rather than try and guess.","title":"Single Sign-on"},{"location":"Extensions/Authentication/#basic-configuration","text":"To get up and running, all you need to do is configure the following values: $config [ 'auth_mechanism' ] = \"sso\" ; $config [ 'sso' ][ 'mode' ] = \"env\" ; $config [ 'sso' ][ 'group_strategy' ] = \"static\" ; $config [ 'sso' ][ 'static_level' ] = 10 ; This, along with the defaults, sets up a basic Single Sign-on setup that: Reads values from environment variables Automatically creates users when they're first seen Automatically updates users with new values Gives everyone privilege level 10 This happens to mimic the behaviour of http-auth , so if this is the kind of setup you want, you're probably better of just going and using that mechanism.","title":"Basic Configuration"},{"location":"Extensions/Authentication/#security","text":"If there is a proxy involved (e.g. EZProxy, Azure AD Application Proxy, NGINX, mod_proxy) it's essential that you have some means in place to prevent headers being injected between the proxy and the end user, and also prevent end users from contacting LibreNMS directly. This should also apply to user connections to the proxy itself - the proxy must not be allowed to blindly pass through HTTP headers. mod security _ should be considered a minimum, with a full WAF being strongly recommended. This advice applies to the IDP too. The mechanism includes very basic protection, in the form of an IP whitelist with should contain the source addresses of your proxies: $config [ 'sso' ][ 'trusted_proxies' ] = [ '127.0.0.1/8' , '::1/128' , '192.0.2.0' , '2001:DB8::' ]; This configuration item should contain an array with a list of IP addresses or CIDR prefixes that are allowed to connect to LibreNMS and supply environment variables or headers.","title":"Security"},{"location":"Extensions/Authentication/#advanced-configuration-options","text":"","title":"Advanced Configuration Options"},{"location":"Extensions/Authentication/#user-attribute","text":"If for some reason your relying party doesn't store the username in REMOTE_USER , you can override this choice. $config [ 'sso' ][ 'user_attr' ] = 'HTTP_UID' ; Note that the user lookup is a little special - normally headers are prefixed with HTTP_ , however this is not the case for remote user - it's a special case. If you're using something different you need to figure out of the HTTP_ prefix is required or not yourself.","title":"User Attribute"},{"location":"Extensions/Authentication/#automatic-user-createupdate","text":"These are enabled by default: $config [ 'sso' ][ 'create_users' ] = true ; $config [ 'sso' ][ 'update_users' ] = true ; If these are not enabled, user logins will be (somewhat silently) rejected unless an administrator has created the account in advance. Note that in the case of SAML federations, unless release of the users true identity has been negotiated with the IDP, the username (probably ePTID) is not likely to be predicable.","title":"Automatic User Create/Update"},{"location":"Extensions/Authentication/#personalisation","text":"If the attributes are being populated, you can instruct the mechanism to add additional information to the user's database entry: $config [ 'sso' ][ 'email_attr' ] = \"mail\" ; $config [ 'sso' ][ 'realname_attr' ] = \"displayName\" ; $config [ 'sso' ][ 'descr_attr' ] = \"unscoped-affiliation","title":"Personalisation"},{"location":"Extensions/Authentication/#group-strategies","text":"","title":"Group Strategies"},{"location":"Extensions/Authentication/#static","text":"As used above, static gives every single user the same privilege level. If you're working with a small team, or don't need access control, this is probably suitable.","title":"Static"},{"location":"Extensions/Authentication/#attribute","text":"$config [ 'sso' ][ 'group_strategy' ] = \"attribute\" ; $config [ 'sso' ][ 'level_attr' ] = \"entitlement\" ; If your Relying Party is capable of calculating the necessary privilege level, you can configure the module to read the privilege number straight from an attribute. sso_level_attr should contain the name of the attribute that the Relying Party exposes to LibreNMS - as long as sso_mode is correctly set, the mechanism should find the value.","title":"Attribute"},{"location":"Extensions/Authentication/#group-map","text":"This is the most flexible (and complex) way of assigning privileges. $config [ 'sso' ][ 'group_strategy' ] = \"map\" ; $config [ 'sso' ][ 'group_attr' ] = \"member\" ; $config [ 'sso' ][ 'group_level_map' ] = [ 'librenms-admins' => 10 , 'librenms-readers' => 1 , 'librenms-billingcontacts' => 5 ]; $config [ 'sso' ][ 'group_delimiter' ] = ';' ; This mechanism expects to find a delimited list of groups within the attribute that sso_group_attr points to. This should be an associative array of group name keys, with privilege levels as values. The mechanism will scan the list and find the highest privilege level that the user is entitled to, and assign that value to the user. If there are no matches between the user's groups and the sso_group_level_map , the user will be assigned the privilege level specified in the sso_static_level variable, with a default of 0 (no access). This feature can be used to provide a default access level (such as read-only) to all authenticated users. Additionally, this format may be specific to Shibboleth; other relying party software may need changes to the mechanism (e.g. mod_auth_mellon may create pseudo arrays). There is an optional value for sites with large numbers of groups: $config [ 'sso' ][ 'group_filter' ] = \"/librenms-(.*)/i\" ; This filter causes the mechanism to only consider groups matching a regular expression.","title":"Group Map"},{"location":"Extensions/Authentication/#logout-behaviour","text":"LibreNMS has no capability to log out a user authenticated via Single Sign-On - that responsibility falls to the Relying Party. If your Relying Party has a magic URL that needs to be called to end a session, you can configure LibreNMS to direct the user to it: # Example for Shibboleth $config [ 'auth_logout_handler' ] = '/Shibboleth.sso/Logout' ; # Example for oauth2-proxy $config [ 'auth_logout_handler' ] = '/oauth2/sign_out' ; This option functions independently of the Single Sign-on mechanism.","title":"Logout Behaviour"},{"location":"Extensions/Authentication/#complete-configuration","text":"This configuration works on my deployment with a Shibboleth relying party, injecting environment variables, with the IDP supplying a list of groups. $config [ 'auth_mechanism' ] = 'sso' ; $config [ 'auth_logout_handler' ] = '/Shibboleth.sso/Logout' ; $config [ 'sso' ][ 'mode' ] = 'env' ; $config [ 'sso' ][ 'create_users' ] = true ; $config [ 'sso' ][ 'update_users' ] = true ; $config [ 'sso' ][ 'realname_attr' ] = 'displayName' ; $config [ 'sso' ][ 'email_attr' ] = 'mail' ; $config [ 'sso' ][ 'group_strategy' ] = 'map' ; $config [ 'sso' ][ 'group_attr' ] = 'member' ; $config [ 'sso' ][ 'group_filter' ] = '/(librenms-.*)/i' ; $config [ 'sso' ][ 'group_delimiter' ] = ';' ; $config [ 'sso' ][ 'group_level_map' ] = [ 'librenms-demo' => 11 , 'librenms-globaladmin' => 10 , 'librenms-globalread' => 5 , 'librenms-lowpriv' => 1 ];","title":"Complete Configuration"},{"location":"Extensions/Auto-Discovery/","text":"Auto Discovery Support Getting Started LibreNMS provides the ability to automatically add devices on your network, we can do this via a few methods which will be explained below and also indicate if they are enabled by default. All discovery methods run when discovery runs (every 6 hours by default and within 5 minutes for new devices). Please note that you need at least ONE device added before auto-discovery will work. The first thing to do though is add the required configuration options to config.php . SNMP Details To add devices automatically we need to know your snmp details, examples of SNMP v1, v2c and v3 are below: // v1 or v2c $config [ 'snmp' ][ 'community' ][] = \"my_custom_community\" ; $config [ 'snmp' ][ 'community' ][] = \"another_community\" ; // v3 $config [ 'snmp' ][ 'v3' ][ 0 ][ 'authlevel' ] = 'authPriv' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'authname' ] = 'my_username' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'authpass' ] = 'my_password' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'authalgo' ] = 'SHA' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'cryptopass' ] = 'my_crypto' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'cryptoalgo' ] = 'AES' ; These details will be attempted when adding devices, you can specify any mixture of these. Allowed Networks Your Networks To add devices, we need to know what are your subnets so we don't go blindly attempting to add devices not under your control. discovery/networks lnms config:set nets.+ '192.168.0.0/24' lnms config:set nets.+ '172.2.4.0/22' Exclusions If you have added a network as above but a single device exists within it that you can't auto add, then you can exclude this with the following: discovery/networks lnms config:set autodiscovery.nets-exclude.+ '192.168.0.1/32' Additional Options Discovering devices by IP By default we don't add devices by IP address, we look for a reverse dns name to be found and add with that. If this fails and you would like to still add devices automatically then you will need to set $config['discovery_by_ip'] = true; Short hostnames If your devices only return a short hostname such as lax-fa0-dc01 but the full name should be lax-fa0-dc01.example.com then you can set discovery/general lnms config:set mydomain example.com Allow Duplicate sysName By default we require unique sysNames when adding devices (this is returned over snmp by your devices). If you would like to allow devices to be added with duplicate sysNames then please set discovery/discovery_modules lnms config:set allow_duplicate_sysName true Discovery Methods Below are the methods for auto discovering devices. Each one can be enabled or disabled and may have additional configuration options. ARP Disabled by default. Adds devices that are listed in another device's arp table. This module depends on the arp-table module being enabled and returning data. To enable, switch on globally the discovery_modules.discovery-arp or per device within the Modules section. discovery/discovery_modules lnms config:set discovery_modules.discovery-arp true XDP Enabled by default. $config['autodiscovery']['xdp'] = false; to disable. This includes FDP, CDP and LLDP support based on the device type. The LLDP/xDP links with neighbours will always be discovered as soon as the discovery module is enabled. However, LibreNMS will only try to add the new devices discovered with LLDP/xDP if $config['autodiscovery']['xdp'] = true; . Devices may be excluded from xdp discovery by sysName and sysDescr. //Exclude devices by name $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysname_regexp' ][] = '/host1/' ; $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysname_regexp' ][] = '/^dev/' ; //Exclude devices by description $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysdesc_regexp' ][] = '/Vendor X/' ; $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysdesc_regexp' ][] = '/Vendor Y/' ; Devices may be excluded from cdp discovery by platform. //Exclude devices by platform(Cisco only) $config [ 'autodiscovery' ][ 'cdp_exclude' ][ 'platform_regexp' ][] = '/WS-C3750G/' ; These devices are excluded by default: $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysdesc_regexp' ][] = '/-K9W8/' ; // Cisco Lightweight Access Point $config [ 'autodiscovery' ][ 'cdp_exclude' ][ 'platform_regexp' ][] = '/^Cisco IP Phone/' ; //Cisco IP Phone OSPF Enabled by default. $config['autodiscovery']['ospf'] = false; to disable. BGP Enabled by default. $config['autodiscovery']['bgp'] = false; to disable. This module is invoked from bgp-peers discovery module. SNMP Scan Apart from the aforementioned Auto-Discovery options, LibreNMS is also able to proactively scan a network for SNMP-enabled devices using the configured version/credentials. SNMP Scan will scan nets by default and respects autodiscovery.nets-exclude . To run the SNMP-Scanner you need to execute the snmp-scan.py from within your LibreNMS installation directory. Here the script's help-page for reference: usage: snmp-scan.py [-h] [-t THREADS] [-g GROUP] [-l] [-v] [--ping-fallback] [--ping-only] [-P] [network ...] Scan network for snmp hosts and add them to LibreNMS. positional arguments: network CIDR noted IP-Range to scan. Can be specified multiple times This argument is only required if 'nets' config is not set Example: 192.168.0.0/24 Example: 192.168.0.0/31 will be treated as an RFC3021 p-t-p network with two addresses, 192.168.0.0 and 192.168.0.1 Example: 192.168.0.1/32 will be treated as a single host address optional arguments: -h, --help show this help message and exit -t THREADS How many IPs to scan at a time. More will increase the scan speed, but could overload your system. Default: 32 -g GROUP The poller group all scanned devices will be added to. Default: The first group listed in 'distributed_poller_group', or 0 if not specificed -l, --legend Print the legend. -v, --verbose Show debug output. Specifying multiple times increases the verbosity. --ping-fallback Add the device as an ICMP only device if it replies to ping but not SNMP. --ping-only Always add the device as an ICMP only device. -P, --ping Deprecated. Use --ping-fallback instead. Discovered devices Newly discovered devices will be added to the default_poller_group , this value defaults to 0 if unset. When using distributed polling, this value can be changed locally by setting $config['default_poller_group'] in config.php or globally by using lnms config:set .","title":"Auto-discovery Setup"},{"location":"Extensions/Auto-Discovery/#auto-discovery-support","text":"","title":"Auto Discovery Support"},{"location":"Extensions/Auto-Discovery/#getting-started","text":"LibreNMS provides the ability to automatically add devices on your network, we can do this via a few methods which will be explained below and also indicate if they are enabled by default. All discovery methods run when discovery runs (every 6 hours by default and within 5 minutes for new devices). Please note that you need at least ONE device added before auto-discovery will work. The first thing to do though is add the required configuration options to config.php .","title":"Getting Started"},{"location":"Extensions/Auto-Discovery/#snmp-details","text":"To add devices automatically we need to know your snmp details, examples of SNMP v1, v2c and v3 are below: // v1 or v2c $config [ 'snmp' ][ 'community' ][] = \"my_custom_community\" ; $config [ 'snmp' ][ 'community' ][] = \"another_community\" ; // v3 $config [ 'snmp' ][ 'v3' ][ 0 ][ 'authlevel' ] = 'authPriv' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'authname' ] = 'my_username' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'authpass' ] = 'my_password' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'authalgo' ] = 'SHA' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'cryptopass' ] = 'my_crypto' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'cryptoalgo' ] = 'AES' ; These details will be attempted when adding devices, you can specify any mixture of these.","title":"SNMP Details"},{"location":"Extensions/Auto-Discovery/#allowed-networks","text":"","title":"Allowed Networks"},{"location":"Extensions/Auto-Discovery/#your-networks","text":"To add devices, we need to know what are your subnets so we don't go blindly attempting to add devices not under your control. discovery/networks lnms config:set nets.+ '192.168.0.0/24' lnms config:set nets.+ '172.2.4.0/22'","title":"Your Networks"},{"location":"Extensions/Auto-Discovery/#exclusions","text":"If you have added a network as above but a single device exists within it that you can't auto add, then you can exclude this with the following: discovery/networks lnms config:set autodiscovery.nets-exclude.+ '192.168.0.1/32'","title":"Exclusions"},{"location":"Extensions/Auto-Discovery/#additional-options","text":"","title":"Additional Options"},{"location":"Extensions/Auto-Discovery/#discovering-devices-by-ip","text":"By default we don't add devices by IP address, we look for a reverse dns name to be found and add with that. If this fails and you would like to still add devices automatically then you will need to set $config['discovery_by_ip'] = true;","title":"Discovering devices by IP"},{"location":"Extensions/Auto-Discovery/#short-hostnames","text":"If your devices only return a short hostname such as lax-fa0-dc01 but the full name should be lax-fa0-dc01.example.com then you can set discovery/general lnms config:set mydomain example.com","title":"Short hostnames"},{"location":"Extensions/Auto-Discovery/#allow-duplicate-sysname","text":"By default we require unique sysNames when adding devices (this is returned over snmp by your devices). If you would like to allow devices to be added with duplicate sysNames then please set discovery/discovery_modules lnms config:set allow_duplicate_sysName true","title":"Allow Duplicate sysName"},{"location":"Extensions/Auto-Discovery/#discovery-methods","text":"Below are the methods for auto discovering devices. Each one can be enabled or disabled and may have additional configuration options.","title":"Discovery Methods"},{"location":"Extensions/Auto-Discovery/#arp","text":"Disabled by default. Adds devices that are listed in another device's arp table. This module depends on the arp-table module being enabled and returning data. To enable, switch on globally the discovery_modules.discovery-arp or per device within the Modules section. discovery/discovery_modules lnms config:set discovery_modules.discovery-arp true","title":"ARP"},{"location":"Extensions/Auto-Discovery/#xdp","text":"Enabled by default. $config['autodiscovery']['xdp'] = false; to disable. This includes FDP, CDP and LLDP support based on the device type. The LLDP/xDP links with neighbours will always be discovered as soon as the discovery module is enabled. However, LibreNMS will only try to add the new devices discovered with LLDP/xDP if $config['autodiscovery']['xdp'] = true; . Devices may be excluded from xdp discovery by sysName and sysDescr. //Exclude devices by name $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysname_regexp' ][] = '/host1/' ; $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysname_regexp' ][] = '/^dev/' ; //Exclude devices by description $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysdesc_regexp' ][] = '/Vendor X/' ; $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysdesc_regexp' ][] = '/Vendor Y/' ; Devices may be excluded from cdp discovery by platform. //Exclude devices by platform(Cisco only) $config [ 'autodiscovery' ][ 'cdp_exclude' ][ 'platform_regexp' ][] = '/WS-C3750G/' ; These devices are excluded by default: $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysdesc_regexp' ][] = '/-K9W8/' ; // Cisco Lightweight Access Point $config [ 'autodiscovery' ][ 'cdp_exclude' ][ 'platform_regexp' ][] = '/^Cisco IP Phone/' ; //Cisco IP Phone","title":"XDP"},{"location":"Extensions/Auto-Discovery/#ospf","text":"Enabled by default. $config['autodiscovery']['ospf'] = false; to disable.","title":"OSPF"},{"location":"Extensions/Auto-Discovery/#bgp","text":"Enabled by default. $config['autodiscovery']['bgp'] = false; to disable. This module is invoked from bgp-peers discovery module.","title":"BGP"},{"location":"Extensions/Auto-Discovery/#snmp-scan","text":"Apart from the aforementioned Auto-Discovery options, LibreNMS is also able to proactively scan a network for SNMP-enabled devices using the configured version/credentials. SNMP Scan will scan nets by default and respects autodiscovery.nets-exclude . To run the SNMP-Scanner you need to execute the snmp-scan.py from within your LibreNMS installation directory. Here the script's help-page for reference: usage: snmp-scan.py [-h] [-t THREADS] [-g GROUP] [-l] [-v] [--ping-fallback] [--ping-only] [-P] [network ...] Scan network for snmp hosts and add them to LibreNMS. positional arguments: network CIDR noted IP-Range to scan. Can be specified multiple times This argument is only required if 'nets' config is not set Example: 192.168.0.0/24 Example: 192.168.0.0/31 will be treated as an RFC3021 p-t-p network with two addresses, 192.168.0.0 and 192.168.0.1 Example: 192.168.0.1/32 will be treated as a single host address optional arguments: -h, --help show this help message and exit -t THREADS How many IPs to scan at a time. More will increase the scan speed, but could overload your system. Default: 32 -g GROUP The poller group all scanned devices will be added to. Default: The first group listed in 'distributed_poller_group', or 0 if not specificed -l, --legend Print the legend. -v, --verbose Show debug output. Specifying multiple times increases the verbosity. --ping-fallback Add the device as an ICMP only device if it replies to ping but not SNMP. --ping-only Always add the device as an ICMP only device. -P, --ping Deprecated. Use --ping-fallback instead.","title":"SNMP Scan"},{"location":"Extensions/Auto-Discovery/#discovered-devices","text":"Newly discovered devices will be added to the default_poller_group , this value defaults to 0 if unset. When using distributed polling, this value can be changed locally by setting $config['default_poller_group'] in config.php or globally by using lnms config:set .","title":"Discovered devices"},{"location":"Extensions/Availability-Map/","text":"Availability Map LibreNMS has the following page to show an availability map: Overview -> Maps -> Availability This map will show all devices on a single page, with each device having either a box or a coloured square representing its status. Widget There is an availability map widget that can be added to a dashboard to give a quick overview of the status of all devices on the network. Settings # Set the compact view mode for the availability map lnms config:set webui.availability_map_compact false # Size of the box for each device in the availability map (not compact) lnms config:set webui.availability_map_box_size 165 # Sort by status instead of hostname lnms config:set webui.availability_map_sort_status false # Show the device group drop-down on the availabiltiy map page lnms config:set webui.availability_map_use_device_groups true","title":"Availability Map"},{"location":"Extensions/Availability-Map/#availability-map","text":"LibreNMS has the following page to show an availability map: Overview -> Maps -> Availability This map will show all devices on a single page, with each device having either a box or a coloured square representing its status.","title":"Availability Map"},{"location":"Extensions/Availability-Map/#widget","text":"There is an availability map widget that can be added to a dashboard to give a quick overview of the status of all devices on the network.","title":"Widget"},{"location":"Extensions/Availability-Map/#settings","text":"# Set the compact view mode for the availability map lnms config:set webui.availability_map_compact false # Size of the box for each device in the availability map (not compact) lnms config:set webui.availability_map_box_size 165 # Sort by status instead of hostname lnms config:set webui.availability_map_sort_status false # Show the device group drop-down on the availabiltiy map page lnms config:set webui.availability_map_use_device_groups true","title":"Settings"},{"location":"Extensions/Billing-Module/","text":"Billing Module With the billing module you can create a bill, assign a quota to it and add ports to it. It then tracks the ports usage and shows you the usage in the bill, including any overage. Accounting by both total transferred data and 95th percentile is supported. To enable and use the billing module you need to perform the following steps: Edit config.php and add (or enable) the following line near the end of the config $config [ 'enable_billing' ] = 1 ; # Enable Billing Edit /etc/cron.d/librenms and add the following: */5 * * * * librenms /opt/librenms/poll-billing.php >> /dev/null 2 > & 1 01 * * * * librenms /opt/librenms/billing-calculate.php >> /dev/null 2 > & 1 Create billing graphs as required. Data Retention Billing data is stored in the MySQL database, and you may wish to purge the detailed stats for old data (per-month totals will always be kept). To enable this, add the following to config.php : $config [ 'billing_data_purge' ] = 12 ; // Number of months to retain Data for the last complete billing cycle will always be retained - only data older than this by the configured number of months will be removed. This task is performed in the daily cleanup tasks. 95th Percentile Calculation For 95th Percentile billing, the default behavior is to use the highest of the input or output 95th Percentile calculation. To instead use the combined total of inout + output to derive the 95th percentile, This can be changed on a per bill basis by setting 95th Calculation to \"Aggregate\". To change the default option to Aggregate, add the following the config.php : $config [ 'billing' ][ '95th_default_agg' ] = 1 ; // Set aggregate 95th as default This configuration setting is cosmetic and only changes the default selected option when adding a new bill.","title":"Billing Module"},{"location":"Extensions/Billing-Module/#billing-module","text":"With the billing module you can create a bill, assign a quota to it and add ports to it. It then tracks the ports usage and shows you the usage in the bill, including any overage. Accounting by both total transferred data and 95th percentile is supported. To enable and use the billing module you need to perform the following steps: Edit config.php and add (or enable) the following line near the end of the config $config [ 'enable_billing' ] = 1 ; # Enable Billing Edit /etc/cron.d/librenms and add the following: */5 * * * * librenms /opt/librenms/poll-billing.php >> /dev/null 2 > & 1 01 * * * * librenms /opt/librenms/billing-calculate.php >> /dev/null 2 > & 1 Create billing graphs as required.","title":"Billing Module"},{"location":"Extensions/Billing-Module/#data-retention","text":"Billing data is stored in the MySQL database, and you may wish to purge the detailed stats for old data (per-month totals will always be kept). To enable this, add the following to config.php : $config [ 'billing_data_purge' ] = 12 ; // Number of months to retain Data for the last complete billing cycle will always be retained - only data older than this by the configured number of months will be removed. This task is performed in the daily cleanup tasks.","title":"Data Retention"},{"location":"Extensions/Billing-Module/#95th-percentile-calculation","text":"For 95th Percentile billing, the default behavior is to use the highest of the input or output 95th Percentile calculation. To instead use the combined total of inout + output to derive the 95th percentile, This can be changed on a per bill basis by setting 95th Calculation to \"Aggregate\". To change the default option to Aggregate, add the following the config.php : $config [ 'billing' ][ '95th_default_agg' ] = 1 ; // Set aggregate 95th as default This configuration setting is cosmetic and only changes the default selected option when adding a new bill.","title":"95th Percentile Calculation"},{"location":"Extensions/Component/","text":"About The Component extension provides a generic database storage mechanism for discovery and poller modules. The Driver behind this extension was to provide the features of ports, in a generic manner to discovery/poller modules. It provides a status (Nagios convention), the ability to Disable (do not poll), or Ignore (do not Alert). Database Structure The database structure contains the component table: mysql > select * from component limit 1 ; + ----+-----------+------+------------+--------+----------+--------+-------+ | id | device_id | type | label | status | disabled | ignore | error | + ----+-----------+------+------------+--------+----------+--------+-------+ | 9 | 1 | TEST | TEST LABEL | 0 | 1 | 1 | | + ----+-----------+------+------------+--------+----------+--------+-------+ 1 row in set ( 0 . 00 sec ) These fields are described below: id - ID for each component, unique index device_id - device_id from the devices table type - name from the component_type table label - Display label for the component status - The status of the component, retrieved from the device disabled - Should this component be polled? ignore - Should this component be alerted on error - Error message if in Alert state The component_prefs table holds custom data in an Attribute/Value format: mysql > select * from component_prefs limit 1 ; + ----+-----------+-----------+-----------+ | id | component | attribute | value | + ----+-----------+-----------+-----------+ | 4 | 9 | TEST_ATTR | TEST_ATTR | + ----+-----------+-----------+-----------+ 2 rows in set ( 0 . 00 sec ) Reserved Fields When this data from both the component and component_prefs tables is returned in one single consolidated array, there is the potential for someone to attempt to set an attribute (in the component_prefs ) table that is used in the component table. Because of this all fields of the component table are reserved, they cannot be used as custom attributes, if you update these the module will attempt to write them to the component table, not the component_prefs table. Using Components Create an instance of the component class: $COMPONENT = new LibreNMS\\Component (); Retrieving Components Now you can retrieve an array of the available components: $ARRAY = $COMPONENT -> getComponents ( $DEVICE_ID , $OPTIONS ); getComponents takes 2 arguments: DEVICE_ID or null for all devices. OPTIONS - an array of various options. getComponents will return an array containing components in the following format: Array ( [ X ] => Array ( [ Y1 ] => Array ( [ device_id ] => 1 [ TEST_ATTR ] => TEST_ATTR [ type ] => TEST [ label ] => TEST LABEL [ status ] => 0 [ ignore ] => 1 [ disabled ] => 1 [ error ] => ), [ Y2 ] => Array ( [ device_id ] => 1 [ TEST_ATTR ] => TEST_ATTR [ type ] => TESTING [ label ] => TEST LABEL [ status ] => 0 [ ignore ] => 1 [ disabled ] => 0 [ error ] => ), ) ) Where X is the Device ID and Y1/Y2 is the Component ID. In the example above, TEST_ATTR is a custom field, the rest are reserved fields. Options Options can be supplied to getComponents to influence which and how components are returned. Filtering You can filter on any of the reserved fields. Filters are created in the following format: $options [ 'filter' ][ 'FIELD' ] = array ( 'OPERATOR' , 'CRITERIA' ); Where: FIELD - The reserved field to filter on OPERATOR - 'LIKE' or '=', are we checking if the FIELD equals or contains the CRITERIA. CRITERIA - The criteria to search on There are 2 filtering shortcuts: $DEVICE_ID is a synonym for: $OPTIONS [ 'filter' ][ 'device_id' ] = array ( '=' , $DEVICE_ID ); $OPTIONS['type'] = $TYPE is a synonym for: $OPTIONS [ 'filter' ][ 'type' ] = array ( '=' , $TYPE ); Sorting You can sort the records that are returned by specifying the following option: $OPTIONS [ 'sort' ][ FIELD ] = 'DIRECTION' ; Where Direction is one of: ASC - Ascending, from Low to High DESC - Descending, from High to Low Creating Components To create a new component, run the createComponent function. $ARRAY = $COMPONENT -> createComponent ( $DEVICE_ID , $TYPE ); createComponent takes 2 arguments: DEVICE_ID - The ID of the device to attach the component to. TYPE - The unique type for your module. This will return a new, empty array with a component ID and Type set, all other fields will be set to defaults. Array ( [ 1 ] => Array ( [ type ] => TESTING [ label ] => [ status ] => 1 [ ignore ] => 0 [ disabled ] => 0 [ error ] => ) ) Deleting Components When a component is no longer needed, it can be deleted. $COMPONENT -> deleteComponent ( $COMPONENT_ID ) This will return True on success or False on failure. Editing Components To edit a component, the procedure is: Get the Current Components Edit the array Write the components Edit the Array Once you have a component array from getComponents the first thing to do is extract the components for only the single device you are editing. This is required because the setComponentPrefs function only saves a single device at a time. $ARRAY = $COMPONENT -> getComponents ( $DEVICE_ID , $OPTIONS ); $ARRAY = $ARRAY [ $DEVICE_ID ]; Then simply edit this array to suit your needs. If you need to add a new Attribute/Value pair you can: $ARRAY [ COMPONENT_ID ][ 'New Attribute' ] = \"Value\" ; If you need to delete a previously set Attribute/Value pair you can: unset ( $ARRAY [ COMPONENT_ID ][ 'New Attribute' ]); If you need to edit a previously set Attribute/Value pair you can: $ARRAY [ COMPONENT_ID ][ 'Existing Attribute' ] = \"New Value\" ; Write the components To write component changes back to the database simply: $COMPONENT -> setComponentPrefs ( $DEVICE_ID , $ARRAY ) When writing the component array there are several caveats to be aware of, these are: $ARRAY must be in the format of a single device ID - $ARRAY[$COMPONENT_ID][Attribute] = 'Value'; NOT in the multi device format returned by getComponents - $ARRAY[$DEVICE_ID][$COMPONENT_ID][Attribute] = 'Value'; You cannot edit the Component ID or the Device ID reserved fields can not be removed if a change is found an entry will be written to the eventlog. API Component details are available via the API. Please see the API-Docs for details. Alerting It is intended that discovery/poller modules will detect the status of a component during the polling cycle. Status is logged using the Nagios convention for status codes, where: 0 = Ok, 1 = Warning, 2 = Critical If you are creating a poller module which can detect a fault condition simply set STATUS to something other than 0 and ERROR to a message that indicates the problem. To actually raise an alert, the user will need to create an alert rule. To assist with this several Alerting Macro's have been created: %macro.component_normal - A component that is not disabled or ignored and in a Normal state. %macro.component_warning - A component that is not disabled or ignored and NOT in a Warning state. %macro.component_critical - A component that is not disabled or ignored and NOT in a Critical state. To raise alerts for components, the following rules could be created: %macros.component_critical = \"1\" - To alert on all Critical components %macros.component_critical = \"1\" && %component.type = \"\" - To alert on all Critical components of a particular type. If there is a particular component you would like excluded from alerting, simply set the ignore field to 1. The data that is written to each alert when it is raised is in the following format: COMPONENT_TYPE - LABEL - ERROR Example Code To see an example of how the component module can used, please see the following modules: Cisco CBQoS includes/discovery/cisco-cbqos.inc.php includes/polling/cisco-cbqos.inc.php html/includes/graphs/device/cbqos_traffic.inc.php Cisco OTV includes/discovery/cisco-otv.inc.php includes/polling/cisco-otv.inc.php html/includes/graphs/device/cisco-otv-mac.inc.php html/pages/routing/cisco-otv.inc.php","title":"Component"},{"location":"Extensions/Component/#about","text":"The Component extension provides a generic database storage mechanism for discovery and poller modules. The Driver behind this extension was to provide the features of ports, in a generic manner to discovery/poller modules. It provides a status (Nagios convention), the ability to Disable (do not poll), or Ignore (do not Alert).","title":"About"},{"location":"Extensions/Component/#database-structure","text":"The database structure contains the component table: mysql > select * from component limit 1 ; + ----+-----------+------+------------+--------+----------+--------+-------+ | id | device_id | type | label | status | disabled | ignore | error | + ----+-----------+------+------------+--------+----------+--------+-------+ | 9 | 1 | TEST | TEST LABEL | 0 | 1 | 1 | | + ----+-----------+------+------------+--------+----------+--------+-------+ 1 row in set ( 0 . 00 sec ) These fields are described below: id - ID for each component, unique index device_id - device_id from the devices table type - name from the component_type table label - Display label for the component status - The status of the component, retrieved from the device disabled - Should this component be polled? ignore - Should this component be alerted on error - Error message if in Alert state The component_prefs table holds custom data in an Attribute/Value format: mysql > select * from component_prefs limit 1 ; + ----+-----------+-----------+-----------+ | id | component | attribute | value | + ----+-----------+-----------+-----------+ | 4 | 9 | TEST_ATTR | TEST_ATTR | + ----+-----------+-----------+-----------+ 2 rows in set ( 0 . 00 sec )","title":"Database Structure"},{"location":"Extensions/Component/#reserved-fields","text":"When this data from both the component and component_prefs tables is returned in one single consolidated array, there is the potential for someone to attempt to set an attribute (in the component_prefs ) table that is used in the component table. Because of this all fields of the component table are reserved, they cannot be used as custom attributes, if you update these the module will attempt to write them to the component table, not the component_prefs table.","title":"Reserved Fields"},{"location":"Extensions/Component/#using-components","text":"Create an instance of the component class: $COMPONENT = new LibreNMS\\Component ();","title":"Using Components"},{"location":"Extensions/Component/#retrieving-components","text":"Now you can retrieve an array of the available components: $ARRAY = $COMPONENT -> getComponents ( $DEVICE_ID , $OPTIONS ); getComponents takes 2 arguments: DEVICE_ID or null for all devices. OPTIONS - an array of various options. getComponents will return an array containing components in the following format: Array ( [ X ] => Array ( [ Y1 ] => Array ( [ device_id ] => 1 [ TEST_ATTR ] => TEST_ATTR [ type ] => TEST [ label ] => TEST LABEL [ status ] => 0 [ ignore ] => 1 [ disabled ] => 1 [ error ] => ), [ Y2 ] => Array ( [ device_id ] => 1 [ TEST_ATTR ] => TEST_ATTR [ type ] => TESTING [ label ] => TEST LABEL [ status ] => 0 [ ignore ] => 1 [ disabled ] => 0 [ error ] => ), ) ) Where X is the Device ID and Y1/Y2 is the Component ID. In the example above, TEST_ATTR is a custom field, the rest are reserved fields.","title":"Retrieving Components"},{"location":"Extensions/Component/#options","text":"Options can be supplied to getComponents to influence which and how components are returned.","title":"Options"},{"location":"Extensions/Component/#filtering","text":"You can filter on any of the reserved fields. Filters are created in the following format: $options [ 'filter' ][ 'FIELD' ] = array ( 'OPERATOR' , 'CRITERIA' ); Where: FIELD - The reserved field to filter on OPERATOR - 'LIKE' or '=', are we checking if the FIELD equals or contains the CRITERIA. CRITERIA - The criteria to search on There are 2 filtering shortcuts: $DEVICE_ID is a synonym for: $OPTIONS [ 'filter' ][ 'device_id' ] = array ( '=' , $DEVICE_ID ); $OPTIONS['type'] = $TYPE is a synonym for: $OPTIONS [ 'filter' ][ 'type' ] = array ( '=' , $TYPE );","title":"Filtering"},{"location":"Extensions/Component/#sorting","text":"You can sort the records that are returned by specifying the following option: $OPTIONS [ 'sort' ][ FIELD ] = 'DIRECTION' ; Where Direction is one of: ASC - Ascending, from Low to High DESC - Descending, from High to Low","title":"Sorting"},{"location":"Extensions/Component/#creating-components","text":"To create a new component, run the createComponent function. $ARRAY = $COMPONENT -> createComponent ( $DEVICE_ID , $TYPE ); createComponent takes 2 arguments: DEVICE_ID - The ID of the device to attach the component to. TYPE - The unique type for your module. This will return a new, empty array with a component ID and Type set, all other fields will be set to defaults. Array ( [ 1 ] => Array ( [ type ] => TESTING [ label ] => [ status ] => 1 [ ignore ] => 0 [ disabled ] => 0 [ error ] => ) )","title":"Creating Components"},{"location":"Extensions/Component/#deleting-components","text":"When a component is no longer needed, it can be deleted. $COMPONENT -> deleteComponent ( $COMPONENT_ID ) This will return True on success or False on failure.","title":"Deleting Components"},{"location":"Extensions/Component/#editing-components","text":"To edit a component, the procedure is: Get the Current Components Edit the array Write the components","title":"Editing Components"},{"location":"Extensions/Component/#edit-the-array","text":"Once you have a component array from getComponents the first thing to do is extract the components for only the single device you are editing. This is required because the setComponentPrefs function only saves a single device at a time. $ARRAY = $COMPONENT -> getComponents ( $DEVICE_ID , $OPTIONS ); $ARRAY = $ARRAY [ $DEVICE_ID ]; Then simply edit this array to suit your needs. If you need to add a new Attribute/Value pair you can: $ARRAY [ COMPONENT_ID ][ 'New Attribute' ] = \"Value\" ; If you need to delete a previously set Attribute/Value pair you can: unset ( $ARRAY [ COMPONENT_ID ][ 'New Attribute' ]); If you need to edit a previously set Attribute/Value pair you can: $ARRAY [ COMPONENT_ID ][ 'Existing Attribute' ] = \"New Value\" ;","title":"Edit the Array"},{"location":"Extensions/Component/#write-the-components","text":"To write component changes back to the database simply: $COMPONENT -> setComponentPrefs ( $DEVICE_ID , $ARRAY ) When writing the component array there are several caveats to be aware of, these are: $ARRAY must be in the format of a single device ID - $ARRAY[$COMPONENT_ID][Attribute] = 'Value'; NOT in the multi device format returned by getComponents - $ARRAY[$DEVICE_ID][$COMPONENT_ID][Attribute] = 'Value'; You cannot edit the Component ID or the Device ID reserved fields can not be removed if a change is found an entry will be written to the eventlog.","title":"Write the components"},{"location":"Extensions/Component/#api","text":"Component details are available via the API. Please see the API-Docs for details.","title":"API"},{"location":"Extensions/Component/#alerting","text":"It is intended that discovery/poller modules will detect the status of a component during the polling cycle. Status is logged using the Nagios convention for status codes, where: 0 = Ok, 1 = Warning, 2 = Critical If you are creating a poller module which can detect a fault condition simply set STATUS to something other than 0 and ERROR to a message that indicates the problem. To actually raise an alert, the user will need to create an alert rule. To assist with this several Alerting Macro's have been created: %macro.component_normal - A component that is not disabled or ignored and in a Normal state. %macro.component_warning - A component that is not disabled or ignored and NOT in a Warning state. %macro.component_critical - A component that is not disabled or ignored and NOT in a Critical state. To raise alerts for components, the following rules could be created: %macros.component_critical = \"1\" - To alert on all Critical components %macros.component_critical = \"1\" && %component.type = \"\" - To alert on all Critical components of a particular type. If there is a particular component you would like excluded from alerting, simply set the ignore field to 1. The data that is written to each alert when it is raised is in the following format: COMPONENT_TYPE - LABEL - ERROR","title":"Alerting"},{"location":"Extensions/Component/#example-code","text":"To see an example of how the component module can used, please see the following modules: Cisco CBQoS includes/discovery/cisco-cbqos.inc.php includes/polling/cisco-cbqos.inc.php html/includes/graphs/device/cbqos_traffic.inc.php Cisco OTV includes/discovery/cisco-otv.inc.php includes/polling/cisco-otv.inc.php html/includes/graphs/device/cisco-otv-mac.inc.php html/pages/routing/cisco-otv.inc.php","title":"Example Code"},{"location":"Extensions/Custom-Map/","text":"Custom Map LibreNMS has the ability to create custom maps to give a quick overview of parts of the network including up/down status of devices and link utilisation. These are also referred to as weather maps. Viewer Once some maps have been created, they will be visible to any users who have read access to all devices on a given map. Custom maps are available through the Overview -> Maps -> Custom Maps menu. Some key points about the viewer are: Nodes will change colour if they are down or disabled Links are only associated with a single network interface Link utilisation can only be shown if the link speed is known Link speed is decoded from SNMP if possible (Upload/Download) and defaults to the physical speed if SNMP data is not available, or cannot be decoded Links will change colour as follows: Black if the link is down, or the max speed is unknown Green at 0% utilisation, with a gradual change to Yellow at 50% utilisation, with a gradual change to Orange at 75% utilisation, with a gradual change to Red at 100% utilisation, with a gradual change to Purple at 150% utilisation and above Viewer URL options You can manually add the following parameters to a URL to alter the display of a custom map. The following URL options are available: bare=yes : Removes the control bar from the top of the page. screenshot=yes : Removes all labels from the nodes and links e.g. If you want bare and screenshot enabled, https:// nmsserver /maps/custom/2 becomes https:// nmsserver /maps/custom/2?bare=yes&screenshot=yes Editor To access the custom map editor, a user must be an admin. The editor is accessed through the Overview -> Maps -> Custom Map Editor menu. Once you are in the editor, you will be given a drop-down list of all the custom maps so you can choose one to edit, or select \"Create New Map\" to create a new map. Map Settings When you create a new map, you will be presented with a page to set some global map settings. These are: Name : The name for the map Width : The width of the map in pixels Height : The height of the map in pixels Node Alignment : When devices are added to the map, this will align the devices to an invisible grid this many pixels wide, which can help to make the maps look better. This can be set to 0 to disable. Background : An image (PNG/JPG) up to 2MB can be uploaded as a background. These settings can be changed at any stage by clicking on the \"Edit Map Settings\" button in the top-left of the editor. Nodes Once you have a map, you can start by adding \"nodes\" to the map. A node represents a device, or an external point in the network (e.g. the internet) To add a node, you click on the \"Add Node\" button in the control bar, then click on the map area where you want to add the node. You will then be aked for the following information: Label : The text to display on this point in the network Device : If this node represents a device, you can select the device from the drop-down. This will overwrite the label, which you can then change if you want to. Style : You can select the style of the node. If a device has been selected you can choose the LibreNMS icon by choosing \"Device Image\". You can also choose \"Icon\" to select an image for the device. Icon : If you choose \"Icon\" in the style box, you can select from a list of images to represent this node There are also options to choose the size and colour of the node and the font. Once you have finished choosing the options for the node, you can press Save to add it to the map. NOTE: This does not save anything to the database immediately. You need to click on the \"Save Map\" button in the top-right to save your changes to the database. You can edit a node at any time by selecting it on the map and clicking on the \"Edit Node\" button in the control bar. You can also modify the default settings for all new nodes by clicking on the \"Edit Node Default\" button at the top of the page. Edges Once you have 2 or more nodes, you can add links between the nodes. These are called edges in the editor. To add a link, click on the \"Add Edge\" button in the control bar, then click on one of the nodes you want to link and drag the cursor to the second node that you want to link. You will then be prompted for the following information: From : The node that the link runs from (it will default to first node you selected) To : The node that the link runs to (it will default to the second node you selected) Port : If the From or To node is linked to a device, you can select an interface from one of the devices and the custom map will show traffic utilisation for the selected interface. Reverse Port Direction : If the selected port displays data in the wrong direction for the link, you can reverse it by toggling this option. Line Style : You can try different line styles, especially if you are running multiple links between the same 2 nodes Show percent usage : Choose whether to have text on the lines showing the link utilisation as a percentage Recenter Line : If you tick this box, the centre point of the line will be moved back to half way between the 2 nodes when you click on the save button. Once you have finished choosing the options for the node, you can press Save to add it to the map. NOTE: This does not save anything to the database immediately. You need to click on the \"Save Map\" button in the top-right to save your changes to the database. Once you press save, you it will create 3 objects on the screen, 2 arrows and a round node in the middle. Having the 3 objects allows you to move the mid point of the line off centre, and also allows us to display bandwidth information for both directions of the link. You can edit an edge at any time by selecting it on the map and clicking on the \"Edit Edge\" button in the control bar. You can also modify the default settings for all new edges by clicking on the \"Edit Edge Default\" button at the top of the page. Re-Render When you drag items around the map, some of the lines will bend. This will cause a \"Re-Render Map\" button to appear at the top-right of the page. This button can be clicked on to cause all lines to be re-drawn the way they will be shown in the viewer. Save Map Once you are happy with a set of changes that you have made, you can click on the \"Save Map\" button in the top-right of the page to commit changes to the database. This will cause anyone viewing the map to see the new version the next time their page refreshes. Adding Images You can add your own images to use on the custom map by copying files into the html/images/custommap/icons/ directory. Any files with a .svg, .png or .jpg extension will be shown in the image selection drop-down in the custom map editor.","title":"Custom Map"},{"location":"Extensions/Custom-Map/#custom-map","text":"LibreNMS has the ability to create custom maps to give a quick overview of parts of the network including up/down status of devices and link utilisation. These are also referred to as weather maps.","title":"Custom Map"},{"location":"Extensions/Custom-Map/#viewer","text":"Once some maps have been created, they will be visible to any users who have read access to all devices on a given map. Custom maps are available through the Overview -> Maps -> Custom Maps menu. Some key points about the viewer are: Nodes will change colour if they are down or disabled Links are only associated with a single network interface Link utilisation can only be shown if the link speed is known Link speed is decoded from SNMP if possible (Upload/Download) and defaults to the physical speed if SNMP data is not available, or cannot be decoded Links will change colour as follows: Black if the link is down, or the max speed is unknown Green at 0% utilisation, with a gradual change to Yellow at 50% utilisation, with a gradual change to Orange at 75% utilisation, with a gradual change to Red at 100% utilisation, with a gradual change to Purple at 150% utilisation and above","title":"Viewer"},{"location":"Extensions/Custom-Map/#viewer-url-options","text":"You can manually add the following parameters to a URL to alter the display of a custom map. The following URL options are available: bare=yes : Removes the control bar from the top of the page. screenshot=yes : Removes all labels from the nodes and links e.g. If you want bare and screenshot enabled, https:// nmsserver /maps/custom/2 becomes https:// nmsserver /maps/custom/2?bare=yes&screenshot=yes","title":"Viewer URL options"},{"location":"Extensions/Custom-Map/#editor","text":"To access the custom map editor, a user must be an admin. The editor is accessed through the Overview -> Maps -> Custom Map Editor menu. Once you are in the editor, you will be given a drop-down list of all the custom maps so you can choose one to edit, or select \"Create New Map\" to create a new map.","title":"Editor"},{"location":"Extensions/Custom-Map/#map-settings","text":"When you create a new map, you will be presented with a page to set some global map settings. These are: Name : The name for the map Width : The width of the map in pixels Height : The height of the map in pixels Node Alignment : When devices are added to the map, this will align the devices to an invisible grid this many pixels wide, which can help to make the maps look better. This can be set to 0 to disable. Background : An image (PNG/JPG) up to 2MB can be uploaded as a background. These settings can be changed at any stage by clicking on the \"Edit Map Settings\" button in the top-left of the editor.","title":"Map Settings"},{"location":"Extensions/Custom-Map/#nodes","text":"Once you have a map, you can start by adding \"nodes\" to the map. A node represents a device, or an external point in the network (e.g. the internet) To add a node, you click on the \"Add Node\" button in the control bar, then click on the map area where you want to add the node. You will then be aked for the following information: Label : The text to display on this point in the network Device : If this node represents a device, you can select the device from the drop-down. This will overwrite the label, which you can then change if you want to. Style : You can select the style of the node. If a device has been selected you can choose the LibreNMS icon by choosing \"Device Image\". You can also choose \"Icon\" to select an image for the device. Icon : If you choose \"Icon\" in the style box, you can select from a list of images to represent this node There are also options to choose the size and colour of the node and the font. Once you have finished choosing the options for the node, you can press Save to add it to the map. NOTE: This does not save anything to the database immediately. You need to click on the \"Save Map\" button in the top-right to save your changes to the database. You can edit a node at any time by selecting it on the map and clicking on the \"Edit Node\" button in the control bar. You can also modify the default settings for all new nodes by clicking on the \"Edit Node Default\" button at the top of the page.","title":"Nodes"},{"location":"Extensions/Custom-Map/#edges","text":"Once you have 2 or more nodes, you can add links between the nodes. These are called edges in the editor. To add a link, click on the \"Add Edge\" button in the control bar, then click on one of the nodes you want to link and drag the cursor to the second node that you want to link. You will then be prompted for the following information: From : The node that the link runs from (it will default to first node you selected) To : The node that the link runs to (it will default to the second node you selected) Port : If the From or To node is linked to a device, you can select an interface from one of the devices and the custom map will show traffic utilisation for the selected interface. Reverse Port Direction : If the selected port displays data in the wrong direction for the link, you can reverse it by toggling this option. Line Style : You can try different line styles, especially if you are running multiple links between the same 2 nodes Show percent usage : Choose whether to have text on the lines showing the link utilisation as a percentage Recenter Line : If you tick this box, the centre point of the line will be moved back to half way between the 2 nodes when you click on the save button. Once you have finished choosing the options for the node, you can press Save to add it to the map. NOTE: This does not save anything to the database immediately. You need to click on the \"Save Map\" button in the top-right to save your changes to the database. Once you press save, you it will create 3 objects on the screen, 2 arrows and a round node in the middle. Having the 3 objects allows you to move the mid point of the line off centre, and also allows us to display bandwidth information for both directions of the link. You can edit an edge at any time by selecting it on the map and clicking on the \"Edit Edge\" button in the control bar. You can also modify the default settings for all new edges by clicking on the \"Edit Edge Default\" button at the top of the page.","title":"Edges"},{"location":"Extensions/Custom-Map/#re-render","text":"When you drag items around the map, some of the lines will bend. This will cause a \"Re-Render Map\" button to appear at the top-right of the page. This button can be clicked on to cause all lines to be re-drawn the way they will be shown in the viewer.","title":"Re-Render"},{"location":"Extensions/Custom-Map/#save-map","text":"Once you are happy with a set of changes that you have made, you can click on the \"Save Map\" button in the top-right of the page to commit changes to the database. This will cause anyone viewing the map to see the new version the next time their page refreshes.","title":"Save Map"},{"location":"Extensions/Custom-Map/#adding-images","text":"You can add your own images to use on the custom map by copying files into the html/images/custommap/icons/ directory. Any files with a .svg, .png or .jpg extension will be shown in the image selection drop-down in the custom map editor.","title":"Adding Images"},{"location":"Extensions/Customizing-the-Web-UI/","text":"Customizing the Web UI Custom menu entry Create the file resources/views/menu/custom.blade.php Example contents:
          3. Custom Menu
          4. Custom device menu action You can add custom external links in the menu on the device page. This feature allows you to easily link applications to related systems, as shown in the example of Open-audIT. The url value is parsed by the Laravel Blade templating engine. You can access device variables such as $device->hostname , $device->sysName and use full PHP. settings/webui/device lnms config:set html.device.links.+ '{\"url\": \"http://atssrv/open-audit/index/devices/{{ $device->sysName }}\", \"title\": \"Open-AudIT\"}' Field Description url Url blade template resulting in valid url. Required. title Title text displayed in the menu. Required. icon Font Awesome icon class. Default: fa-external-link external Open link in new window. Default: true action Show as action on device list. Default: false Launching Windows programs from the LibreNMS device menu You can launch windows programs from links in LibreNMS, but it does take some registry entries on the client device. Save the following as winbox.reg, edit for your winbox.exe path and double click to add to your registry. Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\\winbox] @=\"URL:Winbox Protocol\" \"URL Protocol\"=\"\" [HKEY_CLASSES_ROOT\\winbox\\shell] [HKEY_CLASSES_ROOT\\winbox\\shell\\open] [HKEY_CLASSES_ROOT\\winbox\\shell\\open\\command] @=\"C:\\Windows\\System32\\WindowsPowerShell 1.0\\powershell.exe -Command \"$val='%l'; $val = $val.TrimEnd('/');if ($val.StartsWith('winbox://' { $val = $val.SubString(9) }; & 'C:\\Program Files\\winbox64.exe' \"$val\"\"\" Now we can use that in the device menu entry to open winbox. settings/webui/device lnms config:set html.device.links.+ '{\"url\": \"winbox://{{ $device->hostname }}\", \"title\": \"Winbox\"}' Setting the primary device menu action You can change the icon that is clickable in the device without having to open the dropdown menu. The primary button is edit device by default. settings/webui/device lnms config:set html.device.primary_link web Value Description edit Edit device web Connect to the device via https/http ssh launch ssh:// protocol to the device, make sure you have a handler registered telnet launch telnet:// protocol to the device capture Link to the device capture page custom1 Custom Link 1 custom2 Custom Link 2 custom3 Custom Link 3 custom4 Custom Link 4 custom5 Custom Link 5 custom6 Custom Link 6 custom7 Custom Link 7 custom8 Custom Link 8 !!! Custom http, ssh, telnet ports Custom ports can be set through the device setting misc tab and will be appended to the Uri. Empty value will not append anything and automatically default to the standard. - custom ssh port set to 2222 will result in ssh://10.0.0.0:2222 - custom telnet port set to 2323 will result in telnet://10.0.0.0:2323","title":"Customizing the Web UI"},{"location":"Extensions/Customizing-the-Web-UI/#customizing-the-web-ui","text":"","title":"Customizing the Web UI"},{"location":"Extensions/Customizing-the-Web-UI/#custom-menu-entry","text":"Create the file resources/views/menu/custom.blade.php Example contents:
          5. Custom Menu
          6. ","title":"Custom menu entry"},{"location":"Extensions/Customizing-the-Web-UI/#custom-device-menu-action","text":"You can add custom external links in the menu on the device page. This feature allows you to easily link applications to related systems, as shown in the example of Open-audIT. The url value is parsed by the Laravel Blade templating engine. You can access device variables such as $device->hostname , $device->sysName and use full PHP. settings/webui/device lnms config:set html.device.links.+ '{\"url\": \"http://atssrv/open-audit/index/devices/{{ $device->sysName }}\", \"title\": \"Open-AudIT\"}' Field Description url Url blade template resulting in valid url. Required. title Title text displayed in the menu. Required. icon Font Awesome icon class. Default: fa-external-link external Open link in new window. Default: true action Show as action on device list. Default: false","title":"Custom device menu action"},{"location":"Extensions/Customizing-the-Web-UI/#launching-windows-programs-from-the-librenms-device-menu","text":"You can launch windows programs from links in LibreNMS, but it does take some registry entries on the client device. Save the following as winbox.reg, edit for your winbox.exe path and double click to add to your registry. Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\\winbox] @=\"URL:Winbox Protocol\" \"URL Protocol\"=\"\" [HKEY_CLASSES_ROOT\\winbox\\shell] [HKEY_CLASSES_ROOT\\winbox\\shell\\open] [HKEY_CLASSES_ROOT\\winbox\\shell\\open\\command] @=\"C:\\Windows\\System32\\WindowsPowerShell 1.0\\powershell.exe -Command \"$val='%l'; $val = $val.TrimEnd('/');if ($val.StartsWith('winbox://' { $val = $val.SubString(9) }; & 'C:\\Program Files\\winbox64.exe' \"$val\"\"\" Now we can use that in the device menu entry to open winbox. settings/webui/device lnms config:set html.device.links.+ '{\"url\": \"winbox://{{ $device->hostname }}\", \"title\": \"Winbox\"}'","title":"Launching Windows programs from the LibreNMS device menu"},{"location":"Extensions/Customizing-the-Web-UI/#setting-the-primary-device-menu-action","text":"You can change the icon that is clickable in the device without having to open the dropdown menu. The primary button is edit device by default. settings/webui/device lnms config:set html.device.primary_link web Value Description edit Edit device web Connect to the device via https/http ssh launch ssh:// protocol to the device, make sure you have a handler registered telnet launch telnet:// protocol to the device capture Link to the device capture page custom1 Custom Link 1 custom2 Custom Link 2 custom3 Custom Link 3 custom4 Custom Link 4 custom5 Custom Link 5 custom6 Custom Link 6 custom7 Custom Link 7 custom8 Custom Link 8 !!! Custom http, ssh, telnet ports Custom ports can be set through the device setting misc tab and will be appended to the Uri. Empty value will not append anything and automatically default to the standard. - custom ssh port set to 2222 will result in ssh://10.0.0.0:2222 - custom telnet port set to 2323 will result in telnet://10.0.0.0:2323","title":"Setting the primary device menu action"},{"location":"Extensions/Dashboards/","text":"Dashboards Create customised dashboards in LibreNMS per user. You can share dashboards with other users. You can also make a custom dashboard and default it for all users in LibreNMS. Example Dashboard Widgets LibreNMS has a whole list of Widgets to select from. Alerts Widget: Displays all alert notifications. Availability Map: Displays all devices with colored tiles, green up, yellow for warning (device has been restarted in last 24 hours), red for down. You can also list all services and ignored/disabled devices in this widget. Components Status: List all components Ok state, Warning state, Critical state. Device Summary horizontal: List device totals, up, down, ignored, disabled. Same for ports and services. Device Summary vertical: List device totals, up, down, ignored, disabled. Same for ports and services. Eventlog: Displays all events with your devices and LibreNMS. External Image: can be used to show external images on your dashboard. Or images from inside LibreNMS. Globe Map: Will display map of the globe. Graph: Can be used to display graphs from devices. Graylog: Displays all Graylog's syslog entries. Notes: use for html tags, embed links and external web pages. Or just notes in general. Server Stats: Will display gauges for CPU, Memory, Storage usage. Note the device type has to be listed as \"Server\". Syslog: Displays all syslog entries. Top Devices: By Traffic, or Uptime, or Response time, or Poller Duration, or Processor load, or Memory Usage, or Storage Usage. Top Interfaces: Lists top interfaces by traffic utilization. World Map: displays all your devices locations. From syslocation or from override sysLocation. List of Widgets: Dashboard Permissions Private: Sets the dashboard to only the user that created the dashboard can view and edit. Shared Read: Sets the dashboard to allow other users to view the dashboard, but cant make changes to the dashboard. Shared: Allows all users to view the dashboard and make changes. Setting a global default dashboard Step 1: Set the dashboard to either shared read or shared, depending on what you want the users access to change. Step 2: Then go to Settings -> WebUI settings -> Dashboard Settings and set the global default dashboard. Setting embedded webpage Using the Notes Widget. < iframe src = \"your_url\" frameBorder = \"0\" width = \"100%\" height = \"100%\" > < p > Your browser does not support iframes. Note you may need to play with the width and height and also size your widget properly. src=\"url\" needs to be URL to webpage you are linking to. Also some web pages may not support html embedded or iframe. How to create ports graph In the dashboard, you want to create an interface graph select the widget called 'Graph' then select \"Port\" -> \"Bits\" Note: you can map the port by description or the alias or by port id. You will need to know this in order to map the port to the graph. Dimension parameter replacement for Generic-image widget When using the Generic-image widget you can provide the width and height of the widget with your request. This will ensure that the image will fit nicely with the dimensions if the Generic-image widget. You can add @AUTO_HEIGHT@ and @AUTO_WIDTH@ to the Image URL as parameters. Examples: http://librenms.example.com/graph.php?id=333%2C444&type=multiport_bits_separate&legend=no&absolute=1&from=-14200&width=@AUTO_WIDTH@&height=@AUTO_HEIGHT@ http://example.com/myimage.php?size=@AUTO_WIDTH@x@AUTO_HEIGHT@","title":"Dashboards"},{"location":"Extensions/Dashboards/#dashboards","text":"Create customised dashboards in LibreNMS per user. You can share dashboards with other users. You can also make a custom dashboard and default it for all users in LibreNMS. Example Dashboard","title":"Dashboards"},{"location":"Extensions/Dashboards/#widgets","text":"LibreNMS has a whole list of Widgets to select from. Alerts Widget: Displays all alert notifications. Availability Map: Displays all devices with colored tiles, green up, yellow for warning (device has been restarted in last 24 hours), red for down. You can also list all services and ignored/disabled devices in this widget. Components Status: List all components Ok state, Warning state, Critical state. Device Summary horizontal: List device totals, up, down, ignored, disabled. Same for ports and services. Device Summary vertical: List device totals, up, down, ignored, disabled. Same for ports and services. Eventlog: Displays all events with your devices and LibreNMS. External Image: can be used to show external images on your dashboard. Or images from inside LibreNMS. Globe Map: Will display map of the globe. Graph: Can be used to display graphs from devices. Graylog: Displays all Graylog's syslog entries. Notes: use for html tags, embed links and external web pages. Or just notes in general. Server Stats: Will display gauges for CPU, Memory, Storage usage. Note the device type has to be listed as \"Server\". Syslog: Displays all syslog entries. Top Devices: By Traffic, or Uptime, or Response time, or Poller Duration, or Processor load, or Memory Usage, or Storage Usage. Top Interfaces: Lists top interfaces by traffic utilization. World Map: displays all your devices locations. From syslocation or from override sysLocation. List of Widgets:","title":"Widgets"},{"location":"Extensions/Dashboards/#dashboard-permissions","text":"Private: Sets the dashboard to only the user that created the dashboard can view and edit. Shared Read: Sets the dashboard to allow other users to view the dashboard, but cant make changes to the dashboard. Shared: Allows all users to view the dashboard and make changes.","title":"Dashboard Permissions"},{"location":"Extensions/Dashboards/#setting-a-global-default-dashboard","text":"Step 1: Set the dashboard to either shared read or shared, depending on what you want the users access to change. Step 2: Then go to Settings -> WebUI settings -> Dashboard Settings and set the global default dashboard.","title":"Setting a global default dashboard"},{"location":"Extensions/Dashboards/#setting-embedded-webpage","text":"Using the Notes Widget. < iframe src = \"your_url\" frameBorder = \"0\" width = \"100%\" height = \"100%\" > < p > Your browser does not support iframes. Note you may need to play with the width and height and also size your widget properly. src=\"url\" needs to be URL to webpage you are linking to. Also some web pages may not support html embedded or iframe.","title":"Setting embedded webpage"},{"location":"Extensions/Dashboards/#how-to-create-ports-graph","text":"In the dashboard, you want to create an interface graph select the widget called 'Graph' then select \"Port\" -> \"Bits\" Note: you can map the port by description or the alias or by port id. You will need to know this in order to map the port to the graph.","title":"How to create ports graph"},{"location":"Extensions/Dashboards/#dimension-parameter-replacement-for-generic-image-widget","text":"When using the Generic-image widget you can provide the width and height of the widget with your request. This will ensure that the image will fit nicely with the dimensions if the Generic-image widget. You can add @AUTO_HEIGHT@ and @AUTO_WIDTH@ to the Image URL as parameters. Examples: http://librenms.example.com/graph.php?id=333%2C444&type=multiport_bits_separate&legend=no&absolute=1&from=-14200&width=@AUTO_WIDTH@&height=@AUTO_HEIGHT@ http://example.com/myimage.php?size=@AUTO_WIDTH@x@AUTO_HEIGHT@","title":"Dimension parameter replacement for Generic-image widget"},{"location":"Extensions/Dell-OpenManage/","text":"Dell OpenManage Support For Dell OpenManage support you will need to install Dell OpenManage (yeah - really :)) (minimum 5.1) onto the device you want to monitor. Ensure that net-snmp is using srvadmin, you should see something similar to: master agentx view all included .1 access notConfigGroup \"\" any noauth exact all none none smuxpeer .1.3.6.1.4.1.674.10892.1 Restart net-snmp: service snmpd restart Ensure that srvadmin is started, this is usually done by executing: /opt/dell/srvadmin/sbin/srvadmin-services.sh start Once this has been done, add the device to LibreNMS as normal and you will start to receive Temperatures and Fan speed data. Windows Download OpenManage from Dell's support page Link and install OpenManage on your windows server. Make sure you have SNMP setup and running on your windows server.","title":"Dell OpenManage"},{"location":"Extensions/Dell-OpenManage/#dell-openmanage-support","text":"For Dell OpenManage support you will need to install Dell OpenManage (yeah - really :)) (minimum 5.1) onto the device you want to monitor. Ensure that net-snmp is using srvadmin, you should see something similar to: master agentx view all included .1 access notConfigGroup \"\" any noauth exact all none none smuxpeer .1.3.6.1.4.1.674.10892.1 Restart net-snmp: service snmpd restart Ensure that srvadmin is started, this is usually done by executing: /opt/dell/srvadmin/sbin/srvadmin-services.sh start Once this has been done, add the device to LibreNMS as normal and you will start to receive Temperatures and Fan speed data.","title":"Dell OpenManage Support"},{"location":"Extensions/Dell-OpenManage/#windows","text":"Download OpenManage from Dell's support page Link and install OpenManage on your windows server. Make sure you have SNMP setup and running on your windows server.","title":"Windows"},{"location":"Extensions/Dependency-Map/","text":"Dependency Map LibreNMS has the ability to show you a dynamic network map based on device dependencies that have been configure. These maps are accessed through the following menu options: Overview -> Maps -> Device Dependency Overview -> Maps -> Device Groups Dependencies Settings The map display can be configured by altering the VisJS-Config.md","title":"Dependency Map"},{"location":"Extensions/Dependency-Map/#dependency-map","text":"LibreNMS has the ability to show you a dynamic network map based on device dependencies that have been configure. These maps are accessed through the following menu options: Overview -> Maps -> Device Dependency Overview -> Maps -> Device Groups Dependencies","title":"Dependency Map"},{"location":"Extensions/Dependency-Map/#settings","text":"The map display can be configured by altering the VisJS-Config.md","title":"Settings"},{"location":"Extensions/Device-Groups/","text":"Grouping Devices LibreNMS supports grouping your devices together in much the same way as you can configure alerts. This document will hopefully help you get started. Dynamic Groups Rule Editor The rule is based on the MySQL structure your data is in. Such as tablename.columnname . If you already know the entity you want, you can browse around inside MySQL using show tables and desc . As a working example and a common question, let's assume you want to group devices by hostname. If your hostname format is dcX.[devicetype].example.com. You would use the field devices.hostname . If you want to group them by device type, you would add a rule for routers of devices.hostname endswith rtr.example.com . If you want to group them by DC, you could use the rule devices.hostname regex dc1\\..*\\.example\\.com (Don't forget to escape periods in the regex) Static Groups You can create static groups (and convert dynamic groups to static) to put specific devices in a group. Just select static as the type and select the devices you want in the group. You can now select this group from the Devices -> All Devices link in the navigation at the top. You can also use the group to map alert rules to by creating an alert mapping Overview -> Alerts -> Rule Mapping .","title":"Grouping Devices"},{"location":"Extensions/Device-Groups/#grouping-devices","text":"LibreNMS supports grouping your devices together in much the same way as you can configure alerts. This document will hopefully help you get started.","title":"Grouping Devices"},{"location":"Extensions/Device-Groups/#dynamic-groups","text":"","title":"Dynamic Groups"},{"location":"Extensions/Device-Groups/#rule-editor","text":"The rule is based on the MySQL structure your data is in. Such as tablename.columnname . If you already know the entity you want, you can browse around inside MySQL using show tables and desc . As a working example and a common question, let's assume you want to group devices by hostname. If your hostname format is dcX.[devicetype].example.com. You would use the field devices.hostname . If you want to group them by device type, you would add a rule for routers of devices.hostname endswith rtr.example.com . If you want to group them by DC, you could use the rule devices.hostname regex dc1\\..*\\.example\\.com (Don't forget to escape periods in the regex)","title":"Rule Editor"},{"location":"Extensions/Device-Groups/#static-groups","text":"You can create static groups (and convert dynamic groups to static) to put specific devices in a group. Just select static as the type and select the devices you want in the group. You can now select this group from the Devices -> All Devices link in the navigation at the top. You can also use the group to map alert rules to by creating an alert mapping Overview -> Alerts -> Rule Mapping .","title":"Static Groups"},{"location":"Extensions/Dispatcher-Service/","text":"Dispatcher Service Status: Release Candidate The LibreNMS dispatcher service ( librenms-service.py ) is a new method of running the poller service at set times. It does not replace the php scripts, just the cron entries running them. External Requirements A recent version of Python The LibreNMS service requires Python 3 and some features require behaviour only found in Python3.4+. Python modules PyMySQL is recommended as it requires no C compiler to install. MySQLclient can also be used, but does require compilation. python-dotenv .env loader redis-py 4.0+ and Redis 5.0+ server (if using distributed polling) psutil These can be obtained from your OS package manager, or from PyPI with the below commands. pip3 install -r requirements.txt Redis (distributed polling) If you want to use distributed polling, you'll need a Redis instance to coordinate the nodes. It's recommended that you do not share the Redis database with any other system - by default, Redis supports up to 16 databases (numbered 0-15). You can also use Redis on a single host if you want It's strongly recommended that you deploy a resilient cluster of redis systems, and use redis-sentinel. You should not rely on the password for the security of your system. See https://redis.io/topics/security Memcached (distributed polling) LibreNMS can still use memcached as a locking mechanism when using distributed polling. So you can configure memcached for this purpose unless you have updates disabled. See Locking Mechanisms at https://docs.librenms.org/Extensions/Distributed-Poller/ MySQL You should already have this, but the pollers do need access to the SQL database. The LibreNMS service runs faster and more aggressively than the standard poller, so keep an eye on the number of open connections and other important health metrics. Configuration Connection settings are required in .env . The .env file is generated after composer install and APP_KEY and NODE_ID are set. Remember that the APP_KEY value must be the same on all your pollers. #APP_KEY= #Required, generated by composer install #NODE_ID= #Required, generated by composer install DB_HOST=localhost DB_DATABASE=librenms DB_USERNAME=librenms DB_PASSWORD= Distributed Polling Configuration Once you have your Redis database set up, configure it in the .env file on each node. Configure the redis cache driver for distributed locking. There are a number of options - most of them are optional if your redis instance is standalone and unauthenticated (neither recommended). ## ## Standalone ## REDIS_HOST=127.0.0.1 REDIS_PORT=6379 REDIS_DB=0 REDIS_TIMEOUT=60 # If requirepass is set in redis set everything above as well as: (recommended) REDIS_PASSWORD=PasswordGoesHere # If ACL's are in use, set everything above as well as: (highly recommended) REDIS_USERNAME=UsernameGoesHere ## ## Sentinel ## REDIS_SENTINEL=redis-001.example.org:26379,redis-002.example.org:26379,redis-003.example.org:26379 REDIS_SENTINEL_SERVICE=mymaster # If requirepass is set in sentinel, set everything above as well as: (recommended) REDIS_SENTINEL_PASSWORD=SentinelPasswordGoesHere # If ACL's are in use, set everything above as well as: (highly recommended) REDIS_SENTINEL_USERNAME=SentinelUsernameGoesHere For more information on ACL's, see https://redis.io/docs/management/security/acl/ Note that if you use Sentinel, you may still need REDIS_PASSWORD , REDIS_USERNAME , REDIS_DB and REDIS_TIMEOUT - Sentinel just provides the address of the instance currently accepting writes and manages failover. It's possible (and recommended) to have authentication both on Sentinel and the managed Redis instances. Basic Configuration Additional configuration settings can be set in your config. The defaults are shown here - it's recommended that you at least tune the number of workers. poller/distributed lnms config:set service_poller_workers 24 lnms config:set service_services_workers 8 lnms config:set service_discovery_workers 16 Optional Settings poller/distributed lnms config:set service_poller_frequency 300 lnms config:set service_services_frequency 300 lnms config:set service_discovery_frequency 21600 lnms config:set service_billing_frequency 300 lnms config:set service_billing_calculate_frequency 60 lnms config:set service_poller_down_retry 60 lnms config:set service_loglevel INFO lnms config:set service_update_frequency 86400 There are also some SQL options, but these should be inherited from your LibreNMS web UI configuration. Logs are sent to the system logging service (usually journald or rsyslog ) - see https://docs.python.org/3/library/logging.html#logging-levels for the options available. $config [ 'distributed_poller' ] = true ; # Set to true to enable distributed polling $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); # Uniquely identifies the poller instance $config [ 'distributed_poller_group' ] = 0 ; # Which group to poll Tuning the number of workers See https://your_librenms_install/poller You want to keep Consumed Worker Seconds comfortably below Maximum Worker Seconds. The closer the values are to each other, the flatter the CPU graph of the poller machine. Meaning that you are utilizing your CPU resources well. As long as Consumed WS stays below Maximum WS and Devices Pending is 0, you should be ok. If Consumed WS is below Maximum WS and Devices Pending is > 0, your hardware is not up to the task. Maximum WS equals the number of workers multiplied with the number of seconds in the polling period. (default 300) Fast Ping The fast ping scheduler is disabled by default. You can enable it by setting the following: $config [ 'service_ping_enabled' ] = true ; Watchdog The watchdog scheduler is disabled by default. You can enable it by setting the following: $config [ 'service_watchdog_enabled' ] = true ; The watchdog scheduler will check that the poller log file has been written to within the last poll period. If there is no change to the log file since, the watchdog will restart the polling service. The poller log file is set by $config['log_file'] and defaults to ./logs/librenms.log Cron Scripts Once the LibreNMS service is installed, the cron scripts used by LibreNMS to start alerting, polling, discovery and maintenance tasks are no longer required and must be disabled either by removing or commenting them out. The service handles these tasks when enabled. The only cron task enabled after switching to the dispatcher service should be the following: * * * * * librenms cd /opt/librenms/ && php artisan schedule:run >> /dev/null 2>&1 Service Installation A systemd unit file is provided - You must adapt ExecStart and WorkingDirectory if you did not install librenms in /opt/librenms The sysv and upstart init scripts could also be used with a little modification. systemd service A systemd unit file can be found in misc/librenms.service . To install run: cp /opt/librenms/misc/librenms.service /etc/systemd/system/librenms.service && systemctl enable --now librenms.service systemd service with watchdog This service file is an alternative to the above service file. It uses the systemd WatchdogSec= option to restart the service if it does not receive a keep-alive from the running process. A systemd unit file can be found in misc/librenms-watchdog.service . To install run: cp /opt/librenms/misc/librenms-watchdog.service /etc/systemd/system/librenms.service && systemctl enable --now librenms.service This requires: python3-systemd (or python-systemd on older systems) or https://pypi.org/project/systemd-python/ If you run this systemd service without python3-systemd it will restart every 30 seconds. OS-Specific Instructions RHEL/CentOS To get the LibreNMS service running under python3.4+ on RHEL-derivatives with minimal fuss, you can use the software collections build: First, enable SCL's on your system: CentOS 7 # yum install centos-release-scl RHEL 7 # subscription-manager repos --enable rhel-server-rhscl-7-rpms Then install and configure the runtime and service: # yum install gcc rh-python36 rh-python36-python-devel epel-release # yum --enablerepo=remi install redis # vi /opt/librenms/config.php # vi /etc/redis.conf # systemctl enable --now redis.service # scl enable rh-python36 bash # change directory to librenms (default /opt/librenms) # pip3 install -r requirements.txt # cp /opt/librenms/misc/librenms.service.scl /etc/systemd/system/librenms.service # systemctl enable --now librenms.service If you want to use another version of python 3, change rh-python36 in the unit file and the commands above to match the name of the replacement scl. Debian/Ubuntu Debian 11 (Bullseye) Warning: Bullseye provide PHP 7.4 that is too old to run LibreNMS. Debian 12 (Bookworm) Warning: Bookworm is not available as stable yet (as 2022 november). Install dependancies apt install python3 python3-mysqldb python3-dotenv Add the python3-systemd package for service with watchdog.","title":"Dispatcher Service (RC)"},{"location":"Extensions/Dispatcher-Service/#dispatcher-service","text":"Status: Release Candidate The LibreNMS dispatcher service ( librenms-service.py ) is a new method of running the poller service at set times. It does not replace the php scripts, just the cron entries running them.","title":"Dispatcher Service"},{"location":"Extensions/Dispatcher-Service/#external-requirements","text":"","title":"External Requirements"},{"location":"Extensions/Dispatcher-Service/#a-recent-version-of-python","text":"The LibreNMS service requires Python 3 and some features require behaviour only found in Python3.4+.","title":"A recent version of Python"},{"location":"Extensions/Dispatcher-Service/#python-modules","text":"PyMySQL is recommended as it requires no C compiler to install. MySQLclient can also be used, but does require compilation. python-dotenv .env loader redis-py 4.0+ and Redis 5.0+ server (if using distributed polling) psutil These can be obtained from your OS package manager, or from PyPI with the below commands. pip3 install -r requirements.txt","title":"Python modules"},{"location":"Extensions/Dispatcher-Service/#redis-distributed-polling","text":"If you want to use distributed polling, you'll need a Redis instance to coordinate the nodes. It's recommended that you do not share the Redis database with any other system - by default, Redis supports up to 16 databases (numbered 0-15). You can also use Redis on a single host if you want It's strongly recommended that you deploy a resilient cluster of redis systems, and use redis-sentinel. You should not rely on the password for the security of your system. See https://redis.io/topics/security","title":"Redis (distributed polling)"},{"location":"Extensions/Dispatcher-Service/#memcached-distributed-polling","text":"LibreNMS can still use memcached as a locking mechanism when using distributed polling. So you can configure memcached for this purpose unless you have updates disabled. See Locking Mechanisms at https://docs.librenms.org/Extensions/Distributed-Poller/","title":"Memcached (distributed polling)"},{"location":"Extensions/Dispatcher-Service/#mysql","text":"You should already have this, but the pollers do need access to the SQL database. The LibreNMS service runs faster and more aggressively than the standard poller, so keep an eye on the number of open connections and other important health metrics.","title":"MySQL"},{"location":"Extensions/Dispatcher-Service/#configuration","text":"Connection settings are required in .env . The .env file is generated after composer install and APP_KEY and NODE_ID are set. Remember that the APP_KEY value must be the same on all your pollers. #APP_KEY= #Required, generated by composer install #NODE_ID= #Required, generated by composer install DB_HOST=localhost DB_DATABASE=librenms DB_USERNAME=librenms DB_PASSWORD=","title":"Configuration"},{"location":"Extensions/Dispatcher-Service/#distributed-polling-configuration","text":"Once you have your Redis database set up, configure it in the .env file on each node. Configure the redis cache driver for distributed locking. There are a number of options - most of them are optional if your redis instance is standalone and unauthenticated (neither recommended). ## ## Standalone ## REDIS_HOST=127.0.0.1 REDIS_PORT=6379 REDIS_DB=0 REDIS_TIMEOUT=60 # If requirepass is set in redis set everything above as well as: (recommended) REDIS_PASSWORD=PasswordGoesHere # If ACL's are in use, set everything above as well as: (highly recommended) REDIS_USERNAME=UsernameGoesHere ## ## Sentinel ## REDIS_SENTINEL=redis-001.example.org:26379,redis-002.example.org:26379,redis-003.example.org:26379 REDIS_SENTINEL_SERVICE=mymaster # If requirepass is set in sentinel, set everything above as well as: (recommended) REDIS_SENTINEL_PASSWORD=SentinelPasswordGoesHere # If ACL's are in use, set everything above as well as: (highly recommended) REDIS_SENTINEL_USERNAME=SentinelUsernameGoesHere For more information on ACL's, see https://redis.io/docs/management/security/acl/ Note that if you use Sentinel, you may still need REDIS_PASSWORD , REDIS_USERNAME , REDIS_DB and REDIS_TIMEOUT - Sentinel just provides the address of the instance currently accepting writes and manages failover. It's possible (and recommended) to have authentication both on Sentinel and the managed Redis instances.","title":"Distributed Polling Configuration"},{"location":"Extensions/Dispatcher-Service/#basic-configuration","text":"Additional configuration settings can be set in your config. The defaults are shown here - it's recommended that you at least tune the number of workers. poller/distributed lnms config:set service_poller_workers 24 lnms config:set service_services_workers 8 lnms config:set service_discovery_workers 16 Optional Settings poller/distributed lnms config:set service_poller_frequency 300 lnms config:set service_services_frequency 300 lnms config:set service_discovery_frequency 21600 lnms config:set service_billing_frequency 300 lnms config:set service_billing_calculate_frequency 60 lnms config:set service_poller_down_retry 60 lnms config:set service_loglevel INFO lnms config:set service_update_frequency 86400 There are also some SQL options, but these should be inherited from your LibreNMS web UI configuration. Logs are sent to the system logging service (usually journald or rsyslog ) - see https://docs.python.org/3/library/logging.html#logging-levels for the options available. $config [ 'distributed_poller' ] = true ; # Set to true to enable distributed polling $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); # Uniquely identifies the poller instance $config [ 'distributed_poller_group' ] = 0 ; # Which group to poll","title":"Basic Configuration"},{"location":"Extensions/Dispatcher-Service/#tuning-the-number-of-workers","text":"See https://your_librenms_install/poller You want to keep Consumed Worker Seconds comfortably below Maximum Worker Seconds. The closer the values are to each other, the flatter the CPU graph of the poller machine. Meaning that you are utilizing your CPU resources well. As long as Consumed WS stays below Maximum WS and Devices Pending is 0, you should be ok. If Consumed WS is below Maximum WS and Devices Pending is > 0, your hardware is not up to the task. Maximum WS equals the number of workers multiplied with the number of seconds in the polling period. (default 300)","title":"Tuning the number of workers"},{"location":"Extensions/Dispatcher-Service/#fast-ping","text":"The fast ping scheduler is disabled by default. You can enable it by setting the following: $config [ 'service_ping_enabled' ] = true ;","title":"Fast Ping"},{"location":"Extensions/Dispatcher-Service/#watchdog","text":"The watchdog scheduler is disabled by default. You can enable it by setting the following: $config [ 'service_watchdog_enabled' ] = true ; The watchdog scheduler will check that the poller log file has been written to within the last poll period. If there is no change to the log file since, the watchdog will restart the polling service. The poller log file is set by $config['log_file'] and defaults to ./logs/librenms.log","title":"Watchdog"},{"location":"Extensions/Dispatcher-Service/#cron-scripts","text":"Once the LibreNMS service is installed, the cron scripts used by LibreNMS to start alerting, polling, discovery and maintenance tasks are no longer required and must be disabled either by removing or commenting them out. The service handles these tasks when enabled. The only cron task enabled after switching to the dispatcher service should be the following: * * * * * librenms cd /opt/librenms/ && php artisan schedule:run >> /dev/null 2>&1","title":"Cron Scripts"},{"location":"Extensions/Dispatcher-Service/#service-installation","text":"A systemd unit file is provided - You must adapt ExecStart and WorkingDirectory if you did not install librenms in /opt/librenms The sysv and upstart init scripts could also be used with a little modification.","title":"Service Installation"},{"location":"Extensions/Dispatcher-Service/#systemd-service","text":"A systemd unit file can be found in misc/librenms.service . To install run: cp /opt/librenms/misc/librenms.service /etc/systemd/system/librenms.service && systemctl enable --now librenms.service","title":"systemd service"},{"location":"Extensions/Dispatcher-Service/#systemd-service-with-watchdog","text":"This service file is an alternative to the above service file. It uses the systemd WatchdogSec= option to restart the service if it does not receive a keep-alive from the running process. A systemd unit file can be found in misc/librenms-watchdog.service . To install run: cp /opt/librenms/misc/librenms-watchdog.service /etc/systemd/system/librenms.service && systemctl enable --now librenms.service This requires: python3-systemd (or python-systemd on older systems) or https://pypi.org/project/systemd-python/ If you run this systemd service without python3-systemd it will restart every 30 seconds.","title":"systemd service with watchdog"},{"location":"Extensions/Dispatcher-Service/#os-specific-instructions","text":"","title":"OS-Specific Instructions"},{"location":"Extensions/Dispatcher-Service/#rhelcentos","text":"To get the LibreNMS service running under python3.4+ on RHEL-derivatives with minimal fuss, you can use the software collections build: First, enable SCL's on your system:","title":"RHEL/CentOS"},{"location":"Extensions/Dispatcher-Service/#centos-7","text":"# yum install centos-release-scl","title":"CentOS 7"},{"location":"Extensions/Dispatcher-Service/#rhel-7","text":"# subscription-manager repos --enable rhel-server-rhscl-7-rpms Then install and configure the runtime and service: # yum install gcc rh-python36 rh-python36-python-devel epel-release # yum --enablerepo=remi install redis # vi /opt/librenms/config.php # vi /etc/redis.conf # systemctl enable --now redis.service # scl enable rh-python36 bash # change directory to librenms (default /opt/librenms) # pip3 install -r requirements.txt # cp /opt/librenms/misc/librenms.service.scl /etc/systemd/system/librenms.service # systemctl enable --now librenms.service If you want to use another version of python 3, change rh-python36 in the unit file and the commands above to match the name of the replacement scl.","title":"RHEL 7"},{"location":"Extensions/Dispatcher-Service/#debianubuntu","text":"","title":"Debian/Ubuntu"},{"location":"Extensions/Dispatcher-Service/#debian-11-bullseye","text":"Warning: Bullseye provide PHP 7.4 that is too old to run LibreNMS.","title":"Debian 11 (Bullseye)"},{"location":"Extensions/Dispatcher-Service/#debian-12-bookworm","text":"Warning: Bookworm is not available as stable yet (as 2022 november). Install dependancies apt install python3 python3-mysqldb python3-dotenv Add the python3-systemd package for service with watchdog.","title":"Debian 12 (Bookworm)"},{"location":"Extensions/Distributed-Poller/","text":"Distributed Poller A normal install contains all parts of LibreNMS: Poller/Discovery/etc workers RRD (Time series data store) * Database * Webserver (Web UI/API) * * may only be installed on one server (however, some can be clustered) Distributed Polling allows the workers to be spread across additional servers for horizontal scaling. Distributed polling is not intended for remote polling. Devices can be grouped together into a poller_group to pin these devices to a single or a group of designated pollers. All pollers need to write to the same set of RRD files, preferably via RRDcached. It is also a requirement that at least one locking service is in place to which all pollers can connect. There are currently three locking mechanisms available memcached redis (preferred) sql locks (default) All of the above locking mechanisms are natively supported in LibreNMS. If none are specified, it will default to using SQL. Requirements for distributed polling These requirements are above the normal requirements for a full LibreNMS install. rrdtool version 1.4 or above At least one locking mechanism configured a rrdcached install By default, all hosts are shared and have the poller_group = 0 . To pin a device to a poller, set it to a value greater than 0 and set the same value in the poller's config with distributed_poller_group . One can also specify a comma separated string of poller groups in distributed_poller_group . The poller will then poll devices from any of the groups listed. If new devices get added from the poller they will be assigned to the first poller group in the list unless the group is specified when adding the device. The following is a standard config, combined with a locking mechanism below: poller/distributed lnms config:set distributed_poller true lnms config:set distributed_poller_group 0 If you want to customise the hostname for the poller then you will need to set this in config.php : $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); Locking mechanisms Pick one of the following setups, do not use all of them at the same time. Using REDIS In your .env file you will need to specify a redis server, port and the driver. REDIS_HOST=HOSTNAME or IP REDIS_PORT=6379 CACHE_DRIVER=redis Using Memcached Preferably you should set the memcached server settings via the web UI. Under Settings > Global Settings > Distributed poller, you fill out the memcached host and port, and then in your .env file you will need to add: CACHE_DRIVER=memcached If you want to use memcached, you will also need to install an additional Python 3 python-memcached package. Example Setup Below is an example setup based on a real deployment which at the time of writing covers over 2,500 devices and 50,000 ports. The setup is running within an OpenStack environment with some commodity hardware for remote pollers. Here's a diagram of how you can scale LibreNMS out: Architecture How you set the distribution up is entirely up to you. You can choose to host the majority of the required services on a single virtual machine or server and then a poller to actually query the devices being monitored, all the way through to having a dedicated server for each of the individual roles. Below are notes on what you need to consider both from the software layer, but also connectivity. Web / API Layer This is typically Apache but we have setup guides for both Nginx and Lighttpd which should work perfectly fine. There is nothing unique about the role this service is providing except that if you are adding devices from this layer then the web service will need to be able to connect to the end device via SNMP and perform an ICMP test. It is advisable to run RRDCached within this setup so that you don't need to share the rrd folder via a remote file share such as NFS. The web service can then generate rrd graphs via RRDCached. If RRDCached isn't an option then you can mount the rrd directory to read the RRD files directly. Database Server MySQL / MariaDB - At the moment these are the only database servers that are supported. The pollers, web and API layers should all be able to access the database server directly. RRD Storage Central storage should be provided so all RRD files can be read from and written to in one location. As suggested above, it's recommended that RRD Cached is configured and used. For this example, we are running RRDCached to allow all pollers and web/api servers to read/write to the rrd files with the rrd directory also exported by NFS for simple access and maintenance. Pollers Pollers can be installed and run from anywhere, the only requirements are: They can access the Memcache instance They can create RRD files via some method such as a shared filesystem or RRDTool >=1.5.5 They can access the MySQL server You can either assign pollers into groups and set a poller group against certain devices, this will mean that those devices will only be processed by certain pollers (default poller group is 0) or you can assign all pollers to the default poller group for them to process any and all devices. This will provide the ability to have a single poller behind a NAT firewall monitor internal devices and report back to your central system. You will then be able to monitor those devices from the Web UI as normal. Another benefit to this is that you can provide N+x pollers, i.e if you know that you require three pollers to process all devices within 300 seconds then adding a 4th poller will mean that should any one single poller fail then the remaining three will complete polling in time. You could also use this to take a poller out of service for maintenance, i.e OS updates and software updates. It is extremely advisable to either run a central recursive dns server such as pdns-recursor and have all of your pollers use this or install a recursive dns server on each poller - the volume of DNS requests on large installs can be significant and will slow polling down enough to cause issues with a large number of devices. A last note to make sure of, is that all pollers writing to the same DB need to have the same APP_KEY value set in the .env file. Discovery Depending on your setup will depend on how you configure your discovery processes. Cron based polling It's not necessary to run discovery services on all pollers. In fact, you should only run one discovery process per poller group. Designate a single poller to run discovery (or a separate server if required). If you run billing, you can do this in one of two ways: Run poll-billing.php and calculate-billing.php on a single poller which will create billing information for all bills. Please note this poller must have snmp access to all of your devices which have ports within a bill. The other option is to enable $config['distributed_billing'] = true; in config.php. Then run poll-billing.php on a single poller per group. You can run calculate-billing.php on any poller but only one poller overall. Dispatcher service When using the dispatcher service, discovery can run on all nodes. Configuration Settings in config.php should be copied to all servers as they only apply locally. One way around this is to set settings in the database via the web ui or ./lnms config:set Config sample The following config is taken from a live setup which consists of a Web server, DB server, RRDCached server and 3 pollers. Web Server: Running Apache and an install of LibreNMS in /opt/librenms poller/distributed lnms config:set distributed_poller true poller/rrdtool lnms config:set rrdcached \"example.com:42217\" Database Server: Running Memcache and MariaDB Memcache Ubuntu (/etc/memcached.conf) -d -m 64 -p 11211 -u memcache -l ip.ip.ip.ip RRDCached Server: Running RRDCached RRDCached Ubuntu (/etc/default/rrdcached) OPTS=\"-l 0:42217\" OPTS=\"$OPTS -j /var/lib/rrdcached/journal/ -F\" OPTS=\"$OPTS -b /opt/librenms/rrd -B\" OPTS=\"$OPTS -w 1800 -z 900\" Ubuntu (/etc/default/rrdcached) - RRDCached 1.5.5 and above. BASE_OPTIONS=\"-l 0:42217\" BASE_OPTIONS=\"$BASE_OPTIONS -R -j /var/lib/rrdcached/journal/ -F\" BASE_OPTIONS=\"$BASE_OPTIONS -b /opt/librenms/rrd -B\" BASE_OPTIONS=\"$BASE_OPTIONS -w 1800 -z 900\" Poller 1: Running an install of LibreNMS in /opt/librenms config.php $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); $config [ 'distributed_poller_group' ] = '0' ; $config [ 'distributed_billing' ] = true ; poller/distributed lnms config:set distributed_poller_memcached_host \"example.com\" lnms config:set distributed_poller_memcached_port 11211 lnms config:set distributed_poller true poller/rrdtool lnms config:set rrdcached \"example.com:42217\" /etc/cron.d/librenms Runs discovery and polling for group 0, daily.sh to deal with notifications and DB cleanup and alerts. 33 */6 * * * librenms /opt/librenms/cronic /opt/librenms/discovery-wrapper.py 1 */5 * * * * librenms /opt/librenms/discovery.php -h new >> /dev/null 2>&1 */5 * * * * librenms /opt/librenms/cronic /opt/librenms/poller-wrapper.py 16 15 0 * * * librenms /opt/librenms/daily.sh >> /dev/null 2>&1 * * * * * librenms /opt/librenms/alerts.php >> /dev/null 2>&1 Poller 2: Running an install of LibreNMS in /opt/librenms config.php $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); $config [ 'distributed_poller_group' ] = '0' ; $config [ 'distributed_billing' ] = true ; poller/distributed lnms config:set distributed_poller_memcached_host \"example.com\" lnms config:set distributed_poller_memcached_port 11211 lnms config:set distributed_poller true poller/rrdtool lnms config:set rrdcached \"example.com:42217\" /etc/cron.d/librenms Runs billing as well as polling for group 0. */5 * * * * librenms /opt/librenms/poller-wrapper.py 16 >> /opt/librenms/logs/wrapper.log */5 * * * * librenms /opt/librenms/poll-billing.php >> /dev/null 2>&1 01 * * * * librenms /opt/librenms/billing-calculate.php >> /dev/null 2>&1 15 0 * * * librenms /opt/librenms/daily.sh >> /dev/null 2>&1 Poller 3: Running an install of LibreNMS in /opt/librenms config.php $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); $config [ 'distributed_poller_group' ] = '2,3' ; $config [ 'distributed_billing' ] = true ; poller/distributed lnms config:set distributed_poller_memcached_host \"example.com\" lnms config:set distributed_poller_memcached_port 11211 lnms config:set distributed_poller true poller/rrdtool lnms config:set rrdcached \"example.com:42217\" /etc/cron.d/librenms Runs discovery and polling for groups 2 and 3. 33 */6 * * * librenms /opt/librenms/cronic /opt/librenms/discovery-wrapper.py 1 */5 * * * * librenms /opt/librenms/discovery.php -h new >> /dev/null 2>&1 */5 * * * * librenms /opt/librenms/poll-billing.php >> /dev/null 2>&1 */5 * * * * librenms /opt/librenms/cronic /opt/librenms/poller-wrapper.py 16 15 0 * * * librenms /opt/librenms/daily.sh >> /dev/null 2>&1","title":"Scaling LibreNMS"},{"location":"Extensions/Distributed-Poller/#distributed-poller","text":"A normal install contains all parts of LibreNMS: Poller/Discovery/etc workers RRD (Time series data store) * Database * Webserver (Web UI/API) * * may only be installed on one server (however, some can be clustered) Distributed Polling allows the workers to be spread across additional servers for horizontal scaling. Distributed polling is not intended for remote polling. Devices can be grouped together into a poller_group to pin these devices to a single or a group of designated pollers. All pollers need to write to the same set of RRD files, preferably via RRDcached. It is also a requirement that at least one locking service is in place to which all pollers can connect. There are currently three locking mechanisms available memcached redis (preferred) sql locks (default) All of the above locking mechanisms are natively supported in LibreNMS. If none are specified, it will default to using SQL.","title":"Distributed Poller"},{"location":"Extensions/Distributed-Poller/#requirements-for-distributed-polling","text":"These requirements are above the normal requirements for a full LibreNMS install. rrdtool version 1.4 or above At least one locking mechanism configured a rrdcached install By default, all hosts are shared and have the poller_group = 0 . To pin a device to a poller, set it to a value greater than 0 and set the same value in the poller's config with distributed_poller_group . One can also specify a comma separated string of poller groups in distributed_poller_group . The poller will then poll devices from any of the groups listed. If new devices get added from the poller they will be assigned to the first poller group in the list unless the group is specified when adding the device. The following is a standard config, combined with a locking mechanism below: poller/distributed lnms config:set distributed_poller true lnms config:set distributed_poller_group 0 If you want to customise the hostname for the poller then you will need to set this in config.php : $config [ 'distributed_poller_name' ] = php_uname ( 'n' );","title":"Requirements for distributed polling"},{"location":"Extensions/Distributed-Poller/#locking-mechanisms","text":"Pick one of the following setups, do not use all of them at the same time.","title":"Locking mechanisms"},{"location":"Extensions/Distributed-Poller/#using-redis","text":"In your .env file you will need to specify a redis server, port and the driver. REDIS_HOST=HOSTNAME or IP REDIS_PORT=6379 CACHE_DRIVER=redis","title":"Using REDIS"},{"location":"Extensions/Distributed-Poller/#using-memcached","text":"Preferably you should set the memcached server settings via the web UI. Under Settings > Global Settings > Distributed poller, you fill out the memcached host and port, and then in your .env file you will need to add: CACHE_DRIVER=memcached If you want to use memcached, you will also need to install an additional Python 3 python-memcached package.","title":"Using Memcached"},{"location":"Extensions/Distributed-Poller/#example-setup","text":"Below is an example setup based on a real deployment which at the time of writing covers over 2,500 devices and 50,000 ports. The setup is running within an OpenStack environment with some commodity hardware for remote pollers. Here's a diagram of how you can scale LibreNMS out:","title":"Example Setup"},{"location":"Extensions/Distributed-Poller/#architecture","text":"How you set the distribution up is entirely up to you. You can choose to host the majority of the required services on a single virtual machine or server and then a poller to actually query the devices being monitored, all the way through to having a dedicated server for each of the individual roles. Below are notes on what you need to consider both from the software layer, but also connectivity.","title":"Architecture"},{"location":"Extensions/Distributed-Poller/#web-api-layer","text":"This is typically Apache but we have setup guides for both Nginx and Lighttpd which should work perfectly fine. There is nothing unique about the role this service is providing except that if you are adding devices from this layer then the web service will need to be able to connect to the end device via SNMP and perform an ICMP test. It is advisable to run RRDCached within this setup so that you don't need to share the rrd folder via a remote file share such as NFS. The web service can then generate rrd graphs via RRDCached. If RRDCached isn't an option then you can mount the rrd directory to read the RRD files directly.","title":"Web / API Layer"},{"location":"Extensions/Distributed-Poller/#database-server","text":"MySQL / MariaDB - At the moment these are the only database servers that are supported. The pollers, web and API layers should all be able to access the database server directly.","title":"Database Server"},{"location":"Extensions/Distributed-Poller/#rrd-storage","text":"Central storage should be provided so all RRD files can be read from and written to in one location. As suggested above, it's recommended that RRD Cached is configured and used. For this example, we are running RRDCached to allow all pollers and web/api servers to read/write to the rrd files with the rrd directory also exported by NFS for simple access and maintenance.","title":"RRD Storage"},{"location":"Extensions/Distributed-Poller/#pollers","text":"Pollers can be installed and run from anywhere, the only requirements are: They can access the Memcache instance They can create RRD files via some method such as a shared filesystem or RRDTool >=1.5.5 They can access the MySQL server You can either assign pollers into groups and set a poller group against certain devices, this will mean that those devices will only be processed by certain pollers (default poller group is 0) or you can assign all pollers to the default poller group for them to process any and all devices. This will provide the ability to have a single poller behind a NAT firewall monitor internal devices and report back to your central system. You will then be able to monitor those devices from the Web UI as normal. Another benefit to this is that you can provide N+x pollers, i.e if you know that you require three pollers to process all devices within 300 seconds then adding a 4th poller will mean that should any one single poller fail then the remaining three will complete polling in time. You could also use this to take a poller out of service for maintenance, i.e OS updates and software updates. It is extremely advisable to either run a central recursive dns server such as pdns-recursor and have all of your pollers use this or install a recursive dns server on each poller - the volume of DNS requests on large installs can be significant and will slow polling down enough to cause issues with a large number of devices. A last note to make sure of, is that all pollers writing to the same DB need to have the same APP_KEY value set in the .env file.","title":"Pollers"},{"location":"Extensions/Distributed-Poller/#discovery","text":"Depending on your setup will depend on how you configure your discovery processes. Cron based polling It's not necessary to run discovery services on all pollers. In fact, you should only run one discovery process per poller group. Designate a single poller to run discovery (or a separate server if required). If you run billing, you can do this in one of two ways: Run poll-billing.php and calculate-billing.php on a single poller which will create billing information for all bills. Please note this poller must have snmp access to all of your devices which have ports within a bill. The other option is to enable $config['distributed_billing'] = true; in config.php. Then run poll-billing.php on a single poller per group. You can run calculate-billing.php on any poller but only one poller overall. Dispatcher service When using the dispatcher service, discovery can run on all nodes.","title":"Discovery"},{"location":"Extensions/Distributed-Poller/#configuration","text":"Settings in config.php should be copied to all servers as they only apply locally. One way around this is to set settings in the database via the web ui or ./lnms config:set","title":"Configuration"},{"location":"Extensions/Distributed-Poller/#config-sample","text":"The following config is taken from a live setup which consists of a Web server, DB server, RRDCached server and 3 pollers. Web Server: Running Apache and an install of LibreNMS in /opt/librenms poller/distributed lnms config:set distributed_poller true poller/rrdtool lnms config:set rrdcached \"example.com:42217\" Database Server: Running Memcache and MariaDB Memcache Ubuntu (/etc/memcached.conf) -d -m 64 -p 11211 -u memcache -l ip.ip.ip.ip RRDCached Server: Running RRDCached RRDCached Ubuntu (/etc/default/rrdcached) OPTS=\"-l 0:42217\" OPTS=\"$OPTS -j /var/lib/rrdcached/journal/ -F\" OPTS=\"$OPTS -b /opt/librenms/rrd -B\" OPTS=\"$OPTS -w 1800 -z 900\" Ubuntu (/etc/default/rrdcached) - RRDCached 1.5.5 and above. BASE_OPTIONS=\"-l 0:42217\" BASE_OPTIONS=\"$BASE_OPTIONS -R -j /var/lib/rrdcached/journal/ -F\" BASE_OPTIONS=\"$BASE_OPTIONS -b /opt/librenms/rrd -B\" BASE_OPTIONS=\"$BASE_OPTIONS -w 1800 -z 900\" Poller 1: Running an install of LibreNMS in /opt/librenms config.php $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); $config [ 'distributed_poller_group' ] = '0' ; $config [ 'distributed_billing' ] = true ; poller/distributed lnms config:set distributed_poller_memcached_host \"example.com\" lnms config:set distributed_poller_memcached_port 11211 lnms config:set distributed_poller true poller/rrdtool lnms config:set rrdcached \"example.com:42217\" /etc/cron.d/librenms Runs discovery and polling for group 0, daily.sh to deal with notifications and DB cleanup and alerts. 33 */6 * * * librenms /opt/librenms/cronic /opt/librenms/discovery-wrapper.py 1 */5 * * * * librenms /opt/librenms/discovery.php -h new >> /dev/null 2>&1 */5 * * * * librenms /opt/librenms/cronic /opt/librenms/poller-wrapper.py 16 15 0 * * * librenms /opt/librenms/daily.sh >> /dev/null 2>&1 * * * * * librenms /opt/librenms/alerts.php >> /dev/null 2>&1 Poller 2: Running an install of LibreNMS in /opt/librenms config.php $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); $config [ 'distributed_poller_group' ] = '0' ; $config [ 'distributed_billing' ] = true ; poller/distributed lnms config:set distributed_poller_memcached_host \"example.com\" lnms config:set distributed_poller_memcached_port 11211 lnms config:set distributed_poller true poller/rrdtool lnms config:set rrdcached \"example.com:42217\" /etc/cron.d/librenms Runs billing as well as polling for group 0. */5 * * * * librenms /opt/librenms/poller-wrapper.py 16 >> /opt/librenms/logs/wrapper.log */5 * * * * librenms /opt/librenms/poll-billing.php >> /dev/null 2>&1 01 * * * * librenms /opt/librenms/billing-calculate.php >> /dev/null 2>&1 15 0 * * * librenms /opt/librenms/daily.sh >> /dev/null 2>&1 Poller 3: Running an install of LibreNMS in /opt/librenms config.php $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); $config [ 'distributed_poller_group' ] = '2,3' ; $config [ 'distributed_billing' ] = true ; poller/distributed lnms config:set distributed_poller_memcached_host \"example.com\" lnms config:set distributed_poller_memcached_port 11211 lnms config:set distributed_poller true poller/rrdtool lnms config:set rrdcached \"example.com:42217\" /etc/cron.d/librenms Runs discovery and polling for groups 2 and 3. 33 */6 * * * librenms /opt/librenms/cronic /opt/librenms/discovery-wrapper.py 1 */5 * * * * librenms /opt/librenms/discovery.php -h new >> /dev/null 2>&1 */5 * * * * librenms /opt/librenms/poll-billing.php >> /dev/null 2>&1 */5 * * * * librenms /opt/librenms/cronic /opt/librenms/poller-wrapper.py 16 15 0 * * * librenms /opt/librenms/daily.sh >> /dev/null 2>&1","title":"Config sample"},{"location":"Extensions/Fast-Ping-Check/","text":"Fast up/down checking Normally, LibreNMS sends an ICMP ping to the device before polling to check if it is up or down. This check is tied to the poller frequency, which is normally 5 minutes. This means it may take up to 5 minutes to find out if a device is down. Some users may want to know if devices stop responding to ping more quickly than that. LibreNMS offers a ping.php script to run ping checks as quickly as possible without increasing snmp load on your devices by switching to 1 minute polling. WARNING : If you do not have an alert rule that alerts on device status, enabling this will be a waste of resources. You can find one in the Alert Rules Collection . Setting the ping check to 1 minute 1: If you are using RRDCached , stop the service. - This will flush all pending writes so that the rrdstep.php script can change the steps. 2: Change the ping_rrd_step setting in config.php poller/rrdtool lnms config:set ping_rrd_step 60 3: Update the rrd files to change the step (step is hardcoded at file creation in rrd files) ./scripts/rrdstep.php -h all 4: Add the following line to /etc/cron.d/librenms to allow 1 minute ping checks * * * * * librenms /opt/librenms/ping.php >> /dev/null 2>&1 5: If applicable: Start the RRDCached service NOTE : If you are using distributed pollers you can restrict a poller to a group by appending -g to the cron entry. Alternatively, you should only run ping.php on a single node. Sub minute ping check Cron only has a resolution of one minute, so for sub-minute ping checks we need to adapt both ping and alerts entries. We add two entries per function, but add a delay before one of these entries. Remember, you need to remove the original ping.php and alerts.php entries in crontab before proceeding! 1: Set ping_rrd_step poller/rrdtool lnms config:set ping_rrd_step 30 2: Update the rrd files ./scripts/rrdstep.php -h all 3: Update cron (removing any other ping.php or alert.php entries) * * * * * librenms /opt/librenms/ping.php >> /dev/null 2>&1 * * * * * librenms sleep 30 && /opt/librenms/ping.php >> /dev/null 2>&1 * * * * * librenms sleep 15 && /opt/librenms/alerts.php >> /dev/null 2>&1 * * * * * librenms sleep 45 && /opt/librenms/alerts.php >> /dev/null 2>&1 Device dependencies The ping.php script respects device dependencies, but the main poller does not (for technical reasons). However, using this script does not disable the icmp check in the poller and a child may be reported as down before the parent. Settings ping.php uses much the same settings as the poller fping with one exception: retries is used instead of count. ping.php does not measure loss and avg response time, only up/down, so once a device responds it stops pinging it. poller/ping lnms config:set fping_options.retries 2 lnms config:set fping_options.timeout 500 lnms config:set fping_options.interval 500","title":"Fast Ping Checking"},{"location":"Extensions/Fast-Ping-Check/#fast-updown-checking","text":"Normally, LibreNMS sends an ICMP ping to the device before polling to check if it is up or down. This check is tied to the poller frequency, which is normally 5 minutes. This means it may take up to 5 minutes to find out if a device is down. Some users may want to know if devices stop responding to ping more quickly than that. LibreNMS offers a ping.php script to run ping checks as quickly as possible without increasing snmp load on your devices by switching to 1 minute polling. WARNING : If you do not have an alert rule that alerts on device status, enabling this will be a waste of resources. You can find one in the Alert Rules Collection .","title":"Fast up/down checking"},{"location":"Extensions/Fast-Ping-Check/#setting-the-ping-check-to-1-minute","text":"1: If you are using RRDCached , stop the service. - This will flush all pending writes so that the rrdstep.php script can change the steps. 2: Change the ping_rrd_step setting in config.php poller/rrdtool lnms config:set ping_rrd_step 60 3: Update the rrd files to change the step (step is hardcoded at file creation in rrd files) ./scripts/rrdstep.php -h all 4: Add the following line to /etc/cron.d/librenms to allow 1 minute ping checks * * * * * librenms /opt/librenms/ping.php >> /dev/null 2>&1 5: If applicable: Start the RRDCached service NOTE : If you are using distributed pollers you can restrict a poller to a group by appending -g to the cron entry. Alternatively, you should only run ping.php on a single node.","title":"Setting the ping check to 1 minute"},{"location":"Extensions/Fast-Ping-Check/#sub-minute-ping-check","text":"Cron only has a resolution of one minute, so for sub-minute ping checks we need to adapt both ping and alerts entries. We add two entries per function, but add a delay before one of these entries. Remember, you need to remove the original ping.php and alerts.php entries in crontab before proceeding! 1: Set ping_rrd_step poller/rrdtool lnms config:set ping_rrd_step 30 2: Update the rrd files ./scripts/rrdstep.php -h all 3: Update cron (removing any other ping.php or alert.php entries) * * * * * librenms /opt/librenms/ping.php >> /dev/null 2>&1 * * * * * librenms sleep 30 && /opt/librenms/ping.php >> /dev/null 2>&1 * * * * * librenms sleep 15 && /opt/librenms/alerts.php >> /dev/null 2>&1 * * * * * librenms sleep 45 && /opt/librenms/alerts.php >> /dev/null 2>&1","title":"Sub minute ping check"},{"location":"Extensions/Fast-Ping-Check/#device-dependencies","text":"The ping.php script respects device dependencies, but the main poller does not (for technical reasons). However, using this script does not disable the icmp check in the poller and a child may be reported as down before the parent.","title":"Device dependencies"},{"location":"Extensions/Fast-Ping-Check/#settings","text":"ping.php uses much the same settings as the poller fping with one exception: retries is used instead of count. ping.php does not measure loss and avg response time, only up/down, so once a device responds it stops pinging it. poller/ping lnms config:set fping_options.retries 2 lnms config:set fping_options.timeout 500 lnms config:set fping_options.interval 500","title":"Settings"},{"location":"Extensions/Galera-Cluster/","text":"MariaDB Galera Cluster This is currently being tested, use at your own risk. LibreNMS can be used with a MariaDB Galera Cluster. This is a Multi Master cluster, meaning each node in the cluster can read and write to the database. They all have the same ability. LibreNMS will randomly choose a working node to read and write requests to. For more information see https://laravel.com/docs/database#read-and-write-connections Getting Started It is best practice to have a minimum of 3 nodes in the cluster, A odd number of nodes is recommended in the event nodes have a disagreement on data, they will have a tie breaker. It's recommended that all servers be similar in hardware performance, cluster performance can be affected by the slowest server in the cluster. Backup the database before starting, and backing up the database regularly is still recommended even in a working cluster environment. Install and Configure Galera Install Galera4 and MariaDB Server These can be obtained from your OS package manager. For example in Ubuntu. sudo apt-get install mariadb-server mariadb-client galera-4 Create Galera Config Create a new file /etc/mysql/conf.d/galera.conf on each node [mysqld] binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 bind-address=0.0.0.0 # Galera Provider Configuration wsrep_on=ON wsrep_provider=/usr/lib/galera/libgalera_smm.so # Galera Cluster Configuration wsrep_cluster_name=\"librenms_cluster\" wsrep_cluster_address=\"gcomm://192.168.1.35,192.168.1.36,192.168.1.37,192.168.1.38,192.168.1.39\" # Galera Synchronization Configuration wsrep_sst_method=rsync # Galera Node Configuration wsrep_node_address=\"192.168.1.35\" wsrep_node_name=\"librenms1.35\" Change the following values for your environment. * wsrep_cluster_address - All the IP address's of your nodes. * wsrep_cluster_name - Name of cluster, should be the same for all nodes * wsrep_node_address - IP address of this node. * wsrep_node_name - Name of this node. Edit LibreNMS .env LibreNMS supports up to 9 galera nodes, you define these nodes in the .env file. For each node we have the ability to define if this librenms installation/poller is able to write, read or both to that node. The galera nodes you define here can be the same or differnt for each librenms poller. If you have a poller you only want to write/read to one galera node, you would simply add one DB_HOST, and omit all the rest. This allows you to precisely control what galera nodes a librenms poller is reading and or writing too. DB_HOST is always set to read/write. DB_HOST must be set, however, it does not have to be the same on each poller, it can be different as long as it's part of the same galera cluster. If the node that is set to DB_HOST is down, things like lnms db command no longer work, as they only use DB_HOST and don't failover to other nodes. Set DB_CONNECTION=mysql_cluster to enable DB_STICKY can be used if you are pulling out of sync data form the database in a read request. For more information see https://laravel.com/docs/database#the-sticky-option The below example setting up 5 nodes DB_HOST=192.168.1.35 DB_HOST_R2=192.168.1.36 DB_HOST_R3=192.168.1.37 DB_HOST_R4=192.168.1.38 DB_HOST_R5=192.168.1.39 DB_HOST_W2=192.168.1.36 DB_HOST_W3=192.168.1.37 DB_STICKY=true DB_CONNECTION=mysql_cluster DB_DATABASE=librenms DB_USERNAME=librenms DB_PASSWORD=password The above .env on a librenms installation/poller would communicate to each galera node as follows. 192.168.1.35 - Read/Write 192.168.1.36 - Read/Write 192.168.1.37 - Read/Write 192.168.1.38 - Read Only 192.168.1.39 - Read Only Starting Galera Cluster for the first time. 1) Shutdown MariaDB server on ALL nodes. sudo systemctl stop mariadb-server 2) On the server with your existing database or any mariadb server if you are starting without existing data, run the following command sudo galera_new_cluster 3) Start the rest of the nodes normally. sudo systemctl start mariadb-server Galera Cluster Status To see some stats on how the Galera cluster is preforming run the following. lnms db In the database run following mysql query SHOW GLOBAL STATUS LIKE 'wsrep_%' ; Variable Name Value Notes ----------------------------------- ---------------------------------------------------------------- --------------------------------------------------------- wsrep_cluster_size 2 Current number of nodes in Cluster wsrep_cluster_state_uuid e71582f3-cf14-11eb-bcf6-a23029e16405 Last Transaction UUID, Should be the same for each node wsrep_connected On On = Connected with other nodes wsrep_local_state_comment Synced Synced with other nodes Restarting the Entire Cluster In a cluster environment, steps should be taken to ensure that ALL nodes are not offline at the same time. Failed nodes can recover without issue as long as one node remains online. In the event that ALL nodes are offline, the following should be done to ensure you are starting the cluster with the most up-to-date database. To do this login to each node and running the following sudo cat /var/lib/data/grastate.dat # GALERA saved state version: 2.1 uuid: e71582f3-cf14-11eb-bcf6-a23029e16405 seqno: -1 safe_to_bootstrap: 1 If the safe_to_bootstrap = 1, then Galera determined that this node has the most up-to-date database and can be safeley used to start the cluster. Once you have found a node that can be used for starting the cluster, follow the steps in starting for the first time.","title":"Galera Database Cluster"},{"location":"Extensions/Galera-Cluster/#mariadb-galera-cluster","text":"This is currently being tested, use at your own risk. LibreNMS can be used with a MariaDB Galera Cluster. This is a Multi Master cluster, meaning each node in the cluster can read and write to the database. They all have the same ability. LibreNMS will randomly choose a working node to read and write requests to. For more information see https://laravel.com/docs/database#read-and-write-connections","title":"MariaDB Galera Cluster"},{"location":"Extensions/Galera-Cluster/#getting-started","text":"It is best practice to have a minimum of 3 nodes in the cluster, A odd number of nodes is recommended in the event nodes have a disagreement on data, they will have a tie breaker. It's recommended that all servers be similar in hardware performance, cluster performance can be affected by the slowest server in the cluster. Backup the database before starting, and backing up the database regularly is still recommended even in a working cluster environment.","title":"Getting Started"},{"location":"Extensions/Galera-Cluster/#install-and-configure-galera","text":"","title":"Install and Configure Galera"},{"location":"Extensions/Galera-Cluster/#install-galera4-and-mariadb-server","text":"These can be obtained from your OS package manager. For example in Ubuntu. sudo apt-get install mariadb-server mariadb-client galera-4","title":"Install Galera4 and MariaDB Server"},{"location":"Extensions/Galera-Cluster/#create-galera-config","text":"Create a new file /etc/mysql/conf.d/galera.conf on each node [mysqld] binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 bind-address=0.0.0.0 # Galera Provider Configuration wsrep_on=ON wsrep_provider=/usr/lib/galera/libgalera_smm.so # Galera Cluster Configuration wsrep_cluster_name=\"librenms_cluster\" wsrep_cluster_address=\"gcomm://192.168.1.35,192.168.1.36,192.168.1.37,192.168.1.38,192.168.1.39\" # Galera Synchronization Configuration wsrep_sst_method=rsync # Galera Node Configuration wsrep_node_address=\"192.168.1.35\" wsrep_node_name=\"librenms1.35\" Change the following values for your environment. * wsrep_cluster_address - All the IP address's of your nodes. * wsrep_cluster_name - Name of cluster, should be the same for all nodes * wsrep_node_address - IP address of this node. * wsrep_node_name - Name of this node.","title":"Create Galera Config"},{"location":"Extensions/Galera-Cluster/#edit-librenms-env","text":"LibreNMS supports up to 9 galera nodes, you define these nodes in the .env file. For each node we have the ability to define if this librenms installation/poller is able to write, read or both to that node. The galera nodes you define here can be the same or differnt for each librenms poller. If you have a poller you only want to write/read to one galera node, you would simply add one DB_HOST, and omit all the rest. This allows you to precisely control what galera nodes a librenms poller is reading and or writing too. DB_HOST is always set to read/write. DB_HOST must be set, however, it does not have to be the same on each poller, it can be different as long as it's part of the same galera cluster. If the node that is set to DB_HOST is down, things like lnms db command no longer work, as they only use DB_HOST and don't failover to other nodes. Set DB_CONNECTION=mysql_cluster to enable DB_STICKY can be used if you are pulling out of sync data form the database in a read request. For more information see https://laravel.com/docs/database#the-sticky-option The below example setting up 5 nodes DB_HOST=192.168.1.35 DB_HOST_R2=192.168.1.36 DB_HOST_R3=192.168.1.37 DB_HOST_R4=192.168.1.38 DB_HOST_R5=192.168.1.39 DB_HOST_W2=192.168.1.36 DB_HOST_W3=192.168.1.37 DB_STICKY=true DB_CONNECTION=mysql_cluster DB_DATABASE=librenms DB_USERNAME=librenms DB_PASSWORD=password The above .env on a librenms installation/poller would communicate to each galera node as follows. 192.168.1.35 - Read/Write 192.168.1.36 - Read/Write 192.168.1.37 - Read/Write 192.168.1.38 - Read Only 192.168.1.39 - Read Only","title":"Edit LibreNMS .env"},{"location":"Extensions/Galera-Cluster/#starting-galera-cluster-for-the-first-time","text":"1) Shutdown MariaDB server on ALL nodes. sudo systemctl stop mariadb-server 2) On the server with your existing database or any mariadb server if you are starting without existing data, run the following command sudo galera_new_cluster 3) Start the rest of the nodes normally. sudo systemctl start mariadb-server","title":"Starting Galera Cluster for the first time."},{"location":"Extensions/Galera-Cluster/#galera-cluster-status","text":"To see some stats on how the Galera cluster is preforming run the following. lnms db In the database run following mysql query SHOW GLOBAL STATUS LIKE 'wsrep_%' ; Variable Name Value Notes ----------------------------------- ---------------------------------------------------------------- --------------------------------------------------------- wsrep_cluster_size 2 Current number of nodes in Cluster wsrep_cluster_state_uuid e71582f3-cf14-11eb-bcf6-a23029e16405 Last Transaction UUID, Should be the same for each node wsrep_connected On On = Connected with other nodes wsrep_local_state_comment Synced Synced with other nodes","title":"Galera Cluster Status"},{"location":"Extensions/Galera-Cluster/#restarting-the-entire-cluster","text":"In a cluster environment, steps should be taken to ensure that ALL nodes are not offline at the same time. Failed nodes can recover without issue as long as one node remains online. In the event that ALL nodes are offline, the following should be done to ensure you are starting the cluster with the most up-to-date database. To do this login to each node and running the following sudo cat /var/lib/data/grastate.dat # GALERA saved state version: 2.1 uuid: e71582f3-cf14-11eb-bcf6-a23029e16405 seqno: -1 safe_to_bootstrap: 1 If the safe_to_bootstrap = 1, then Galera determined that this node has the most up-to-date database and can be safeley used to start the cluster. Once you have found a node that can be used for starting the cluster, follow the steps in starting for the first time.","title":"Restarting the Entire Cluster"},{"location":"Extensions/Gateone/","text":"GateOne integration We have simple integration for GateOne , you will be redirected to your Gateone command line frontend to access your equipment. (Currently this only works with SSH) GateOne itself isn't included within LibreNMS, you will need to install this separately either on the same infrastructure as LibreNMS or as a totally standalone appliance. The installation is beyond the scope of this document. Config is simple, include the following in your config.php : $config [ 'gateone' ][ 'server' ] = 'http:// , have special meanings or effects. Before a command is executed, the IRC-Bot ensures that the MySQL-Socket is working, that $this->user points to the right user and that the user is authenticated. Below you will find a table with related functions and attributes. You can chain-load any built-in command by calling $this->_command(\"My Parameters\") . You cannot chain-load external commands. To enable your command, edit your config.php and add something like this: ... $config [ 'irc_external' ][] = \"mycommand\" ; ... See: Example Functions and Attributes ... that are accessible from within an extension Functions Function( (Type) $Variable [= Default] [,...] ) Returns Description $this->getChan( ) String Returns channel of current event. $this->getData( (boolean) $Block = false ) String/Boolean Returns a line from the IRC-Buffer if it's not matched against any other command . If $Block is true , wait until a suitable line is returned. $this->getUser( ) String Returns nick of current user. Not to confuse with $this->user ! $this->get_user( ) Array See $this->user in Attributes. $this->irc_raw( (string) $Protocol ) Boolean Sends raw IRC-Protocol. $this->isAuthd( ) Boolean true if the user is authenticated. $this->joinChan( (string) $Channel ) Boolean Joins given $Channel . $this->log( (string) $Message ) Boolean Logs given $Message into STDOUT . $this->read( (string) $Buffer ) String/Boolean Returns a line from given $Buffer or false if there's nothing suitable inside the Buffer. Please use $this->getData() for handler-safe data retrieval. $this->respond( (string) $Message ) Boolean Responds to the request auto-detecting channel or private message. Attributes Attribute Type Description $params String Contains all arguments that are passed to the .command . $this->chan Array Channels that are configured. $this->commands Array Contains accessible commands . $this->config Array Contains $config from config.php . $this->data String Contains raw IRC-Protocol. $this->debug Boolean Debug-Flag. $this->external Array Contains loaded extra commands . $this->nick String Bot's nick on the IRC. $this->pass String IRC-Server's passphrase. $this->port Int IRC-Server's port-number. $this->server String IRC-Server's hostname. $this->ssl Boolean SSL-Flag. $this->tick Int Interval to check buffers in microseconds. $this->user Array Array containing details about the user that sent the request . Example includes/ircbot/join-ng.inc.php if ( $this -> user [ 'level' ] != 10 ) { return $this -> respond ( \"Sorry only admins can make me join.\" ); } if ( $this -> getChan () == \"#noc\" ) { $this -> respond ( \"Joining $params \" ); $this -> joinChan ( $params ); } else { $this -> respond ( \"Sorry, only people from #noc can make join.\" ); } config.php ... $config [ 'irc_external' ][] = \"join-ng\" ; ...","title":"IRC Bot Extensions"},{"location":"Extensions/IRC-Bot-Extensions/#irc-bot-extensions","text":"Okay this is a very quick walk-through in writing your own commands for the IRC-Bot. First of all, create a file in includes/ircbot , the file-name should be in this format: command.inc.php . When editing the file, do not open nor close PHP-tags. Any variable you assign will be discarded as soon as your command returns. Some variables, specially all listed under $this-> , have special meanings or effects. Before a command is executed, the IRC-Bot ensures that the MySQL-Socket is working, that $this->user points to the right user and that the user is authenticated. Below you will find a table with related functions and attributes. You can chain-load any built-in command by calling $this->_command(\"My Parameters\") . You cannot chain-load external commands. To enable your command, edit your config.php and add something like this: ... $config [ 'irc_external' ][] = \"mycommand\" ; ... See: Example","title":"IRC Bot Extensions"},{"location":"Extensions/IRC-Bot-Extensions/#functions-and-attributes","text":"... that are accessible from within an extension","title":"Functions and Attributes"},{"location":"Extensions/IRC-Bot-Extensions/#functions","text":"Function( (Type) $Variable [= Default] [,...] ) Returns Description $this->getChan( ) String Returns channel of current event. $this->getData( (boolean) $Block = false ) String/Boolean Returns a line from the IRC-Buffer if it's not matched against any other command . If $Block is true , wait until a suitable line is returned. $this->getUser( ) String Returns nick of current user. Not to confuse with $this->user ! $this->get_user( ) Array See $this->user in Attributes. $this->irc_raw( (string) $Protocol ) Boolean Sends raw IRC-Protocol. $this->isAuthd( ) Boolean true if the user is authenticated. $this->joinChan( (string) $Channel ) Boolean Joins given $Channel . $this->log( (string) $Message ) Boolean Logs given $Message into STDOUT . $this->read( (string) $Buffer ) String/Boolean Returns a line from given $Buffer or false if there's nothing suitable inside the Buffer. Please use $this->getData() for handler-safe data retrieval. $this->respond( (string) $Message ) Boolean Responds to the request auto-detecting channel or private message.","title":"Functions"},{"location":"Extensions/IRC-Bot-Extensions/#attributes","text":"Attribute Type Description $params String Contains all arguments that are passed to the .command . $this->chan Array Channels that are configured. $this->commands Array Contains accessible commands . $this->config Array Contains $config from config.php . $this->data String Contains raw IRC-Protocol. $this->debug Boolean Debug-Flag. $this->external Array Contains loaded extra commands . $this->nick String Bot's nick on the IRC. $this->pass String IRC-Server's passphrase. $this->port Int IRC-Server's port-number. $this->server String IRC-Server's hostname. $this->ssl Boolean SSL-Flag. $this->tick Int Interval to check buffers in microseconds. $this->user Array Array containing details about the user that sent the request .","title":"Attributes"},{"location":"Extensions/IRC-Bot-Extensions/#example","text":"includes/ircbot/join-ng.inc.php if ( $this -> user [ 'level' ] != 10 ) { return $this -> respond ( \"Sorry only admins can make me join.\" ); } if ( $this -> getChan () == \"#noc\" ) { $this -> respond ( \"Joining $params \" ); $this -> joinChan ( $params ); } else { $this -> respond ( \"Sorry, only people from #noc can make join.\" ); } config.php ... $config [ 'irc_external' ][] = \"join-ng\" ; ...","title":"Example"},{"location":"Extensions/IRC-Bot/","text":"IRC Bot LibreNMS has an easy to use IRC-Interface for basic tasks like viewing last log-entry, current device/port status and such. By default the IRC-Bot will not start when executed and will return an error until at least $config['irc_host'] and $config['irc_port'] has been specified inside config.php . (To start the IRC-Bot run ./irc.php ) If no channel has been specified with $config['irc_chan'] , ##librenms will be used. The default Nick for the bot is LibreNMS . The Bot will reply the same way it's being called. If you send it the commands via Query, it will respond in the Query. If you send the commands via a Channel, then it will respond in the Channel. Configuration & Defaults Option Default-Value Notes $config['irc_alert'] false Optional; Enables Alerting-Socket. EXPERIMENTAL $config['irc_alert_chan'] false Optional; Multiple channels can be defined as Array or delimited with , . EXPERIMENTAL $config['irc_alert_utf8'] false Optional; Enables use of strikethrough in alerts via UTF-8 encoded characters. Might cause trouble for some clients. $config['irc_alert_short'] false Optional; Send a one line alert summary instead of multi-line detailed alert. $config['irc_authtime'] 3 Optional; Defines how long in Hours an auth-session is valid. $config['irc_chan'] ##librenms Optional; Multiple channels can be defined as Array or delimited with , . Passwords are defined after a space-character . $config['irc_debug'] false Optional; Enables debug output (Wall of text) $config['irc_external'] Optional; Array or , delimited string with commands to include from includes/ircbot/*.inc.php $config['irc_host'] Required; Domain or IP to connect. If it's an IPv6 Address, embed it in [] . (Example: [::1] ) $config['irc_maxretry'] 5 Optional; How many connection attempts should be made before giving up $config['irc_nick'] LibreNMS Optional; $config['irc_pass'] Optional; This sends the IRC-PASS Sequence to IRC-Servers that require Password on Connect $config['irc_port'] 6667 Required; To enable SSL append a + before the Port. (Example: +6697 ) $config['irc_ctcp'] false Optional; Enable/disable ctcp-replies from the bot (currently VERSION, PING and TIME). $config['irc_ctcp_version'] LibreNMS IRCbot. https://www.librenms.org/ Optional; Reply-string to CTCP VERSION requests $config['irc_auth'] Optional; Array of hostmasks that are automatically authenticated. IRC-Commands Command Description .auth If : Request an Auth-Token. If : Authenticate session. .device Prints basic information about given hostname . .down List hostnames that are down, if any. .help List available commands. .join Joins if user has admin-level. .listdevices Lists the hostnames of all known devices. .log [] Prints N lines or last line of the eventlog. .port Prints Port-related information from ifname on given hostname . .quit Disconnect from IRC and exit. .reload Reload configuration. .status Prints status information for given type . Type can be devices , services , ports . Shorthands are: dev , srv , prt .version Prints $this->config['project_name_version'] . ( /!\\ All commands are case- insensitive but their arguments are case- sensitive ) Examples Server examples Unencrypted Connection to irc.libera.chat : ... $config [ 'irc_host' ] = \"irc.libera.chat\" ; $config [ 'irc_port' ] = 6667 ; ... SSL-Encrypted Connection to irc.libera.chat : ... $config [ 'irc_host' ] = \"irc.libera.chat\" ; $config [ 'irc_port' ] = \"+6697\" ; ... SSL-Encrypted Connection to irc.localdomain with Server-Password and odd port: ... $config [ 'irc_host' ] = \"irc.localdomain\" ; $config [ 'irc_port' ] = \"+12345\" ; $config [ 'irc_pass' ] = \"Super Secret Passphrase123\" ; ... Channel notations Channels can be defined using Array-Notation like: ... $config [ 'irc_chan' ][] = \"#librenms\" ; $config [ 'irc_chan' ][] = \"#otherchan\" ; $config [ 'irc_chan' ][] = \"#noc\" ; ... Or using a single string using , as delimiter between various channels: ... $config [ 'irc_chan' ] = \"#librenms,#otherchan,#noc\" ; ... Hostmask authentication ... $config [ 'irc_auth' ][ 'admin' ][] = \"*!root@nms.host.invalid\" ; $config [ 'irc_auth' ][ 'admin' ][] = \"*!*peter@peters.computer.invalid\" ; $config [ 'irc_auth' ][ ' john ][] = \"john!doe@login.server.invalid\" ; ... Any client matching one of the first two hostmasks will automatically be authenticated as the \"admin\" user in LibreNMS, and clients matching the last line will be authenticated as the user \"john\" in LibreNMS, without using .auth and a waiting for a valid token. Extensions?! The bot is coded in a unified way. This makes writing extensions by far less painful. Simply add your command to the $config['irc_external'] directive and create a file called includes/ircbot/command.inc.php containing your code. The string behind the call of .command is passed as $params . The user who requested something is accessible via $this->user . Send your reply/ies via $this->respond($string) . A more detailed documentation of the functions and variables available for extensions can be found at IRC-Bot Extensions ; Confused? Here an Echo-Example: File: config.php ... $config [ 'irc_external' ][] = \"echo\" ; ... File: includes/ircbot/echo.inc.php //Prefix everything with `You said: '...'` and return what was sent. if ( $this -> user [ 'name' ] != \"root\" ) { return $this -> respond ( \"You said: '\" . $params . \"'\" ); } else { return $this -> respond ( \"root shouldn't be online so late!\" ); } Systemd start up script Basic systemd start up script to be placed in /etc/systemd/system/ to start irc service at boot. librenms-irc.service script is located at /opt/librenms/misc/ Once copied to /etc/systemd/system/ you must run the following commands: a) chmod 664 /etc/systemd/system/librenms-irc.service b) systemctl daemon-reload c) systemctl enable librenms-irc.service d) systemctl start librenms-irc.service It can be stopped or started just like any other systemd script such as systemctl start librenms-irc.service","title":"IRC Bot"},{"location":"Extensions/IRC-Bot/#irc-bot","text":"LibreNMS has an easy to use IRC-Interface for basic tasks like viewing last log-entry, current device/port status and such. By default the IRC-Bot will not start when executed and will return an error until at least $config['irc_host'] and $config['irc_port'] has been specified inside config.php . (To start the IRC-Bot run ./irc.php ) If no channel has been specified with $config['irc_chan'] , ##librenms will be used. The default Nick for the bot is LibreNMS . The Bot will reply the same way it's being called. If you send it the commands via Query, it will respond in the Query. If you send the commands via a Channel, then it will respond in the Channel.","title":"IRC Bot"},{"location":"Extensions/IRC-Bot/#configuration-defaults","text":"Option Default-Value Notes $config['irc_alert'] false Optional; Enables Alerting-Socket. EXPERIMENTAL $config['irc_alert_chan'] false Optional; Multiple channels can be defined as Array or delimited with , . EXPERIMENTAL $config['irc_alert_utf8'] false Optional; Enables use of strikethrough in alerts via UTF-8 encoded characters. Might cause trouble for some clients. $config['irc_alert_short'] false Optional; Send a one line alert summary instead of multi-line detailed alert. $config['irc_authtime'] 3 Optional; Defines how long in Hours an auth-session is valid. $config['irc_chan'] ##librenms Optional; Multiple channels can be defined as Array or delimited with , . Passwords are defined after a space-character . $config['irc_debug'] false Optional; Enables debug output (Wall of text) $config['irc_external'] Optional; Array or , delimited string with commands to include from includes/ircbot/*.inc.php $config['irc_host'] Required; Domain or IP to connect. If it's an IPv6 Address, embed it in [] . (Example: [::1] ) $config['irc_maxretry'] 5 Optional; How many connection attempts should be made before giving up $config['irc_nick'] LibreNMS Optional; $config['irc_pass'] Optional; This sends the IRC-PASS Sequence to IRC-Servers that require Password on Connect $config['irc_port'] 6667 Required; To enable SSL append a + before the Port. (Example: +6697 ) $config['irc_ctcp'] false Optional; Enable/disable ctcp-replies from the bot (currently VERSION, PING and TIME). $config['irc_ctcp_version'] LibreNMS IRCbot. https://www.librenms.org/ Optional; Reply-string to CTCP VERSION requests $config['irc_auth'] Optional; Array of hostmasks that are automatically authenticated.","title":"Configuration & Defaults"},{"location":"Extensions/IRC-Bot/#irc-commands","text":"Command Description .auth If : Request an Auth-Token. If : Authenticate session. .device Prints basic information about given hostname . .down List hostnames that are down, if any. .help List available commands. .join Joins if user has admin-level. .listdevices Lists the hostnames of all known devices. .log [] Prints N lines or last line of the eventlog. .port Prints Port-related information from ifname on given hostname . .quit Disconnect from IRC and exit. .reload Reload configuration. .status Prints status information for given type . Type can be devices , services , ports . Shorthands are: dev , srv , prt .version Prints $this->config['project_name_version'] . ( /!\\ All commands are case- insensitive but their arguments are case- sensitive )","title":"IRC-Commands"},{"location":"Extensions/IRC-Bot/#examples","text":"","title":"Examples"},{"location":"Extensions/IRC-Bot/#server-examples","text":"Unencrypted Connection to irc.libera.chat : ... $config [ 'irc_host' ] = \"irc.libera.chat\" ; $config [ 'irc_port' ] = 6667 ; ... SSL-Encrypted Connection to irc.libera.chat : ... $config [ 'irc_host' ] = \"irc.libera.chat\" ; $config [ 'irc_port' ] = \"+6697\" ; ... SSL-Encrypted Connection to irc.localdomain with Server-Password and odd port: ... $config [ 'irc_host' ] = \"irc.localdomain\" ; $config [ 'irc_port' ] = \"+12345\" ; $config [ 'irc_pass' ] = \"Super Secret Passphrase123\" ; ...","title":"Server examples"},{"location":"Extensions/IRC-Bot/#channel-notations","text":"Channels can be defined using Array-Notation like: ... $config [ 'irc_chan' ][] = \"#librenms\" ; $config [ 'irc_chan' ][] = \"#otherchan\" ; $config [ 'irc_chan' ][] = \"#noc\" ; ... Or using a single string using , as delimiter between various channels: ... $config [ 'irc_chan' ] = \"#librenms,#otherchan,#noc\" ; ...","title":"Channel notations"},{"location":"Extensions/IRC-Bot/#hostmask-authentication","text":"... $config [ 'irc_auth' ][ 'admin' ][] = \"*!root@nms.host.invalid\" ; $config [ 'irc_auth' ][ 'admin' ][] = \"*!*peter@peters.computer.invalid\" ; $config [ 'irc_auth' ][ ' john ][] = \"john!doe@login.server.invalid\" ; ... Any client matching one of the first two hostmasks will automatically be authenticated as the \"admin\" user in LibreNMS, and clients matching the last line will be authenticated as the user \"john\" in LibreNMS, without using .auth and a waiting for a valid token.","title":"Hostmask authentication"},{"location":"Extensions/IRC-Bot/#extensions","text":"The bot is coded in a unified way. This makes writing extensions by far less painful. Simply add your command to the $config['irc_external'] directive and create a file called includes/ircbot/command.inc.php containing your code. The string behind the call of .command is passed as $params . The user who requested something is accessible via $this->user . Send your reply/ies via $this->respond($string) . A more detailed documentation of the functions and variables available for extensions can be found at IRC-Bot Extensions ; Confused? Here an Echo-Example: File: config.php ... $config [ 'irc_external' ][] = \"echo\" ; ... File: includes/ircbot/echo.inc.php //Prefix everything with `You said: '...'` and return what was sent. if ( $this -> user [ 'name' ] != \"root\" ) { return $this -> respond ( \"You said: '\" . $params . \"'\" ); } else { return $this -> respond ( \"root shouldn't be online so late!\" ); }","title":"Extensions?!"},{"location":"Extensions/IRC-Bot/#systemd-start-up-script","text":"Basic systemd start up script to be placed in /etc/systemd/system/ to start irc service at boot. librenms-irc.service script is located at /opt/librenms/misc/ Once copied to /etc/systemd/system/ you must run the following commands: a) chmod 664 /etc/systemd/system/librenms-irc.service b) systemctl daemon-reload c) systemctl enable librenms-irc.service d) systemctl start librenms-irc.service It can be stopped or started just like any other systemd script such as systemctl start librenms-irc.service","title":"Systemd start up script"},{"location":"Extensions/Interface-Description-Parsing/","text":"Interface Description Parsing Librenms can interpret, display and group certain additional information on ports. This is done based on the format that the port description is written although it's possible to customise the parser to be specific for your setup. Keywords See examples for formats. Keywords Cust - Customer Transit - Transit link Peering - Peering link Core - Infrastructure link (non-customer) Info-keywords () contains a note {} contains your circuit id [] contains the service type or speed Examples Cisco IOS / NXOS / IOSXR: interface Gi0/1 descr Transit: Example Provider (AS65000) interface Gi0/2 descr Peering: Peering Exchange interface Gi0/3 descr Core: core.router01 FastEthernet0/0 (Telco X CCID023141) interface Gi0/4 descr Cust: Example Customer [10Mbit] (T1 Telco Y CCID129031) {EXAMP0001} Unix / Linux: This requires an additional script to be setup # eth3: Cust: Example Customer [10Mbit] (T1 Telco Y CCID129031) {EXAMP0001} # eth0: Transit: Example Provider (AS65000) # eth1: Core: core.router01 FastEthernet0/0 (Telco X CCID023141) # eth2: Peering: Peering Exchange Customisation The following config options can be set to enable more custom types: webui/port-descr lnms config:set customers_descr.+ 'cust' lnms config:set transit_descr.+ 'transit' lnms config:set peering_descr.+ 'peering' \";' lnms config:set core_descr.+ 'core' lnms config:set custom_descr.+ 'something_made_up' Custom interface parser It's also possible to write your own parser, the existing one is: includes/port-descr-parser.inc.php Once you've created your own then you can enable it with: $config [ 'port_descr_parser' ] = \"includes/custom/my-port-descr-parser.inc.php\" ; Setup For Unix / Linux based systems, you need to run an additional script to support the parsing of interface information. Add ifAlias from /opt/librenms/scripts/ or download it from here to the Server and make it executable chmod +x /path/to/ifAlias Add to snmpd.conf something like: pass .1.3.6.1.2.1.31.1.1.1.18 /path/to/ifAlias Add aliasses with iproute2 package like: ip link set eth0.427 alias 'Cust: CustomerA' in /etc/network/interfaces or /etc/network/interfaces.d/* with a comment like: # eth0.427: Cust CustomerA Restart snmpd - systemctl restart snmpd There are no changes to be made or additions to install for the polling librenms. Now you can set up your keywords in your aliases.","title":"Interface Description Parsing"},{"location":"Extensions/Interface-Description-Parsing/#interface-description-parsing","text":"Librenms can interpret, display and group certain additional information on ports. This is done based on the format that the port description is written although it's possible to customise the parser to be specific for your setup.","title":"Interface Description Parsing"},{"location":"Extensions/Interface-Description-Parsing/#keywords","text":"See examples for formats. Keywords Cust - Customer Transit - Transit link Peering - Peering link Core - Infrastructure link (non-customer) Info-keywords () contains a note {} contains your circuit id [] contains the service type or speed","title":"Keywords"},{"location":"Extensions/Interface-Description-Parsing/#examples","text":"Cisco IOS / NXOS / IOSXR: interface Gi0/1 descr Transit: Example Provider (AS65000) interface Gi0/2 descr Peering: Peering Exchange interface Gi0/3 descr Core: core.router01 FastEthernet0/0 (Telco X CCID023141) interface Gi0/4 descr Cust: Example Customer [10Mbit] (T1 Telco Y CCID129031) {EXAMP0001} Unix / Linux: This requires an additional script to be setup # eth3: Cust: Example Customer [10Mbit] (T1 Telco Y CCID129031) {EXAMP0001} # eth0: Transit: Example Provider (AS65000) # eth1: Core: core.router01 FastEthernet0/0 (Telco X CCID023141) # eth2: Peering: Peering Exchange","title":"Examples"},{"location":"Extensions/Interface-Description-Parsing/#customisation","text":"The following config options can be set to enable more custom types: webui/port-descr lnms config:set customers_descr.+ 'cust' lnms config:set transit_descr.+ 'transit' lnms config:set peering_descr.+ 'peering' \";' lnms config:set core_descr.+ 'core' lnms config:set custom_descr.+ 'something_made_up'","title":"Customisation"},{"location":"Extensions/Interface-Description-Parsing/#custom-interface-parser","text":"It's also possible to write your own parser, the existing one is: includes/port-descr-parser.inc.php Once you've created your own then you can enable it with: $config [ 'port_descr_parser' ] = \"includes/custom/my-port-descr-parser.inc.php\" ;","title":"Custom interface parser"},{"location":"Extensions/Interface-Description-Parsing/#setup","text":"For Unix / Linux based systems, you need to run an additional script to support the parsing of interface information. Add ifAlias from /opt/librenms/scripts/ or download it from here to the Server and make it executable chmod +x /path/to/ifAlias Add to snmpd.conf something like: pass .1.3.6.1.2.1.31.1.1.1.18 /path/to/ifAlias Add aliasses with iproute2 package like: ip link set eth0.427 alias 'Cust: CustomerA' in /etc/network/interfaces or /etc/network/interfaces.d/* with a comment like: # eth0.427: Cust CustomerA Restart snmpd - systemctl restart snmpd There are no changes to be made or additions to install for the polling librenms. Now you can set up your keywords in your aliases.","title":"Setup"},{"location":"Extensions/Metric-Storage/","text":"Metric storage By default we ship all metrics to RRD files, either directly or via RRDCached . On top of this you can ship metrics to Graphite, InfluxDB, OpenTSDB or Prometheus. At present you can't use these backends to display graphs within LibreNMS and will need to use something like Grafana . For further information on configuring LibreNMS to ship data to one of the other backends then please see the documentation below. Graphite InfluxDB OpenTSDB Prometheus","title":"Intro"},{"location":"Extensions/Metric-Storage/#metric-storage","text":"By default we ship all metrics to RRD files, either directly or via RRDCached . On top of this you can ship metrics to Graphite, InfluxDB, OpenTSDB or Prometheus. At present you can't use these backends to display graphs within LibreNMS and will need to use something like Grafana . For further information on configuring LibreNMS to ship data to one of the other backends then please see the documentation below. Graphite InfluxDB OpenTSDB Prometheus","title":"Metric storage"},{"location":"Extensions/NFSen/","text":"NFSen The installation of NFSen is out of scope for this document / LibreNMS Configuration The following is the configuration that can be used: external/nfsen lnms config:set nfsen_enable true lnms config:set nfsen_split_char '_' lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat/live/' lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat' lnms config:set nfsen_base.+ '/var/nfsen/' lnms config:set nfsen_suffix '_yourdomain_com' Set lnms config:set nfsen_enable true to enable NFSen support. nfsen_rrds This value tells us where your NFSen rrd files live. This can also be an array to specify more directories like: external/nfsen lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat/sitea/' lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat/siteb/' Although for most setups, it will look like below, with the profiles-stat/live directory being where it stores the general RRDs for data sources. external/nfsen lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat/live' If you wish to render info for configure channels for a device, you need add the various profile-stat directories your system uses, which for most systems will be as below. external/nfsen lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat' When adding sources to nfsen.conf, it is important to use the hostname that matches what is configured in LibreNMS, because the rrd files NfSen creates is named after the source name (ident), and it doesn't allow you to use an IP address instead. However, in LibreNMS, if your device is added by an IP address, add your source with any name of your choice, and create a symbolic link to the rrd file. cd /var/nfsen/profiles-stat/sitea/ ln -s mychannel.rrd librenmsdeviceIP.rrd external/nfsen lnms config:set nfsen_split_char '_' This value tells us what to replace the full stops . in the devices hostname with. external/nfsen lnms config:set nfsen_suffix '_yourdomain_com' The above is a very important bit as device names in NfSen are limited to 21 characters. This means full domain names for devices can be very problematic to squeeze in, so therefor this chunk is usually removed. On a similar note, NfSen profiles for channels should be created with the same name. Stats Defaults and Settings Below are the default settings used with nfdump for stats. For more defaulted information on that, please see nfdump(1). The default location for nfdump is /usr/bin/nfdump . If nfdump is located elsewhere, set it with external/binaries ```bash lnms config:set nfdump /usr/local/bin/nfdump ``` external/nfsen lnms config:set nfsen_last_max 153600 lnms config:set nfsen_top_max 500 lnms config:set nfsen_top_N '[10, 20, 50, 100, 200, 500]' lnms config:set nfsen_top_default 20 lnms config:set nfsen_stat_default srcip lnms config:set nfsen_order_default packets lnms config:set nfsen_last_default 900 lnms config:set nfsen_lasts \"{'300':'5 minutes', '600':'10 minutes', '900':'15 minutes', '1800':'30 minutes', '3600':'1 hour', '9600':'3 hours', '38400':'12 hours', '76800':'24 hours', '115200':'36 hours', '153600':'48 hours'}\" external/nfsen lnms config:set nfsen_last_max 153600 The above is the max value in seconds one may pull stats for. The higher this is, the more CPU and disk intensive the search will be. Numbers larger than this will be set to this. external/nfsen lnms config:set nfsen_top_max 500 The above is max number of items to be displayed. Numbers larger than this will be set to this. external/nfsen lnms config:set nfsen_top_N '[10, 20, 50, 100, 200, 500]' The above is a array containing a list for the drop down menu how many top items should be returned. external/nfsen lnms config:set nfsen_top_default 20 The above sets default top number to use from the drop down. external/nfsen lnms config:set nfsen_stat_default srcip The above sets default stat type to use from the drop down. record Flow Records ip Any IP Address srcip SRC IP Address dstip DST IP Address port Any Port srcport SRC Port dstport DST Port srctos SRC TOS dsttos DST TOS tos TOS as AS srcas SRC AS dstas DST AS external/nfsen lnms config:set nfsen_order_default packets The above sets default order type to use from the drop down. Any of the following below are currently supported. flows Number of total flows for the time period. packet Number of total packets for the time period. bytes Number of total bytes for the time period. pps Packets Per Second bps Bytes Per Second bpp Bytes Per Packet external/nfsen lnms config:set nfsen_last_default 900 The above is the last default to use from the drop down. external/nfsen lnms config:set nfsen_lasts \"{'300':'5 minutes', '600':'10 minutes', '900':'15 minutes', '1800':'30 minutes', '3600':'1 hour', '9600':'3 hours', '38400':'12 hours', '76800':'24 hours', '115200':'36 hours', '153600':'48 hours'}\" The above associative array contains time intervals for how far back to go. The keys are the length in seconds and the value is just a description to display.","title":"NFSen"},{"location":"Extensions/NFSen/#nfsen","text":"The installation of NFSen is out of scope for this document / LibreNMS","title":"NFSen"},{"location":"Extensions/NFSen/#configuration","text":"The following is the configuration that can be used: external/nfsen lnms config:set nfsen_enable true lnms config:set nfsen_split_char '_' lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat/live/' lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat' lnms config:set nfsen_base.+ '/var/nfsen/' lnms config:set nfsen_suffix '_yourdomain_com' Set lnms config:set nfsen_enable true to enable NFSen support. nfsen_rrds This value tells us where your NFSen rrd files live. This can also be an array to specify more directories like: external/nfsen lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat/sitea/' lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat/siteb/' Although for most setups, it will look like below, with the profiles-stat/live directory being where it stores the general RRDs for data sources. external/nfsen lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat/live' If you wish to render info for configure channels for a device, you need add the various profile-stat directories your system uses, which for most systems will be as below. external/nfsen lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat' When adding sources to nfsen.conf, it is important to use the hostname that matches what is configured in LibreNMS, because the rrd files NfSen creates is named after the source name (ident), and it doesn't allow you to use an IP address instead. However, in LibreNMS, if your device is added by an IP address, add your source with any name of your choice, and create a symbolic link to the rrd file. cd /var/nfsen/profiles-stat/sitea/ ln -s mychannel.rrd librenmsdeviceIP.rrd external/nfsen lnms config:set nfsen_split_char '_' This value tells us what to replace the full stops . in the devices hostname with. external/nfsen lnms config:set nfsen_suffix '_yourdomain_com' The above is a very important bit as device names in NfSen are limited to 21 characters. This means full domain names for devices can be very problematic to squeeze in, so therefor this chunk is usually removed. On a similar note, NfSen profiles for channels should be created with the same name.","title":"Configuration"},{"location":"Extensions/NFSen/#stats-defaults-and-settings","text":"Below are the default settings used with nfdump for stats. For more defaulted information on that, please see nfdump(1). The default location for nfdump is /usr/bin/nfdump . If nfdump is located elsewhere, set it with external/binaries ```bash lnms config:set nfdump /usr/local/bin/nfdump ``` external/nfsen lnms config:set nfsen_last_max 153600 lnms config:set nfsen_top_max 500 lnms config:set nfsen_top_N '[10, 20, 50, 100, 200, 500]' lnms config:set nfsen_top_default 20 lnms config:set nfsen_stat_default srcip lnms config:set nfsen_order_default packets lnms config:set nfsen_last_default 900 lnms config:set nfsen_lasts \"{'300':'5 minutes', '600':'10 minutes', '900':'15 minutes', '1800':'30 minutes', '3600':'1 hour', '9600':'3 hours', '38400':'12 hours', '76800':'24 hours', '115200':'36 hours', '153600':'48 hours'}\" external/nfsen lnms config:set nfsen_last_max 153600 The above is the max value in seconds one may pull stats for. The higher this is, the more CPU and disk intensive the search will be. Numbers larger than this will be set to this. external/nfsen lnms config:set nfsen_top_max 500 The above is max number of items to be displayed. Numbers larger than this will be set to this. external/nfsen lnms config:set nfsen_top_N '[10, 20, 50, 100, 200, 500]' The above is a array containing a list for the drop down menu how many top items should be returned. external/nfsen lnms config:set nfsen_top_default 20 The above sets default top number to use from the drop down. external/nfsen lnms config:set nfsen_stat_default srcip The above sets default stat type to use from the drop down. record Flow Records ip Any IP Address srcip SRC IP Address dstip DST IP Address port Any Port srcport SRC Port dstport DST Port srctos SRC TOS dsttos DST TOS tos TOS as AS srcas SRC AS dstas DST AS external/nfsen lnms config:set nfsen_order_default packets The above sets default order type to use from the drop down. Any of the following below are currently supported. flows Number of total flows for the time period. packet Number of total packets for the time period. bytes Number of total bytes for the time period. pps Packets Per Second bps Bytes Per Second bpp Bytes Per Packet external/nfsen lnms config:set nfsen_last_default 900 The above is the last default to use from the drop down. external/nfsen lnms config:set nfsen_lasts \"{'300':'5 minutes', '600':'10 minutes', '900':'15 minutes', '1800':'30 minutes', '3600':'1 hour', '9600':'3 hours', '38400':'12 hours', '76800':'24 hours', '115200':'36 hours', '153600':'48 hours'}\" The above associative array contains time intervals for how far back to go. The keys are the length in seconds and the value is just a description to display.","title":"Stats Defaults and Settings"},{"location":"Extensions/Network-Map/","text":"Network Map LibreNMS has the ability to show you a dynamic network map based on data collected from devices. These maps are accessed through the following menu options: Overview -> Maps -> Network Overview -> Maps -> Device Group Maps The Neighbours -> Map tab when viewing a single device (the Neighbours tab will only show if a device has xDP neighbours) These network maps can be based on: xDP Discovery MAC addresses (ARP entries matching interface IP and MAC) By default, both are are included but you can enable / disable either one using the following config option: lnms config:set 'network_map_items' \"('mac','xdp')\" Either remove mac or xdp depending on which you want. XDP is based on FDP, CDP and LLDP support based on the device type. It is worth noting that the global map could lead to a large network map that is slow to render and interact with. The network map on the device neighbour page, or building device groups and using the device group maps will be more usable on large networks. Settings The map display can be configured by altering the VisJS-Config.md","title":"Network Map"},{"location":"Extensions/Network-Map/#network-map","text":"LibreNMS has the ability to show you a dynamic network map based on data collected from devices. These maps are accessed through the following menu options: Overview -> Maps -> Network Overview -> Maps -> Device Group Maps The Neighbours -> Map tab when viewing a single device (the Neighbours tab will only show if a device has xDP neighbours) These network maps can be based on: xDP Discovery MAC addresses (ARP entries matching interface IP and MAC) By default, both are are included but you can enable / disable either one using the following config option: lnms config:set 'network_map_items' \"('mac','xdp')\" Either remove mac or xdp depending on which you want. XDP is based on FDP, CDP and LLDP support based on the device type. It is worth noting that the global map could lead to a large network map that is slow to render and interact with. The network map on the device neighbour page, or building device groups and using the device group maps will be more usable on large networks.","title":"Network Map"},{"location":"Extensions/Network-Map/#settings","text":"The map display can be configured by altering the VisJS-Config.md","title":"Settings"},{"location":"Extensions/OAuth-SAML/","text":"OAuth and SAML Support Introduction LibreNMS has support for Laravel Socialite to try and simplify the use of OAuth 1 or 2 providers such as using GitHub, Microsoft, Twitter + many more and SAML. Socialite Providers supports more than 100+ 3rd parties so you will most likely find support for the SAML or OAuth provider you need without too much trouble. Please do note however, these providers are not maintained by LibreNMS so we cannot add support for new ones and we can only provide you basic help with general configuration. See the Socialite Providers website for more information on adding a new OAuth provider. Below we will guide you on how to install SAML or some of these OAth providers, you should be able to use these as a guide on how to install any others you may need but please, please, ensure you read the Socialite Providers documentation carefully . GitHub Provider Microsoft Provider Okta Provider SAML2 Requirements LibreNMS version 22.3.0 or later. Please ensure you set APP_URL within your .env file so that callback URLs work correctly with the identify provider. Note Once you have configured your OAuth or SAML2 provider, please ensure you check the Post configuration settings section at the end. GitHub and Microsoft Examples Install plugin Note First we need to install the plugin itself. The plugin name can be slightly different so be sure to check the Socialite Providers documentation and look for this line, composer require socialiteproviders/github which will give you the name you need for the command, i.e: socialiteproviders/github . GitHub Microsoft Okta lnms plugin:add socialiteproviders/github lnms plugin:add socialiteproviders/microsoft lnms plugin:add socialiteproviders/okta Find the provider name Next we need to find the provider name and writing it down Note It's almost always the name of the provider in lowercase but can be different so check the Socialite Providers documentation and look for this line, github => [ which will give you the name you need for the above command: github . GitHub Microsoft Okta For GitHub we can find the line: 'github' => [ 'client_id' => env ( 'GITHUB_CLIENT_ID' ), 'client_secret' => env ( 'GITHUB_CLIENT_SECRET' ), 'redirect' => env ( 'GITHUB_REDIRECT_URI' ) ], So our provider name is github , write this down. For Microsoft we can find the line: 'microsoft' => [ 'client_id' => env ( 'MICROSOFT_CLIENT_ID' ), 'client_secret' => env ( 'MICROSOFT_CLIENT_SECRET' ), 'redirect' => env ( 'MICROSOFT_REDIRECT_URI' ) ], So our provider name is microsoft , write this down. For Okta we can find the line: 'okta' => [ 'base_url' => env ( 'OKTA_BASE_URL' ), 'client_id' => env ( 'OKTA_CLIENT_ID' ), 'client_secret' => env ( 'OKTA_CLIENT_SECRET' ), 'redirect' => env ( 'OKTA_REDIRECT_URI' ) ], So our provider name is okta , write this down. Register OAuth application Register a new application Now we need some values from the OAuth provider itself, in most cases you need to register a new \"OAuth application\" at the providers site. This will vary from provider to provider but the process itself should be similar to the examples below. Note The callback URL is always: https:// your-librenms-url /auth/ provider /callback It doesn't need to be a public available site, but it almost always needs to support TLS (https)! GitHub Microsoft Okta For our example with GitHub we go to GitHub Developer Settings and press \"Register a new application\": Fill out the form accordingly (with your own values): For our example with Microsoft we go to \"Azure Active Directory\" > \"App registrations\" and press \"New registration\" Fill out the form accordingly using your own values): Copy the value of the Application (client) ID and Directory (tenant) ID and save them, you will need them in the next step. For our example with Okta, we go to Applications>Create App Integration , Select OIDC - OpenID Connect , then Web Application . Fill in the Name, Logo, and Assignments based on your preferred settings. Leave the Sign-In Redirect URI field, this is where you will edit this later: Note your Okta domain or login url. Sometimes this can be a vanity url like login.company.com , or sometimes just company.okta.com . Click save. Generate a new client secret GitHub Microsoft Okta Press 'Generate a new client secret' to get a new client secret. Copy the Client ID and Client secret In the example above it is: Client ID : 7a41f1d8215640ca6b00 Client secret : ea03957288edd0e590be202b239e4f0ff26b8047 Select Certificates & secrets under Manage. Select the 'New client secret' button. Enter a value in Description and select one of the options for Expires and select 'Add'. Copy the client secret Value (not Secret ID!) before you leave this page. You will need it in the next step. This step is done for you when creating the app. All you have to do is copy down the client secret. You will need it in the next step. Saving configuration Now we need to set the configuration options for your provider within LibreNMS itself. Please replace the values in the examples below with the values you collected earlier: The format of the configuration string is auth.socialite.configs.*provider name*.*value* GitHub Microsoft Okta settings/auth/socialite lnms config:set auth.socialite.configs.github.client_id 7a41f1d8215640ca6b00 lnms config:set auth.socialite.configs.github.client_secret ea03957288edd0e590be202b239e4f0ff26b8047 settings/auth/socialite lnms config:set auth.socialite.configs.microsoft.client_id 7983ac13-c955-40e9-9b85-5ba27be52a52 lnms config:set auth.socialite.configs.microsoft.client_secret J9P7Q~K2F5C.L243sqzbGj.cOOcjTBgAPak_l lnms config:set auth.socialite.configs.microsoft.tenant a15edc05-152d-4eb4-973c-14f1fdc57d8b settings/auth/socialite lnms config:set auth.socialite.configs.okta.client_id 0oa1c08tti8D7xgXb697 lnms config:set auth.socialite.configs.okta.client_secret sWew90IKqKDmURj1XLsCPjXjre0U3zmJuFR6SzsG lnms config:set auth.socialite.configs.okta.base_url \"https://\" Add provider event listener The final step is to now add an event listener. Note It's important to copy exactly the right value here, It should begin with a \\ and end before the ::class.'@handle' GitHub Microsoft Okta Find the section looking like: protected $listen = [ \\SocialiteProviders\\Manager\\SocialiteWasCalled :: class => [ // ... other providers \\SocialiteProviders\\GitHub\\GitHubExtendSocialite :: class . '@handle' , ], ]; Copy the part: \\SocialiteProviders\\GitHub\\GitHubExtendSocialite and run; settings/auth/socialite lnms config:set auth.socialite.configs.github.listener \"\\SocialiteProviders\\GitHub\\GitHubExtendSocialite\" Don't forget the initial backslash (\\) ! Find the section looking like: protected $listen = [ \\SocialiteProviders\\Manager\\SocialiteWasCalled :: class => [ // ... other providers \\SocialiteProviders\\Microsoft\\MicrosoftExtendSocialite :: class . '@handle' , ], ]; Copy the part: \\SocialiteProviders\\Microsoft\\MicrosoftExtendSocialite and run; settings/auth/socialite lnms config:set auth.socialite.configs.microsoft.listener \"\\SocialiteProviders\\Microsoft\\MicrosoftExtendSocialite\" Don't forget the initial backslash (\\) ! Find the section looking like: protected $listen = [ \\SocialiteProviders\\Manager\\SocialiteWasCalled :: class => [ // ... other providers \\SocialiteProviders\\Okta\\OktaExtendSocialite :: class . '@handle' , ], ]; Copy the part: \\SocialiteProviders\\Okta\\OktaExtendSocialite and run; settings/auth/socialite lnms config:set auth.socialite.configs.okta.listener \"\\SocialiteProviders\\Okta\\OktaExtendSocialite\" Don't forget the initial backslack (\\) ! Now you are done with setting up the OAuth provider! If it doesn't work, please double check your configuration values by using the config:get command below. settings/auth/socialite lnms config:get auth.socialite Default Role Since most Socialite Providers don't provide Authorization only Authentication it is possible to set the default User Role for Authorized users. Appropriate care should be taken. none: No Access : User has no access normal: Normal User : You will need to assign device / port permissions for users at this level. global-read: Global Read : Read only Administrator. admin: Administrator : This is a global read/write admin account. settings/auth/socialite lnms config:set auth.socialite.default_role global-read Claims / Access Scopes Socialite can specifiy scopes that should be included with in the authentication request. (see Larvel docs ) For example, if Okta is configured to expose group information it is possible to use these group names to configure User Roles. First enable sending the 'groups' claim (along with the normal openid, profile, and email claims). Be aware that the scope name must match the claim name. For identity providers where the scope does not match (e.g. Keycloak: roles -> groups) you need to configure a custom scope. settings/auth/socialite lnms config:set auth.socialite.scopes.+ groups Then setup mappings from the returned claim arrays to the User levels you want settings/auth/socialite lnms config:set auth.socialite.claims.RETURN_FROM_CLAIM.roles '[\"admin\"]' lnms config:set auth.socialite.claims.OTHER_RETURN_FROM_CLAIM.roles '[\"global-read\",\"cleaner\"]' SAML2 Example Install plugin The first step is to install the plugin itself. lnms plugin:add socialiteproviders/saml2 Add configuration Depending on what your identity provider (Google, Azure, ...) supports, the configuration could look different from what you see next so please use this as a rough guide. It is up the IdP to provide the relevant details that you will need for configuration. Google Azure Go to https://admin.google.com/ac/apps/unified Press \"DOWNLOAD METADATA\" and save the file somewhere accessible by your LibreNMS server ACS URL = https:// your-librenms-url /auth/saml2/callback Entity ID = https:// your-librenms-url /auth/saml2 Name ID format = PERSISTANT Name ID = Basic Information > Primary email First name = http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname Last name = http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname Primary email = http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress settings/auth/socialite lnms config:set auth.socialite.configs.saml2.metadata \" $( cat /tmp/GoogleIDPMetadata.xml ) \" Alternatively, you can copy the content of the file and run it like so, this will result in the exact same result as above. settings/auth/socialite lnms config:set auth.socialite.configs.saml2.metadata '''''' echo \"SESSION_SAME_SITE_COOKIE=none\" >> .env lnms plugin:add socialiteproviders/saml2 lnms config:set auth.socialite.redirect true lnms config:set auth.socialite.register true lnms config:set auth.socialite.configs.saml2.acs https://login.microsoftonline.com/xxxidfromazurexxx/saml2 lnms config:set auth.socialite.configs.saml2.entityid https://sts.windows.net/xxxidfromazurexxx/ lnms config:set auth.socialite.configs.saml2.certificate xxxcertinonelinexxx lnms config:set auth.socialite.configs.saml2.listener \"\\SocialiteProviders\\Saml2\\Saml2ExtendSocialite\" lnms config:set auth.socialite.configs.saml2.metadata https://nexus.microsoftonline-p.com/federationmetadata/saml20/federationmetadata.xml lnms config:set auth.socialite.configs.saml2.sp_default_binding_method urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST lnms config:clear Using an Identity Provider metadata URL Note This is the prefered and easiest way, if your IdP supports it! settings/auth/socialite lnms config:set auth.socialite.configs.saml2.metadata https://idp.co/metadata/xml Using an Identity Provider metadata XML file settings/auth/socialite lnms config:set auth.socialite.configs.saml2.metadata \" $( cat GoogleIDPMetadata.xml ) \" Manually configuring the Identity Provider with a certificate string settings/auth/socialite lnms config:set auth.socialite.configs.saml2.acs https://idp.co/auth/acs lnms config:set auth.socialite.configs.saml2.entityid http://saml.to/trust lnms config:set auth.socialite.configs.saml2.certificate MIIC4jCCAcqgAwIBAgIQbDO5YO.... Manually configuring the Identity Provider with a certificate file settings/auth/socialite lnms config:set auth.socialite.configs.saml2.acs https://idp.co/auth/acs lnms config:set auth.socialite.configs.saml2.entityid http://saml.to/trust lnms config:set auth.socialite.configs.saml2.certificate \" $( cat /path/to/certificate.pem ) \" Add provider event listener Now we just need to define the listener service within LibreNMS: settings/auth/socialite lnms config:set auth.socialite.configs.saml2.listener \"\\SocialiteProviders\\Saml2\\Saml2ExtendSocialite\" SESSION_SAME_SITE_COOKIE You most likely will need to set SESSION_SAME_SITE_COOKIE=none in .env if you use SAML2! If you get an error with http code 419, you should try to remove SESSION_SAME_SITE_COOKIE=none from your .env . Note Don't forget to run lnms config:clear after you modify .env to flush the config cache Service provider metadata Your identify provider might ask you for your Service Provider (SP) metadata. LibreNMS exposes all of this information from your LibreNMS install Troubleshooting If it doesn't work, please double check your configuration values by using the config:get command below. settings/auth/socialite lnms config:get auth.socialite Redirect URL If you have a need to, then you can override redirect url with the following commands: OAuth SAML2 Replace github and the relevant URL below with your identity provider details. lnms config:set auth.socialite.configs.github.redirect https://demo.librenms.org/auth/github/callback lnms config:set auth.socialite.configs.saml2.sp_acs auth/saml2/callback Post configuration settings settings/auth/socialite From here you can configure the settings for any identity providers you have configured along with some bespoke options. Redirect Login page: This setting will skip your LibreNMS login and take the end user straight to the first idP you configured. Allow registration via provider: If this setting is disabled, new users signing in via the idP will not be authenticated. This setting allows a local user to be automatically created which permits their login.","title":"Oauth/SAML support"},{"location":"Extensions/OAuth-SAML/#oauth-and-saml-support","text":"","title":"OAuth and SAML Support"},{"location":"Extensions/OAuth-SAML/#introduction","text":"LibreNMS has support for Laravel Socialite to try and simplify the use of OAuth 1 or 2 providers such as using GitHub, Microsoft, Twitter + many more and SAML. Socialite Providers supports more than 100+ 3rd parties so you will most likely find support for the SAML or OAuth provider you need without too much trouble. Please do note however, these providers are not maintained by LibreNMS so we cannot add support for new ones and we can only provide you basic help with general configuration. See the Socialite Providers website for more information on adding a new OAuth provider. Below we will guide you on how to install SAML or some of these OAth providers, you should be able to use these as a guide on how to install any others you may need but please, please, ensure you read the Socialite Providers documentation carefully . GitHub Provider Microsoft Provider Okta Provider SAML2","title":"Introduction"},{"location":"Extensions/OAuth-SAML/#requirements","text":"LibreNMS version 22.3.0 or later. Please ensure you set APP_URL within your .env file so that callback URLs work correctly with the identify provider. Note Once you have configured your OAuth or SAML2 provider, please ensure you check the Post configuration settings section at the end.","title":"Requirements"},{"location":"Extensions/OAuth-SAML/#github-and-microsoft-examples","text":"","title":"GitHub and Microsoft Examples"},{"location":"Extensions/OAuth-SAML/#install-plugin","text":"Note First we need to install the plugin itself. The plugin name can be slightly different so be sure to check the Socialite Providers documentation and look for this line, composer require socialiteproviders/github which will give you the name you need for the command, i.e: socialiteproviders/github . GitHub Microsoft Okta lnms plugin:add socialiteproviders/github lnms plugin:add socialiteproviders/microsoft lnms plugin:add socialiteproviders/okta","title":"Install plugin"},{"location":"Extensions/OAuth-SAML/#find-the-provider-name","text":"Next we need to find the provider name and writing it down Note It's almost always the name of the provider in lowercase but can be different so check the Socialite Providers documentation and look for this line, github => [ which will give you the name you need for the above command: github . GitHub Microsoft Okta For GitHub we can find the line: 'github' => [ 'client_id' => env ( 'GITHUB_CLIENT_ID' ), 'client_secret' => env ( 'GITHUB_CLIENT_SECRET' ), 'redirect' => env ( 'GITHUB_REDIRECT_URI' ) ], So our provider name is github , write this down. For Microsoft we can find the line: 'microsoft' => [ 'client_id' => env ( 'MICROSOFT_CLIENT_ID' ), 'client_secret' => env ( 'MICROSOFT_CLIENT_SECRET' ), 'redirect' => env ( 'MICROSOFT_REDIRECT_URI' ) ], So our provider name is microsoft , write this down. For Okta we can find the line: 'okta' => [ 'base_url' => env ( 'OKTA_BASE_URL' ), 'client_id' => env ( 'OKTA_CLIENT_ID' ), 'client_secret' => env ( 'OKTA_CLIENT_SECRET' ), 'redirect' => env ( 'OKTA_REDIRECT_URI' ) ], So our provider name is okta , write this down.","title":"Find the provider name"},{"location":"Extensions/OAuth-SAML/#register-oauth-application","text":"","title":"Register OAuth application"},{"location":"Extensions/OAuth-SAML/#register-a-new-application","text":"Now we need some values from the OAuth provider itself, in most cases you need to register a new \"OAuth application\" at the providers site. This will vary from provider to provider but the process itself should be similar to the examples below. Note The callback URL is always: https:// your-librenms-url /auth/ provider /callback It doesn't need to be a public available site, but it almost always needs to support TLS (https)! GitHub Microsoft Okta For our example with GitHub we go to GitHub Developer Settings and press \"Register a new application\": Fill out the form accordingly (with your own values): For our example with Microsoft we go to \"Azure Active Directory\" > \"App registrations\" and press \"New registration\" Fill out the form accordingly using your own values): Copy the value of the Application (client) ID and Directory (tenant) ID and save them, you will need them in the next step. For our example with Okta, we go to Applications>Create App Integration , Select OIDC - OpenID Connect , then Web Application . Fill in the Name, Logo, and Assignments based on your preferred settings. Leave the Sign-In Redirect URI field, this is where you will edit this later: Note your Okta domain or login url. Sometimes this can be a vanity url like login.company.com , or sometimes just company.okta.com . Click save.","title":"Register a new application"},{"location":"Extensions/OAuth-SAML/#generate-a-new-client-secret","text":"GitHub Microsoft Okta Press 'Generate a new client secret' to get a new client secret. Copy the Client ID and Client secret In the example above it is: Client ID : 7a41f1d8215640ca6b00 Client secret : ea03957288edd0e590be202b239e4f0ff26b8047 Select Certificates & secrets under Manage. Select the 'New client secret' button. Enter a value in Description and select one of the options for Expires and select 'Add'. Copy the client secret Value (not Secret ID!) before you leave this page. You will need it in the next step. This step is done for you when creating the app. All you have to do is copy down the client secret. You will need it in the next step.","title":"Generate a new client secret"},{"location":"Extensions/OAuth-SAML/#saving-configuration","text":"Now we need to set the configuration options for your provider within LibreNMS itself. Please replace the values in the examples below with the values you collected earlier: The format of the configuration string is auth.socialite.configs.*provider name*.*value* GitHub Microsoft Okta settings/auth/socialite lnms config:set auth.socialite.configs.github.client_id 7a41f1d8215640ca6b00 lnms config:set auth.socialite.configs.github.client_secret ea03957288edd0e590be202b239e4f0ff26b8047 settings/auth/socialite lnms config:set auth.socialite.configs.microsoft.client_id 7983ac13-c955-40e9-9b85-5ba27be52a52 lnms config:set auth.socialite.configs.microsoft.client_secret J9P7Q~K2F5C.L243sqzbGj.cOOcjTBgAPak_l lnms config:set auth.socialite.configs.microsoft.tenant a15edc05-152d-4eb4-973c-14f1fdc57d8b settings/auth/socialite lnms config:set auth.socialite.configs.okta.client_id 0oa1c08tti8D7xgXb697 lnms config:set auth.socialite.configs.okta.client_secret sWew90IKqKDmURj1XLsCPjXjre0U3zmJuFR6SzsG lnms config:set auth.socialite.configs.okta.base_url \"https://\"","title":"Saving configuration"},{"location":"Extensions/OAuth-SAML/#add-provider-event-listener","text":"The final step is to now add an event listener. Note It's important to copy exactly the right value here, It should begin with a \\ and end before the ::class.'@handle' GitHub Microsoft Okta Find the section looking like: protected $listen = [ \\SocialiteProviders\\Manager\\SocialiteWasCalled :: class => [ // ... other providers \\SocialiteProviders\\GitHub\\GitHubExtendSocialite :: class . '@handle' , ], ]; Copy the part: \\SocialiteProviders\\GitHub\\GitHubExtendSocialite and run; settings/auth/socialite lnms config:set auth.socialite.configs.github.listener \"\\SocialiteProviders\\GitHub\\GitHubExtendSocialite\" Don't forget the initial backslash (\\) ! Find the section looking like: protected $listen = [ \\SocialiteProviders\\Manager\\SocialiteWasCalled :: class => [ // ... other providers \\SocialiteProviders\\Microsoft\\MicrosoftExtendSocialite :: class . '@handle' , ], ]; Copy the part: \\SocialiteProviders\\Microsoft\\MicrosoftExtendSocialite and run; settings/auth/socialite lnms config:set auth.socialite.configs.microsoft.listener \"\\SocialiteProviders\\Microsoft\\MicrosoftExtendSocialite\" Don't forget the initial backslash (\\) ! Find the section looking like: protected $listen = [ \\SocialiteProviders\\Manager\\SocialiteWasCalled :: class => [ // ... other providers \\SocialiteProviders\\Okta\\OktaExtendSocialite :: class . '@handle' , ], ]; Copy the part: \\SocialiteProviders\\Okta\\OktaExtendSocialite and run; settings/auth/socialite lnms config:set auth.socialite.configs.okta.listener \"\\SocialiteProviders\\Okta\\OktaExtendSocialite\" Don't forget the initial backslack (\\) ! Now you are done with setting up the OAuth provider! If it doesn't work, please double check your configuration values by using the config:get command below. settings/auth/socialite lnms config:get auth.socialite","title":"Add provider event listener"},{"location":"Extensions/OAuth-SAML/#default-role","text":"Since most Socialite Providers don't provide Authorization only Authentication it is possible to set the default User Role for Authorized users. Appropriate care should be taken. none: No Access : User has no access normal: Normal User : You will need to assign device / port permissions for users at this level. global-read: Global Read : Read only Administrator. admin: Administrator : This is a global read/write admin account. settings/auth/socialite lnms config:set auth.socialite.default_role global-read","title":"Default Role"},{"location":"Extensions/OAuth-SAML/#claims-access-scopes","text":"Socialite can specifiy scopes that should be included with in the authentication request. (see Larvel docs ) For example, if Okta is configured to expose group information it is possible to use these group names to configure User Roles. First enable sending the 'groups' claim (along with the normal openid, profile, and email claims). Be aware that the scope name must match the claim name. For identity providers where the scope does not match (e.g. Keycloak: roles -> groups) you need to configure a custom scope. settings/auth/socialite lnms config:set auth.socialite.scopes.+ groups Then setup mappings from the returned claim arrays to the User levels you want settings/auth/socialite lnms config:set auth.socialite.claims.RETURN_FROM_CLAIM.roles '[\"admin\"]' lnms config:set auth.socialite.claims.OTHER_RETURN_FROM_CLAIM.roles '[\"global-read\",\"cleaner\"]'","title":"Claims / Access Scopes"},{"location":"Extensions/OAuth-SAML/#saml2-example","text":"","title":"SAML2 Example"},{"location":"Extensions/OAuth-SAML/#install-plugin_1","text":"The first step is to install the plugin itself. lnms plugin:add socialiteproviders/saml2","title":"Install plugin"},{"location":"Extensions/OAuth-SAML/#add-configuration","text":"Depending on what your identity provider (Google, Azure, ...) supports, the configuration could look different from what you see next so please use this as a rough guide. It is up the IdP to provide the relevant details that you will need for configuration. Google Azure Go to https://admin.google.com/ac/apps/unified Press \"DOWNLOAD METADATA\" and save the file somewhere accessible by your LibreNMS server ACS URL = https:// your-librenms-url /auth/saml2/callback Entity ID = https:// your-librenms-url /auth/saml2 Name ID format = PERSISTANT Name ID = Basic Information > Primary email First name = http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname Last name = http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname Primary email = http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress settings/auth/socialite lnms config:set auth.socialite.configs.saml2.metadata \" $( cat /tmp/GoogleIDPMetadata.xml ) \" Alternatively, you can copy the content of the file and run it like so, this will result in the exact same result as above. settings/auth/socialite lnms config:set auth.socialite.configs.saml2.metadata '''''' echo \"SESSION_SAME_SITE_COOKIE=none\" >> .env lnms plugin:add socialiteproviders/saml2 lnms config:set auth.socialite.redirect true lnms config:set auth.socialite.register true lnms config:set auth.socialite.configs.saml2.acs https://login.microsoftonline.com/xxxidfromazurexxx/saml2 lnms config:set auth.socialite.configs.saml2.entityid https://sts.windows.net/xxxidfromazurexxx/ lnms config:set auth.socialite.configs.saml2.certificate xxxcertinonelinexxx lnms config:set auth.socialite.configs.saml2.listener \"\\SocialiteProviders\\Saml2\\Saml2ExtendSocialite\" lnms config:set auth.socialite.configs.saml2.metadata https://nexus.microsoftonline-p.com/federationmetadata/saml20/federationmetadata.xml lnms config:set auth.socialite.configs.saml2.sp_default_binding_method urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST lnms config:clear","title":"Add configuration"},{"location":"Extensions/OAuth-SAML/#using-an-identity-provider-metadata-url","text":"Note This is the prefered and easiest way, if your IdP supports it! settings/auth/socialite lnms config:set auth.socialite.configs.saml2.metadata https://idp.co/metadata/xml","title":"Using an Identity Provider metadata URL"},{"location":"Extensions/OAuth-SAML/#using-an-identity-provider-metadata-xml-file","text":"settings/auth/socialite lnms config:set auth.socialite.configs.saml2.metadata \" $( cat GoogleIDPMetadata.xml ) \"","title":"Using an Identity Provider metadata XML file"},{"location":"Extensions/OAuth-SAML/#manually-configuring-the-identity-provider-with-a-certificate-string","text":"settings/auth/socialite lnms config:set auth.socialite.configs.saml2.acs https://idp.co/auth/acs lnms config:set auth.socialite.configs.saml2.entityid http://saml.to/trust lnms config:set auth.socialite.configs.saml2.certificate MIIC4jCCAcqgAwIBAgIQbDO5YO....","title":"Manually configuring the Identity Provider with a certificate string"},{"location":"Extensions/OAuth-SAML/#manually-configuring-the-identity-provider-with-a-certificate-file","text":"settings/auth/socialite lnms config:set auth.socialite.configs.saml2.acs https://idp.co/auth/acs lnms config:set auth.socialite.configs.saml2.entityid http://saml.to/trust lnms config:set auth.socialite.configs.saml2.certificate \" $( cat /path/to/certificate.pem ) \"","title":"Manually configuring the Identity Provider with a certificate file"},{"location":"Extensions/OAuth-SAML/#add-provider-event-listener_1","text":"Now we just need to define the listener service within LibreNMS: settings/auth/socialite lnms config:set auth.socialite.configs.saml2.listener \"\\SocialiteProviders\\Saml2\\Saml2ExtendSocialite\"","title":"Add provider event listener"},{"location":"Extensions/OAuth-SAML/#session_same_site_cookie","text":"You most likely will need to set SESSION_SAME_SITE_COOKIE=none in .env if you use SAML2! If you get an error with http code 419, you should try to remove SESSION_SAME_SITE_COOKIE=none from your .env . Note Don't forget to run lnms config:clear after you modify .env to flush the config cache","title":"SESSION_SAME_SITE_COOKIE"},{"location":"Extensions/OAuth-SAML/#service-provider-metadata","text":"Your identify provider might ask you for your Service Provider (SP) metadata. LibreNMS exposes all of this information from your LibreNMS install","title":"Service provider metadata"},{"location":"Extensions/OAuth-SAML/#troubleshooting","text":"If it doesn't work, please double check your configuration values by using the config:get command below. settings/auth/socialite lnms config:get auth.socialite","title":"Troubleshooting"},{"location":"Extensions/OAuth-SAML/#redirect-url","text":"If you have a need to, then you can override redirect url with the following commands: OAuth SAML2 Replace github and the relevant URL below with your identity provider details. lnms config:set auth.socialite.configs.github.redirect https://demo.librenms.org/auth/github/callback lnms config:set auth.socialite.configs.saml2.sp_acs auth/saml2/callback","title":"Redirect URL"},{"location":"Extensions/OAuth-SAML/#post-configuration-settings","text":"settings/auth/socialite From here you can configure the settings for any identity providers you have configured along with some bespoke options. Redirect Login page: This setting will skip your LibreNMS login and take the end user straight to the first idP you configured. Allow registration via provider: If this setting is disabled, new users signing in via the idP will not be authenticated. This setting allows a local user to be automatically created which permits their login.","title":"Post configuration settings"},{"location":"Extensions/Oxidized/","text":"Oxidized Integrating LibreNMS with Oxidized brings the following benefits: Config viewing: Current, History, and Diffs all under the Configs tab of each device Automatic addition of devices to Oxidized: Including filtering and grouping to ease credential management Configuration searching (Requires oxidized-web 0.8.0 or newer) First you will need to install Oxidized following their documentation . Then you can procede to the LibreNMS Web UI and go to Oxidized Settings in the External Settings section of Global Settings. Enable it and enter the url to your oxidized instance. To have devices automatically added, you will need to configure oxidized to pull them from LibreNMS Feeding Oxidized Note: this means devices will be controlled by the LibreNMS API, and not router.db, passwords will still need to be in the oxidized config file. LibreNMS will automatically map the OS to the Oxidized model name if they don't match. this means you shouldn't need to use the model_map config option within Oxidized. Detailed integration information This is a straight forward use of Oxidized, it relies on you having a working Oxidized setup which is already taking config snapshots for your devices. When you have that, you only need the following config to enable the display of device configs within the device page itself: external/oxidized lnms config:set oxidized.enabled true lnms config:set oxidized.url http://127.0.0.1:8888 LibreNMS supports config versioning if Oxidized does. This is known to work with the git output module. external/oxidized lnms config:set oxidized.features.versioning true Oxidized supports various ways to utilise credentials to login to devices, you can specify global username/password within Oxidized, Group level username/password or per device. LibreNMS currently supports sending groups back to Oxidized so that you can then define group credentials within Oxidized. To enable this support please switch on 'Enable the return of groups to Oxidized': external/oxidized lnms config:set oxidized.group_support true You can set a default group that devices will fall back to with: external/oxidized lnms config:set oxidized.default_group default You can ignore specific groups external/oxidized lnms config:set oxidized.ignore_groups '[\"badgroup\", \"nobackup\"]' One trick you can do to ignore all ungrouped devices is set both of these settings external/oxidized lnms config:set oxidized.default_group nobackup lnms config:set oxidized.ignore_groups.+ nobackup SELinux If you're running SELinux, you'll need to allow httpd to connect outbound to the network, otherwise Oxidized integration in the web UI will silently fail: setsebool -P httpd_can_network_connect 1 Feeding Oxidized Oxidized has support for feeding devices into it via an API call, support for Oxidized has been added to the LibreNMS API. A sample config for Oxidized is provided below. You will need to configure default credentials for your devices in the Oxidized config, LibreNMS doesn't provide login credentials at this time. source: default: http debug: false http: url: https://librenms/api/v0/oxidized map: name: hostname model: os group: group headers: X-Auth-Token: '01582bf94c03104ecb7953dsadsadwed' LibreNMS is able to reload the Oxidized list of nodes, each time a device is added to LibreNMS. To do so, edit the option in Global Settings>External Settings>Oxidized Integration or add the following to your config. external/oxidized lnms config:set oxidized.reload_nodes true Creating overrides To return an override to Oxidized you can do this by providing the override key, followed by matching a lookup for a host (or hosts), and finally by defining the overriding value itself. LibreNMS does not check for the validity of these attributes but will deliver them to Oxidized as defined. Matching of hosts can be done using hostname , sysname , os , location , sysDescr , hardware , purpose or notes and including either a 'match' key and value, or a 'regex' key and value. The order of matching is: hostname sysName sysDescr hardware os location ip purpose notes To match on the device hostnames or sysNames that contain 'lon-sw' or if the location contains 'London' then you would set the following: external/oxidized lnms config:set oxidized.maps.group.hostname.+ '{\"regex\": \"/^lon-sw/\", \"value\": \"london-switches\"}' lnms config:set oxidized.maps.group.sysName.+ '{\"regex\": \"/^lon-sw/\", \"value\": \"london-switches\"}' lnms config:set oxidized.maps.group.location.+ '{\"regex\": \"/london/\", \"value\": \"london-switches\"}' To match on a device os of edgeos then please use the following: external/oxidized lnms config:set oxidized.maps.group.os.+ '{\"match\": \"edgeos\", \"value\": \"wireless\"}' Matching on OS requires system name of the OS. For example, \"match\": \"RouterOS\" will not work, while \"match\": \"routeros\" will. To match on a device purpose or device notes that contains 'lon-net' then you would set the following: external/oxidized lnms config:set oxidized.maps.group.purpose.+ '{\"regex\": \"/^lon-sw/\", \"value\": \"london-network\"}' lnms config:set oxidized.maps.group.notes.+ '{\"regex\": \"/^lon-sw/\", \"value\": \"london-network\"}' To edit an existing map, you must use the index to override it. external/oxidized lnms config:get oxidized.maps.os.os [ { \"match\" : \"airos-af-ltu\" , \"value\" : \"airfiber\" } , { \"match\" : \"airos-af\" , \"value\" : \"airfiber\" } , ] lnms config:set oxidized.maps.os.os.1 '{\"match\": \"airos-af\", \"value\": \"something-else\"}' To override the IP Oxidized uses to poll the device, set the following: external/oxidized lnms config:set oxidized.maps.ip.sysName.+ '{\"regex\": \"/^my.node/\", \"value\": \"192.168.1.10\"}' lnms config:set oxidized.maps.ip.sysName.+ '{\"match\": \"my-other.node\", \"value\": \"192.168.1.20\"}' This allows extending the configuration further by providing a completely flexible model for custom flags and settings, for example, below shows the ability to add an ssh_proxy host within Oxidized simply by adding the below to your configuration: external/oxidized lnms config:set oxidized.maps.ssh_proxy.sysName.+ '{\"regex\": \"/^my.node/\", \"value\": \"my-ssh-gateway.node\"}' Or of course, any custom value that could be needed or wanted can be applied, for example, setting a \"myAttribute\" to \"Super cool value\" for any configured and enabled \"routeros\" device. external/oxidized lnms config:set oxidized.maps.myAttribute.os.+ '{\"match\": \"routeros\", \"value\": \"Super cool value\"}' Verify the return of groups by querying the API: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/oxidized If you need to, you can specify credentials for groups by using the following in your Oxidized config: groups: : username: password: Miscellaneous If you have devices which you do not wish to appear in Oxidized then you can edit those devices in Device -> Edit -> Misc and enable \"Exclude from Oxidized?\" The use of custom ssh and telnet ports can be set through device settings misc tab, and can be passed on to oxidized with the following vars_map source: http: map: name: hostname model: os group: group vars_map: ssh_port: ssh_port telnet_port: telnet_port It's also possible to exclude certain device types and OS' from being output via the API. external/oxidized lnms config:set oxidized.ignore_types '[\"server\", \"power\"]' lnms config:set oxidized.ignore_os '[\"linux\", \"windows\"]' You can also ignore whole groups of devices external/oxidized lnms config:set oxidized.ignore_groups '[\"london-switches\", \"default\"]' Trigger configuration backups Using the Oxidized REST API and Syslog Hooks , Oxidized can trigger configuration downloads whenever a configuration change event has been logged. An example script to do this is included in ./scripts/syslog-notify-oxidized.php . Oxidized can spawn a new worker thread and perform the download immediately with the following configuration next_adds_job: true Validate Oxidized config You can perform basic validation of the Oxidized configuration by going to the Overview -> Tools -> Oxidized link and in the Oxidized config validation page, paste your yaml file into the input box and click 'Validate YAML'. We check for yaml syntax errors and also actual config values to ensure they are used in the correct location. Accessing configuration of a disabled/removed device When you're disabling or removing a device from LibreNMS, the configuration will no longer be available via the LibreNMS web interface. You can gain access to these configurations directly in the Git repository of Oxidized (if using Git for version control). 1: Check in your Oxidized where are stored your Git repositories: /home/oxidized/.config/oxidized/config 2: Go the correct Git repository for the needed device (the .git one) and get the list of devices using this command: git ls-files -s 3: Save the object ID of the device, and run the command to get the file content: git cat-file -p Remove disabled/removed device If you want to purge saved config of a device that is not in LibreNMS anymore, you can run the following command: git rm --cached ","title":"Oxidized"},{"location":"Extensions/Oxidized/#oxidized","text":"Integrating LibreNMS with Oxidized brings the following benefits: Config viewing: Current, History, and Diffs all under the Configs tab of each device Automatic addition of devices to Oxidized: Including filtering and grouping to ease credential management Configuration searching (Requires oxidized-web 0.8.0 or newer) First you will need to install Oxidized following their documentation . Then you can procede to the LibreNMS Web UI and go to Oxidized Settings in the External Settings section of Global Settings. Enable it and enter the url to your oxidized instance. To have devices automatically added, you will need to configure oxidized to pull them from LibreNMS Feeding Oxidized Note: this means devices will be controlled by the LibreNMS API, and not router.db, passwords will still need to be in the oxidized config file. LibreNMS will automatically map the OS to the Oxidized model name if they don't match. this means you shouldn't need to use the model_map config option within Oxidized.","title":"Oxidized"},{"location":"Extensions/Oxidized/#detailed-integration-information","text":"This is a straight forward use of Oxidized, it relies on you having a working Oxidized setup which is already taking config snapshots for your devices. When you have that, you only need the following config to enable the display of device configs within the device page itself: external/oxidized lnms config:set oxidized.enabled true lnms config:set oxidized.url http://127.0.0.1:8888 LibreNMS supports config versioning if Oxidized does. This is known to work with the git output module. external/oxidized lnms config:set oxidized.features.versioning true Oxidized supports various ways to utilise credentials to login to devices, you can specify global username/password within Oxidized, Group level username/password or per device. LibreNMS currently supports sending groups back to Oxidized so that you can then define group credentials within Oxidized. To enable this support please switch on 'Enable the return of groups to Oxidized': external/oxidized lnms config:set oxidized.group_support true You can set a default group that devices will fall back to with: external/oxidized lnms config:set oxidized.default_group default You can ignore specific groups external/oxidized lnms config:set oxidized.ignore_groups '[\"badgroup\", \"nobackup\"]' One trick you can do to ignore all ungrouped devices is set both of these settings external/oxidized lnms config:set oxidized.default_group nobackup lnms config:set oxidized.ignore_groups.+ nobackup","title":"Detailed integration information"},{"location":"Extensions/Oxidized/#selinux","text":"If you're running SELinux, you'll need to allow httpd to connect outbound to the network, otherwise Oxidized integration in the web UI will silently fail: setsebool -P httpd_can_network_connect 1","title":"SELinux"},{"location":"Extensions/Oxidized/#feeding-oxidized","text":"Oxidized has support for feeding devices into it via an API call, support for Oxidized has been added to the LibreNMS API. A sample config for Oxidized is provided below. You will need to configure default credentials for your devices in the Oxidized config, LibreNMS doesn't provide login credentials at this time. source: default: http debug: false http: url: https://librenms/api/v0/oxidized map: name: hostname model: os group: group headers: X-Auth-Token: '01582bf94c03104ecb7953dsadsadwed' LibreNMS is able to reload the Oxidized list of nodes, each time a device is added to LibreNMS. To do so, edit the option in Global Settings>External Settings>Oxidized Integration or add the following to your config. external/oxidized lnms config:set oxidized.reload_nodes true","title":"Feeding Oxidized"},{"location":"Extensions/Oxidized/#creating-overrides","text":"To return an override to Oxidized you can do this by providing the override key, followed by matching a lookup for a host (or hosts), and finally by defining the overriding value itself. LibreNMS does not check for the validity of these attributes but will deliver them to Oxidized as defined. Matching of hosts can be done using hostname , sysname , os , location , sysDescr , hardware , purpose or notes and including either a 'match' key and value, or a 'regex' key and value. The order of matching is: hostname sysName sysDescr hardware os location ip purpose notes To match on the device hostnames or sysNames that contain 'lon-sw' or if the location contains 'London' then you would set the following: external/oxidized lnms config:set oxidized.maps.group.hostname.+ '{\"regex\": \"/^lon-sw/\", \"value\": \"london-switches\"}' lnms config:set oxidized.maps.group.sysName.+ '{\"regex\": \"/^lon-sw/\", \"value\": \"london-switches\"}' lnms config:set oxidized.maps.group.location.+ '{\"regex\": \"/london/\", \"value\": \"london-switches\"}' To match on a device os of edgeos then please use the following: external/oxidized lnms config:set oxidized.maps.group.os.+ '{\"match\": \"edgeos\", \"value\": \"wireless\"}' Matching on OS requires system name of the OS. For example, \"match\": \"RouterOS\" will not work, while \"match\": \"routeros\" will. To match on a device purpose or device notes that contains 'lon-net' then you would set the following: external/oxidized lnms config:set oxidized.maps.group.purpose.+ '{\"regex\": \"/^lon-sw/\", \"value\": \"london-network\"}' lnms config:set oxidized.maps.group.notes.+ '{\"regex\": \"/^lon-sw/\", \"value\": \"london-network\"}' To edit an existing map, you must use the index to override it. external/oxidized lnms config:get oxidized.maps.os.os [ { \"match\" : \"airos-af-ltu\" , \"value\" : \"airfiber\" } , { \"match\" : \"airos-af\" , \"value\" : \"airfiber\" } , ] lnms config:set oxidized.maps.os.os.1 '{\"match\": \"airos-af\", \"value\": \"something-else\"}' To override the IP Oxidized uses to poll the device, set the following: external/oxidized lnms config:set oxidized.maps.ip.sysName.+ '{\"regex\": \"/^my.node/\", \"value\": \"192.168.1.10\"}' lnms config:set oxidized.maps.ip.sysName.+ '{\"match\": \"my-other.node\", \"value\": \"192.168.1.20\"}' This allows extending the configuration further by providing a completely flexible model for custom flags and settings, for example, below shows the ability to add an ssh_proxy host within Oxidized simply by adding the below to your configuration: external/oxidized lnms config:set oxidized.maps.ssh_proxy.sysName.+ '{\"regex\": \"/^my.node/\", \"value\": \"my-ssh-gateway.node\"}' Or of course, any custom value that could be needed or wanted can be applied, for example, setting a \"myAttribute\" to \"Super cool value\" for any configured and enabled \"routeros\" device. external/oxidized lnms config:set oxidized.maps.myAttribute.os.+ '{\"match\": \"routeros\", \"value\": \"Super cool value\"}' Verify the return of groups by querying the API: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/oxidized If you need to, you can specify credentials for groups by using the following in your Oxidized config: groups: : username: password: ","title":"Creating overrides"},{"location":"Extensions/Oxidized/#miscellaneous","text":"If you have devices which you do not wish to appear in Oxidized then you can edit those devices in Device -> Edit -> Misc and enable \"Exclude from Oxidized?\" The use of custom ssh and telnet ports can be set through device settings misc tab, and can be passed on to oxidized with the following vars_map source: http: map: name: hostname model: os group: group vars_map: ssh_port: ssh_port telnet_port: telnet_port It's also possible to exclude certain device types and OS' from being output via the API. external/oxidized lnms config:set oxidized.ignore_types '[\"server\", \"power\"]' lnms config:set oxidized.ignore_os '[\"linux\", \"windows\"]' You can also ignore whole groups of devices external/oxidized lnms config:set oxidized.ignore_groups '[\"london-switches\", \"default\"]'","title":"Miscellaneous"},{"location":"Extensions/Oxidized/#trigger-configuration-backups","text":"Using the Oxidized REST API and Syslog Hooks , Oxidized can trigger configuration downloads whenever a configuration change event has been logged. An example script to do this is included in ./scripts/syslog-notify-oxidized.php . Oxidized can spawn a new worker thread and perform the download immediately with the following configuration next_adds_job: true","title":"Trigger configuration backups"},{"location":"Extensions/Oxidized/#validate-oxidized-config","text":"You can perform basic validation of the Oxidized configuration by going to the Overview -> Tools -> Oxidized link and in the Oxidized config validation page, paste your yaml file into the input box and click 'Validate YAML'. We check for yaml syntax errors and also actual config values to ensure they are used in the correct location.","title":"Validate Oxidized config"},{"location":"Extensions/Oxidized/#accessing-configuration-of-a-disabledremoved-device","text":"When you're disabling or removing a device from LibreNMS, the configuration will no longer be available via the LibreNMS web interface. You can gain access to these configurations directly in the Git repository of Oxidized (if using Git for version control). 1: Check in your Oxidized where are stored your Git repositories: /home/oxidized/.config/oxidized/config 2: Go the correct Git repository for the needed device (the .git one) and get the list of devices using this command: git ls-files -s 3: Save the object ID of the device, and run the command to get the file content: git cat-file -p ","title":"Accessing configuration of a disabled/removed device"},{"location":"Extensions/Oxidized/#remove-disabledremoved-device","text":"If you want to purge saved config of a device that is not in LibreNMS anymore, you can run the following command: git rm --cached ","title":"Remove disabled/removed device"},{"location":"Extensions/PeeringDB/","text":"PeeringDB Support LibreNMS has integration with PeeringDB to match up your BGP sessions with the peering exchanges you are connected to. To enable the integration please do so within the WebUI external/peeringdb lnms config:set peeringdb.enabled true Data will be collated the next time daily.sh is run or you can manually force this by running php daily.php -f peeringdb , the initial collection is delayed for a random amount of time to avoid overloading the PeeringDB API. Once enabled you will have an additional menu item under Routing -> PeeringDB","title":"PeeringDB"},{"location":"Extensions/PeeringDB/#peeringdb-support","text":"LibreNMS has integration with PeeringDB to match up your BGP sessions with the peering exchanges you are connected to. To enable the integration please do so within the WebUI external/peeringdb lnms config:set peeringdb.enabled true Data will be collated the next time daily.sh is run or you can manually force this by running php daily.php -f peeringdb , the initial collection is delayed for a random amount of time to avoid overloading the PeeringDB API. Once enabled you will have an additional menu item under Routing -> PeeringDB","title":"PeeringDB Support"},{"location":"Extensions/Plugin-System/","text":"Developing for the Plugin System With plugins you can extend LibreNMS with special functions that are specific to your setup or are not relevant or interesting for all community members. You are able to intervene in defined places in the behavior of the website, without it coming to problems with future updates. This documentation will give you a basis for writing a plugin for LibreNMS. An example plugin is included in the LibreNMS distribution. Version 2 Plugin System structure Plugins in version 2 need to be installed into app/Plugins Note: Plugins are disabled when the have an error, to show errors instead set plugins.show_errors The structure of a plugin is follows: app/Plugins /PluginName /DeviceOverview.php /Menu.php /Page.php /PortTab.php /Settings.php /resources/views /device-overview.blade.php /menu.blade.php /page.blade.php /port-tab.blade.php /settings.blade.php The above structure is checked before a plugin can be installed. All file/folder names are case sensitive and must match the structure. Only the blade files that are really needed need to be created. A plugin manager will then load a hook that has a basic functionality. If you want to customize the basic behavior of the hooks, you can create a class in 'app/Plugins/PluginName' and overload the hook methods. device-overview.blade.php :: This is called in the Device Overview page. You receive the $device as a object per default, you can do your work here and display your results in a frame.
            {{ $title }}
            {{ $device->hostname }}
            port-tab.blade.php :: This is called in the Port page, in the \"Plugins\" menu_option that will appear when your plugin gets enabled. In this blade, you can do your work and display your results in a frame. menu.blade.php :: For a menu entry page.blade.pho :: Here is a good place to add a own LibreNMS page without dependence with a device. A good place to create your own lists with special requirements and behavior. settings.blade.php :: If you need your own settings and variables, you can have a look in the ExamplePlugin. PHP Hooks customization PHP code should run inside your hooks method and not your blade view. The built in hooks support authorize and data methods. These methods are called with Dependency Injection Hooks with relevant database models will include them in these calls. Additionally, the settings argument may be included to inject the plugin settings into the method. Data You can overrid the data method to supply data to your view. You should also do any processing here. You can do things like access the database or configuration settings and more. In the data method we are injecting settings here to count how many we have for display in the menu entry blade view. Note that you must specify a default value ( = [] here) for any arguments that don't exist on the parent method. class Menu extends MenuEntryHook { public function data ( array $settings = []) : array { return [ 'count' => count ( $settings ), ]; } } Authorize By default hooks are always shown, but you may control when the user is authorized to view the hook content. As an example, you could imagine that the device-overview.blade.php should only be displayed when the device is in maintanence mode and the current user has the admin role. class DeviceOverview extends DeviceOverviewHook { public function authorize ( User $user , Device $device ) : bool { return $user -> can ( 'admin' ) && $device -> isUnderMaintenance (); } } Full plugin You may create a full plugin that can publish multiple routes, views, database migrations and more. Create a package according to the Laravel documentation you may call any of the supported hooks to tie into LibreNMS. https://laravel.com/docs/packages This is untested, please come to discord and share any expriences and update this documentation! Version 1 Plugin System structure (legacy verion) Plugins need to be installed into html/plugins The structure of a plugin is follows: html/plugins /PluginName /PluginName.php /PluginName.inc.php The above structure is checked before a plugin can be installed. All files / folder names are case sensitive and must match. PluginName - This is a directory and needs to be named as per the plugin you are creating. PluginName.php :: This file is used to process calls into the plugin from the main LibreNMS install. Here only functions within the class for your plugin that LibreNMS calls will be executed. For a list of currently enabled system hooks, please see further down. The minimum code required in this file is (replace Test with the name of your plugin): PluginName.inc.php :: This file is the main included file when browsing to the plugin itself. You can use this to display / edit / remove whatever you like. The minimum code required in this file is: System Hooks System hooks are called as functions within your plugin class. The following system hooks are currently available: menu() :: This is called to build the plugin menu system and you can use this to link to your plugin (you don't have to). public static function menu() { echo('
          7. '.get_class().'
          8. '); } device_overview_container($device) :: This is called in the Device Overview page. You receive the $device as a parameter, can do your work here and display your results in a frame. public static function device_overview_container($device) { echo('
            '.get_class().' Plugin
            '); echo(' Example plugin in \"Device - Overview\" tab
            '); echo('
            '); } port_container($device, $port) :: This is called in the Port page, in the \"Plugins\" menu_option that will appear when your plugin gets enabled. In this function, you can do your work and display your results in a frame. public static function port_container($device, $port) { echo('
            '.get_class().' plugin in \"Port\" tab
            '); echo ('Example display in Port tab
            '); echo('
            '); }","title":"Plugin System"},{"location":"Extensions/Plugin-System/#developing-for-the-plugin-system","text":"With plugins you can extend LibreNMS with special functions that are specific to your setup or are not relevant or interesting for all community members. You are able to intervene in defined places in the behavior of the website, without it coming to problems with future updates. This documentation will give you a basis for writing a plugin for LibreNMS. An example plugin is included in the LibreNMS distribution.","title":"Developing for the Plugin System"},{"location":"Extensions/Plugin-System/#version-2-plugin-system-structure","text":"Plugins in version 2 need to be installed into app/Plugins Note: Plugins are disabled when the have an error, to show errors instead set plugins.show_errors The structure of a plugin is follows: app/Plugins /PluginName /DeviceOverview.php /Menu.php /Page.php /PortTab.php /Settings.php /resources/views /device-overview.blade.php /menu.blade.php /page.blade.php /port-tab.blade.php /settings.blade.php The above structure is checked before a plugin can be installed. All file/folder names are case sensitive and must match the structure. Only the blade files that are really needed need to be created. A plugin manager will then load a hook that has a basic functionality. If you want to customize the basic behavior of the hooks, you can create a class in 'app/Plugins/PluginName' and overload the hook methods. device-overview.blade.php :: This is called in the Device Overview page. You receive the $device as a object per default, you can do your work here and display your results in a frame.
            {{ $title }}
            {{ $device->hostname }}
            port-tab.blade.php :: This is called in the Port page, in the \"Plugins\" menu_option that will appear when your plugin gets enabled. In this blade, you can do your work and display your results in a frame. menu.blade.php :: For a menu entry page.blade.pho :: Here is a good place to add a own LibreNMS page without dependence with a device. A good place to create your own lists with special requirements and behavior. settings.blade.php :: If you need your own settings and variables, you can have a look in the ExamplePlugin.","title":"Version 2 Plugin System structure"},{"location":"Extensions/Plugin-System/#php-hooks-customization","text":"PHP code should run inside your hooks method and not your blade view. The built in hooks support authorize and data methods. These methods are called with Dependency Injection Hooks with relevant database models will include them in these calls. Additionally, the settings argument may be included to inject the plugin settings into the method.","title":"PHP Hooks customization"},{"location":"Extensions/Plugin-System/#data","text":"You can overrid the data method to supply data to your view. You should also do any processing here. You can do things like access the database or configuration settings and more. In the data method we are injecting settings here to count how many we have for display in the menu entry blade view. Note that you must specify a default value ( = [] here) for any arguments that don't exist on the parent method. class Menu extends MenuEntryHook { public function data ( array $settings = []) : array { return [ 'count' => count ( $settings ), ]; } }","title":"Data"},{"location":"Extensions/Plugin-System/#authorize","text":"By default hooks are always shown, but you may control when the user is authorized to view the hook content. As an example, you could imagine that the device-overview.blade.php should only be displayed when the device is in maintanence mode and the current user has the admin role. class DeviceOverview extends DeviceOverviewHook { public function authorize ( User $user , Device $device ) : bool { return $user -> can ( 'admin' ) && $device -> isUnderMaintenance (); } }","title":"Authorize"},{"location":"Extensions/Plugin-System/#full-plugin","text":"You may create a full plugin that can publish multiple routes, views, database migrations and more. Create a package according to the Laravel documentation you may call any of the supported hooks to tie into LibreNMS. https://laravel.com/docs/packages This is untested, please come to discord and share any expriences and update this documentation!","title":"Full plugin"},{"location":"Extensions/Plugin-System/#version-1-plugin-system-structure-legacy-verion","text":"Plugins need to be installed into html/plugins The structure of a plugin is follows: html/plugins /PluginName /PluginName.php /PluginName.inc.php The above structure is checked before a plugin can be installed. All files / folder names are case sensitive and must match. PluginName - This is a directory and needs to be named as per the plugin you are creating. PluginName.php :: This file is used to process calls into the plugin from the main LibreNMS install. Here only functions within the class for your plugin that LibreNMS calls will be executed. For a list of currently enabled system hooks, please see further down. The minimum code required in this file is (replace Test with the name of your plugin): PluginName.inc.php :: This file is the main included file when browsing to the plugin itself. You can use this to display / edit / remove whatever you like. The minimum code required in this file is: ","title":"Version 1 Plugin System structure (legacy verion)"},{"location":"Extensions/Plugin-System/#system-hooks","text":"System hooks are called as functions within your plugin class. The following system hooks are currently available: menu() :: This is called to build the plugin menu system and you can use this to link to your plugin (you don't have to). public static function menu() { echo('
          9. '.get_class().'
          10. '); } device_overview_container($device) :: This is called in the Device Overview page. You receive the $device as a parameter, can do your work here and display your results in a frame. public static function device_overview_container($device) { echo('
            '.get_class().' Plugin
            '); echo(' Example plugin in \"Device - Overview\" tab
            '); echo('
            '); } port_container($device, $port) :: This is called in the Port page, in the \"Plugins\" menu_option that will appear when your plugin gets enabled. In this function, you can do your work and display your results in a frame. public static function port_container($device, $port) { echo('
            '.get_class().' plugin in \"Port\" tab
            '); echo ('Example display in Port tab
            '); echo('
            '); }","title":"System Hooks"},{"location":"Extensions/Proxmox/","text":"Proxmox graphing It is possible to create graphs of the Proxmox VMs that run on your monitored machines. Currently, only traffic graphs are created. One for each interface on each VM. Possibly, IO graphs will be added later on. The ultimate goal is to be able to create traffic bills for VMs, no matter on which physical machine that VM runs. Enabling Proxmox graphs To enable Proxmox graphs, do the following: In config.php, enable Proxmox: $config [ 'enable_proxmox' ] = 1 ; Then, install git and librenms-agent on the machines running Proxmox and enable the Proxmox-script using: cp /opt/librenms-agent/agent-local/proxmox /usr/lib/check_mk_agent/local/proxmox chmod +x /usr/lib/check_mk_agent/local/proxmox Then, enable and start the check_mk service using systemd cp /opt/librenms-agent/check_mk@.service /opt/librenms-agent/check_mk.socket /etc/systemd/system systemctl daemon-reload systemctl enable check_mk.socket && systemctl start check_mk.socket Then in LibreNMS active the librenms-agent and proxmox application flag for the device you are monitoring. You should now see an application in LibreNMS, as well as a new menu-item in the topmenu, allowing you to choose which cluster you want to look at. Note, if you want to use use xinetd instead of systemd Its possible to use the librenms-agent started by xinetd instead of systemd. One use case is if you are forced to use a old Proxmox installation. After installing the librenms-agent (see above) please copy enable the xinetd config, then restart the xinetd service: cp check_mk_xinetd /etc/xinetd.d/check_mk /etc/init.d/xinetd restart","title":"Proxmox"},{"location":"Extensions/Proxmox/#proxmox-graphing","text":"It is possible to create graphs of the Proxmox VMs that run on your monitored machines. Currently, only traffic graphs are created. One for each interface on each VM. Possibly, IO graphs will be added later on. The ultimate goal is to be able to create traffic bills for VMs, no matter on which physical machine that VM runs.","title":"Proxmox graphing"},{"location":"Extensions/Proxmox/#enabling-proxmox-graphs","text":"To enable Proxmox graphs, do the following: In config.php, enable Proxmox: $config [ 'enable_proxmox' ] = 1 ; Then, install git and librenms-agent on the machines running Proxmox and enable the Proxmox-script using: cp /opt/librenms-agent/agent-local/proxmox /usr/lib/check_mk_agent/local/proxmox chmod +x /usr/lib/check_mk_agent/local/proxmox Then, enable and start the check_mk service using systemd cp /opt/librenms-agent/check_mk@.service /opt/librenms-agent/check_mk.socket /etc/systemd/system systemctl daemon-reload systemctl enable check_mk.socket && systemctl start check_mk.socket Then in LibreNMS active the librenms-agent and proxmox application flag for the device you are monitoring. You should now see an application in LibreNMS, as well as a new menu-item in the topmenu, allowing you to choose which cluster you want to look at.","title":"Enabling Proxmox graphs"},{"location":"Extensions/Proxmox/#note-if-you-want-to-use-use-xinetd-instead-of-systemd","text":"Its possible to use the librenms-agent started by xinetd instead of systemd. One use case is if you are forced to use a old Proxmox installation. After installing the librenms-agent (see above) please copy enable the xinetd config, then restart the xinetd service: cp check_mk_xinetd /etc/xinetd.d/check_mk /etc/init.d/xinetd restart","title":"Note, if you want to use use xinetd instead of systemd"},{"location":"Extensions/RRDCached/","text":"Setting up RRDCached This document will explain how to set up RRDCached for LibreNMS. Since version 1.5, rrdtool / rrdcached now supports creating rrd files over rrdcached. If you have rrdcached 1.5.5 or above, you can also tune over rrdcached. To enable this set the following config: poller/rrdtool lnms config:set rrdtool_version '1.5.5' This setting has to be the exact version of rrdtool you are running. NOTE: This feature requires your client version of rrdtool to be 1.5.5 or newer, in addition to your rrdcached version. Distributed Poller Support Matrix Shared FS: Is a shared filesystem required? Features: Supported features in the version indicated. G = Graphs. C = Create RRD files. U = Update RRD files. T = Tune RRD files. Version Shared FS Features 1.4.x Yes G,U <1.5.5 Yes G,U >=1.5.5 No G,C,U >=1.6.x No G,C,U It is recommended that you monitor your LibreNMS server with LibreNMS so you can view the disk I/O usage delta. Installation Manual for RRDCached installation Ubuntu 16 RRDCached installation Debian Buster RRDCached installation Debian Stretch RRDCached installation CentOS 7 or 8 RRDCached installation CentOS 6 Securing RRCached RRDCached installation Ubuntu 16 1: Install rrdcached sudo apt-get install rrdcached 2: Edit /etc/default/rrdcached to include: DAEMON=/usr/bin/rrdcached DAEMON_USER=librenms DAEMON_GROUP=librenms WRITE_THREADS=4 WRITE_TIMEOUT=1800 WRITE_JITTER=1800 BASE_PATH=/opt/librenms/rrd/ JOURNAL_PATH=/var/lib/rrdcached/journal/ PIDFILE=/run/rrdcached.pid SOCKFILE=/run/rrdcached.sock SOCKGROUP=librenms BASE_OPTIONS=\"-B -F -R\" 2: Fix permissions chown librenms:librenms /var/lib/rrdcached/journal/ 3: Restart the rrdcached service systemctl restart rrdcached.service 5: Edit your config to include: poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\" RRDCached installation Debian Buster (rrdcached 1.7.1) 1: Install rrdcached sudo apt-get install rrdcached 2; Edit /etc/default/rrdcached to include: DAEMON = /usr/bin/rrdcached WRITE_TIMEOUT = 1800 WRITE_JITTER = 1800 WRITE_THREADS = 4 BASE_PATH = /opt/librenms/rrd/ JOURNAL_PATH = /var/lib/rrdcached/journal/ PIDFILE = /var/run/rrdcached.pid SOCKFILE = /run/rrdcached.sock SOCKGROUP = librenms DAEMON_GROUP = librenms DAEMON_USER = librenms BASE_OPTIONS = \"-B -F -R\" 3: Fix permissions chown librenms:librenms /var/lib/rrdcached/journal/ 4: Restart the rrdcached service systemctl restart rrdcached.service 5: Edit your config to include: For local RRDCached server poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\" For remote RRDCached server make sure you have network option in /var/default/rrdcached NETWORK_OPTIONS = \"-L\" poller/rrdtool lnms config:set rrdcached \"IPADDRESS:42217\" NOTE: change IPADDRESS to the ip the rrdcached server is listening on. RRDCached installation Debian Stretch (rrdcached 1.6.0) 1: Install rrdcached sudo apt-get install rrdcached 2; Edit /etc/default/rrdcached to include: DAEMON = /usr/bin/rrdcached WRITE_TIMEOUT = 1800 WRITE_JITTER = 1800 WRITE_THREADS = 4 BASE_PATH = /opt/librenms/rrd/ JOURNAL_PATH = /var/lib/rrdcached/journal/ PIDFILE = /var/run/rrdcached.pid SOCKFILE = /run/rrdcached.sock SOCKGROUP = librenms DAEMON_GROUP = librenms DAEMON_USER = librenms BASE_OPTIONS = \"-B -F -R\" 3: Fix permissions chown librenms:librenms /var/lib/rrdcached/journal/ 4: Restart the rrdcached service systemctl restart rrdcached.service 5: Edit your config to include: For local RRDCached server poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\" For remote RRDCached server make sure you have network option in /var/default/rrdcached NETWORK_OPTIONS = \"-L\" poller/rrdtool lnms config:set rrdcached \"IPADDRESS:42217\" NOTE: change IPADDRESS to the ip the rrdcached server is listening on. RRDCached installation CentOS 7 or 8 1: Create /etc/systemd/system/rrdcached.service with this content: [Unit] Description=Data caching daemon for rrdtool After=network.service [Service] Type=forking PIDFile=/run/rrdcached.pid ExecStart=/usr/bin/rrdcached -w 1800 -z 1800 -f 3600 -s librenms -U librenms -G librenms -B -R -j /var/tmp -l unix:/run/rrdcached.sock -t 4 -F -b /opt/librenms/rrd/ [Install] WantedBy=default.target 2: Configure SELinux for RRDCached cat > rrdcached_librenms.te << EOF module rrdcached_librenms 1.0; require { type var_run_t; type tmp_t; type httpd_t; type rrdcached_t; type httpd_sys_rw_content_t; class dir { add_name getattr open read remove_name rmdir search write }; class file { create getattr open read rename setattr unlink write map lock }; class sock_file { create setattr unlink write }; class capability { fsetid sys_resource }; class unix_stream_socket connectto; } #============= rrdcached_t ============== allow rrdcached_t httpd_sys_rw_content_t:dir { add_name getattr remove_name search write }; allow rrdcached_t httpd_sys_rw_content_t:file { create getattr open read rename setattr unlink write map lock }; allow rrdcached_t self:capability fsetid; allow rrdcached_t var_run_t:sock_file { create setattr unlink }; allow httpd_t var_run_t:sock_file write; allow httpd_t rrdcached_t:unix_stream_socket connectto; EOF checkmodule -M -m -o rrdcached_librenms.mod rrdcached_librenms.te semodule_package -o rrdcached_librenms.pp -m rrdcached_librenms.mod semodule -i rrdcached_librenms.pp 3: Start rrdcached systemctl enable --now rrdcached.service 4: Edit your config to include: poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\" RRDCached installation CentOS 6 This example is based on a fresh LibreNMS install, on a minimal CentOS 6 installation. In this example, we'll use the Repoforge repository. rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm vi /etc/yum.repos.d/rpmforge.repo Enable the Extra repo yum update rrdtool vi /etc/yum.repos.d/rpmforge.repo Disable the [rpmforge] and [rpmforge-extras] repos again vi /etc/sysconfig/rrdcached # Settings for rrdcached OPTIONS=\"-w 1800 -z 1800 -f 3600 -s librenms -U librenms -G librenms -B -R -j /var/tmp -l unix:/run/rrdcached.sock -t 4 -F -b /opt/librenms/rrd/\" RRDC_USER=librenms mkdir /var/run/rrdcached chown librenms:librenms /var/run/rrdcached/ chown librenms:librenms /var/rrdtool/ chown librenms:librenms /var/rrdtool/rrdcached/ chkconfig rrdcached on service rrdcached start Edit your config to include: poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\" Verify Check to see if the graphs are being drawn in LibreNMS. This might take a few minutes. After at least one poll cycle (5 mins), check the LibreNMS disk I/O performance delta. Disk I/O can be found under the menu Devices>All Devices>[localhost hostname]>Health>Disk I/O. Depending on many factors, you should see the Ops/sec drop by ~30-40%. Securing RRCached According to the man page , under \"SECURITY CONSIDERATIONS\", rrdcached has no authentication or security except for running under a unix socket. If you choose to use a network socket instead of a unix socket, you will need to secure your rrdcached installation. To do so you can proxy rrdcached using nginx to allow only specific IPs to connect. Using the same setup above, using nginx version 1.9.0 or later, you can follow this setup to proxy the default rrdcached port to the local unix socket. (You can use ./conf.d for your configuration as well) mkdir /etc/nginx/streams-{available,enabled} add the following to your nginx.conf file: #/etc/nginx/nginx.conf ... stream { include /etc/nginx/streams-enabled/* ; } Add this to /etc/nginx/streams-available/rrd server { listen 42217 ; error_log /var/log/nginx/rrd.stream.error.log ; allow $LibreNMS_IP ; deny all ; proxy_pass unix:/run/rrdcached.sock ; } Replace $LibreNMS_IP with the ip of the server that will be using rrdcached. You can specify more than one allow statement. This will bind nginx to TCP 42217 (the default rrdcached port), allow the specified IPs to connect, and deny all others. next, we'll symlink the config to streams-enabled: ln -s /etc/nginx/streams-{available,enabled}/rrd and reload nginx service nginx reload","title":"RRDCached"},{"location":"Extensions/RRDCached/#setting-up-rrdcached","text":"This document will explain how to set up RRDCached for LibreNMS. Since version 1.5, rrdtool / rrdcached now supports creating rrd files over rrdcached. If you have rrdcached 1.5.5 or above, you can also tune over rrdcached. To enable this set the following config: poller/rrdtool lnms config:set rrdtool_version '1.5.5' This setting has to be the exact version of rrdtool you are running. NOTE: This feature requires your client version of rrdtool to be 1.5.5 or newer, in addition to your rrdcached version.","title":"Setting up RRDCached"},{"location":"Extensions/RRDCached/#distributed-poller-support-matrix","text":"Shared FS: Is a shared filesystem required? Features: Supported features in the version indicated. G = Graphs. C = Create RRD files. U = Update RRD files. T = Tune RRD files. Version Shared FS Features 1.4.x Yes G,U <1.5.5 Yes G,U >=1.5.5 No G,C,U >=1.6.x No G,C,U It is recommended that you monitor your LibreNMS server with LibreNMS so you can view the disk I/O usage delta.","title":"Distributed Poller Support Matrix"},{"location":"Extensions/RRDCached/#installation-manual-for","text":"RRDCached installation Ubuntu 16 RRDCached installation Debian Buster RRDCached installation Debian Stretch RRDCached installation CentOS 7 or 8 RRDCached installation CentOS 6 Securing RRCached","title":"Installation Manual for"},{"location":"Extensions/RRDCached/#rrdcached-installation-ubuntu-16","text":"1: Install rrdcached sudo apt-get install rrdcached 2: Edit /etc/default/rrdcached to include: DAEMON=/usr/bin/rrdcached DAEMON_USER=librenms DAEMON_GROUP=librenms WRITE_THREADS=4 WRITE_TIMEOUT=1800 WRITE_JITTER=1800 BASE_PATH=/opt/librenms/rrd/ JOURNAL_PATH=/var/lib/rrdcached/journal/ PIDFILE=/run/rrdcached.pid SOCKFILE=/run/rrdcached.sock SOCKGROUP=librenms BASE_OPTIONS=\"-B -F -R\" 2: Fix permissions chown librenms:librenms /var/lib/rrdcached/journal/ 3: Restart the rrdcached service systemctl restart rrdcached.service 5: Edit your config to include: poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\"","title":"RRDCached installation Ubuntu 16"},{"location":"Extensions/RRDCached/#rrdcached-installation-debian-buster","text":"(rrdcached 1.7.1) 1: Install rrdcached sudo apt-get install rrdcached 2; Edit /etc/default/rrdcached to include: DAEMON = /usr/bin/rrdcached WRITE_TIMEOUT = 1800 WRITE_JITTER = 1800 WRITE_THREADS = 4 BASE_PATH = /opt/librenms/rrd/ JOURNAL_PATH = /var/lib/rrdcached/journal/ PIDFILE = /var/run/rrdcached.pid SOCKFILE = /run/rrdcached.sock SOCKGROUP = librenms DAEMON_GROUP = librenms DAEMON_USER = librenms BASE_OPTIONS = \"-B -F -R\" 3: Fix permissions chown librenms:librenms /var/lib/rrdcached/journal/ 4: Restart the rrdcached service systemctl restart rrdcached.service 5: Edit your config to include: For local RRDCached server poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\" For remote RRDCached server make sure you have network option in /var/default/rrdcached NETWORK_OPTIONS = \"-L\" poller/rrdtool lnms config:set rrdcached \"IPADDRESS:42217\" NOTE: change IPADDRESS to the ip the rrdcached server is listening on.","title":"RRDCached installation Debian Buster"},{"location":"Extensions/RRDCached/#rrdcached-installation-debian-stretch","text":"(rrdcached 1.6.0) 1: Install rrdcached sudo apt-get install rrdcached 2; Edit /etc/default/rrdcached to include: DAEMON = /usr/bin/rrdcached WRITE_TIMEOUT = 1800 WRITE_JITTER = 1800 WRITE_THREADS = 4 BASE_PATH = /opt/librenms/rrd/ JOURNAL_PATH = /var/lib/rrdcached/journal/ PIDFILE = /var/run/rrdcached.pid SOCKFILE = /run/rrdcached.sock SOCKGROUP = librenms DAEMON_GROUP = librenms DAEMON_USER = librenms BASE_OPTIONS = \"-B -F -R\" 3: Fix permissions chown librenms:librenms /var/lib/rrdcached/journal/ 4: Restart the rrdcached service systemctl restart rrdcached.service 5: Edit your config to include: For local RRDCached server poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\" For remote RRDCached server make sure you have network option in /var/default/rrdcached NETWORK_OPTIONS = \"-L\" poller/rrdtool lnms config:set rrdcached \"IPADDRESS:42217\" NOTE: change IPADDRESS to the ip the rrdcached server is listening on.","title":"RRDCached installation Debian Stretch"},{"location":"Extensions/RRDCached/#rrdcached-installation-centos-7-or-8","text":"1: Create /etc/systemd/system/rrdcached.service with this content: [Unit] Description=Data caching daemon for rrdtool After=network.service [Service] Type=forking PIDFile=/run/rrdcached.pid ExecStart=/usr/bin/rrdcached -w 1800 -z 1800 -f 3600 -s librenms -U librenms -G librenms -B -R -j /var/tmp -l unix:/run/rrdcached.sock -t 4 -F -b /opt/librenms/rrd/ [Install] WantedBy=default.target 2: Configure SELinux for RRDCached cat > rrdcached_librenms.te << EOF module rrdcached_librenms 1.0; require { type var_run_t; type tmp_t; type httpd_t; type rrdcached_t; type httpd_sys_rw_content_t; class dir { add_name getattr open read remove_name rmdir search write }; class file { create getattr open read rename setattr unlink write map lock }; class sock_file { create setattr unlink write }; class capability { fsetid sys_resource }; class unix_stream_socket connectto; } #============= rrdcached_t ============== allow rrdcached_t httpd_sys_rw_content_t:dir { add_name getattr remove_name search write }; allow rrdcached_t httpd_sys_rw_content_t:file { create getattr open read rename setattr unlink write map lock }; allow rrdcached_t self:capability fsetid; allow rrdcached_t var_run_t:sock_file { create setattr unlink }; allow httpd_t var_run_t:sock_file write; allow httpd_t rrdcached_t:unix_stream_socket connectto; EOF checkmodule -M -m -o rrdcached_librenms.mod rrdcached_librenms.te semodule_package -o rrdcached_librenms.pp -m rrdcached_librenms.mod semodule -i rrdcached_librenms.pp 3: Start rrdcached systemctl enable --now rrdcached.service 4: Edit your config to include: poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\"","title":"RRDCached installation CentOS 7 or 8"},{"location":"Extensions/RRDCached/#rrdcached-installation-centos-6","text":"This example is based on a fresh LibreNMS install, on a minimal CentOS 6 installation. In this example, we'll use the Repoforge repository. rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm vi /etc/yum.repos.d/rpmforge.repo Enable the Extra repo yum update rrdtool vi /etc/yum.repos.d/rpmforge.repo Disable the [rpmforge] and [rpmforge-extras] repos again vi /etc/sysconfig/rrdcached # Settings for rrdcached OPTIONS=\"-w 1800 -z 1800 -f 3600 -s librenms -U librenms -G librenms -B -R -j /var/tmp -l unix:/run/rrdcached.sock -t 4 -F -b /opt/librenms/rrd/\" RRDC_USER=librenms mkdir /var/run/rrdcached chown librenms:librenms /var/run/rrdcached/ chown librenms:librenms /var/rrdtool/ chown librenms:librenms /var/rrdtool/rrdcached/ chkconfig rrdcached on service rrdcached start Edit your config to include: poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\"","title":"RRDCached installation CentOS 6"},{"location":"Extensions/RRDCached/#verify","text":"Check to see if the graphs are being drawn in LibreNMS. This might take a few minutes. After at least one poll cycle (5 mins), check the LibreNMS disk I/O performance delta. Disk I/O can be found under the menu Devices>All Devices>[localhost hostname]>Health>Disk I/O. Depending on many factors, you should see the Ops/sec drop by ~30-40%.","title":"Verify"},{"location":"Extensions/RRDCached/#securing-rrcached","text":"According to the man page , under \"SECURITY CONSIDERATIONS\", rrdcached has no authentication or security except for running under a unix socket. If you choose to use a network socket instead of a unix socket, you will need to secure your rrdcached installation. To do so you can proxy rrdcached using nginx to allow only specific IPs to connect. Using the same setup above, using nginx version 1.9.0 or later, you can follow this setup to proxy the default rrdcached port to the local unix socket. (You can use ./conf.d for your configuration as well) mkdir /etc/nginx/streams-{available,enabled} add the following to your nginx.conf file: #/etc/nginx/nginx.conf ... stream { include /etc/nginx/streams-enabled/* ; } Add this to /etc/nginx/streams-available/rrd server { listen 42217 ; error_log /var/log/nginx/rrd.stream.error.log ; allow $LibreNMS_IP ; deny all ; proxy_pass unix:/run/rrdcached.sock ; } Replace $LibreNMS_IP with the ip of the server that will be using rrdcached. You can specify more than one allow statement. This will bind nginx to TCP 42217 (the default rrdcached port), allow the specified IPs to connect, and deny all others. next, we'll symlink the config to streams-enabled: ln -s /etc/nginx/streams-{available,enabled}/rrd and reload nginx service nginx reload","title":"Securing RRCached"},{"location":"Extensions/RRDTune/","text":"RRDTune When we create rrd files for ports, we currently do so with a max value of 12500000000 (100G). Because of this if a device sends us bad data back then it can appear as though a 100M port is doing 40G+ which is impossible. To counter this you can enable the rrdtool tune option which will fix the max value to the interfaces physical speed (minimum of 10M). To enable this you can do so in three ways! Globally under Global Settings -> Poller -> Datastore: RRDTool For the actual device, Edit Device -> Misc For each port, Edit Device -> Port Settings Now when a port interface speed changes (this can happen because of a physical change or just because the device has misreported) the max value is set. If you don't want to wait until a port speed changes then you can run the included script: ./scripts/tune_port.php -h -p Wildcards are supported using *, i.e: ./scripts/tune_port.php -h local* -p eth* This script will then perform the rrdtool tune on each port found using the provided ifSpeed for that port. Run ./scripts/tune_port.php to see help page.","title":"RRDTune"},{"location":"Extensions/RRDTune/#rrdtune","text":"When we create rrd files for ports, we currently do so with a max value of 12500000000 (100G). Because of this if a device sends us bad data back then it can appear as though a 100M port is doing 40G+ which is impossible. To counter this you can enable the rrdtool tune option which will fix the max value to the interfaces physical speed (minimum of 10M). To enable this you can do so in three ways! Globally under Global Settings -> Poller -> Datastore: RRDTool For the actual device, Edit Device -> Misc For each port, Edit Device -> Port Settings Now when a port interface speed changes (this can happen because of a physical change or just because the device has misreported) the max value is set. If you don't want to wait until a port speed changes then you can run the included script: ./scripts/tune_port.php -h -p Wildcards are supported using *, i.e: ./scripts/tune_port.php -h local* -p eth* This script will then perform the rrdtool tune on each port found using the provided ifSpeed for that port. Run ./scripts/tune_port.php to see help page.","title":"RRDTune"},{"location":"Extensions/Rancid/","text":"Rancid Librenms can generate a list of hosts that can be monitored by RANCID. We assume you have currently a running Rancid, and you just need to create and update the file 'router.db' Included Rancid script To generate the config file (maybe even add a cron to schedule this). We've assumed a few locations for Rancid, the config file you want to call it and where LibreNMS is: cd /opt/librenms/scripts/ php ./gen_rancid.php > /the/path/where/is/rancid/core/router.db Sample cron: 15 0 * * * root cd /opt/librenms/scripts && php ./gen_rancid.php > /the/path/where/is/rancid/core/router.db Now configure LibreNMS (make sure you point dir to your rancid data directory): $config [ 'rancid_configs' ][ 'core' ] = '/the/path/where/is/rancid/core' ; $config [ 'rancid_ignorecomments' ] = 0 ; After that, you should see some \"config\" tab on routers that have a rancid update. Ubuntu Rancid Install The options shown below also contains the default values. NOTE - This is Only for Ubuntu 16.04 at this time, and may not work on other distros! sudo apt-get install rancid subversion Edit Rancid config file to use subversion or git instead of default cvs, and adds a group: sudo vi /etc/rancid/rancid.conf LIST_OF_GROUPS=\"librenms\" Now change these two lines: CVSROOT=$BASEDIR/CVS; export CVSROOT RCSSYS=cvs; export RCSSYS to: CVSROOT=$BASEDIR/SVN; export CVSROOT RCSSYS=svn; export RCSSYS NOTE - This only creates 1 group! You can of course make more when you get the hang of it, this is just a basic 'Need it to work\" deal. sudo su -c /var/lib/rancid/bin/rancid-cvs -s /bin/bash -l rancid NOTE - do NOT change cvs to svn here! Leave command as is! Get a list of devices from Librenms you can pull configs from: cd /opt/librenms/scripts sudo ./gen_rancid.php Copy the output. Replace all \":\" with \";\" example: alphcr1:cisco:up will change to: alphcr1;cisco;up copy and past results into the below file: sudo vi /var/lib/rancid/librenms/router.db NOTE - This ONLY applies to newer RANCID versions and Linux distros. Older versions will need to retain the : and not the ; Create/edit rancids login file: sudo vi /var/lib/rancid/.cloginrc Add following at minimum: add user * add password * add method * ssh add noenable * {1} ******This disables the enable when using radius etc ******* Grant permissions for rancid: sudo chown rancid /var/lib/rancid/.cloginrc sudo chmod 600 /var/lib/rancid/.cloginrc Test config: sudo /usr/lib/rancid/bin/clogin -f /var/lib/rancid/.cloginrc NOTE: IF you run into a 'diffie-hellmen' kind of error, then it is because your Linux distro is using newer encryption methods etc. This is basically just letting you know that the device you tested on is running an outdated encryption type. I recommend updating downstream device if able. If not, the following should fix: sudo vi /etc/ssh/ssh_config Add: KexAlgorithms diffie-hellman-group1-sha1 Re-try logging into your device again Upon success, run rancid: sudo su -c /var/lib/rancid/bin/rancid-run -s /bin/bash -l rancid Ensure your configs pulled: sudo su - rancid cd librenms/configs/ ls Make sure your config files are there :-) sudo usermod -a -G rancid librenms Add Rancid into LibreNMS config.php: ### Rancid $config [ 'rancid_configs' ][] = '/var/lib/rancid/librenms/configs/' ; $config [ 'rancid_repo_type' ] = 'svn' ; //'svn' or 'git' $config [ 'rancid_ignorecomments' ] = 0 ; Now restart apache sudo /etc/init.d/apache2 restart","title":"Rancid"},{"location":"Extensions/Rancid/#rancid","text":"Librenms can generate a list of hosts that can be monitored by RANCID. We assume you have currently a running Rancid, and you just need to create and update the file 'router.db'","title":"Rancid"},{"location":"Extensions/Rancid/#included-rancid-script","text":"To generate the config file (maybe even add a cron to schedule this). We've assumed a few locations for Rancid, the config file you want to call it and where LibreNMS is: cd /opt/librenms/scripts/ php ./gen_rancid.php > /the/path/where/is/rancid/core/router.db Sample cron: 15 0 * * * root cd /opt/librenms/scripts && php ./gen_rancid.php > /the/path/where/is/rancid/core/router.db Now configure LibreNMS (make sure you point dir to your rancid data directory): $config [ 'rancid_configs' ][ 'core' ] = '/the/path/where/is/rancid/core' ; $config [ 'rancid_ignorecomments' ] = 0 ; After that, you should see some \"config\" tab on routers that have a rancid update.","title":"Included Rancid script"},{"location":"Extensions/Rancid/#ubuntu-rancid-install","text":"The options shown below also contains the default values. NOTE - This is Only for Ubuntu 16.04 at this time, and may not work on other distros! sudo apt-get install rancid subversion Edit Rancid config file to use subversion or git instead of default cvs, and adds a group: sudo vi /etc/rancid/rancid.conf LIST_OF_GROUPS=\"librenms\" Now change these two lines: CVSROOT=$BASEDIR/CVS; export CVSROOT RCSSYS=cvs; export RCSSYS to: CVSROOT=$BASEDIR/SVN; export CVSROOT RCSSYS=svn; export RCSSYS NOTE - This only creates 1 group! You can of course make more when you get the hang of it, this is just a basic 'Need it to work\" deal. sudo su -c /var/lib/rancid/bin/rancid-cvs -s /bin/bash -l rancid NOTE - do NOT change cvs to svn here! Leave command as is! Get a list of devices from Librenms you can pull configs from: cd /opt/librenms/scripts sudo ./gen_rancid.php Copy the output. Replace all \":\" with \";\" example: alphcr1:cisco:up will change to: alphcr1;cisco;up copy and past results into the below file: sudo vi /var/lib/rancid/librenms/router.db NOTE - This ONLY applies to newer RANCID versions and Linux distros. Older versions will need to retain the : and not the ; Create/edit rancids login file: sudo vi /var/lib/rancid/.cloginrc Add following at minimum: add user * add password * add method * ssh add noenable * {1} ******This disables the enable when using radius etc ******* Grant permissions for rancid: sudo chown rancid /var/lib/rancid/.cloginrc sudo chmod 600 /var/lib/rancid/.cloginrc Test config: sudo /usr/lib/rancid/bin/clogin -f /var/lib/rancid/.cloginrc NOTE: IF you run into a 'diffie-hellmen' kind of error, then it is because your Linux distro is using newer encryption methods etc. This is basically just letting you know that the device you tested on is running an outdated encryption type. I recommend updating downstream device if able. If not, the following should fix: sudo vi /etc/ssh/ssh_config Add: KexAlgorithms diffie-hellman-group1-sha1 Re-try logging into your device again Upon success, run rancid: sudo su -c /var/lib/rancid/bin/rancid-run -s /bin/bash -l rancid Ensure your configs pulled: sudo su - rancid cd librenms/configs/ ls Make sure your config files are there :-) sudo usermod -a -G rancid librenms Add Rancid into LibreNMS config.php: ### Rancid $config [ 'rancid_configs' ][] = '/var/lib/rancid/librenms/configs/' ; $config [ 'rancid_repo_type' ] = 'svn' ; //'svn' or 'git' $config [ 'rancid_ignorecomments' ] = 0 ; Now restart apache sudo /etc/init.d/apache2 restart","title":"Ubuntu Rancid Install"},{"location":"Extensions/SNMP-Proxy/","text":"SNMP Proxy If you have machines that you want to monitor but are not reachable directly, you can use SNMPD Proxy . This will use the reachable SNMPD to proxy requests to the unreachable SNMPD. Example configuration We want to poll 'unreachable.example.com' via 'hereweare.example.com'. Use the following config: On 'hereweare.example.com': view all included .1 com2sec -Cn ctx_unreachable readonly unreachable access MyROGroup ctx_unreachable any noauth prefix all none none proxy -Cn ctx_unreachable -v 2c -c private unreachable.example.com .1.3 On 'unreachable.example.com': view all included .1 80 com2sec readonly private group MyROGroup v1 readonly group MyROGroup v2c readonly group MyROGroup usm readonly access MyROGroup \"\" any noauth exact all none none You can now poll community 'private' on 'unreachable.example.com' via community 'unreachable' on host 'hereweare.example.com'. Please note that requests on 'unreachable.example.com' will be coming from 'hereweare.example.com', not your poller.","title":"SNMP Proxy"},{"location":"Extensions/SNMP-Proxy/#snmp-proxy","text":"If you have machines that you want to monitor but are not reachable directly, you can use SNMPD Proxy . This will use the reachable SNMPD to proxy requests to the unreachable SNMPD.","title":"SNMP Proxy"},{"location":"Extensions/SNMP-Proxy/#example-configuration","text":"We want to poll 'unreachable.example.com' via 'hereweare.example.com'. Use the following config: On 'hereweare.example.com': view all included .1 com2sec -Cn ctx_unreachable readonly unreachable access MyROGroup ctx_unreachable any noauth prefix all none none proxy -Cn ctx_unreachable -v 2c -c private unreachable.example.com .1.3 On 'unreachable.example.com': view all included .1 80 com2sec readonly private group MyROGroup v1 readonly group MyROGroup v2c readonly group MyROGroup usm readonly access MyROGroup \"\" any noauth exact all none none You can now poll community 'private' on 'unreachable.example.com' via community 'unreachable' on host 'hereweare.example.com'. Please note that requests on 'unreachable.example.com' will be coming from 'hereweare.example.com', not your poller.","title":"Example configuration"},{"location":"Extensions/SNMP-Trap-Handler/","text":"SNMP trap handling Currently, LibreNMS supports a lot of trap handlers. You can check them on GitHub here . To add more see Adding new SNMP Trap handlers . Traps are handled via snmptrapd. snmptrapd is an SNMP application that receives and logs SNMP TRAP and INFORM messages. The default is to listen on UDP port 162 on all IPv4 interfaces. Since 162 is a privileged port, snmptrapd must typically be run as root. Configure snmptrapd Install snmptrapd via your package manager. For example (Debian based systems): sudo apt install snmptrapd -y In /etc/snmp/snmptrapd.conf , add : disableAuthorization yes authCommunity log,execute,net COMMUNITYSTRING traphandle default /opt/librenms/snmptrap.php To enable snmptrapd to properly parse traps, we will need to add MIBs to service. Option 1 Make the folder /etc/systemd/system/snmptrapd.service.d/ and edit the file /etc/systemd/system/snmptrapd.service.d/mibs.conf and add the following content. You may want to tweak to add vendor directories for devices you care about. In the example below, standard and cisco directories are defined, and only IF-MIB is loaded. [Service] Environment = MIBDIRS=+/opt/librenms/mibs:/opt/librenms/mibs/cisco Environment = MIBS=+IF-MIB For non-systemd systems, you can edit TRAPDOPTS in the init script in /etc/init.d/snmptrapd. TRAPDOPTS=\"-Lsd -M /opt/librenms/mibs -m IF-MIB -f -p $TRAPD_PID\" Along with any necessary configuration to receive the traps from your devices (community, etc.) Option 2 Tested on Ubuntu 18 Just set up your service like: [Unit] Description=Simple Network Management Protocol (SNMP) Trap Daemon. After=network.target ConditionPathExists=/etc/snmp/snmptrapd.conf [Service] Environment=\"MIBSDIR=/opt/librenms/mibs\" Type=simple ExecStart=/usr/sbin/snmptrapd -f -m IF-MIB -M /opt/librenms/mibs ExecReload=/bin/kill -HUP $MAINPID [Install] WantedBy=multi-user.target In Ubuntu 18 is service located by default in /etc/systemd/system/multi-user.target.wants/snmptrapd.service Here is a list of snmptrapd options: Option Description -a Ignore authenticationFailure traps. [OPTIONAL] -f Do not fork from the shell -n Use numeric addresses instead of attempting hostname lookups (no DNS) [OPTIONAL] -m MIBLIST: use MIBLIST ( FILE1-MIB:FILE2-MIB ). ALL = Load all MIBS in DIRLIST. (usually fails) -M DIRLIST: use DIRLIST as the list of locations to look for MIBs. Option is not recursive, so you need to specify each DIR individually, separated by : . (For example: /opt/librenms/mibs:/opt/librenms/mibs/cisco:/opt/librenms/mibs/edgecos) Good practice is to avoid -m ALL because then it will try to load all the MIBs in DIRLIST, which will typically fail (snmptrapd cannot load that many mibs). Better is to specify the exact MIB files defining the traps you are interested in, for example for LinkDown and LinkUp as well as BGP traps, use -m IF-MIB:BGP4-MIB . Multiple files can be added, separated with : . If you want to test or store original TRAPS in log then: Create a folder for storing traps for example in file traps.log sudo mkdir /var/log/snmptrap Add the following config to your snmptrapd.service after ExecStart=/usr/sbin/snmptrapd -f -m ALL -M /opt/librenms/mibs -tLf /var/log/snmptrap/traps.log On SELinux, you need to configure SELinux for SNMPd to communicate to LibreNMS: cat > snmptrap.te << EOF module snmptrap 1.0; require { type httpd_sys_rw_content_t; type snmpd_t; class file { append getattr open read }; class capability dac_override; } #============= snmpd_t ============== allow snmpd_t httpd_sys_rw_content_t:file { append getattr open read }; allow snmpd_t self:capability dac_override; EOF checkmodule -M -m -o snmptrap.mod snmptrap.te semodule_package -o snmptrap.pp -m snmptrap.mod semodule -i snmptrap.pp After successfully configuring the service, reload service files, enable, and start the snmptrapd service: sudo systemctl daemon-reload sudo systemctl enable snmptrapd sudo systemctl restart snmptrapd Testing The easiest test is to generate a trap from your device. Usually, changing the configuration on a network device, or plugging/unplugging a network cable (LinkUp, LinkDown) will generate a trap. You can confirm it using a with tcpdump , tshark or wireshark . You can also generate a trap using the snmptrap command from the LibreNMS server itself (if and only if the LibreNMS server is monitored). How to send SNMP v2 Trap The command below takes the form of: snmptrap -v -c Using OID's: snmptrap -v 2c -c public localhost '' 1.3.6.1.4.1.8072.2.3.0.1 1.3.6.1.4.1.8072.2.3.2.1 i 123456 If you have configured logging of traps to /var/log/snmptrap/traps.log then you will see in traps.log new entry: 2020-03-09 16:22:59 localhost [UDP: [127.0.0.1]:58942->[127.0.0.1]:162]: SNMPv2-MIB::sysUpTime.0 = Timeticks: (149721964) 17 days, 7:53:39.64 SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-SMI::enterprises.8072.2.3.0.1 SNMPv2-SMI::enterprises.8072.2.3.2.1 = INTEGER: 123456 and in LibreNMS your localhost device eventlog like: 2020-03-09 16:22:59 SNMP trap received: SNMPv2-SMI::enterprises.8072.2.3.0.1 Why we need Uptime When you send a trap, it must of course conform to a set of standards. Every trap needs an uptime value. Uptime is how long the system has been running since boot. Sometimes this is the operating system, other devices might use the SNMP engine uptime. Regardless, a value will be sent. So what value should you type in the commands below? Oddly enough, simply supplying no value by using two single quotes '' will instruct the command to obtain the value from the operating system you are executing this on. Event logging You can configure generic event logging for snmp traps. This will log an event of the type trap for received traps. These events can be used for alerting. By default, only the TrapOID is logged. But you can enable the \"detailed\" variant, and all the data received with the trap will be logged. The parameter can be found in General Settings / External / SNMP Traps Integration. It can also be configured in your config. external/snmptrapd lnms config:set snmptraps.eventlog 'unhandled' lnms config:set snmptraps.eventlog_detailed false Valid options are: unhandled only unhandled traps will be logged (default value) all log all traps none no traps will create a generic event log (handled traps may still log events)","title":"SNMP Trap Handler"},{"location":"Extensions/SNMP-Trap-Handler/#snmp-trap-handling","text":"Currently, LibreNMS supports a lot of trap handlers. You can check them on GitHub here . To add more see Adding new SNMP Trap handlers . Traps are handled via snmptrapd. snmptrapd is an SNMP application that receives and logs SNMP TRAP and INFORM messages. The default is to listen on UDP port 162 on all IPv4 interfaces. Since 162 is a privileged port, snmptrapd must typically be run as root.","title":"SNMP trap handling"},{"location":"Extensions/SNMP-Trap-Handler/#configure-snmptrapd","text":"Install snmptrapd via your package manager. For example (Debian based systems): sudo apt install snmptrapd -y In /etc/snmp/snmptrapd.conf , add : disableAuthorization yes authCommunity log,execute,net COMMUNITYSTRING traphandle default /opt/librenms/snmptrap.php To enable snmptrapd to properly parse traps, we will need to add MIBs to service.","title":"Configure snmptrapd"},{"location":"Extensions/SNMP-Trap-Handler/#option-1","text":"Make the folder /etc/systemd/system/snmptrapd.service.d/ and edit the file /etc/systemd/system/snmptrapd.service.d/mibs.conf and add the following content. You may want to tweak to add vendor directories for devices you care about. In the example below, standard and cisco directories are defined, and only IF-MIB is loaded. [Service] Environment = MIBDIRS=+/opt/librenms/mibs:/opt/librenms/mibs/cisco Environment = MIBS=+IF-MIB For non-systemd systems, you can edit TRAPDOPTS in the init script in /etc/init.d/snmptrapd. TRAPDOPTS=\"-Lsd -M /opt/librenms/mibs -m IF-MIB -f -p $TRAPD_PID\" Along with any necessary configuration to receive the traps from your devices (community, etc.)","title":"Option 1"},{"location":"Extensions/SNMP-Trap-Handler/#option-2","text":"Tested on Ubuntu 18 Just set up your service like: [Unit] Description=Simple Network Management Protocol (SNMP) Trap Daemon. After=network.target ConditionPathExists=/etc/snmp/snmptrapd.conf [Service] Environment=\"MIBSDIR=/opt/librenms/mibs\" Type=simple ExecStart=/usr/sbin/snmptrapd -f -m IF-MIB -M /opt/librenms/mibs ExecReload=/bin/kill -HUP $MAINPID [Install] WantedBy=multi-user.target In Ubuntu 18 is service located by default in /etc/systemd/system/multi-user.target.wants/snmptrapd.service Here is a list of snmptrapd options: Option Description -a Ignore authenticationFailure traps. [OPTIONAL] -f Do not fork from the shell -n Use numeric addresses instead of attempting hostname lookups (no DNS) [OPTIONAL] -m MIBLIST: use MIBLIST ( FILE1-MIB:FILE2-MIB ). ALL = Load all MIBS in DIRLIST. (usually fails) -M DIRLIST: use DIRLIST as the list of locations to look for MIBs. Option is not recursive, so you need to specify each DIR individually, separated by : . (For example: /opt/librenms/mibs:/opt/librenms/mibs/cisco:/opt/librenms/mibs/edgecos) Good practice is to avoid -m ALL because then it will try to load all the MIBs in DIRLIST, which will typically fail (snmptrapd cannot load that many mibs). Better is to specify the exact MIB files defining the traps you are interested in, for example for LinkDown and LinkUp as well as BGP traps, use -m IF-MIB:BGP4-MIB . Multiple files can be added, separated with : . If you want to test or store original TRAPS in log then: Create a folder for storing traps for example in file traps.log sudo mkdir /var/log/snmptrap Add the following config to your snmptrapd.service after ExecStart=/usr/sbin/snmptrapd -f -m ALL -M /opt/librenms/mibs -tLf /var/log/snmptrap/traps.log On SELinux, you need to configure SELinux for SNMPd to communicate to LibreNMS: cat > snmptrap.te << EOF module snmptrap 1.0; require { type httpd_sys_rw_content_t; type snmpd_t; class file { append getattr open read }; class capability dac_override; } #============= snmpd_t ============== allow snmpd_t httpd_sys_rw_content_t:file { append getattr open read }; allow snmpd_t self:capability dac_override; EOF checkmodule -M -m -o snmptrap.mod snmptrap.te semodule_package -o snmptrap.pp -m snmptrap.mod semodule -i snmptrap.pp After successfully configuring the service, reload service files, enable, and start the snmptrapd service: sudo systemctl daemon-reload sudo systemctl enable snmptrapd sudo systemctl restart snmptrapd","title":"Option 2"},{"location":"Extensions/SNMP-Trap-Handler/#testing","text":"The easiest test is to generate a trap from your device. Usually, changing the configuration on a network device, or plugging/unplugging a network cable (LinkUp, LinkDown) will generate a trap. You can confirm it using a with tcpdump , tshark or wireshark . You can also generate a trap using the snmptrap command from the LibreNMS server itself (if and only if the LibreNMS server is monitored).","title":"Testing"},{"location":"Extensions/SNMP-Trap-Handler/#how-to-send-snmp-v2-trap","text":"The command below takes the form of: snmptrap -v -c Using OID's: snmptrap -v 2c -c public localhost '' 1.3.6.1.4.1.8072.2.3.0.1 1.3.6.1.4.1.8072.2.3.2.1 i 123456 If you have configured logging of traps to /var/log/snmptrap/traps.log then you will see in traps.log new entry: 2020-03-09 16:22:59 localhost [UDP: [127.0.0.1]:58942->[127.0.0.1]:162]: SNMPv2-MIB::sysUpTime.0 = Timeticks: (149721964) 17 days, 7:53:39.64 SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-SMI::enterprises.8072.2.3.0.1 SNMPv2-SMI::enterprises.8072.2.3.2.1 = INTEGER: 123456 and in LibreNMS your localhost device eventlog like: 2020-03-09 16:22:59 SNMP trap received: SNMPv2-SMI::enterprises.8072.2.3.0.1","title":"How to send SNMP v2 Trap"},{"location":"Extensions/SNMP-Trap-Handler/#why-we-need-uptime","text":"When you send a trap, it must of course conform to a set of standards. Every trap needs an uptime value. Uptime is how long the system has been running since boot. Sometimes this is the operating system, other devices might use the SNMP engine uptime. Regardless, a value will be sent. So what value should you type in the commands below? Oddly enough, simply supplying no value by using two single quotes '' will instruct the command to obtain the value from the operating system you are executing this on.","title":"Why we need Uptime"},{"location":"Extensions/SNMP-Trap-Handler/#event-logging","text":"You can configure generic event logging for snmp traps. This will log an event of the type trap for received traps. These events can be used for alerting. By default, only the TrapOID is logged. But you can enable the \"detailed\" variant, and all the data received with the trap will be logged. The parameter can be found in General Settings / External / SNMP Traps Integration. It can also be configured in your config. external/snmptrapd lnms config:set snmptraps.eventlog 'unhandled' lnms config:set snmptraps.eventlog_detailed false Valid options are: unhandled only unhandled traps will be logged (default value) all log all traps none no traps will create a generic event log (handled traps may still log events)","title":"Event logging"},{"location":"Extensions/Services/","text":"Nagios Plugins - Services Services within LibreNMS provides the ability to leverage Nagios plugins to perform additional monitoring outside of SNMP. Services can also be used in conjunction with your SNMP monitoring for larger monitoring functionality. Setting up Services Services must be tied to a device to function properly. A good generic option is to use localhost , but it is suggested to attach the check to the device you are monitoring. Nagios plugins source Plugins come from two main sources: monitoring-plugins pkg-nagios-plugins-contrib Note: Plugins will only load if they are prefixed with check_ . The check_ prefix is stripped out when displaying in the \"Add Service\" GUI \"Type\" dropdown list. Service Templates Service Templates within LibreNMS provides the same ability as Nagios does with Host Groups. Known as Device Groups in LibreNMS. They are applied devices that belong to the specified Device Group. Use the Apply buttons to manually create or update Services for the Service Template. Use the Remove buttons to manually remove Services for the Service Template. After you Edit a Service Template, and then use Apply, all relevant changes are pushed to existing Services previously created. You can also enable Service Templates Auto Discovery to have Services added / removed / updated on regular discover intervals. When a Device is a member of multiple Device Groups, templates from all of those Device Groups are applied. If a Device is added or removed from a Device Group, when the Apply button is used or Auto Discovery runs Services will be added / removed as appropriate. Service Templates are tied into Device Groups, you need at least one Device Group to be able to add Service Templates - You can define a dummy one. The Device Group does not need members to add Service Templates. Service Auto Discovery To automatically create services for devices with available checks. You need to enable the discover services within config.php with the following: $config [ 'discover_services' ] = true ; Service Templates Auto Discovery To automatically create services for devices with configured Service Templates. You need to enable the discover services within config.php with the following: $config [ 'discover_services_templates' ] = true ; Setup Service checks are now distributable if you run a distributed setup. To leverage this, use the dispatch service. Alternatively, you could also replace check-services.php with services-wrapper.py in cron instead to run across all polling nodes. If you need to debug the output of services-wrapper.py then you can add -d to the end of the command - it is NOT recommended to do this in cron. Firstly, install Nagios plugins. Debian / Ubuntu: sudo apt install monitoring-plugins Centos: yum install nagios-plugins-all Note: The plugins are bundled with the pre-build VM and Docker images. Next, you need to enable the services within config.php with the following: $config [ 'show_services' ] = 1 ; This will enable a new service menu within your navbar. Debian/Ubuntu: $config [ 'nagios_plugins' ] = \"/usr/lib/nagios/plugins\" ; Centos: $config [ 'nagios_plugins' ] = \"/usr/lib64/nagios/plugins\" ; This will point LibreNMS at the location of the nagios plugins - please ensure that any plugins you use are set to executable. For example: Debian/Ubuntu: chmod +x /usr/lib/nagios/plugins/* Centos: chmod +x /usr/lib64/nagios/plugins/* Finally, you now need to add services-wrapper.py to the current cron file (/etc/cron.d/librenms typically) like: */5 * * * * librenms /opt/librenms/services-wrapper.py 1 Now you can add services via the main Services link in the navbar, or via the 'Add Service' link within the device, services page. Note that some services (procs, inodes, load and similar) will always poll the local LibreNMS server it's running on, regardless of which device you add it to. Performance data By default, the check-services script will collect all performance data that the Nagios script returns and display each datasource on a separate graph. LibreNMS expects scripts to return using Nagios convention for the response message structure: AEN200 However for some modules it would be better if some of this information was consolidated on a single graph. An example is the ICMP check. This check returns: Round Trip Average (rta), Round Trip Min (rtmin) and Round Trip Max (rtmax). These have been combined onto a single graph. If you find a check script that would benefit from having some datasources graphed together, please log an issue on GitHub with the debug information from the script, and let us know which DS's should go together. Example below: ./check-services.php -d -- snip -- Nagios Service - 26 Request: /usr/lib/nagios/plugins/check_icmp localhost Perf Data - DS: rta, Value: 0.016, UOM: ms Perf Data - DS: pl, Value: 0, UOM: % Perf Data - DS: rtmax, Value: 0.044, UOM: ms Perf Data - DS: rtmin, Value: 0.009, UOM: ms Response: OK - localhost: rta 0.016ms, lost 0% Service DS: { \"rta\": \"ms\", \"pl\": \"%\", \"rtmax\": \"ms\", \"rtmin\": \"ms\" } OK u:0.00 s:0.00 r:40.67 RRD[update /opt/librenms/rrd/localhost/services-26.rrd N:0.016:0:0.044:0.009] -- snip -- Alerting Services uses the Nagios Alerting scheme where exit code: 0 = Ok, 1 = Warning, 2 = Critical, To create an alerting rule to alert on service=critical, your alerting rule would look like: %services.service_status = \"2\" Debug Change user to librenms for example su - librenms then you can run the following command to help troubleshoot services. ./check-services.php -d Related Polling / Discovery Options These settings are related and should be investigated and set accordingly. The below values are not defaults or recommended. $config [ 'service_poller_enabled' ] = true ; $config [ 'service_poller_workers' ] = 16 ; $config [ 'service_poller_frequency' ] = 300 ; $config [ 'service_poller_down_retry' ] = 5 ; $config [ 'service_discovery_enabled' ] = true ; $config [ 'service_discovery_workers' ] = 16 ; $config [ 'service_discovery_frequency' ] = 3600 ; $config [ 'service_services_enabled' ] = true ; $config [ 'service_services_workers' ] = 16 ; $config [ 'service_services_frequency' ] = 60 ; Service checks polling logic Service check is skipped when the associated device is not pingable, and an appropriate entry is populated in the event log. Service check is polled if it's IP address parameter is not equal to associated device's IP address, even when the associated device is not pingable. To override the default logic and always poll service checks, you can disable ICMP testing for any device by switching Disable ICMP Test setting (Edit -> Misc) to ON. Service checks will never be polled on disabled devices. CHECK_MRPE In most cases, only Nagios plugins that run against a remote host with the -H option are available as services. However, if you're remote host is running the Check_MK agent you may be able to use MRPE to monitor Nagios plugins that only execute locally as services. For example, consider the fairly common check_cpu.sh Nagios plugin. If you added.. cpu_check /usr/lib/nagios/plugins/check_cpu.sh -c 95 -w 75 ...to /etc/check_mk/mrpe.cfg on your remote host, you should be able to check its output by configuring a service using the check_mrpe script. Add check_mrpe to the Nagios plugins directory on your LibreNMS server and make it executable. In LibreNMS, add a new service to the desired device with the type mrpe. Enter the IP address of the remote host and in parameters enter -a cpu_check (this should match the name used at the beginning of the line in the mrpe.cfg file).","title":"Nagios Plugins"},{"location":"Extensions/Services/#nagios-plugins-services","text":"Services within LibreNMS provides the ability to leverage Nagios plugins to perform additional monitoring outside of SNMP. Services can also be used in conjunction with your SNMP monitoring for larger monitoring functionality.","title":"Nagios Plugins - Services"},{"location":"Extensions/Services/#setting-up-services","text":"Services must be tied to a device to function properly. A good generic option is to use localhost , but it is suggested to attach the check to the device you are monitoring.","title":"Setting up Services"},{"location":"Extensions/Services/#nagios-plugins-source","text":"Plugins come from two main sources: monitoring-plugins pkg-nagios-plugins-contrib Note: Plugins will only load if they are prefixed with check_ . The check_ prefix is stripped out when displaying in the \"Add Service\" GUI \"Type\" dropdown list.","title":"Nagios plugins source"},{"location":"Extensions/Services/#service-templates","text":"Service Templates within LibreNMS provides the same ability as Nagios does with Host Groups. Known as Device Groups in LibreNMS. They are applied devices that belong to the specified Device Group. Use the Apply buttons to manually create or update Services for the Service Template. Use the Remove buttons to manually remove Services for the Service Template. After you Edit a Service Template, and then use Apply, all relevant changes are pushed to existing Services previously created. You can also enable Service Templates Auto Discovery to have Services added / removed / updated on regular discover intervals. When a Device is a member of multiple Device Groups, templates from all of those Device Groups are applied. If a Device is added or removed from a Device Group, when the Apply button is used or Auto Discovery runs Services will be added / removed as appropriate. Service Templates are tied into Device Groups, you need at least one Device Group to be able to add Service Templates - You can define a dummy one. The Device Group does not need members to add Service Templates.","title":"Service Templates"},{"location":"Extensions/Services/#service-auto-discovery","text":"To automatically create services for devices with available checks. You need to enable the discover services within config.php with the following: $config [ 'discover_services' ] = true ;","title":"Service Auto Discovery"},{"location":"Extensions/Services/#service-templates-auto-discovery","text":"To automatically create services for devices with configured Service Templates. You need to enable the discover services within config.php with the following: $config [ 'discover_services_templates' ] = true ;","title":"Service Templates Auto Discovery"},{"location":"Extensions/Services/#setup","text":"Service checks are now distributable if you run a distributed setup. To leverage this, use the dispatch service. Alternatively, you could also replace check-services.php with services-wrapper.py in cron instead to run across all polling nodes. If you need to debug the output of services-wrapper.py then you can add -d to the end of the command - it is NOT recommended to do this in cron. Firstly, install Nagios plugins. Debian / Ubuntu: sudo apt install monitoring-plugins Centos: yum install nagios-plugins-all Note: The plugins are bundled with the pre-build VM and Docker images. Next, you need to enable the services within config.php with the following: $config [ 'show_services' ] = 1 ; This will enable a new service menu within your navbar. Debian/Ubuntu: $config [ 'nagios_plugins' ] = \"/usr/lib/nagios/plugins\" ; Centos: $config [ 'nagios_plugins' ] = \"/usr/lib64/nagios/plugins\" ; This will point LibreNMS at the location of the nagios plugins - please ensure that any plugins you use are set to executable. For example: Debian/Ubuntu: chmod +x /usr/lib/nagios/plugins/* Centos: chmod +x /usr/lib64/nagios/plugins/* Finally, you now need to add services-wrapper.py to the current cron file (/etc/cron.d/librenms typically) like: */5 * * * * librenms /opt/librenms/services-wrapper.py 1 Now you can add services via the main Services link in the navbar, or via the 'Add Service' link within the device, services page. Note that some services (procs, inodes, load and similar) will always poll the local LibreNMS server it's running on, regardless of which device you add it to.","title":"Setup"},{"location":"Extensions/Services/#performance-data","text":"By default, the check-services script will collect all performance data that the Nagios script returns and display each datasource on a separate graph. LibreNMS expects scripts to return using Nagios convention for the response message structure: AEN200 However for some modules it would be better if some of this information was consolidated on a single graph. An example is the ICMP check. This check returns: Round Trip Average (rta), Round Trip Min (rtmin) and Round Trip Max (rtmax). These have been combined onto a single graph. If you find a check script that would benefit from having some datasources graphed together, please log an issue on GitHub with the debug information from the script, and let us know which DS's should go together. Example below: ./check-services.php -d -- snip -- Nagios Service - 26 Request: /usr/lib/nagios/plugins/check_icmp localhost Perf Data - DS: rta, Value: 0.016, UOM: ms Perf Data - DS: pl, Value: 0, UOM: % Perf Data - DS: rtmax, Value: 0.044, UOM: ms Perf Data - DS: rtmin, Value: 0.009, UOM: ms Response: OK - localhost: rta 0.016ms, lost 0% Service DS: { \"rta\": \"ms\", \"pl\": \"%\", \"rtmax\": \"ms\", \"rtmin\": \"ms\" } OK u:0.00 s:0.00 r:40.67 RRD[update /opt/librenms/rrd/localhost/services-26.rrd N:0.016:0:0.044:0.009] -- snip --","title":"Performance data"},{"location":"Extensions/Services/#alerting","text":"Services uses the Nagios Alerting scheme where exit code: 0 = Ok, 1 = Warning, 2 = Critical, To create an alerting rule to alert on service=critical, your alerting rule would look like: %services.service_status = \"2\"","title":"Alerting"},{"location":"Extensions/Services/#debug","text":"Change user to librenms for example su - librenms then you can run the following command to help troubleshoot services. ./check-services.php -d","title":"Debug"},{"location":"Extensions/Services/#related-polling-discovery-options","text":"These settings are related and should be investigated and set accordingly. The below values are not defaults or recommended. $config [ 'service_poller_enabled' ] = true ; $config [ 'service_poller_workers' ] = 16 ; $config [ 'service_poller_frequency' ] = 300 ; $config [ 'service_poller_down_retry' ] = 5 ; $config [ 'service_discovery_enabled' ] = true ; $config [ 'service_discovery_workers' ] = 16 ; $config [ 'service_discovery_frequency' ] = 3600 ; $config [ 'service_services_enabled' ] = true ; $config [ 'service_services_workers' ] = 16 ; $config [ 'service_services_frequency' ] = 60 ;","title":"Related Polling / Discovery Options"},{"location":"Extensions/Services/#service-checks-polling-logic","text":"Service check is skipped when the associated device is not pingable, and an appropriate entry is populated in the event log. Service check is polled if it's IP address parameter is not equal to associated device's IP address, even when the associated device is not pingable. To override the default logic and always poll service checks, you can disable ICMP testing for any device by switching Disable ICMP Test setting (Edit -> Misc) to ON. Service checks will never be polled on disabled devices.","title":"Service checks polling logic"},{"location":"Extensions/Services/#check_mrpe","text":"In most cases, only Nagios plugins that run against a remote host with the -H option are available as services. However, if you're remote host is running the Check_MK agent you may be able to use MRPE to monitor Nagios plugins that only execute locally as services. For example, consider the fairly common check_cpu.sh Nagios plugin. If you added.. cpu_check /usr/lib/nagios/plugins/check_cpu.sh -c 95 -w 75 ...to /etc/check_mk/mrpe.cfg on your remote host, you should be able to check its output by configuring a service using the check_mrpe script. Add check_mrpe to the Nagios plugins directory on your LibreNMS server and make it executable. In LibreNMS, add a new service to the desired device with the type mrpe. Enter the IP address of the remote host and in parameters enter -a cpu_check (this should match the name used at the beginning of the line in the mrpe.cfg file).","title":"CHECK_MRPE"},{"location":"Extensions/Smokeping/","text":"Smokeping integration SmokePing is a tool which lets us keep track of network latency, and visualise this through RRD graphs. LibreNMS has support for both new and pre-existing SmokePing installations. For new installations, we can use the lnms cli to generate a Smokeping configuration file. Pre-Existing Smokeping Installation If you have an existing smokeping server, follow the instructions, you only need to look at Configure LibreNMS - All Operating Systems . New Installation All installation steps assume a clean configuration - if you have an existing smokeping setup, you'll need to adapt these steps somewhat. Install and integrate Smokeping Backend - RHEL, CentOS and alike Smokeping is available via EPEL, which if you're running LibreNMS, you probably already have. If you want to do something like run Smokeping on a seperate host and ship data via RRCached though, here's the install command: sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm sudo yum install smokeping Once installed, you should need a cron script installed to make sure that the configuration file is updated. You can find an example in misc/librenms-smokeping-rhel.example . Put this into /etc/cron.d/hourly, and mark it executable: sudo cp /opt/librenms/misc/smokeping-rhel.example /etc/cron.hourly/librenms-smokeping sudo chmod +x /etc/cron.hourly/librenms-smokeping Finally, update the default configuration. Strip everything from the *** Probes *** and *** Targets *** stanza's, and replace with: *** Probes *** @include /etc/smokeping/librenms-probes.conf *** Targets *** probe = FPing menu = Top title = Network Latency Grapher remark = Welcome to the SmokePing website of Insert Company Name Here. \\ Here you will learn all about the latency of our network. @include /etc/smokeping/librenms-targets.conf Note there may be other stanza's (possibly *** Slaves *** ) between the *** Probes *** and *** Targets *** stanza's - leave these intact. Leave everything else untouched. If you need to add other configuration, make sure it comes after the LibreNMS configuration, and keep in mind that Smokeping does not allow duplicate modules, and cares about the configuration file sequence. Once you're happy, manually kick off the cron once, then enable and start smokeping: sudo /etc/cron.hourly/librenms-smokeping sudo systemctl enable --now smokeping Install and integrate Smokeping Backend - Ubuntu, Debian and alike Smokeping is available via the default repositories. sudo apt-get install smokeping Once installed, you should need a cron script installed to make sure that the configuration file is updated. You can find an example in misc/librenms-smokeping-debian.example . Put this into /etc/cron.d/hourly, and mark it executable: sudo cp /opt/librenms/misc/smokeping-debian.example /etc/cron.hourly/librenms-smokeping sudo chmod +x /etc/cron.hourly/librenms-smokeping Finally, update the default configuration. Strip everything from /etc/smokeping/config.d/Probes and replace with: *** Probes *** @include /etc/smokeping/config.d/librenms-probes.conf Strip everything from /etc/smokeping/config.d/Targets and replace with: *** Targets *** probe = FPing menu = Top title = Network Latency Grapher remark = Welcome to the SmokePing website of Insert Company Name Here. \\ Here you will learn all about the latency of our network. @include /etc/smokeping/config.d/librenms-targets.conf Leave everything else untouched. If you need to add other configuration, make sure it comes after the LibreNMS configuration, and keep in mind that Smokeping does not allow duplicate modules, and cares about the configuration file sequence. Configure LibreNMS - All Operating Systems external/smokeping lnms config:set smokeping.dir '/var/lib/smokeping' lnms config:set smokeping.pings 20 lnms config:set smokeping.probes 2 lnms config:set smokeping.integration true lnms config:set smokeping.url 'smokeping/' dir should match the location that smokeping writes RRD's to pings should match the default smokeping value, default 20 probes should be the number of processes to spread pings over, default 2 These settings can also be set in the Web UI. Configure Smokeping's Web UI - Optional This section covers the required configuration for your web server of choice. This covers the required configuration for either Apache or Nginx. LibreNMS does not need the Web UI - you can find the graphs in LibreNMS on the latency tab. Apache Configuration - Ubuntu, Debian and alike Edit the General configuration file's Owner and contact , and cgiurl hostname details: nano /etc/smokeping/config.d/General owner = LibreNMS-Admin contact = admin@ACME.xxx cgiurl = http://yourlibrenms/cgi-bin/smokeping.cgi Smokeping should automatically install an Apache configuration file in /etc/apache2/conf-available/ . Verify this using : librenms@librenms:~/scripts$ ls /etc/apache2/conf-available/ | grep smokeping smokeping.conf If you don't see smokeping.conf listed, you'll need to create a symlink for it: ln -s /etc/smokeping/apache2.conf /etc/apache2/conf-available/smokeping.conf After creating the symlink, restart Apache with sudo systemctl apache2 restart You should be able to load the Smokeping web interface at http://yourhost/cgi-bin/smokeping.cgi Nginx Configuration - RHEL, CentOS and alike This section assumes you have configured LibreNMS with Nginx as specified in Configure Nginx . Note, you need to install fcgiwrap for CGI wrapper interact with Nginx yum install fcgiwrap Then create a new configuration file for fcgiwrap in /etc/nginx/fcgiwrap.conf # Include this file on your nginx.conf to support debian cgi-bin scripts using # fcgiwrap location /cgi-bin/ { # Disable gzip (it makes scripts feel slower since they have to complete # before getting gzipped) gzip off; # Set the root to /usr/lib (inside this location this means that we are # giving access to the files under /usr/lib/cgi-bin) #root /usr/lib; root /usr/share/nginx; # Fastcgi socket fastcgi_pass unix:/var/run/fcgiwrap.socket; # Fastcgi parameters, include the standard ones include /etc/nginx/fastcgi_params; # Adjust non standard parameters (SCRIPT_FILENAME) fastcgi_param SCRIPT_FILENAME /usr/lib$fastcgi_script_name; } Be sure to create the folder cgi-bin folder with required permissions (755) mkdir /usr/share/nginx/cgi-bin Create fcgiwrap systemd service in /usr/lib/systemd/system/fcgiwrap.service # create new [Unit] Description=Simple CGI Server After=nss-user-lookup.target Requires=fcgiwrap.socket [Service] EnvironmentFile=/etc/sysconfig/fcgiwrap ExecStart=/usr/sbin/fcgiwrap ${DAEMON_OPTS} -c ${DAEMON_PROCS} User=librenms Group=librenms [Install] Also=fcgiwrap.socket The socket file in /usr/lib/systemd/system/fcgiwrap.socket # create new [Unit] Description=fcgiwrap Socket [Socket] ListenStream=/var/run/fcgiwrap.socket [Install] WantedBy=sockets.target Enable fcgiwrap systemctl enable --now fcgiwrap Add the following configuration to your /etc/nginx/conf.d/librenms.conf file within server section. The following will configure Nginx to respond to http://yourlibrenms/smokeping : location = /smokeping/ { fastcgi_intercept_errors on; fastcgi_param SCRIPT_FILENAME /usr/share/smokeping/cgi/smokeping.fcgi; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_param HTTPS $https if_not_empty; fastcgi_pass unix:/var/run/fcgiwrap.socket; } location ^~ /smokeping/ { alias /usr/share/smokeping/cgi/; index smokeping.fcgi; gzip off; } If images/js/css don't load, you might have to add location ^~ /smokeping/css { alias /usr/share/smokeping/htdocs/css/; gzip off; } location ^~ /smokeping/js { alias /usr/share/smokeping/htdocs/js/; gzip off; } location ^~ /smokeping/images { alias /opt/librenms/rrd/smokeping/images; gzip off; } After saving the configuration file, verify your Nginx configuration file syntax is OK with sudo nginx -t , then restart Nginx with sudo systemctl restart nginx You should be able to load the Smokeping web interface at http://yourlibrenms/smokeping Nginx Configuration - Ubuntu, Debian and alike This section assumes you have configured LibreNMS with Nginx as specified in Configure Nginx . Note, you need to install fcgiwrap for CGI wrapper interact with Nginx apt install fcgiwrap Then configure Nginx with the default configuration cp /usr/share/doc/fcgiwrap/examples/nginx.conf /etc/nginx/fcgiwrap.conf Add the following configuration to your /etc/nginx/conf.d/librenms.conf file within server section. The following will configure Nginx to respond to http://yourlibrenms/smokeping : # Browsing to `http://yourlibrenms/smokeping/` should bring up the smokeping web interface location = /smokeping/ { fastcgi_intercept_errors on; fastcgi_param SCRIPT_FILENAME /usr/lib/cgi-bin/smokeping.cgi; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_param HTTPS $https if_not_empty; fastcgi_pass unix:/var/run/fcgiwrap.socket; } location ^~ /smokeping/ { alias /usr/share/smokeping/www/; index smokeping.cgi; gzip off; } After saving the configuration file, verify your Nginx configuration file syntax is OK with sudo nginx -t , then restart Nginx with sudo systemctl restart nginx You should be able to load the Smokeping web interface at http://yourlibrenms/smokeping Nginx Password Authentication You can use the purpose-made htpasswd utility included in the apache2-utils package (Nginx password files use the same format as Apache). You can install it on Ubuntu with apt install apache2-utils After that you need to create password for your user htpasswd -c /etc/nginx/.htpasswd USER You can verify your user and password with cat /etc/nginx/.htpasswd Then you just need to add to your config auth_basic parameters location ^~ /smokeping/ { alias /usr/share/smokeping/www/; index smokeping.cgi; gzip off; auth_basic \"Private Property\"; auth_basic_user_file /etc/nginx/.htpasswd; } Common Problems RRDs::update ERROR: opening ... Permission denied There is a problem writing to the RRD directory. This is somewhat out of scope of LibreNMS, but make sure that file permissions and SELinux labels allow the smokeping user to write to the directory. If you're using RRDCacheD, make sure that the permissions are correct there too, and that if you're using -B that the smokeping RRD's are inside the base directory; update the smokeping rrd directory if required. It's not recommended to run RRDCachedD without the -B switch. Share RRDCached with LibreNMS Move the RRD's and give smokeping access rights to the LibreNMS RRD directory: sudo systemctl stop smokeping sudo mv /var/lib/smokeping /opt/librenms/rrd/ sudo usermod -a -G librenms smokeping Update data directory in /etc/smokeping : datadir = /opt/librenms/rrd/smokeping dyndir = /opt/librenms/rrd/smokeping/__cgi If you have SELinux on, see next section before starting smokeping. Finally restart the smokeping service: sudo systemctl start smokeping Remember to update your config with the new locations. Configure SELinux to allow smokeping to write in LibreNMS directory on Centos / RHEL If you are using RRDCached with the -B switch and smokeping RRD's inside the LibreNMS RRD base directory, you can install this SELinux profile: cat > smokeping_librenms.te << EOF module smokeping_librenms 1.0; require { type httpd_t; type smokeping_t; type smokeping_var_lib_t; type var_run_t; type httpd_sys_rw_content_t; class dir { add_name create getattr read remove_name search write }; class file { create getattr ioctl lock open read rename setattr unlink write }; } #============= httpd_t ============== allow httpd_t smokeping_var_lib_t:dir read; allow httpd_t var_run_t:file { read write }; #============= smokeping_t ============== allow smokeping_t httpd_sys_rw_content_t:dir { add_name create getattr remove_name search write }; allow smokeping_t httpd_sys_rw_content_t:file { create getattr ioctl lock open read rename setattr unlink write }; EOF checkmodule -M -m -o smokeping_librenms.mod smokeping_librenms.te semodule_package -o smokeping_librenms.pp -m smokeping_librenms.mod semodule -i smokeping_librenms.pp Probe FPing missing missing from the probes section Take a look at the instructions again - something isn't correct in your configuration. Section or variable already exists Most likely, content wasn't fully removed from the *** Probes *** *** Targets*** stanza's as instructed. If you're trying to integrate LibreNMS, smokeping and another source of configuration, you're probably trying to redefine a module (e.g. '+ FPing' more than once) or stanza. Otherwise, look again at the instructions. Mandatory variable 'probe' not defined The target block must have a default probe. If you follow the instructions you will have one. If you're trying to integrate LibreNMS, smokeping and another source of configuration, you need to make sure there are no duplicate or missing definitions. File '/usr/sbin/sendmail' does not exist` If you got this error at the end of the installation, simply edit or comment out the sendmail entry in the configuration: -sendmail = /usr/sbin/sendmail +#sendmail = /usr/sbin/sendmail","title":"Smokeping"},{"location":"Extensions/Smokeping/#smokeping-integration","text":"SmokePing is a tool which lets us keep track of network latency, and visualise this through RRD graphs. LibreNMS has support for both new and pre-existing SmokePing installations. For new installations, we can use the lnms cli to generate a Smokeping configuration file.","title":"Smokeping integration"},{"location":"Extensions/Smokeping/#pre-existing-smokeping-installation","text":"If you have an existing smokeping server, follow the instructions, you only need to look at Configure LibreNMS - All Operating Systems .","title":"Pre-Existing Smokeping Installation"},{"location":"Extensions/Smokeping/#new-installation","text":"All installation steps assume a clean configuration - if you have an existing smokeping setup, you'll need to adapt these steps somewhat.","title":"New Installation"},{"location":"Extensions/Smokeping/#install-and-integrate-smokeping-backend-rhel-centos-and-alike","text":"Smokeping is available via EPEL, which if you're running LibreNMS, you probably already have. If you want to do something like run Smokeping on a seperate host and ship data via RRCached though, here's the install command: sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm sudo yum install smokeping Once installed, you should need a cron script installed to make sure that the configuration file is updated. You can find an example in misc/librenms-smokeping-rhel.example . Put this into /etc/cron.d/hourly, and mark it executable: sudo cp /opt/librenms/misc/smokeping-rhel.example /etc/cron.hourly/librenms-smokeping sudo chmod +x /etc/cron.hourly/librenms-smokeping Finally, update the default configuration. Strip everything from the *** Probes *** and *** Targets *** stanza's, and replace with: *** Probes *** @include /etc/smokeping/librenms-probes.conf *** Targets *** probe = FPing menu = Top title = Network Latency Grapher remark = Welcome to the SmokePing website of Insert Company Name Here. \\ Here you will learn all about the latency of our network. @include /etc/smokeping/librenms-targets.conf Note there may be other stanza's (possibly *** Slaves *** ) between the *** Probes *** and *** Targets *** stanza's - leave these intact. Leave everything else untouched. If you need to add other configuration, make sure it comes after the LibreNMS configuration, and keep in mind that Smokeping does not allow duplicate modules, and cares about the configuration file sequence. Once you're happy, manually kick off the cron once, then enable and start smokeping: sudo /etc/cron.hourly/librenms-smokeping sudo systemctl enable --now smokeping","title":"Install and integrate Smokeping Backend - RHEL, CentOS and alike"},{"location":"Extensions/Smokeping/#install-and-integrate-smokeping-backend-ubuntu-debian-and-alike","text":"Smokeping is available via the default repositories. sudo apt-get install smokeping Once installed, you should need a cron script installed to make sure that the configuration file is updated. You can find an example in misc/librenms-smokeping-debian.example . Put this into /etc/cron.d/hourly, and mark it executable: sudo cp /opt/librenms/misc/smokeping-debian.example /etc/cron.hourly/librenms-smokeping sudo chmod +x /etc/cron.hourly/librenms-smokeping Finally, update the default configuration. Strip everything from /etc/smokeping/config.d/Probes and replace with: *** Probes *** @include /etc/smokeping/config.d/librenms-probes.conf Strip everything from /etc/smokeping/config.d/Targets and replace with: *** Targets *** probe = FPing menu = Top title = Network Latency Grapher remark = Welcome to the SmokePing website of Insert Company Name Here. \\ Here you will learn all about the latency of our network. @include /etc/smokeping/config.d/librenms-targets.conf Leave everything else untouched. If you need to add other configuration, make sure it comes after the LibreNMS configuration, and keep in mind that Smokeping does not allow duplicate modules, and cares about the configuration file sequence.","title":"Install and integrate Smokeping Backend - Ubuntu, Debian and alike"},{"location":"Extensions/Smokeping/#configure-librenms-all-operating-systems","text":"external/smokeping lnms config:set smokeping.dir '/var/lib/smokeping' lnms config:set smokeping.pings 20 lnms config:set smokeping.probes 2 lnms config:set smokeping.integration true lnms config:set smokeping.url 'smokeping/' dir should match the location that smokeping writes RRD's to pings should match the default smokeping value, default 20 probes should be the number of processes to spread pings over, default 2 These settings can also be set in the Web UI.","title":"Configure LibreNMS - All Operating Systems"},{"location":"Extensions/Smokeping/#configure-smokepings-web-ui-optional","text":"This section covers the required configuration for your web server of choice. This covers the required configuration for either Apache or Nginx. LibreNMS does not need the Web UI - you can find the graphs in LibreNMS on the latency tab.","title":"Configure Smokeping's Web UI - Optional"},{"location":"Extensions/Smokeping/#apache-configuration-ubuntu-debian-and-alike","text":"Edit the General configuration file's Owner and contact , and cgiurl hostname details: nano /etc/smokeping/config.d/General owner = LibreNMS-Admin contact = admin@ACME.xxx cgiurl = http://yourlibrenms/cgi-bin/smokeping.cgi Smokeping should automatically install an Apache configuration file in /etc/apache2/conf-available/ . Verify this using : librenms@librenms:~/scripts$ ls /etc/apache2/conf-available/ | grep smokeping smokeping.conf If you don't see smokeping.conf listed, you'll need to create a symlink for it: ln -s /etc/smokeping/apache2.conf /etc/apache2/conf-available/smokeping.conf After creating the symlink, restart Apache with sudo systemctl apache2 restart You should be able to load the Smokeping web interface at http://yourhost/cgi-bin/smokeping.cgi","title":"Apache Configuration - Ubuntu, Debian and alike"},{"location":"Extensions/Smokeping/#nginx-configuration-rhel-centos-and-alike","text":"This section assumes you have configured LibreNMS with Nginx as specified in Configure Nginx . Note, you need to install fcgiwrap for CGI wrapper interact with Nginx yum install fcgiwrap Then create a new configuration file for fcgiwrap in /etc/nginx/fcgiwrap.conf # Include this file on your nginx.conf to support debian cgi-bin scripts using # fcgiwrap location /cgi-bin/ { # Disable gzip (it makes scripts feel slower since they have to complete # before getting gzipped) gzip off; # Set the root to /usr/lib (inside this location this means that we are # giving access to the files under /usr/lib/cgi-bin) #root /usr/lib; root /usr/share/nginx; # Fastcgi socket fastcgi_pass unix:/var/run/fcgiwrap.socket; # Fastcgi parameters, include the standard ones include /etc/nginx/fastcgi_params; # Adjust non standard parameters (SCRIPT_FILENAME) fastcgi_param SCRIPT_FILENAME /usr/lib$fastcgi_script_name; } Be sure to create the folder cgi-bin folder with required permissions (755) mkdir /usr/share/nginx/cgi-bin Create fcgiwrap systemd service in /usr/lib/systemd/system/fcgiwrap.service # create new [Unit] Description=Simple CGI Server After=nss-user-lookup.target Requires=fcgiwrap.socket [Service] EnvironmentFile=/etc/sysconfig/fcgiwrap ExecStart=/usr/sbin/fcgiwrap ${DAEMON_OPTS} -c ${DAEMON_PROCS} User=librenms Group=librenms [Install] Also=fcgiwrap.socket The socket file in /usr/lib/systemd/system/fcgiwrap.socket # create new [Unit] Description=fcgiwrap Socket [Socket] ListenStream=/var/run/fcgiwrap.socket [Install] WantedBy=sockets.target Enable fcgiwrap systemctl enable --now fcgiwrap Add the following configuration to your /etc/nginx/conf.d/librenms.conf file within server section. The following will configure Nginx to respond to http://yourlibrenms/smokeping : location = /smokeping/ { fastcgi_intercept_errors on; fastcgi_param SCRIPT_FILENAME /usr/share/smokeping/cgi/smokeping.fcgi; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_param HTTPS $https if_not_empty; fastcgi_pass unix:/var/run/fcgiwrap.socket; } location ^~ /smokeping/ { alias /usr/share/smokeping/cgi/; index smokeping.fcgi; gzip off; } If images/js/css don't load, you might have to add location ^~ /smokeping/css { alias /usr/share/smokeping/htdocs/css/; gzip off; } location ^~ /smokeping/js { alias /usr/share/smokeping/htdocs/js/; gzip off; } location ^~ /smokeping/images { alias /opt/librenms/rrd/smokeping/images; gzip off; } After saving the configuration file, verify your Nginx configuration file syntax is OK with sudo nginx -t , then restart Nginx with sudo systemctl restart nginx You should be able to load the Smokeping web interface at http://yourlibrenms/smokeping","title":"Nginx Configuration - RHEL, CentOS and alike"},{"location":"Extensions/Smokeping/#nginx-configuration-ubuntu-debian-and-alike","text":"This section assumes you have configured LibreNMS with Nginx as specified in Configure Nginx . Note, you need to install fcgiwrap for CGI wrapper interact with Nginx apt install fcgiwrap Then configure Nginx with the default configuration cp /usr/share/doc/fcgiwrap/examples/nginx.conf /etc/nginx/fcgiwrap.conf Add the following configuration to your /etc/nginx/conf.d/librenms.conf file within server section. The following will configure Nginx to respond to http://yourlibrenms/smokeping : # Browsing to `http://yourlibrenms/smokeping/` should bring up the smokeping web interface location = /smokeping/ { fastcgi_intercept_errors on; fastcgi_param SCRIPT_FILENAME /usr/lib/cgi-bin/smokeping.cgi; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_param HTTPS $https if_not_empty; fastcgi_pass unix:/var/run/fcgiwrap.socket; } location ^~ /smokeping/ { alias /usr/share/smokeping/www/; index smokeping.cgi; gzip off; } After saving the configuration file, verify your Nginx configuration file syntax is OK with sudo nginx -t , then restart Nginx with sudo systemctl restart nginx You should be able to load the Smokeping web interface at http://yourlibrenms/smokeping","title":"Nginx Configuration - Ubuntu, Debian and alike"},{"location":"Extensions/Smokeping/#nginx-password-authentication","text":"You can use the purpose-made htpasswd utility included in the apache2-utils package (Nginx password files use the same format as Apache). You can install it on Ubuntu with apt install apache2-utils After that you need to create password for your user htpasswd -c /etc/nginx/.htpasswd USER You can verify your user and password with cat /etc/nginx/.htpasswd Then you just need to add to your config auth_basic parameters location ^~ /smokeping/ { alias /usr/share/smokeping/www/; index smokeping.cgi; gzip off; auth_basic \"Private Property\"; auth_basic_user_file /etc/nginx/.htpasswd; }","title":"Nginx Password Authentication"},{"location":"Extensions/Smokeping/#common-problems","text":"","title":"Common Problems"},{"location":"Extensions/Smokeping/#rrdsupdate-error-opening-permission-denied","text":"There is a problem writing to the RRD directory. This is somewhat out of scope of LibreNMS, but make sure that file permissions and SELinux labels allow the smokeping user to write to the directory. If you're using RRDCacheD, make sure that the permissions are correct there too, and that if you're using -B that the smokeping RRD's are inside the base directory; update the smokeping rrd directory if required. It's not recommended to run RRDCachedD without the -B switch.","title":"RRDs::update ERROR: opening ... Permission denied"},{"location":"Extensions/Smokeping/#share-rrdcached-with-librenms","text":"Move the RRD's and give smokeping access rights to the LibreNMS RRD directory: sudo systemctl stop smokeping sudo mv /var/lib/smokeping /opt/librenms/rrd/ sudo usermod -a -G librenms smokeping Update data directory in /etc/smokeping : datadir = /opt/librenms/rrd/smokeping dyndir = /opt/librenms/rrd/smokeping/__cgi If you have SELinux on, see next section before starting smokeping. Finally restart the smokeping service: sudo systemctl start smokeping Remember to update your config with the new locations.","title":"Share RRDCached with LibreNMS"},{"location":"Extensions/Smokeping/#configure-selinux-to-allow-smokeping-to-write-in-librenms-directory-on-centos-rhel","text":"If you are using RRDCached with the -B switch and smokeping RRD's inside the LibreNMS RRD base directory, you can install this SELinux profile: cat > smokeping_librenms.te << EOF module smokeping_librenms 1.0; require { type httpd_t; type smokeping_t; type smokeping_var_lib_t; type var_run_t; type httpd_sys_rw_content_t; class dir { add_name create getattr read remove_name search write }; class file { create getattr ioctl lock open read rename setattr unlink write }; } #============= httpd_t ============== allow httpd_t smokeping_var_lib_t:dir read; allow httpd_t var_run_t:file { read write }; #============= smokeping_t ============== allow smokeping_t httpd_sys_rw_content_t:dir { add_name create getattr remove_name search write }; allow smokeping_t httpd_sys_rw_content_t:file { create getattr ioctl lock open read rename setattr unlink write }; EOF checkmodule -M -m -o smokeping_librenms.mod smokeping_librenms.te semodule_package -o smokeping_librenms.pp -m smokeping_librenms.mod semodule -i smokeping_librenms.pp","title":"Configure SELinux to allow smokeping to write in LibreNMS directory on Centos / RHEL"},{"location":"Extensions/Smokeping/#probe-fping-missing-missing-from-the-probes-section","text":"Take a look at the instructions again - something isn't correct in your configuration.","title":"Probe FPing missing missing from the probes section"},{"location":"Extensions/Smokeping/#section-or-variable-already-exists","text":"Most likely, content wasn't fully removed from the *** Probes *** *** Targets*** stanza's as instructed. If you're trying to integrate LibreNMS, smokeping and another source of configuration, you're probably trying to redefine a module (e.g. '+ FPing' more than once) or stanza. Otherwise, look again at the instructions.","title":"Section or variable already exists"},{"location":"Extensions/Smokeping/#mandatory-variable-probe-not-defined","text":"The target block must have a default probe. If you follow the instructions you will have one. If you're trying to integrate LibreNMS, smokeping and another source of configuration, you need to make sure there are no duplicate or missing definitions.","title":"Mandatory variable 'probe' not defined"},{"location":"Extensions/Smokeping/#file-usrsbinsendmail-does-not-exist","text":"If you got this error at the end of the installation, simply edit or comment out the sendmail entry in the configuration: -sendmail = /usr/sbin/sendmail +#sendmail = /usr/sbin/sendmail","title":"File '/usr/sbin/sendmail' does not exist`"},{"location":"Extensions/Sub-Directory/","text":"To run LibreNMS under a subdirectory on your Apache server, the directives for the LibreNMS directory are placed in the base server configuration, or in a virtual host container of your choosing. If using a virtual host, place the directives in the file where the virtual host is configured. If using the base server on RHEL distributions (CentOS, Scientific Linux, etc.) the directives can be placed in /etc/httpd/conf.d/librenms.conf . For Debian distributions (Ubuntu, etc.) place the directives in /etc/apache2/sites-available/default . #These directives can be inside a virtual host or in the base server configuration AllowEncodedSlashes On Alias /librenms /opt/librenms/html AllowOverride All Options FollowSymLinks MultiViews The RewriteBase directive in html/.htaccess must be rewritten to reference the subdirectory name. Assuming LibreNMS is running at http://example.com/librenms/ , you will need to change RewriteBase / to RewriteBase /librenms . Finally, set APP_URL=/librenms/ in .env and lnms config:set base_url '/librenms/' .","title":"Sub-directory Support"},{"location":"Extensions/Supermicro/","text":"Supermicro For some Supermicro information to show up in LibreNMS, you will need to install an agent. Supermicro SuperDoctor Install Supermicro SuperDoctor onto the device you want to monitor. Then add the following to /etc/snmp/snmpd.conf: pass .1.3.6.1.4.1.10876 /usr/bin/sudo /opt/Supermicro/SuperDoctor5/libs/native/snmpagent Restart net-snmp: service snmpd restart","title":"Supermicro"},{"location":"Extensions/Supermicro/#supermicro","text":"For some Supermicro information to show up in LibreNMS, you will need to install an agent.","title":"Supermicro"},{"location":"Extensions/Supermicro/#supermicro-superdoctor","text":"Install Supermicro SuperDoctor onto the device you want to monitor. Then add the following to /etc/snmp/snmpd.conf: pass .1.3.6.1.4.1.10876 /usr/bin/sudo /opt/Supermicro/SuperDoctor5/libs/native/snmpagent Restart net-snmp: service snmpd restart","title":"Supermicro SuperDoctor"},{"location":"Extensions/Syslog/","text":"Syslog support Syslog integration variants This section explain different ways to recieve and process syslog with LibreNMS. Except of graylog, all Syslogs variants store their logs in the LibreNMS database. You need to enable the Syslog extension in config.php : $config [ 'enable_syslog' ] = 1 ; A Syslog integration gives you a centralized view of information within the LibreNMS (device view, traps, event). Further more you can trigger alerts based on syslog messages (see rule collections). Traditional Syslog server syslog-ng Debian / Ubuntu CentOS / RedHat apt-get install syslog-ng-core yum install syslog-ng Once syslog-ng is installed, create the config file (/etc/syslog-ng/conf.d/librenms.conf) and paste the following: source s_net { tcp ( port ( 514 ) flags ( syslog-protocol )) ; udp ( port ( 514 ) flags ( syslog-protocol )) ; } ; destination d_librenms { program ( \"/opt/librenms/syslog.php\" template ( \" $HOST || $FACILITY || $PRIORITY || $LEVEL || $TAG || $R_YEAR - $R_MONTH - $R_DAY $R_HOUR : $R_MIN : $R_SEC || $MSG || $PROGRAM \\n\" ) template-escape ( yes )) ; } ; log { source ( s_net ) ; source ( s_src ) ; destination ( d_librenms ) ; } ; Next start syslog-ng: service syslog-ng restart If no messages make it to the syslog tab in LibreNMS, chances are you experience an issue with SELinux. If so, create a file mycustom-librenms-rsyslog.te , with the following content: module mycustom-librenms-rsyslog 1.0; require { type syslogd_t; type httpd_sys_rw_content_t; type ping_exec_t; class process execmem; class dir { getattr search write }; class file { append getattr execute open read }; } #============= syslogd_t ============== allow syslogd_t httpd_sys_rw_content_t:dir { getattr search write }; allow syslogd_t httpd_sys_rw_content_t:file { open read append getattr }; allow syslogd_t self:process execmem; allow syslogd_t ping_exec_t:file execute; Then, as root, execute the following commands: checkmodule -M -m -o mycustom-librenms-rsyslog.mod mycustom-librenms-rsyslog.te semodule_package -o mycustom-librenms-rsyslog.pp -m mycustom-librenms-rsyslog.mod semodule -i mycustom-librenms-rsyslog.pp rsyslog If you prefer rsyslog, here are some hints on how to get it working. Add the following to your rsyslog config somewhere (could be at the top of the file in the step below, could be in rsyslog.conf if you are using remote logs for something else on this host) # Listen for syslog messages on UDP:514 $ModLoad imudp $UDPServerRun 514 Create a file called /etc/rsyslog.d/30-librenms.conf and add the following depending on your version of rsyslog. Version 8 Version 7 Legacy # Feed syslog messages to librenms module(load=\"omprog\") template(name=\"librenms\" type=\"string\" string= \"%fromhost%||%syslogfacility%||%syslogpriority%||%syslogseverity%||%syslogtag%||%$year%-%$month%-%$day% %timegenerated:8:25%||%msg%||%programname%\\n\") action(type=\"omprog\" binary=\"/opt/librenms/syslog.php\" template=\"librenms\") & stop #Feed syslog messages to librenms $ModLoad omprog $template librenms,\"%fromhost%||%syslogfacility%||%syslogpriority%||%syslogseverity%||%syslogtag%||%$year%-%$month%-%$day% %timegenerated:8:25%||%msg%||%programname%\\n\" *.* action(type=\"omprog\" binary=\"/opt/librenms/syslog.php\" template=\"librenms\") & stop # Feed syslog messages to librenms $ModLoad omprog $template librenms,\"%FROMHOST%||%syslogfacility-text%||%syslogpriority-text%||%syslogseverity%||%syslogtag%||%$YEAR%-%$MONTH%-%$DAY% %timegenerated:8:25%||%msg%||%programname%\\n\" $ActionOMProgBinary /opt/librenms/syslog.php *.* :omprog:;librenms If your rsyslog server is receiving messages relayed by another syslog server, you may try replacing %fromhost% with %hostname% , since fromhost is the host the message was received from, not the host that generated the message. The fromhost property is preferred as it avoids problems caused by devices sending incorrect hostnames in syslog messages. Local Logstash If you prefer logstash, and it is installed on the same server as LibreNMS, here are some hints on how to get it working. First, install the output-exec plugin for logstash: /usr/share/logstash/bin/logstash-plugin install logstash-output-exec Next, create a logstash configuration file (ex. /etc/logstash/conf.d/logstash-simple.conf), and add the following: input { syslog { port => 514 } } output { exec { command => \"echo `echo %{host},,,,%{facility},,,,%{priority},,,,%{severity},,,,%{facility_label},,,,``date --date='%{timestamp}' '+%Y-%m-%d %H:%M:%S'``echo ',,,,%{message}'``echo ,,,,%{program} | sed 's/\\x25\\x7b\\x70\\x72\\x6f\\x67\\x72\\x61\\x6d\\x7d/%{facility_label}/'` | sed 's/,,,,/||/g' | /opt/librenms/syslog.php &\" } elasticsearch { hosts => [\"10.10.10.10:9200\"] index => \"syslog-%{+YYYY.MM.dd}\" } } Replace 10.10.10.10 with your primary elasticsearch server IP, and set the incoming syslog port. Alternatively, if you already have a logstash config file that works except for the LibreNMS export, take only the \"exec\" section from output and add it. Remote Logstash (or any json source) If you have a large logstash / elastic installation for collecting and filtering syslogs, you can simply pass the relevant logs as json to the LibreNMS API \"syslog sink\". This variant may be more flexible and secure in transport. It does not require any major changes to existing ELK setup. You can also pass simple json kv messages from any kind of application or script (example below) to this sink. For long term or advanced aggregation searches you might still use Kibana/Grafana/Graylog etc. It is recommended to keep config['syslog_purge'] short. A schematic setup can look like this: \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502Device\u251c\u2500\u25ba\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502Logstash Cluster \u251c\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502ElasticSearch \u251c\u2510 \u2502 RabbitMQ \u2502\u2502 \u2502 Cluster \u2502\u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u25ba\u2502 Filtering etc \u2502\u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2502 \u2502Device\u2502 \u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2502 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u25bc ~~~WAN~~~ \u2502 \u250c\u2500\u253c\u2500\u2510 \u2502\u253c\u253c\u253c\u2502 LB / Firewall / etc \u2514\u2500\u253c\u2500\u2518 \u2502 \u25bc \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502LibreNMS Sink \u251c\u252c\u2500\u2500\u25ba\u2502LibreNMS Master \u2502 \u2502/api/v0/syslogsink/ \u2502\u2502 \u2502 MariaDB \u2502 \u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 A minimal Logstash http output configuration can look like this: output { .... #feed it to LibreNMS http { http_method => \"post\" url => \"https://sink.librenms.org/api/v0/syslogsink/ # replace with your librenms host format => \"json_batch\" # put multiple syslogs in on HTTP message retry_failed => false # if true, logstash is blocking if the API is unavailable, be careful! headers => [\"X-Auth-Token\",\"xxxxxxxLibreNMSApiToken] # optional if your mapping is not already done before or does not match. \"msg\" and \"host\" is mandatory. # you might also use out the clone {} function to duplicate your log stream and a dedicated log filtering/mapping etc. # mapping => { # \"host\"=> \"%{host}\" # \"program\" => \"%{program}\" # \"facility\" => \"%{facility_label}\" # \"priority\" => \"%{syslog5424_pri}\" # \"level\" => \"%{facility_label}\" # \"tag\" => \"%{topic}\" # \"msg\" => \"%{message}\" # \"timestamp\" => \"%{@timestamp}\" # } } } Sample test data: curl -L -X POST 'https://sink.librenms.org/api/v0/syslogsink/' -H 'X-Auth-Token: xxxxxxxLibreNMSApiToken' --data-raw '[ { \"msg\": \"kernel: minimum Message\", \"host\": \"mydevice.fqdn.com\" }, { \"msg\": \"Line protocol on Interface GigabitEthernet1/0/41, changed state to up\", \"facility\": 23, \"priority\": \"189\", \"program\": \"LINEPROTO-5-UPDOWN\", \"host\": \"172.29.10.24\", \"@timestamp\": \"2022-12-01T20:14:28.257Z\", \"severity\": 5, \"level\": \"ERROR\" }, { \"msg\": \"kernel: a unknown host\", \"host\": \"unknown.fqdn.com\" } ]' msg and host are the minimum keys. Graylog This variant method use a external Graylog installation and its database. Please refer to the dedicated Graylog documentation. Client configuration Below are sample configurations for a variety of clients. You should understand the config before using it as you may want to make some slight changes. Further configuration hints may be found in the file Graylog.md. Replace librenms.ip with IP or hostname of your LibreNMS install. Replace any variables in with the relevant information. syslog *.* @librenms.ip rsyslog *.* @librenms.ip:514 Cisco ASA logging enable logging timestamp logging buffer-size 200000 logging buffered debugging logging trap notifications logging host librenms.ip Cisco IOS logging trap debugging logging facility local6 logging librenms.ip Cisco NXOS logging server librenms.ip 5 use-vrf default facility local6 Juniper Junos set system syslog host librenms.ip authorization any set system syslog host librenms.ip daemon any set system syslog host librenms.ip kernel any set system syslog host librenms.ip user any set system syslog host librenms.ip change-log any set system syslog host librenms.ip source-address set system syslog host librenms.ip exclude-hostname set system syslog time-format Huawei VRP info-center loghost librenms.ip info-center timestamp debugging short-date without-timezone // Optional info-center timestamp log short-date // Optional info-center timestamp trap short-date // Optional //This is optional config, especially if the device is in public ip and you dont'want to get a lot of messages of ACL info-center filter-id bymodule-alias VTY ACL_DENY info-center filter-id bymodule-alias SSH SSH_FAIL info-center filter-id bymodule-alias SNMP SNMP_FAIL info-center filter-id bymodule-alias SNMP SNMP_IPLOCK info-center filter-id bymodule-alias SNMP SNMP_IPUNLOCK info-center filter-id bymodule-alias HTTP ACL_DENY Huawei SmartAX (GPON OLT) loghost add librenms.ip librenms loghost activate name librenms Allied Telesis Alliedware Plus log date-format iso // Required so syslog-ng/LibreNMS can correctly interpret the log message formatting. log host x.x.x.x log host x.x.x.x level // Required. A log-level must be specified for syslog messages to send. log host x.x.x.x level notices program imish // Useful for seeing all commands executed by users. log host x.x.x.x level notices program imi // Required for Oxidized Syslog hook log message. log host source HPE/Aruba Procurve configure logging severity warning logging facility local6 logging librenms.ip control-descr \u201cLibreNMS\u201d logging notify running-config-change write memory If you have permitted udp and tcp 514 through any firewall then that should be all you need. Logs should start appearing and displayed within the LibreNMS web UI. Windows By Default windows has no native way to send logs to a remote syslog server. Using this how to you can download Datagram-Syslog Agent to send logs to a remote syslog server (LibreNMS). Note Keep in mind you can use any agent or program to send the logs. We are just using this Datagram-Syslog Agent for this example. Link to How to You will need to download and install \"Datagram-Syslog Agent\" for this how to Link to Download External hooks Trigger external scripts based on specific syslog patterns being matched with syslog hooks. Add the following to your LibreNMS config.php to enable hooks: $config['enable_syslog_hooks'] = 1; The below are some example hooks to call an external script in the event of a configuration change on Cisco ASA, IOS, NX-OS and IOS-XR devices. Add to your config.php file to enable. Cisco ASA $config['os']['asa']['syslog_hook'][] = Array('regex' => '/%ASA-(config-)?5-111005/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php'); Cisco IOS $config['os']['ios']['syslog_hook'][] = Array('regex' => '/%SYS-(SW[0-9]+-)?5-CONFIG_I/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php'); Cisco NXOS $config['os']['nxos']['syslog_hook'][] = Array('regex' => '/%VSHD-5-VSHD_SYSLOG_CONFIG_I/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php'); Cisco IOSXR $config['os']['iosxr']['syslog_hook'][] = Array('regex' => '/%GBL-CONFIG-6-DB_COMMIT/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php'); Juniper Junos $config['os']['junos']['syslog_hook'][] = Array('regex' => '/UI_COMMIT:/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php'); Juniper ScreenOS $config['os']['screenos']['syslog_hook'][] = Array('regex' => '/System configuration saved/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php'); Allied Telesis Alliedware Plus Note: At least software version 5.4.8-2.1 is required. log host x.x.x.x level notices program imi may also be required depending on configuration. This is to ensure the syslog hook log message gets sent to the syslog server. $config['os']['awplus']['syslog_hook'][] = Array('regex' => '/IMI.+.Startup-config saved on/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php'); HPE/Aruba Procurve $config['os']['procurve']['syslog_hook'][] = Array('regex' => '/Running Config Change/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php'); Configuration Options Syslog Clean Up Can be set inside of config.php $config [ 'syslog_purge' ] = 30 ; The cleanup is run by daily.sh and any entries over X days old are automatically purged. Values are in days. See here for more Clean Up Options Link Matching syslogs to hosts with different names In some cases, you may get logs that aren't being associated with the device in LibreNMS. For example, in LibreNMS the device is known as \"ne-core-01\", and that's how DNS resolves. However, the received syslogs are for \"loopback.core-nw\". To fix this issue, you can configure LibreNMS to translate the incoming syslog hostname into another hostname, so that the logs get associated with the correct device. Example: $config['syslog_xlate'] = array( 'loopback0.core7k1.noc.net' => 'n7k1-core7k1', 'loopback0.core7k2.noc.net' => 'n7k2-core7k2' );","title":"Syslog"},{"location":"Extensions/Syslog/#syslog-support","text":"","title":"Syslog support"},{"location":"Extensions/Syslog/#syslog-integration-variants","text":"This section explain different ways to recieve and process syslog with LibreNMS. Except of graylog, all Syslogs variants store their logs in the LibreNMS database. You need to enable the Syslog extension in config.php : $config [ 'enable_syslog' ] = 1 ; A Syslog integration gives you a centralized view of information within the LibreNMS (device view, traps, event). Further more you can trigger alerts based on syslog messages (see rule collections).","title":"Syslog integration variants"},{"location":"Extensions/Syslog/#traditional-syslog-server","text":"","title":"Traditional Syslog server"},{"location":"Extensions/Syslog/#syslog-ng","text":"Debian / Ubuntu CentOS / RedHat apt-get install syslog-ng-core yum install syslog-ng Once syslog-ng is installed, create the config file (/etc/syslog-ng/conf.d/librenms.conf) and paste the following: source s_net { tcp ( port ( 514 ) flags ( syslog-protocol )) ; udp ( port ( 514 ) flags ( syslog-protocol )) ; } ; destination d_librenms { program ( \"/opt/librenms/syslog.php\" template ( \" $HOST || $FACILITY || $PRIORITY || $LEVEL || $TAG || $R_YEAR - $R_MONTH - $R_DAY $R_HOUR : $R_MIN : $R_SEC || $MSG || $PROGRAM \\n\" ) template-escape ( yes )) ; } ; log { source ( s_net ) ; source ( s_src ) ; destination ( d_librenms ) ; } ; Next start syslog-ng: service syslog-ng restart If no messages make it to the syslog tab in LibreNMS, chances are you experience an issue with SELinux. If so, create a file mycustom-librenms-rsyslog.te , with the following content: module mycustom-librenms-rsyslog 1.0; require { type syslogd_t; type httpd_sys_rw_content_t; type ping_exec_t; class process execmem; class dir { getattr search write }; class file { append getattr execute open read }; } #============= syslogd_t ============== allow syslogd_t httpd_sys_rw_content_t:dir { getattr search write }; allow syslogd_t httpd_sys_rw_content_t:file { open read append getattr }; allow syslogd_t self:process execmem; allow syslogd_t ping_exec_t:file execute; Then, as root, execute the following commands: checkmodule -M -m -o mycustom-librenms-rsyslog.mod mycustom-librenms-rsyslog.te semodule_package -o mycustom-librenms-rsyslog.pp -m mycustom-librenms-rsyslog.mod semodule -i mycustom-librenms-rsyslog.pp","title":"syslog-ng"},{"location":"Extensions/Syslog/#rsyslog","text":"If you prefer rsyslog, here are some hints on how to get it working. Add the following to your rsyslog config somewhere (could be at the top of the file in the step below, could be in rsyslog.conf if you are using remote logs for something else on this host) # Listen for syslog messages on UDP:514 $ModLoad imudp $UDPServerRun 514 Create a file called /etc/rsyslog.d/30-librenms.conf and add the following depending on your version of rsyslog. Version 8 Version 7 Legacy # Feed syslog messages to librenms module(load=\"omprog\") template(name=\"librenms\" type=\"string\" string= \"%fromhost%||%syslogfacility%||%syslogpriority%||%syslogseverity%||%syslogtag%||%$year%-%$month%-%$day% %timegenerated:8:25%||%msg%||%programname%\\n\") action(type=\"omprog\" binary=\"/opt/librenms/syslog.php\" template=\"librenms\") & stop #Feed syslog messages to librenms $ModLoad omprog $template librenms,\"%fromhost%||%syslogfacility%||%syslogpriority%||%syslogseverity%||%syslogtag%||%$year%-%$month%-%$day% %timegenerated:8:25%||%msg%||%programname%\\n\" *.* action(type=\"omprog\" binary=\"/opt/librenms/syslog.php\" template=\"librenms\") & stop # Feed syslog messages to librenms $ModLoad omprog $template librenms,\"%FROMHOST%||%syslogfacility-text%||%syslogpriority-text%||%syslogseverity%||%syslogtag%||%$YEAR%-%$MONTH%-%$DAY% %timegenerated:8:25%||%msg%||%programname%\\n\" $ActionOMProgBinary /opt/librenms/syslog.php *.* :omprog:;librenms If your rsyslog server is receiving messages relayed by another syslog server, you may try replacing %fromhost% with %hostname% , since fromhost is the host the message was received from, not the host that generated the message. The fromhost property is preferred as it avoids problems caused by devices sending incorrect hostnames in syslog messages.","title":"rsyslog"},{"location":"Extensions/Syslog/#local-logstash","text":"If you prefer logstash, and it is installed on the same server as LibreNMS, here are some hints on how to get it working. First, install the output-exec plugin for logstash: /usr/share/logstash/bin/logstash-plugin install logstash-output-exec Next, create a logstash configuration file (ex. /etc/logstash/conf.d/logstash-simple.conf), and add the following: input { syslog { port => 514 } } output { exec { command => \"echo `echo %{host},,,,%{facility},,,,%{priority},,,,%{severity},,,,%{facility_label},,,,``date --date='%{timestamp}' '+%Y-%m-%d %H:%M:%S'``echo ',,,,%{message}'``echo ,,,,%{program} | sed 's/\\x25\\x7b\\x70\\x72\\x6f\\x67\\x72\\x61\\x6d\\x7d/%{facility_label}/'` | sed 's/,,,,/||/g' | /opt/librenms/syslog.php &\" } elasticsearch { hosts => [\"10.10.10.10:9200\"] index => \"syslog-%{+YYYY.MM.dd}\" } } Replace 10.10.10.10 with your primary elasticsearch server IP, and set the incoming syslog port. Alternatively, if you already have a logstash config file that works except for the LibreNMS export, take only the \"exec\" section from output and add it.","title":"Local Logstash"},{"location":"Extensions/Syslog/#remote-logstash-or-any-json-source","text":"If you have a large logstash / elastic installation for collecting and filtering syslogs, you can simply pass the relevant logs as json to the LibreNMS API \"syslog sink\". This variant may be more flexible and secure in transport. It does not require any major changes to existing ELK setup. You can also pass simple json kv messages from any kind of application or script (example below) to this sink. For long term or advanced aggregation searches you might still use Kibana/Grafana/Graylog etc. It is recommended to keep config['syslog_purge'] short. A schematic setup can look like this: \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502Device\u251c\u2500\u25ba\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502Logstash Cluster \u251c\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502ElasticSearch \u251c\u2510 \u2502 RabbitMQ \u2502\u2502 \u2502 Cluster \u2502\u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u25ba\u2502 Filtering etc \u2502\u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2502 \u2502Device\u2502 \u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2502 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u25bc ~~~WAN~~~ \u2502 \u250c\u2500\u253c\u2500\u2510 \u2502\u253c\u253c\u253c\u2502 LB / Firewall / etc \u2514\u2500\u253c\u2500\u2518 \u2502 \u25bc \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502LibreNMS Sink \u251c\u252c\u2500\u2500\u25ba\u2502LibreNMS Master \u2502 \u2502/api/v0/syslogsink/ \u2502\u2502 \u2502 MariaDB \u2502 \u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 A minimal Logstash http output configuration can look like this: output { .... #feed it to LibreNMS http { http_method => \"post\" url => \"https://sink.librenms.org/api/v0/syslogsink/ # replace with your librenms host format => \"json_batch\" # put multiple syslogs in on HTTP message retry_failed => false # if true, logstash is blocking if the API is unavailable, be careful! headers => [\"X-Auth-Token\",\"xxxxxxxLibreNMSApiToken] # optional if your mapping is not already done before or does not match. \"msg\" and \"host\" is mandatory. # you might also use out the clone {} function to duplicate your log stream and a dedicated log filtering/mapping etc. # mapping => { # \"host\"=> \"%{host}\" # \"program\" => \"%{program}\" # \"facility\" => \"%{facility_label}\" # \"priority\" => \"%{syslog5424_pri}\" # \"level\" => \"%{facility_label}\" # \"tag\" => \"%{topic}\" # \"msg\" => \"%{message}\" # \"timestamp\" => \"%{@timestamp}\" # } } } Sample test data: curl -L -X POST 'https://sink.librenms.org/api/v0/syslogsink/' -H 'X-Auth-Token: xxxxxxxLibreNMSApiToken' --data-raw '[ { \"msg\": \"kernel: minimum Message\", \"host\": \"mydevice.fqdn.com\" }, { \"msg\": \"Line protocol on Interface GigabitEthernet1/0/41, changed state to up\", \"facility\": 23, \"priority\": \"189\", \"program\": \"LINEPROTO-5-UPDOWN\", \"host\": \"172.29.10.24\", \"@timestamp\": \"2022-12-01T20:14:28.257Z\", \"severity\": 5, \"level\": \"ERROR\" }, { \"msg\": \"kernel: a unknown host\", \"host\": \"unknown.fqdn.com\" } ]' msg and host are the minimum keys.","title":"Remote Logstash (or any json source)"},{"location":"Extensions/Syslog/#graylog","text":"This variant method use a external Graylog installation and its database. Please refer to the dedicated Graylog documentation.","title":"Graylog"},{"location":"Extensions/Syslog/#client-configuration","text":"Below are sample configurations for a variety of clients. You should understand the config before using it as you may want to make some slight changes. Further configuration hints may be found in the file Graylog.md. Replace librenms.ip with IP or hostname of your LibreNMS install. Replace any variables in with the relevant information.","title":"Client configuration"},{"location":"Extensions/Syslog/#syslog","text":"*.* @librenms.ip","title":"syslog"},{"location":"Extensions/Syslog/#rsyslog_1","text":"*.* @librenms.ip:514","title":"rsyslog"},{"location":"Extensions/Syslog/#cisco-asa","text":"logging enable logging timestamp logging buffer-size 200000 logging buffered debugging logging trap notifications logging host librenms.ip","title":"Cisco ASA"},{"location":"Extensions/Syslog/#cisco-ios","text":"logging trap debugging logging facility local6 logging librenms.ip","title":"Cisco IOS"},{"location":"Extensions/Syslog/#cisco-nxos","text":"logging server librenms.ip 5 use-vrf default facility local6","title":"Cisco NXOS"},{"location":"Extensions/Syslog/#juniper-junos","text":"set system syslog host librenms.ip authorization any set system syslog host librenms.ip daemon any set system syslog host librenms.ip kernel any set system syslog host librenms.ip user any set system syslog host librenms.ip change-log any set system syslog host librenms.ip source-address set system syslog host librenms.ip exclude-hostname set system syslog time-format","title":"Juniper Junos"},{"location":"Extensions/Syslog/#huawei-vrp","text":"info-center loghost librenms.ip info-center timestamp debugging short-date without-timezone // Optional info-center timestamp log short-date // Optional info-center timestamp trap short-date // Optional //This is optional config, especially if the device is in public ip and you dont'want to get a lot of messages of ACL info-center filter-id bymodule-alias VTY ACL_DENY info-center filter-id bymodule-alias SSH SSH_FAIL info-center filter-id bymodule-alias SNMP SNMP_FAIL info-center filter-id bymodule-alias SNMP SNMP_IPLOCK info-center filter-id bymodule-alias SNMP SNMP_IPUNLOCK info-center filter-id bymodule-alias HTTP ACL_DENY","title":"Huawei VRP"},{"location":"Extensions/Syslog/#huawei-smartax-gpon-olt","text":"loghost add librenms.ip librenms loghost activate name librenms","title":"Huawei SmartAX (GPON OLT)"},{"location":"Extensions/Syslog/#allied-telesis-alliedware-plus","text":"log date-format iso // Required so syslog-ng/LibreNMS can correctly interpret the log message formatting. log host x.x.x.x log host x.x.x.x level // Required. A log-level must be specified for syslog messages to send. log host x.x.x.x level notices program imish // Useful for seeing all commands executed by users. log host x.x.x.x level notices program imi // Required for Oxidized Syslog hook log message. log host source ","title":"Allied Telesis Alliedware Plus"},{"location":"Extensions/Syslog/#hpearuba-procurve","text":"configure logging severity warning logging facility local6 logging librenms.ip control-descr \u201cLibreNMS\u201d logging notify running-config-change write memory If you have permitted udp and tcp 514 through any firewall then that should be all you need. Logs should start appearing and displayed within the LibreNMS web UI.","title":"HPE/Aruba Procurve"},{"location":"Extensions/Syslog/#windows","text":"By Default windows has no native way to send logs to a remote syslog server. Using this how to you can download Datagram-Syslog Agent to send logs to a remote syslog server (LibreNMS).","title":"Windows"},{"location":"Extensions/Syslog/#note","text":"Keep in mind you can use any agent or program to send the logs. We are just using this Datagram-Syslog Agent for this example. Link to How to You will need to download and install \"Datagram-Syslog Agent\" for this how to Link to Download","title":"Note"},{"location":"Extensions/Syslog/#external-hooks","text":"Trigger external scripts based on specific syslog patterns being matched with syslog hooks. Add the following to your LibreNMS config.php to enable hooks: $config['enable_syslog_hooks'] = 1; The below are some example hooks to call an external script in the event of a configuration change on Cisco ASA, IOS, NX-OS and IOS-XR devices. Add to your config.php file to enable.","title":"External hooks"},{"location":"Extensions/Syslog/#cisco-asa_1","text":"$config['os']['asa']['syslog_hook'][] = Array('regex' => '/%ASA-(config-)?5-111005/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php');","title":"Cisco ASA"},{"location":"Extensions/Syslog/#cisco-ios_1","text":"$config['os']['ios']['syslog_hook'][] = Array('regex' => '/%SYS-(SW[0-9]+-)?5-CONFIG_I/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php');","title":"Cisco IOS"},{"location":"Extensions/Syslog/#cisco-nxos_1","text":"$config['os']['nxos']['syslog_hook'][] = Array('regex' => '/%VSHD-5-VSHD_SYSLOG_CONFIG_I/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php');","title":"Cisco NXOS"},{"location":"Extensions/Syslog/#cisco-iosxr","text":"$config['os']['iosxr']['syslog_hook'][] = Array('regex' => '/%GBL-CONFIG-6-DB_COMMIT/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php');","title":"Cisco IOSXR"},{"location":"Extensions/Syslog/#juniper-junos_1","text":"$config['os']['junos']['syslog_hook'][] = Array('regex' => '/UI_COMMIT:/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php');","title":"Juniper Junos"},{"location":"Extensions/Syslog/#juniper-screenos","text":"$config['os']['screenos']['syslog_hook'][] = Array('regex' => '/System configuration saved/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php');","title":"Juniper ScreenOS"},{"location":"Extensions/Syslog/#allied-telesis-alliedware-plus_1","text":"Note: At least software version 5.4.8-2.1 is required. log host x.x.x.x level notices program imi may also be required depending on configuration. This is to ensure the syslog hook log message gets sent to the syslog server. $config['os']['awplus']['syslog_hook'][] = Array('regex' => '/IMI.+.Startup-config saved on/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php');","title":"Allied Telesis Alliedware Plus"},{"location":"Extensions/Syslog/#hpearuba-procurve_1","text":"$config['os']['procurve']['syslog_hook'][] = Array('regex' => '/Running Config Change/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php');","title":"HPE/Aruba Procurve"},{"location":"Extensions/Syslog/#configuration-options","text":"","title":"Configuration Options"},{"location":"Extensions/Syslog/#syslog-clean-up","text":"Can be set inside of config.php $config [ 'syslog_purge' ] = 30 ; The cleanup is run by daily.sh and any entries over X days old are automatically purged. Values are in days. See here for more Clean Up Options Link","title":"Syslog Clean Up"},{"location":"Extensions/Syslog/#matching-syslogs-to-hosts-with-different-names","text":"In some cases, you may get logs that aren't being associated with the device in LibreNMS. For example, in LibreNMS the device is known as \"ne-core-01\", and that's how DNS resolves. However, the received syslogs are for \"loopback.core-nw\". To fix this issue, you can configure LibreNMS to translate the incoming syslog hostname into another hostname, so that the logs get associated with the correct device. Example: $config['syslog_xlate'] = array( 'loopback0.core7k1.noc.net' => 'n7k1-core7k1', 'loopback0.core7k2.noc.net' => 'n7k2-core7k2' );","title":"Matching syslogs to hosts with different names"},{"location":"Extensions/Two-Factor-Auth/","text":"Two-Factor Authentication Over the last couple of years, the primary attack vector for internet accounts has been static passwords. Therefore static passwords are no longer sufficient to protect unauthorized access to accounts. Two Factor Authentication adds a variable part in authentication procedures. A user is now required to supply a changing 6-digit passcode in addition to their password to obtain access to the account. LibreNMS has a RFC4226 conformant implementation of both Time and Counter based One-Time-Passwords. It also allows the administrator to configure a throttle time to enforce after 3 failures exceeded. Unlike RFC4226 suggestions, this throttle time will not stack on the amount of failures. Types In general, these two types do not differ in algorithmic terms. The types only differ in the variable being used to derive the passcodes from. The underlying HMAC-SHA1 remains the same for both types, security advantages or disadvantages of each are discussed further down. Timebased One-Time-Password (TOTP) Like the name suggests, this type uses the current Time or a subset of it to generate the passcodes. These passcodes solely rely on the secrecy of their Secretkey in order to provide passcodes. An attacker only needs to guess that Secretkey and the other variable part is any given time, presumably the time upon login. RFC4226 suggests a resynchronization attempt in case the passcode mismatches, providing the attacker a range of up to +/- 3 Minutes to create passcodes. Counterbased One-Time-Password (HOTP) This type uses an internal counter that needs to be in sync with the server's counter to successfully authenticate the passcodes. The main advantage over timebased OTP is the attacker doesn't only need to know the Secretkey but also the server's Counter in order to create valid passcodes. RFC4226 suggests a resynchronization attempt in case the passcode mismatches, providing the attacker a range of up to +4 increments from the actual counter to create passcodes. Configuration WebUI Enable 'Two-Factor' Via Global Settings in the Web UI under Authentication -> General Authentication Settings. Optionally enter a throttle timer in seconds. This will unlock an account after this time once it has failed 3 attempt to authenticate. Set to 0 (default) to disable this feature, meaning accounts will remain locked after 3 attempts and will need an administrator to clear. CLI Enable Two-Factor: ./lnms config:set twofactor true Set throttle-time (in seconds): ./lnms config:set twofactor_lock 300 User Administation If Two-Factor is enabled, the Settings -> Manage Users grid will show a '2FA' column containing a green tick for users with active 2FA. There is no functionality to mandate 2FA for users. If a user has failed 3 attempts, their account can be unlocked or 2FA disabled by editing the user from the Manage Users table. If a throttle timer is set, it will unlock accounts after this time. If set to the default of 0, accounts will need to be manually unlocked by an administrator after 3 failed attempts. Locked accounts will report to the user stating to wait for the throttle time period, or to contact the administrator if no timer set. End-User Enrolment These steps imply that Two-Factor has been enabled system wide as above under Configuration. 2FA is enabled by each user once they are logged in normally: Go to 'My Settings' (/preferences/) Choose TwoFactor type Click on 'Generate TwoFactor Secret Key' If your browser didn't reload, reload manually Scan provided QR or click on 'Manual' to see the Key Google Authenticator Installation guides for Google Authenticator can be found here . Usage: Create a key as described above Scan provided QR or click on 'Manual' and enter the Secret On next login, enter the passcode that the App provides LastPass Authenticator LastPass Authenticator is confirmed to work with Timebased One-Time Passwords (TOTP). Installation guide for LastPass Authenticator can be found here . Usage: Create a Timerbased key as described above Click Add (+) and scan provided QR or click on 'NO QR CODE?' and enter naming details and the Secret On next login, enter the passcode that the App provides","title":"Two-Factor Auth"},{"location":"Extensions/Two-Factor-Auth/#two-factor-authentication","text":"Over the last couple of years, the primary attack vector for internet accounts has been static passwords. Therefore static passwords are no longer sufficient to protect unauthorized access to accounts. Two Factor Authentication adds a variable part in authentication procedures. A user is now required to supply a changing 6-digit passcode in addition to their password to obtain access to the account. LibreNMS has a RFC4226 conformant implementation of both Time and Counter based One-Time-Passwords. It also allows the administrator to configure a throttle time to enforce after 3 failures exceeded. Unlike RFC4226 suggestions, this throttle time will not stack on the amount of failures.","title":"Two-Factor Authentication"},{"location":"Extensions/Two-Factor-Auth/#types","text":"In general, these two types do not differ in algorithmic terms. The types only differ in the variable being used to derive the passcodes from. The underlying HMAC-SHA1 remains the same for both types, security advantages or disadvantages of each are discussed further down.","title":"Types"},{"location":"Extensions/Two-Factor-Auth/#timebased-one-time-password-totp","text":"Like the name suggests, this type uses the current Time or a subset of it to generate the passcodes. These passcodes solely rely on the secrecy of their Secretkey in order to provide passcodes. An attacker only needs to guess that Secretkey and the other variable part is any given time, presumably the time upon login. RFC4226 suggests a resynchronization attempt in case the passcode mismatches, providing the attacker a range of up to +/- 3 Minutes to create passcodes.","title":"Timebased One-Time-Password (TOTP)"},{"location":"Extensions/Two-Factor-Auth/#counterbased-one-time-password-hotp","text":"This type uses an internal counter that needs to be in sync with the server's counter to successfully authenticate the passcodes. The main advantage over timebased OTP is the attacker doesn't only need to know the Secretkey but also the server's Counter in order to create valid passcodes. RFC4226 suggests a resynchronization attempt in case the passcode mismatches, providing the attacker a range of up to +4 increments from the actual counter to create passcodes.","title":"Counterbased One-Time-Password (HOTP)"},{"location":"Extensions/Two-Factor-Auth/#configuration","text":"","title":"Configuration"},{"location":"Extensions/Two-Factor-Auth/#webui","text":"Enable 'Two-Factor' Via Global Settings in the Web UI under Authentication -> General Authentication Settings. Optionally enter a throttle timer in seconds. This will unlock an account after this time once it has failed 3 attempt to authenticate. Set to 0 (default) to disable this feature, meaning accounts will remain locked after 3 attempts and will need an administrator to clear.","title":"WebUI"},{"location":"Extensions/Two-Factor-Auth/#cli","text":"Enable Two-Factor: ./lnms config:set twofactor true Set throttle-time (in seconds): ./lnms config:set twofactor_lock 300","title":"CLI"},{"location":"Extensions/Two-Factor-Auth/#user-administation","text":"If Two-Factor is enabled, the Settings -> Manage Users grid will show a '2FA' column containing a green tick for users with active 2FA. There is no functionality to mandate 2FA for users. If a user has failed 3 attempts, their account can be unlocked or 2FA disabled by editing the user from the Manage Users table. If a throttle timer is set, it will unlock accounts after this time. If set to the default of 0, accounts will need to be manually unlocked by an administrator after 3 failed attempts. Locked accounts will report to the user stating to wait for the throttle time period, or to contact the administrator if no timer set.","title":"User Administation"},{"location":"Extensions/Two-Factor-Auth/#end-user-enrolment","text":"These steps imply that Two-Factor has been enabled system wide as above under Configuration. 2FA is enabled by each user once they are logged in normally: Go to 'My Settings' (/preferences/) Choose TwoFactor type Click on 'Generate TwoFactor Secret Key' If your browser didn't reload, reload manually Scan provided QR or click on 'Manual' to see the Key","title":"End-User Enrolment"},{"location":"Extensions/Two-Factor-Auth/#google-authenticator","text":"Installation guides for Google Authenticator can be found here . Usage: Create a key as described above Scan provided QR or click on 'Manual' and enter the Secret On next login, enter the passcode that the App provides","title":"Google Authenticator"},{"location":"Extensions/Two-Factor-Auth/#lastpass-authenticator","text":"LastPass Authenticator is confirmed to work with Timebased One-Time Passwords (TOTP). Installation guide for LastPass Authenticator can be found here . Usage: Create a Timerbased key as described above Click Add (+) and scan provided QR or click on 'NO QR CODE?' and enter naming details and the Secret On next login, enter the passcode that the App provides","title":"LastPass Authenticator"},{"location":"Extensions/Varnish/","text":"Varnish Installation Guide This document explains how to install Varnish Reverse Proxy for LibreNMS. Varnish is caching software that sits logically between an HTTP client and an HTTP server. Varnish caches HTTP responses from the HTTP server. If an HTTP request can not be responded to by the Varnish cache it directs the request to the HTTP Server. This type of HTTP caching is called a reverse proxy server. Caching your HTTP server can decrease page load times significantly. Architecture Simplified block diagram of an Apache HTTP server with Varnish 4.0 Reverse Proxy CentOS 7 Varnish Installation In this example we will assume your Apache 2.4.X HTTP server is working and configured to process HTTP requests on port 80. If not, please see Installing LibreNMS Install Varnish 4.0 RPM Enable the Varnish CentOS 7 repo and install rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el7.rpm yum install varnish By default Varnish listens for HTTP requests on port 6081. Temporarily add a firewalld rule for testing Varnish. firewall-cmd --zone = public --add-port = 6081 /tcp Test Varnish Start Varnish systemctl start varnish Using a web browser navigate to :6081 or 127.0.0.1:6081. You should see a Varnish error message, this shows that Varnish is working. Example error message: Error 503 Backend fetch failed Backend fetch failed Guru Meditation: XID: 3 Varnish cache server Edit Varnish Parameters Now we need to configure Varnish to listen to HTTP requests on port 80 and relay those requests to the Apache HTTP server on port 8080 (see block diagram). Stop Varnish. systemctl stop varnish Create a back-up of varnish.params just in case you make a mistake. cp /etc/varnish/varnish.params /etc/varnish/varnish.params.bak Edit the varnish.params config. vim /etc/varnish/varnish.params Set the VCL location, IP address, port, and cache location and size. malloc sets the cache location to RAM, and 512M sets the cache size to 512MB. VARNISH_LISTEN_ADDRESS = 192 . 168 . 1 . 10 VARNISH_LISTEN_PORT = 80 VARNISH_VCL_CONF =/ etc / varnish / librenms . vcl VARNISH_STORAGE = \"malloc,512M\" Example varnish.params: # Set this to 1 to make systemd reload try to switch vcl without restart. RELOAD_VCL = 1 # Main configuration file. You probably want to change it. VARNISH_VCL_CONF =/ etc / varnish / librenms . vcl # Default address and port to bind to. Blank address means all IPv4 # and IPv6 interfaces, otherwise specify a host name, an IPv4 dotted # quad, or an IPv6 address in brackets. VARNISH_LISTEN_ADDRESS = 192 . 168 . 1 . 10 VARNISH_LISTEN_PORT = 80 # Admin interface listen address and port VARNISH_ADMIN_LISTEN_ADDRESS = 127 . 0 . 0 . 1 VARNISH_ADMIN_LISTEN_PORT = 6082 # Shared secret file for admin interface VARNISH_SECRET_FILE =/ etc / varnish / secret # Backend storage specification, see Storage Types in the varnishd(5) # man page for details. VARNISH_STORAGE = \"malloc,512M\" # Default TTL used when the backend does not specify one VARNISH_TTL = 120 # User and group for the varnishd worker processes VARNISH_USER = varnish VARNISH_GROUP = varnish # Other options, see the man page varnishd(1) DAEMON_OPTS = \"-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300\" Configure Apache for Varnish Edit librenms.conf and modify the Apache Virtual Host listening port. Modify: to vim /etc/httpd/conf.d/librenms.conf Varnish can not share a port with Apache. Change the Apache listening port to 8080. Modify: Listen 80 to Listen 8080 vim /etc/httpd/conf/httpd.conf Create the librenms.vcl cd /etc/varnish touch librenms.vcl Set ownership and permissions for Varnish files. chown varnish:varnish default.vcl varnish.params secret chmod 644 default.vcl varnish.params secret Edit the librenms.vcl. vim librenms.vcl Paste example VCL config, read config comments for more information. # # This is an example VCL file for Varnish. # # It does not do anything by default, delegating control to the # builtin VCL. The builtin VCL is called when there is no explicit # return statement. # # See the VCL chapters in the Users Guide at https://www.varnish-cache.org/docs/ # and http://varnish-cache.org/trac/wiki/VCLExamples for more examples. # Marker to tell the VCL compiler that this VCL has been adapted to the # new 4.0 format. vcl 4.0 ; # Default backend definition. Set this to point to your Apache server. backend librenms { .host = \"127.0.0.1\" ; .port = \"8080\" ; } # In this example our objective is to cache static content with Varnish and temporarily # cache dynamic content in the client web browser. sub vcl_recv { # HTTP requests from client web browser. # Here we remove any cookie HTTP requests for the 'librenms.domain.net' host # containing the matching file extensions. We don't have to match by host if you # only have LibreNMS running on Apache. # If the cookies are not removed from the HTTP request then Varnish will not cache # the files. 'else' function is set to 'pass', or don't cache anything that doesn't # match. if ( req.http.host ~ \"^librenms.domain.net\" ) { set req.backend_hint = librenms ; if ( req.url ~ \"\\.(png|gif|jpg|jpeg|ico|pdf|js|css|svg|eot|otf|woff|woff2|ttf)$\" ) { unset req.http.Cookie ; } else { return ( pass ); } } } sub vcl_backend_response { # 'sub vcl_backend_response' is the same function as 'sub vcl_fetch' in Varnish 3, however, # the syntax is slightly different # This function happens after we read the response headers from the backend (Apache). # First function 'if (bereq.url ~ \"\\' removes cookies from the Apache HTTP responses # that match the file extensions that are between the quotes, and cache the files for 24 hours. # This assumes you update LibreNMS once a day, otherwise restart Varnish to clear cache. # Second function 'if (bereq.url ~ \"^/' removes the Pragma no-cache statements and sets the age # of how long the client browser will cache the matching urls. # LibreNMS graphs are updated every 300 seconds, 'max-age=300' is set to match this behavior. # We could cache these URLs in Varnish but it would add to the complexity of the config. if ( bereq.http.host ~ \"^librenms.domain.net\" ) { if ( bereq.url ~ \"\\.(png|gif|jpg|jpeg|ico|pdf|js|css|svg|eot|otf|woff|woff2|ttf)$\" ) { unset beresp.http.Set-cookie ; set beresp.ttl = 24h ; } if ( bereq.url ~ \"^/graph.php\" || \"^/device/\" || \"^/iftype/\" || \"^/customers/\" || \"^/health/\" || \"^/apps/\" || \"^/(plugin)$\" || \"^/(alert)$\" || \"^/eventlog/\" || \"^/graphs/\" || \"^/ports/\" ) { unset beresp.http.Pragma ; set beresp.http.Cache-Control = \"max-age=300\" ; } } } sub vcl_deliver { # Happens when we have all the pieces we need, and are about to send the # response to the client. # You can do accounting or modifying the final object here. return ( deliver ); } Reload rules to remove the temporary port rule we added earlier. firewall-cmd --reload Varnish caching does not take effect immediately. You will need to browse the LibreNMS website to build up the cache. Use the command varnishstat to monitor Varnish caching. Over time you should see 'MAIN.cache_hit' and 'MAIN.client_req' increase. With the above VCL the hit to request ratio is approximately 84%. Session based VCL (coming soon) Testing and debugging VCL (coming soon)","title":"Varnish"},{"location":"Extensions/Varnish/#varnish-installation-guide","text":"This document explains how to install Varnish Reverse Proxy for LibreNMS. Varnish is caching software that sits logically between an HTTP client and an HTTP server. Varnish caches HTTP responses from the HTTP server. If an HTTP request can not be responded to by the Varnish cache it directs the request to the HTTP Server. This type of HTTP caching is called a reverse proxy server. Caching your HTTP server can decrease page load times significantly.","title":"Varnish Installation Guide"},{"location":"Extensions/Varnish/#architecture","text":"Simplified block diagram of an Apache HTTP server with Varnish 4.0 Reverse Proxy","title":"Architecture"},{"location":"Extensions/Varnish/#centos-7-varnish-installation","text":"In this example we will assume your Apache 2.4.X HTTP server is working and configured to process HTTP requests on port 80. If not, please see Installing LibreNMS","title":"CentOS 7 Varnish Installation"},{"location":"Extensions/Varnish/#install-varnish-40-rpm","text":"Enable the Varnish CentOS 7 repo and install rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el7.rpm yum install varnish By default Varnish listens for HTTP requests on port 6081. Temporarily add a firewalld rule for testing Varnish. firewall-cmd --zone = public --add-port = 6081 /tcp","title":"Install Varnish 4.0 RPM"},{"location":"Extensions/Varnish/#test-varnish","text":"Start Varnish systemctl start varnish Using a web browser navigate to :6081 or 127.0.0.1:6081. You should see a Varnish error message, this shows that Varnish is working. Example error message: Error 503 Backend fetch failed Backend fetch failed Guru Meditation: XID: 3 Varnish cache server","title":"Test Varnish"},{"location":"Extensions/Varnish/#edit-varnish-parameters","text":"Now we need to configure Varnish to listen to HTTP requests on port 80 and relay those requests to the Apache HTTP server on port 8080 (see block diagram). Stop Varnish. systemctl stop varnish Create a back-up of varnish.params just in case you make a mistake. cp /etc/varnish/varnish.params /etc/varnish/varnish.params.bak Edit the varnish.params config. vim /etc/varnish/varnish.params Set the VCL location, IP address, port, and cache location and size. malloc sets the cache location to RAM, and 512M sets the cache size to 512MB. VARNISH_LISTEN_ADDRESS = 192 . 168 . 1 . 10 VARNISH_LISTEN_PORT = 80 VARNISH_VCL_CONF =/ etc / varnish / librenms . vcl VARNISH_STORAGE = \"malloc,512M\" Example varnish.params: # Set this to 1 to make systemd reload try to switch vcl without restart. RELOAD_VCL = 1 # Main configuration file. You probably want to change it. VARNISH_VCL_CONF =/ etc / varnish / librenms . vcl # Default address and port to bind to. Blank address means all IPv4 # and IPv6 interfaces, otherwise specify a host name, an IPv4 dotted # quad, or an IPv6 address in brackets. VARNISH_LISTEN_ADDRESS = 192 . 168 . 1 . 10 VARNISH_LISTEN_PORT = 80 # Admin interface listen address and port VARNISH_ADMIN_LISTEN_ADDRESS = 127 . 0 . 0 . 1 VARNISH_ADMIN_LISTEN_PORT = 6082 # Shared secret file for admin interface VARNISH_SECRET_FILE =/ etc / varnish / secret # Backend storage specification, see Storage Types in the varnishd(5) # man page for details. VARNISH_STORAGE = \"malloc,512M\" # Default TTL used when the backend does not specify one VARNISH_TTL = 120 # User and group for the varnishd worker processes VARNISH_USER = varnish VARNISH_GROUP = varnish # Other options, see the man page varnishd(1) DAEMON_OPTS = \"-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300\"","title":"Edit Varnish Parameters"},{"location":"Extensions/Varnish/#configure-apache-for-varnish","text":"Edit librenms.conf and modify the Apache Virtual Host listening port. Modify: to vim /etc/httpd/conf.d/librenms.conf Varnish can not share a port with Apache. Change the Apache listening port to 8080. Modify: Listen 80 to Listen 8080 vim /etc/httpd/conf/httpd.conf Create the librenms.vcl cd /etc/varnish touch librenms.vcl Set ownership and permissions for Varnish files. chown varnish:varnish default.vcl varnish.params secret chmod 644 default.vcl varnish.params secret Edit the librenms.vcl. vim librenms.vcl Paste example VCL config, read config comments for more information. # # This is an example VCL file for Varnish. # # It does not do anything by default, delegating control to the # builtin VCL. The builtin VCL is called when there is no explicit # return statement. # # See the VCL chapters in the Users Guide at https://www.varnish-cache.org/docs/ # and http://varnish-cache.org/trac/wiki/VCLExamples for more examples. # Marker to tell the VCL compiler that this VCL has been adapted to the # new 4.0 format. vcl 4.0 ; # Default backend definition. Set this to point to your Apache server. backend librenms { .host = \"127.0.0.1\" ; .port = \"8080\" ; } # In this example our objective is to cache static content with Varnish and temporarily # cache dynamic content in the client web browser. sub vcl_recv { # HTTP requests from client web browser. # Here we remove any cookie HTTP requests for the 'librenms.domain.net' host # containing the matching file extensions. We don't have to match by host if you # only have LibreNMS running on Apache. # If the cookies are not removed from the HTTP request then Varnish will not cache # the files. 'else' function is set to 'pass', or don't cache anything that doesn't # match. if ( req.http.host ~ \"^librenms.domain.net\" ) { set req.backend_hint = librenms ; if ( req.url ~ \"\\.(png|gif|jpg|jpeg|ico|pdf|js|css|svg|eot|otf|woff|woff2|ttf)$\" ) { unset req.http.Cookie ; } else { return ( pass ); } } } sub vcl_backend_response { # 'sub vcl_backend_response' is the same function as 'sub vcl_fetch' in Varnish 3, however, # the syntax is slightly different # This function happens after we read the response headers from the backend (Apache). # First function 'if (bereq.url ~ \"\\' removes cookies from the Apache HTTP responses # that match the file extensions that are between the quotes, and cache the files for 24 hours. # This assumes you update LibreNMS once a day, otherwise restart Varnish to clear cache. # Second function 'if (bereq.url ~ \"^/' removes the Pragma no-cache statements and sets the age # of how long the client browser will cache the matching urls. # LibreNMS graphs are updated every 300 seconds, 'max-age=300' is set to match this behavior. # We could cache these URLs in Varnish but it would add to the complexity of the config. if ( bereq.http.host ~ \"^librenms.domain.net\" ) { if ( bereq.url ~ \"\\.(png|gif|jpg|jpeg|ico|pdf|js|css|svg|eot|otf|woff|woff2|ttf)$\" ) { unset beresp.http.Set-cookie ; set beresp.ttl = 24h ; } if ( bereq.url ~ \"^/graph.php\" || \"^/device/\" || \"^/iftype/\" || \"^/customers/\" || \"^/health/\" || \"^/apps/\" || \"^/(plugin)$\" || \"^/(alert)$\" || \"^/eventlog/\" || \"^/graphs/\" || \"^/ports/\" ) { unset beresp.http.Pragma ; set beresp.http.Cache-Control = \"max-age=300\" ; } } } sub vcl_deliver { # Happens when we have all the pieces we need, and are about to send the # response to the client. # You can do accounting or modifying the final object here. return ( deliver ); } Reload rules to remove the temporary port rule we added earlier. firewall-cmd --reload Varnish caching does not take effect immediately. You will need to browse the LibreNMS website to build up the cache. Use the command varnishstat to monitor Varnish caching. Over time you should see 'MAIN.cache_hit' and 'MAIN.client_req' increase. With the above VCL the hit to request ratio is approximately 84%. Session based VCL (coming soon) Testing and debugging VCL (coming soon)","title":"Configure Apache for Varnish"},{"location":"Extensions/VisJS-Config/","text":"Vis JS Configuration The Network Maps and Dependency Maps all use a common configuration for the vis.js library, which affects the way the maps are rendered, as well as the way that users can interact with the maps. This configuration can be adjusted by following the instructions below. This link will show you all the options and explain what they do. You may also access the dynamic configuration interface example here from within LibreNMS by adding the following to config.php $config [ 'network_map_vis_options' ] = '{ \"configure\": { \"enabled\": true}, }' ; Note You may want to disable the automatic page refresh while you're tweaking your configuration, as the refresh will reset the dynamic configuration UI to the values currently saved in config.php This can be done by clicking on the Settings Icon then Refresh Pause. Configurator Output Once you've achieved your desired map appearance, click the generate options button at the bottom to be given the necessary parameters to add to your config.php file. You will need to paste the generated config into config.php the format will need to look something like this. Note that the configurator will output the config with var options you will need to strip them out and at the end of the config you need to add an }'; see the example below. $config [ 'network_map_vis_options' ] = '{ \"nodes\": { \"color\": { \"background\": \"rgba(20,252,18,1)\" }, \"font\": { \"face\": \"tahoma\" }, \"physics\": false }, \"edges\": { \"smooth\": { \"forceDirection\": \"none\" } }, \"interaction\": { \"hover\": true, \"multiselect\": true, \"navigationButtons\": true }, \"manipulation\": { \"enabled\": true }, \"physics\": { \"barnesHut\": { \"avoidOverlap\": 0.11 }, \"minVelocity\": 0.75 } }' ;","title":"VisJS Config"},{"location":"Extensions/VisJS-Config/#vis-js-configuration","text":"The Network Maps and Dependency Maps all use a common configuration for the vis.js library, which affects the way the maps are rendered, as well as the way that users can interact with the maps. This configuration can be adjusted by following the instructions below. This link will show you all the options and explain what they do. You may also access the dynamic configuration interface example here from within LibreNMS by adding the following to config.php $config [ 'network_map_vis_options' ] = '{ \"configure\": { \"enabled\": true}, }' ;","title":"Vis JS Configuration"},{"location":"Extensions/VisJS-Config/#note","text":"You may want to disable the automatic page refresh while you're tweaking your configuration, as the refresh will reset the dynamic configuration UI to the values currently saved in config.php This can be done by clicking on the Settings Icon then Refresh Pause.","title":"Note"},{"location":"Extensions/VisJS-Config/#configurator-output","text":"Once you've achieved your desired map appearance, click the generate options button at the bottom to be given the necessary parameters to add to your config.php file. You will need to paste the generated config into config.php the format will need to look something like this. Note that the configurator will output the config with var options you will need to strip them out and at the end of the config you need to add an }'; see the example below. $config [ 'network_map_vis_options' ] = '{ \"nodes\": { \"color\": { \"background\": \"rgba(20,252,18,1)\" }, \"font\": { \"face\": \"tahoma\" }, \"physics\": false }, \"edges\": { \"smooth\": { \"forceDirection\": \"none\" } }, \"interaction\": { \"hover\": true, \"multiselect\": true, \"navigationButtons\": true }, \"manipulation\": { \"enabled\": true }, \"physics\": { \"barnesHut\": { \"avoidOverlap\": 0.11 }, \"minVelocity\": 0.75 } }' ;","title":"Configurator Output"},{"location":"Extensions/Weathermap/","text":"Network-WeatherMap with LibreNMS Integrating LibreNMS with Network-Weathermap , allows you to build network maps to help visulaize network traffic flow rates. Prerequisites Network-WeatherMap requires php pear to work. Installing Network-WeatherMap Step 1 Extract to your LibreNMS plugins directory /opt/librenms/html/plugins so you should see something like /opt/librenms/html/plugins/Weathermap/ The best way to do this is via git. Go to your install directory and then /opt/librenms/html/plugins enter: git clone https://github.com/librenms-plugins/Weathermap.git Step 2 Inside the html/plugins directory, change the ownership of the Weathermap directory by typing chown -R librenms:librenms Weathermap/ Make the configs directory writeable. chmod 775 /opt/librenms/html/plugins/Weathermap/configs Note if you are using SELinux you need to input the following command chcon -R -t httpd_cache_t Weathermap/ Step 3 Enable the cron process by editing your current LibreNMS cron file (typically /etc/cron.d/librenms) and add the following: */5 * * * * librenms /opt/librenms/html/plugins/Weathermap/map-poller.php >> /dev/null 2>&1 Step 4 Enable the plugin from LibreNMS Web UI in OverView -> Plugins -> Plugin Admin menu. Step 5 Now you should see Weathermap Overview -> Plugins -> Weathermap Create your maps, please note when you create a MAP, please click Map Style, ensure Overlib is selected for HTML Style and click submit. Also, ensure you set an output image filename and output HTML filename in Map Properties. I'd recommend you use the output folder as this is excluded from git updates (i.e. use output/mymap.png and output/mymap.html ). Optional: If your install is in another directory than standard, set $basehref within map-poller.php . WeatherMapper Automatically generate weathermaps from a LibreNMS database using WeatherMapper . Adding your Network Weathermaps to the Dashboards Once you have created your Network Weather Map you can add it to a dashboard page by doing the following. Step 1 When you create the Weathermap make sure to export as HTML and PNG you will need this for the out to the dashboard. In the Weathermap Plugin page, you will see the output maps. Right click on one of the maps and click on copy image address . Example URL: http://yourlibrenms.org/plugins/Weathermap/output/yourmap.html Step 2 Then go back to your Dashboard, create a new dashboard and give it a name. select the widget as External Images . Give the Widget a Title. The Image URL will need to be the address you copied but at the end remove the .html and replace it with .png Example Image URL http://yourlibrenms.org/plugins/Weathermap/output/yourmap.png The Target URL will be the URL you copied but with the .html at the end of the URL. Example Target URL http://yourlibrenms.org/plugins/Weathermap/output/yourmap.html Then Click on Set You should now be able to see the Weathermap you have created in your list of dashboards. You could also add this to existing dashboards.","title":"Weathermap"},{"location":"Extensions/Weathermap/#network-weathermap-with-librenms","text":"Integrating LibreNMS with Network-Weathermap , allows you to build network maps to help visulaize network traffic flow rates.","title":"Network-WeatherMap with LibreNMS"},{"location":"Extensions/Weathermap/#prerequisites","text":"Network-WeatherMap requires php pear to work.","title":"Prerequisites"},{"location":"Extensions/Weathermap/#installing-network-weathermap","text":"","title":"Installing Network-WeatherMap"},{"location":"Extensions/Weathermap/#step-1","text":"Extract to your LibreNMS plugins directory /opt/librenms/html/plugins so you should see something like /opt/librenms/html/plugins/Weathermap/ The best way to do this is via git. Go to your install directory and then /opt/librenms/html/plugins enter: git clone https://github.com/librenms-plugins/Weathermap.git","title":"Step 1"},{"location":"Extensions/Weathermap/#step-2","text":"Inside the html/plugins directory, change the ownership of the Weathermap directory by typing chown -R librenms:librenms Weathermap/ Make the configs directory writeable. chmod 775 /opt/librenms/html/plugins/Weathermap/configs Note if you are using SELinux you need to input the following command chcon -R -t httpd_cache_t Weathermap/","title":"Step 2"},{"location":"Extensions/Weathermap/#step-3","text":"Enable the cron process by editing your current LibreNMS cron file (typically /etc/cron.d/librenms) and add the following: */5 * * * * librenms /opt/librenms/html/plugins/Weathermap/map-poller.php >> /dev/null 2>&1","title":"Step 3"},{"location":"Extensions/Weathermap/#step-4","text":"Enable the plugin from LibreNMS Web UI in OverView -> Plugins -> Plugin Admin menu.","title":"Step 4"},{"location":"Extensions/Weathermap/#step-5","text":"Now you should see Weathermap Overview -> Plugins -> Weathermap Create your maps, please note when you create a MAP, please click Map Style, ensure Overlib is selected for HTML Style and click submit. Also, ensure you set an output image filename and output HTML filename in Map Properties. I'd recommend you use the output folder as this is excluded from git updates (i.e. use output/mymap.png and output/mymap.html ). Optional: If your install is in another directory than standard, set $basehref within map-poller.php .","title":"Step 5"},{"location":"Extensions/Weathermap/#weathermapper","text":"Automatically generate weathermaps from a LibreNMS database using WeatherMapper .","title":"WeatherMapper"},{"location":"Extensions/Weathermap/#adding-your-network-weathermaps-to-the-dashboards","text":"Once you have created your Network Weather Map you can add it to a dashboard page by doing the following.","title":"Adding your Network Weathermaps to the Dashboards"},{"location":"Extensions/Weathermap/#step-1_1","text":"When you create the Weathermap make sure to export as HTML and PNG you will need this for the out to the dashboard. In the Weathermap Plugin page, you will see the output maps. Right click on one of the maps and click on copy image address . Example URL: http://yourlibrenms.org/plugins/Weathermap/output/yourmap.html","title":"Step 1"},{"location":"Extensions/Weathermap/#step-2_1","text":"Then go back to your Dashboard, create a new dashboard and give it a name. select the widget as External Images . Give the Widget a Title. The Image URL will need to be the address you copied but at the end remove the .html and replace it with .png Example Image URL http://yourlibrenms.org/plugins/Weathermap/output/yourmap.png The Target URL will be the URL you copied but with the .html at the end of the URL. Example Target URL http://yourlibrenms.org/plugins/Weathermap/output/yourmap.html Then Click on Set You should now be able to see the Weathermap you have created in your list of dashboards. You could also add this to existing dashboards.","title":"Step 2"},{"location":"Extensions/World-Map/","text":"World Map Configuration LibreNMS comes with a configurable Geo Map based on World Map Widget to visualize where your equipment is located geographically. World Map Widget World Map Widget, requires you to have properly formatted addresses in sysLocation or sysLocation override. As part of the standard poller these addresses will be Geocoded by Google and stored in the database. Location resolution happens as follows If device['location'] contains [lat, lng] (note the square brackets), that is used If there is a location overide for the device in the WebUI and it contains [lat, lng] (note the square brackets), that is used. Attempt to resolve lat, lng using lnms config:set geoloc.engine Properly formatted addresses in sysLocation or sysLocation override, under device settings. Example: [40.424521, -86.912755] or 1100 Congress Ave, Austin, TX 78701 (3rd floor cabinet) Information inside parentheses is ignored during GEO lookup We have two current mapping engines available: Leaflet (default) Jquery-Mapael World Map Widget Settings Initial Latitude / Longitude : The map will be centered on those coordinates. Initial Zoom : Initial zoom of the map. More information about zoom levels . Grouping radius : Markers are grouped by area. This value define the maximum size of grouping areas. Show devices : Show devices based on status. Example Settings: Device Overview World Map Settings If a device has a location with a valid latitude and logitude, the device overview page will have a panel showing the device on a world map. The following settings affect this map: # Does the world map start opened, or does the user need to clivk to view lnms config:set device_location_map_open false # Do we show all other devices on the map as well lnms config:set device_location_map_show_devices false # Do we show a network map based on device dependencies lnms config:set device_location_map_show_device_dependencies false Offline OpenStreet Map If you can't access OpenStreet map directly you can run a local tile server . To specify a different url you can set: lnms config:set leaflet.tile_url 'localhost.com' Additional Leaflet config lnms config:set map.engine leaflet lnms config:set leaflet.default_lat \"51.981074\" lnms config:set leaflet.default_lng \"5.350342\" lnms config:set leaflet.default_zoom 8 # Device grouping radius in KM default 80KM lnms config:set leaflet.group_radius 1 # Enable network map on world map lnms config:set network_map_show_on_worldmap true # Use CDP/LLDP for network map, or device dependencies lnms config:set network_map_worldmap_link_type xdp/depends # Do not show devices that have notifications disabled lnms config:set network_map_worldmap_show_disabled_alerts false Geocode engine config external/location lnms config:set geoloc.engine google lnms config:set geoloc.api_key 'abcdefghijklmnopqrstuvwxyz' Google: Pros: fast, accurate Cons: requires a credit card even for a free account MapQuest: Pros: free, no credit card required Cons: inaccurate: most addresses are returned as locations at the center of the US Bing: Pros: free, no credit card required, accurate Cons: Microsoft (debatable) Jquery-Mapael config Further custom options are available to load different maps of the world, set default coordinates of where the map will zoom and the zoom level by default. An example of this is: lnms config:set map.engine jquery-mapael lnms config:set mapael.default_map 'mapael-maps/united_kingdom/united_kingdom.js' lnms config:set mapael.map_width 400 lnms config:set mapael.default_lat '50.898482' lnms config:set mapael.default_lng '-3.401402' lnms config:set mapael.default_zoom 20 A list of maps can be found in html/js/maps/ or html/js/mapael-maps/ .","title":"World Map"},{"location":"Extensions/World-Map/#world-map-configuration","text":"LibreNMS comes with a configurable Geo Map based on World Map Widget to visualize where your equipment is located geographically.","title":"World Map Configuration"},{"location":"Extensions/World-Map/#world-map-widget","text":"World Map Widget, requires you to have properly formatted addresses in sysLocation or sysLocation override. As part of the standard poller these addresses will be Geocoded by Google and stored in the database. Location resolution happens as follows If device['location'] contains [lat, lng] (note the square brackets), that is used If there is a location overide for the device in the WebUI and it contains [lat, lng] (note the square brackets), that is used. Attempt to resolve lat, lng using lnms config:set geoloc.engine Properly formatted addresses in sysLocation or sysLocation override, under device settings. Example: [40.424521, -86.912755] or 1100 Congress Ave, Austin, TX 78701 (3rd floor cabinet) Information inside parentheses is ignored during GEO lookup We have two current mapping engines available: Leaflet (default) Jquery-Mapael","title":"World Map Widget"},{"location":"Extensions/World-Map/#world-map-widget-settings","text":"Initial Latitude / Longitude : The map will be centered on those coordinates. Initial Zoom : Initial zoom of the map. More information about zoom levels . Grouping radius : Markers are grouped by area. This value define the maximum size of grouping areas. Show devices : Show devices based on status. Example Settings:","title":"World Map Widget Settings"},{"location":"Extensions/World-Map/#device-overview-world-map-settings","text":"If a device has a location with a valid latitude and logitude, the device overview page will have a panel showing the device on a world map. The following settings affect this map: # Does the world map start opened, or does the user need to clivk to view lnms config:set device_location_map_open false # Do we show all other devices on the map as well lnms config:set device_location_map_show_devices false # Do we show a network map based on device dependencies lnms config:set device_location_map_show_device_dependencies false","title":"Device Overview World Map Settings"},{"location":"Extensions/World-Map/#offline-openstreet-map","text":"If you can't access OpenStreet map directly you can run a local tile server . To specify a different url you can set: lnms config:set leaflet.tile_url 'localhost.com'","title":"Offline OpenStreet Map"},{"location":"Extensions/World-Map/#additional-leaflet-config","text":"lnms config:set map.engine leaflet lnms config:set leaflet.default_lat \"51.981074\" lnms config:set leaflet.default_lng \"5.350342\" lnms config:set leaflet.default_zoom 8 # Device grouping radius in KM default 80KM lnms config:set leaflet.group_radius 1 # Enable network map on world map lnms config:set network_map_show_on_worldmap true # Use CDP/LLDP for network map, or device dependencies lnms config:set network_map_worldmap_link_type xdp/depends # Do not show devices that have notifications disabled lnms config:set network_map_worldmap_show_disabled_alerts false","title":"Additional Leaflet config"},{"location":"Extensions/World-Map/#geocode-engine-config","text":"external/location lnms config:set geoloc.engine google lnms config:set geoloc.api_key 'abcdefghijklmnopqrstuvwxyz' Google: Pros: fast, accurate Cons: requires a credit card even for a free account MapQuest: Pros: free, no credit card required Cons: inaccurate: most addresses are returned as locations at the center of the US Bing: Pros: free, no credit card required, accurate Cons: Microsoft (debatable)","title":"Geocode engine config"},{"location":"Extensions/World-Map/#jquery-mapael-config","text":"Further custom options are available to load different maps of the world, set default coordinates of where the map will zoom and the zoom level by default. An example of this is: lnms config:set map.engine jquery-mapael lnms config:set mapael.default_map 'mapael-maps/united_kingdom/united_kingdom.js' lnms config:set mapael.map_width 400 lnms config:set mapael.default_lat '50.898482' lnms config:set mapael.default_lng '-3.401402' lnms config:set mapael.default_zoom 20 A list of maps can be found in html/js/maps/ or html/js/mapael-maps/ .","title":"Jquery-Mapael config"},{"location":"Extensions/metrics/Graphite/","text":"Enabling support for Graphite This module sends all metrics to a remote graphite service. You need something like Grafana for graphing. What you don't get Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana. RRD will continue to function as normal so LibreNMS itself should continue to function as normal. Configuration poller/graphite lnms config:set graphite.enable true lnms config:set graphite.host 'your.graphite.server' lnms config:set graphite.port 2003 lnms config:set graphite.prefix 'your.metric.prefix' Your metric path can be prefixed if required, otherwise the metric path for Graphite will be in the form of hostname.measurement.fieldname , interfaces will be stored as hostname.ports.ifName.fieldname . The same data then stored within rrd will be sent to Graphite and recorded. You can then create graphs within Grafana to display the information you need. Graphite Configuration As LibreNMS updates its metrics every 5 minutes, the following addition to your storage-schemas.conf is suggested. [network] pattern = your\\.metric\\.prefix\\..* retentions = 5m:30d,15m:90d,1h:1y","title":"Graphite"},{"location":"Extensions/metrics/Graphite/#enabling-support-for-graphite","text":"This module sends all metrics to a remote graphite service. You need something like Grafana for graphing.","title":"Enabling support for Graphite"},{"location":"Extensions/metrics/Graphite/#what-you-dont-get","text":"Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana. RRD will continue to function as normal so LibreNMS itself should continue to function as normal.","title":"What you don't get"},{"location":"Extensions/metrics/Graphite/#configuration","text":"poller/graphite lnms config:set graphite.enable true lnms config:set graphite.host 'your.graphite.server' lnms config:set graphite.port 2003 lnms config:set graphite.prefix 'your.metric.prefix' Your metric path can be prefixed if required, otherwise the metric path for Graphite will be in the form of hostname.measurement.fieldname , interfaces will be stored as hostname.ports.ifName.fieldname . The same data then stored within rrd will be sent to Graphite and recorded. You can then create graphs within Grafana to display the information you need.","title":"Configuration"},{"location":"Extensions/metrics/Graphite/#graphite-configuration","text":"As LibreNMS updates its metrics every 5 minutes, the following addition to your storage-schemas.conf is suggested. [network] pattern = your\\.metric\\.prefix\\..* retentions = 5m:30d,15m:90d,1h:1y","title":"Graphite Configuration"},{"location":"Extensions/metrics/InfluxDB/","text":"Enabling support for InfluxDB Before we get started it is important that you know and understand that InfluxDB support is currently alpha at best. All it provides is the sending of data to a InfluxDB install. Due to the current changes that are constantly being made to InfluxDB itself then we cannot guarantee that your data will be ok so enabling this support is at your own risk! Requirements InfluxDB >= 0.94 < 2.0 Grafana The setup of the above is completely out of scope here and we aren't really able to provide any help with this side of things. What you don't get Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana. Support for InfluxDB or Grafana, we would highly recommend that you have some level of experience with these. RRD will continue to function as normal so LibreNMS itself should continue to function as normal. Configuration poller/influxdb lnms config:set influxdb.enable true lnms config:set influxdb.transport http lnms config:set influxdb.host '127.0.0.1' lnms config:set influxdb.port 8086 lnms config:set influxdb.db 'librenms' lnms config:set influxdb.username 'admin' lnms config:set influxdb.password 'admin' lnms config:set influxdb.timeout 0 lnms config:set influxdb.verifySSL false No credentials are needed if you don't use InfluxDB authentication. The same data then stored within rrd will be sent to InfluxDB and recorded. You can then create graphs within Grafana to display the information you need.","title":"InfluxDB"},{"location":"Extensions/metrics/InfluxDB/#enabling-support-for-influxdb","text":"Before we get started it is important that you know and understand that InfluxDB support is currently alpha at best. All it provides is the sending of data to a InfluxDB install. Due to the current changes that are constantly being made to InfluxDB itself then we cannot guarantee that your data will be ok so enabling this support is at your own risk!","title":"Enabling support for InfluxDB"},{"location":"Extensions/metrics/InfluxDB/#requirements","text":"InfluxDB >= 0.94 < 2.0 Grafana The setup of the above is completely out of scope here and we aren't really able to provide any help with this side of things.","title":"Requirements"},{"location":"Extensions/metrics/InfluxDB/#what-you-dont-get","text":"Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana. Support for InfluxDB or Grafana, we would highly recommend that you have some level of experience with these. RRD will continue to function as normal so LibreNMS itself should continue to function as normal.","title":"What you don't get"},{"location":"Extensions/metrics/InfluxDB/#configuration","text":"poller/influxdb lnms config:set influxdb.enable true lnms config:set influxdb.transport http lnms config:set influxdb.host '127.0.0.1' lnms config:set influxdb.port 8086 lnms config:set influxdb.db 'librenms' lnms config:set influxdb.username 'admin' lnms config:set influxdb.password 'admin' lnms config:set influxdb.timeout 0 lnms config:set influxdb.verifySSL false No credentials are needed if you don't use InfluxDB authentication. The same data then stored within rrd will be sent to InfluxDB and recorded. You can then create graphs within Grafana to display the information you need.","title":"Configuration"},{"location":"Extensions/metrics/OpenTSDB/","text":"Enabling support for OpenTSDB This module sends all metrics to OpenTSDB server. You need something like Grafana for graphing. Requirements OpenTSDB Grafana What you don't get Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana. RRD will continue to function normally so LibreNMS itself should continue to function normally. You can add the following to your config: Configuration poller/opentsdb lnms config:set opentsdb.enable true lnms config:set opentsdb.host '127.0.0.1' lnms config:set opentsdb.port 4242 The same data than the one stored within rrd will be sent to OpenTSDB and recorded. You can then create graphs within Grafana to display the information you need.","title":"OpenTSDB"},{"location":"Extensions/metrics/OpenTSDB/#enabling-support-for-opentsdb","text":"This module sends all metrics to OpenTSDB server. You need something like Grafana for graphing.","title":"Enabling support for OpenTSDB"},{"location":"Extensions/metrics/OpenTSDB/#requirements","text":"OpenTSDB Grafana","title":"Requirements"},{"location":"Extensions/metrics/OpenTSDB/#what-you-dont-get","text":"Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana. RRD will continue to function normally so LibreNMS itself should continue to function normally. You can add the following to your config:","title":"What you don't get"},{"location":"Extensions/metrics/OpenTSDB/#configuration","text":"poller/opentsdb lnms config:set opentsdb.enable true lnms config:set opentsdb.host '127.0.0.1' lnms config:set opentsdb.port 4242 The same data than the one stored within rrd will be sent to OpenTSDB and recorded. You can then create graphs within Grafana to display the information you need.","title":"Configuration"},{"location":"Extensions/metrics/Prometheus/","text":"Enabling support for Prometheus Please be aware Prometheus support is alpha at best, It hasn't been extensively tested and is still in development All it provides is the sending of data to a a Prometheus PushGateway. Please be careful when enabling this support you use it at your own risk! Requirements (Older versions may work but haven't been tested Prometheus >= 2.0 PushGateway >= 0.4.0 Grafana PHP-CURL The setup of the above is completely out of scope here and we aren't really able to provide any help with this side of things. What you don't get Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana. Support for Prometheus or Grafana, we would highly recommend that you have some level of experience with these. RRD will continue to function as normal so LibreNMS itself should continue to function as normal. Configuration poller/prometheus lnms config:set prometheus.enable true lnms config:set prometheus.url 'http://127.0.0.1:9091' lnms config:set prometheus.job 'librenms' lnms config:set prometheus.prefix 'librenms' Prefix Setting the 'prefix' option will cause all metric names to begin with the configured value. For instance without setting this option metric names will be something like this: OUTUCASTPKTS ifOutUcastPkts_rate INOCTETS ifInErrors_rate Configuring a prefix name, for example 'librenms', instead caused those metrics to be exposed with the following names: librenms_OUTUCASTPKTS librenms_ifOutUcastPkts_rate librenms_INOCTETS librenms_ifInErrors_rate Sample Prometheus Scrape Config (for scraping the Push Gateway) - job_name: pushgateway scrape_interval: 300s honor_labels: true static_configs: - targets: ['127.0.0.1:9091'] The same data then stored within rrd will be sent to Prometheus and recorded. You can then create graphs within Grafana to display the information you need.","title":"Prometheus"},{"location":"Extensions/metrics/Prometheus/#enabling-support-for-prometheus","text":"Please be aware Prometheus support is alpha at best, It hasn't been extensively tested and is still in development All it provides is the sending of data to a a Prometheus PushGateway. Please be careful when enabling this support you use it at your own risk!","title":"Enabling support for Prometheus"},{"location":"Extensions/metrics/Prometheus/#requirements-older-versions-may-work-but-havent-been-tested","text":"Prometheus >= 2.0 PushGateway >= 0.4.0 Grafana PHP-CURL The setup of the above is completely out of scope here and we aren't really able to provide any help with this side of things.","title":"Requirements (Older versions may work but haven't been tested"},{"location":"Extensions/metrics/Prometheus/#what-you-dont-get","text":"Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana. Support for Prometheus or Grafana, we would highly recommend that you have some level of experience with these. RRD will continue to function as normal so LibreNMS itself should continue to function as normal.","title":"What you don't get"},{"location":"Extensions/metrics/Prometheus/#configuration","text":"poller/prometheus lnms config:set prometheus.enable true lnms config:set prometheus.url 'http://127.0.0.1:9091' lnms config:set prometheus.job 'librenms' lnms config:set prometheus.prefix 'librenms'","title":"Configuration"},{"location":"Extensions/metrics/Prometheus/#prefix","text":"Setting the 'prefix' option will cause all metric names to begin with the configured value. For instance without setting this option metric names will be something like this: OUTUCASTPKTS ifOutUcastPkts_rate INOCTETS ifInErrors_rate Configuring a prefix name, for example 'librenms', instead caused those metrics to be exposed with the following names: librenms_OUTUCASTPKTS librenms_ifOutUcastPkts_rate librenms_INOCTETS librenms_ifInErrors_rate","title":"Prefix"},{"location":"Extensions/metrics/Prometheus/#sample-prometheus-scrape-config-for-scraping-the-push-gateway","text":"- job_name: pushgateway scrape_interval: 300s honor_labels: true static_configs: - targets: ['127.0.0.1:9091'] The same data then stored within rrd will be sent to Prometheus and recorded. You can then create graphs within Grafana to display the information you need.","title":"Sample Prometheus Scrape Config (for scraping the Push Gateway)"},{"location":"General/Acknowledgement/","text":"Acknowledgements LibreNMS wouldn't be what it is today without the use of some other amazing projects. We list below what we make use of including the license compliance. 3rd Party GPLv3 Compliant Bootstrap : MIT Font Awesome : MIT License Jquery Bootgrid : MIT License Pace : Open License Twitter typeahead : Open License Vis : MIT / Apache 2.0 TCPDF : LGPLv3 Bootstrap 3 Datepicker :MIT Bootstrap Dropdown Hover Plugin : MIT Bootstrap Switch : Apache 2.0 Handlebars : Open License Cycle2 : MIT/GPL Jquery : MIT Jquery UI : MIT Jquery QRCode : MIT Mktree : Open License Moment : MIT Tag Manager : MIT TW Sack : GPLv3 Gridster : MIT Pure PHP radius class : GPLv3 GeSHi - Generic Syntax Highlighter : GPLv2+ MalaysiaMap.svg - By Exiang CC BY 3.0 , via Wikimedia Commons Code for UBNT Devices Mark Gibbons mgibbons@oemcomp.com Initial code base submitted via PR721 Jquery LazyLoad : MIT License influxdb-php : MIT License HTML Purifier : LGPL v2.1 Symfony Yaml : MIT PHPMailer : LGPL v2.1 pbin : GPLv2 (or later - see script header) CorsSlim : MIT Confluence HTTP Authenticator Graylog SSO Authentication Plugin Select2 : MIT License JustGage : MIT jQuery.extendext : MIT doT : MIT jQuery-queryBuilder : MIT sql-parser : MIT (Currently a custom build is used) 3rd Party GPLv3 Non-compliant JpGraph (html/includes/jpgraph): QPL 1.0 license MIBS (mibs): unknown/various html/graph-realtime.php: BSD (original?) html/includes/collectd/: GPLv2 only overLIB (html/js/overlib_mini.js): modified Artistic 1.0?","title":"3rd Party Libraries"},{"location":"General/Acknowledgement/#acknowledgements","text":"LibreNMS wouldn't be what it is today without the use of some other amazing projects. We list below what we make use of including the license compliance.","title":"Acknowledgements"},{"location":"General/Acknowledgement/#3rd-party-gplv3-compliant","text":"Bootstrap : MIT Font Awesome : MIT License Jquery Bootgrid : MIT License Pace : Open License Twitter typeahead : Open License Vis : MIT / Apache 2.0 TCPDF : LGPLv3 Bootstrap 3 Datepicker :MIT Bootstrap Dropdown Hover Plugin : MIT Bootstrap Switch : Apache 2.0 Handlebars : Open License Cycle2 : MIT/GPL Jquery : MIT Jquery UI : MIT Jquery QRCode : MIT Mktree : Open License Moment : MIT Tag Manager : MIT TW Sack : GPLv3 Gridster : MIT Pure PHP radius class : GPLv3 GeSHi - Generic Syntax Highlighter : GPLv2+ MalaysiaMap.svg - By Exiang CC BY 3.0 , via Wikimedia Commons Code for UBNT Devices Mark Gibbons mgibbons@oemcomp.com Initial code base submitted via PR721 Jquery LazyLoad : MIT License influxdb-php : MIT License HTML Purifier : LGPL v2.1 Symfony Yaml : MIT PHPMailer : LGPL v2.1 pbin : GPLv2 (or later - see script header) CorsSlim : MIT Confluence HTTP Authenticator Graylog SSO Authentication Plugin Select2 : MIT License JustGage : MIT jQuery.extendext : MIT doT : MIT jQuery-queryBuilder : MIT sql-parser : MIT (Currently a custom build is used)","title":"3rd Party GPLv3 Compliant"},{"location":"General/Acknowledgement/#3rd-party-gplv3-non-compliant","text":"JpGraph (html/includes/jpgraph): QPL 1.0 license MIBS (mibs): unknown/various html/graph-realtime.php: BSD (original?) html/includes/collectd/: GPLv2 only overLIB (html/js/overlib_mini.js): modified Artistic 1.0?","title":"3rd Party GPLv3 Non-compliant"},{"location":"General/Callback-Stats-and-Privacy/","text":"Submitting Stats Stats data and your privacy This document has been put together to explain what LibreNMS does when it calls back home to report some anonymous statistics. Let's start off by saying, all of the code that processes the data and submits it is included in the standard LibreNMS branch you've installed, the code that accepts this data and in turn generates some pretty graphs is all open source and available on GitHub. Please feel free to review the code, comment on it and suggest changes / improvements. Also, don't forget - by default installations DO NOT call back home, you need to opt into this. Above all we respect users privacy which is why this system has been designed like it has. Now onto the bit you're interested in, what is submitted and what we do with that data. What is submitted All data is anonymous. Generic statistics are taken from the database, these include things like device count, device type, device OS, port types, port speeds, port count and BGP peer count. Take a look at the code for full details. Pairs of sysDescr and sysObjectID from devices with a small amount of sanitation to prevent things like hostnames from being submitted. We record version numbers of php, mysql, net-snmp and rrdtool A random UUID is generated on your own install. That's it! Your IP isn't logged, even via our web service accepting the data. We don't need to know who you are so we don't ask. What we do with the data We store it, not for long - 3 months at the moment although this could change. We use it to generate pretty graphs for people to see. We use it to help prioritise issues and features that need to be worked on. We use sysDescr and sysObjectID to create unit tests and improve OS discovery How do I enable stats submission? If you're happy with all of this - please consider switching the call back system on, you can do this within the About LibreNMS page within your control panel. In the Statistics section you will find a toggle switch to enable / disable the feature. If you've previously had it switched on and want to opt out and remove your data, click the 'Clear remote stats' button and on the next submission all the data you've sent us will be removed! Questions? How often is data submitted? We submit the data once a day according to running daily.sh via cron. If you disable this then opting in will not have any affect. Where can I see the data I submitted? You can't see the data raw, but we collate all of the data together and provide a dynamic site so you can see the results of all contributed stats here I want my data removed. That's easy, simply press 'Clear remote stats' in the About LibreNMS page of your control panel, the next time the call back script is run it will remove all the data we have. I clicked the 'Clear remote stats' button by accident. No problem, before daily.sh runs again - just opt back in, all of your existing data will stay. Hopefully this answers the questions you might have on why and what we are doing here, if not, please pop into our discord server or community forum and ask any questions you like.","title":"Submitting stats"},{"location":"General/Callback-Stats-and-Privacy/#submitting-stats","text":"","title":"Submitting Stats"},{"location":"General/Callback-Stats-and-Privacy/#stats-data-and-your-privacy","text":"This document has been put together to explain what LibreNMS does when it calls back home to report some anonymous statistics. Let's start off by saying, all of the code that processes the data and submits it is included in the standard LibreNMS branch you've installed, the code that accepts this data and in turn generates some pretty graphs is all open source and available on GitHub. Please feel free to review the code, comment on it and suggest changes / improvements. Also, don't forget - by default installations DO NOT call back home, you need to opt into this. Above all we respect users privacy which is why this system has been designed like it has. Now onto the bit you're interested in, what is submitted and what we do with that data.","title":"Stats data and your privacy"},{"location":"General/Callback-Stats-and-Privacy/#what-is-submitted","text":"All data is anonymous. Generic statistics are taken from the database, these include things like device count, device type, device OS, port types, port speeds, port count and BGP peer count. Take a look at the code for full details. Pairs of sysDescr and sysObjectID from devices with a small amount of sanitation to prevent things like hostnames from being submitted. We record version numbers of php, mysql, net-snmp and rrdtool A random UUID is generated on your own install. That's it! Your IP isn't logged, even via our web service accepting the data. We don't need to know who you are so we don't ask.","title":"What is submitted"},{"location":"General/Callback-Stats-and-Privacy/#what-we-do-with-the-data","text":"We store it, not for long - 3 months at the moment although this could change. We use it to generate pretty graphs for people to see. We use it to help prioritise issues and features that need to be worked on. We use sysDescr and sysObjectID to create unit tests and improve OS discovery","title":"What we do with the data"},{"location":"General/Callback-Stats-and-Privacy/#how-do-i-enable-stats-submission","text":"If you're happy with all of this - please consider switching the call back system on, you can do this within the About LibreNMS page within your control panel. In the Statistics section you will find a toggle switch to enable / disable the feature. If you've previously had it switched on and want to opt out and remove your data, click the 'Clear remote stats' button and on the next submission all the data you've sent us will be removed!","title":"How do I enable stats submission?"},{"location":"General/Callback-Stats-and-Privacy/#questions","text":"","title":"Questions?"},{"location":"General/Callback-Stats-and-Privacy/#how-often-is-data-submitted","text":"We submit the data once a day according to running daily.sh via cron. If you disable this then opting in will not have any affect.","title":"How often is data submitted?"},{"location":"General/Callback-Stats-and-Privacy/#where-can-i-see-the-data-i-submitted","text":"You can't see the data raw, but we collate all of the data together and provide a dynamic site so you can see the results of all contributed stats here","title":"Where can I see the data I submitted?"},{"location":"General/Callback-Stats-and-Privacy/#i-want-my-data-removed","text":"That's easy, simply press 'Clear remote stats' in the About LibreNMS page of your control panel, the next time the call back script is run it will remove all the data we have.","title":"I want my data removed."},{"location":"General/Callback-Stats-and-Privacy/#i-clicked-the-clear-remote-stats-button-by-accident","text":"No problem, before daily.sh runs again - just opt back in, all of your existing data will stay. Hopefully this answers the questions you might have on why and what we are doing here, if not, please pop into our discord server or community forum and ask any questions you like.","title":"I clicked the 'Clear remote stats' button by accident."},{"location":"General/Changelog/","text":"24.2.0 (2024-02-27) A big thank you to the following 46 contributors this last month: rudybroersma (14) Npeca75 (10) eskyuu (6) electrocret (5) PipoCanaja (5) Jellyfrog (5) vhuk (5) murrant (5) bnerickson (3) fbouynot (3) FlyveHest (2) nickhilliard (2) dependabot (2) richard-ririe (2) laf (2) SourceDoctor (2) VVelox (2) VoipTelCH (1) fabriciotm (1) dirkx (1) swerveshot (1) jmesserli (1) lrizzi (1) Personwho (1) OSIRIS-REx (1) xorrkaz (1) jcostom (1) tevkar (1) descilla (1) arjitc (1) My-Random-Thoughts (1) dlangille (1) blknight88 (1) z0d1ac-RU (1) lferrerfmv (1) gil-obradors (1) gunkaaa (1) TvL2386 (1) santiag0z (1) EinGlasVollKakao (1) kakohegyi (1) i4networks (1) Bierchermuesli (1) mhamzak008 (1) nicklockhart-fullfibre (1) LoveSkylark (1) Thanks to maintainers and others that helped with pull requests this month: PipoCanaja (35) Jellyfrog (30) electrocret (26) laf (21) murrant (11) mpikzink (1) rudybroersma (1) ottorei (1) vhuk (1) Feature Additional custom map features ( #15806 ) - eskyuu Add/Remove devices from static devicegroups ( #15775 ) - richard-ririe Option to ignore device status ( #15697 ) - SourceDoctor Add functionality for custom maps (weathermaps) ( #15633 ) - eskyuu Alert Rule Editor: new notes field & SQL field improove ( #15631 ) - Bierchermuesli NAC - Improve search in WebUI - Keep Historical data ( #15629 ) - PipoCanaja Security Fix XSS in default example plugin ( #15711 ) - murrant Device Updated SLA poller for Cisco Nexus 9000 ( #15855 ) - FlyveHest Update geist-watchdog.yaml ( #15851 ) - fabriciotm Correctly identify FS Datacenter Switch N8560-48BC ( #15837 ) - rudybroersma Konica printers additional counters ( #15826 ) - Npeca75 Add HSRP state sensors for Cisco IOSXE on L3 switches ( #15823 ) - rudybroersma Add HSRP Sensor support for IOSXR ( #15821 ) - electrocret Add support for Cisco IE1000 ( #15820 ) - rudybroersma Initial support for Eltex mes24xx ( #15816 ) - Npeca75 Add support for Cadant E6000 ( #15813 ) - nickhilliard Add LRT-C / LCM-B / LRS-D / LCM-B modules to Luminato model ( #15812 ) - nickhilliard Add HSRP state sensors for Cisco IOS on L3 switches ( #15809 ) - rudybroersma [rfc1628] Add UPS Test (battery test) status sensor ( #15802 ) - Npeca75 Add build 22631 as Windows 11 23H2 ( #15800 ) - vhuk Zyxel ZynOS PoE Budget sensor support ( #15798 ) - rudybroersma Add Procurve NAC support ( #15794 ) - vhuk Add ArubaOS-CX VSF state sensor support ( #15793 ) - rudybroersma Support for new os/devices, CTS ( #15790 ) - OSIRIS-REx Support for new Lancom devices ( #15779 ) - rudybroersma Add NAC support for Powerconnect ( #15778 ) - vhuk Detect UniFi U7 APs as UniFi AP type ( #15776 ) - jcostom FS.com S5810 Discovery fix ( #15765 ) - rudybroersma Device - webpower smart II snmp UPS card ( #15764 ) - Npeca75 Support for temp sensors - WUT Thermometers - W57605 and W57614 ( #15757 ) - rudybroersma Initial support for Supermicro BMC ( #15750 ) - Npeca75 ArubaOS-CX PSU state sensor support & OS and serial detection ( #15738 ) - rudybroersma Add FortiSwitch PSU state sensor support ( #15735 ) - rudybroersma Added support for Dlink dgs-1250-28x ( #15734 ) - Npeca75 Add FortiGate DHCP Scope usage percentage sensors ( #15727 ) - rudybroersma Added MES 2348B ( #15725 ) - z0d1ac-RU Add FortiGate license status sensors ( #15722 ) - rudybroersma Handle icmpjitter SLA parsing for iosxe ( #15707 ) - FlyveHest Zyxel Wireless Controller OS ( Zyxel NXC series ) ( #15694 ) - kakohegyi Device - fix Counter64 octets value in 32bit column bgpPeerInTotalMessages ( #15621 ) - PipoCanaja Fix tp-link jetstream FDB discovery ( #14321 ) - Npeca75 Webui Disable Page Refresh on Oxidized Tools Page ( #15831 ) - electrocret Modify the date selector to use the session timezone ( #15783 ) - eskyuu Switch bill_notes input to textarea ( #15749 ) - arjitc Sort smart app disks by label ( #15686 ) - SourceDoctor Alerting Add support for Webex max message length. ( #15789 ) - xorrkaz Rename JiraServiceManagement.php to Jiraservicemanagement.php ( #15717 ) - gil-obradors Add JiraServiceManagement Transport ( #15593 ) - mhamzak008 Transport - Jira transport rewrite ( #15561 ) - LoveSkylark Graphs Fixed graphs for icmp service showing PL 4 times ( #15856 ) - VoipTelCH Socket Statistic Application cleanup and application page graph fixes. ( #15845 ) - bnerickson Applications Deliver output for a specific memcached instance ( #15759 ) - tevkar Update nvidia.inc.php ( #15756 ) - descilla Add BorgBackup monitoring support ( #15591 ) - VVelox Add dhcp-stats tests and update for v3 of the extend ( #15378 ) - VVelox Billing Updated bill_data table, alter indexes and add new column ( #15751 ) - laf Api Add API endpoints to update and delete Device Groups ( #15774 ) - richard-ririe Add port description API endpoints and documentation ( #15578 ) - nicklockhart-fullfibre Settings Fix twofactor default value ( #15772 ) - murrant Add isis module to os schema ( #15710 ) - murrant Discovery Fall back to IPV6-MIB IPv6 address discovery if IP-MIB IPv6 address discovery doesn't return any valid addresses ( #15714 ) - gunkaaa Oxidized Add PollerGroup as an option for OxidizedMap ( #15696 ) - electrocret Bug Update Port Real Time Graph error ( #15846 ) - electrocret [bugfix] Fix json-app-tool.php to work with Oid class. ( #15844 ) - bnerickson Fix for linkDown/linkUp ifOperStatus ( #15835 ) - PipoCanaja Fix \"Tempurature\" Typo ( #15811 ) - lrizzi Bug fixes for the custom maps ( #15810 ) - eskyuu Remove dumpRawSql() function in AlertUtil.php ( #15803 ) - Personwho Make all image URLs absolute and fix path for viewer ( #15788 ) - eskyuu Prevent ansi colors in key:generate output ( #15773 ) - Jellyfrog VRP - avoid emptying bgpPeers description at discovery when manually set ( #15713 ) - PipoCanaja OSPF instances and missing mandatory fields fix attempt ( #15712 ) - PipoCanaja Fixed typo in misc/alert_rules.json with regards to \"Space on ...\" alerts ( #15708 ) - TvL2386 Don't escape leaflet tile url in location edit map ( #15695 ) - EinGlasVollKakao Show error if \"Check Type\" field is empty when creating new service template ( #15685 ) - vhuk Refactor Rewrite ups-nut discovery to SnmpQuery:: ( #15850 ) - Npeca75 Rewrite lmsensors discovery to SnmpQuery:: ( #15833 ) - Npeca75 Rewrite ipv4 address discovery to Eloquent ( #15830 ) - Npeca75 Documentation Applications.md formatting update for better readability. ( #15849 ) - bnerickson Update Images.md ( #15824 ) - swerveshot More precise OAuth group/role claim information ( #15817 ) - jmesserli Add selinux open directory permission for rrdcached in RRDCached.md ( #15755 ) - fbouynot Missing dir read permission in sepolicy in RRDCached.md ( #15754 ) - fbouynot Update SQL override section after switch to SQL strict mode ( #15736 ) - blknight88 Add CentOS option to SMART dependency install ( #15704 ) - fbouynot Misc Add kelvin to celcius conversion ( #15836 ) - dirkx Mibs Update watchguard MIBs ( #15719 ) - lferrerfmv Dependencies Bump composer/composer from 2.6.6 to 2.7.0 ( #15808 ) - dependabot Update PHP dependencies ( #15737 ) - murrant Bump follow-redirects from 1.15.3 to 1.15.4 ( #15724 ) - dependabot 24.1.0 (2024-01-07) A big thank you to the following 37 contributors this last month: PipoCanaja (12) murrant (7) laf (5) electrocret (3) peejaychilds (3) Jellyfrog (2) vhuk (2) MittWillson (2) Bierchermuesli (2) netravnen (1) iliessens (1) sarcastic6 (1) SourceDoctor (1) altf4arnold (1) robje (1) rudybroersma (1) mtentilucci (1) tuxgasy (1) craig-nokia (1) brianegge (1) amyjohn000 (1) VirTechSystems (1) atj (1) lhwolfarth (1) bonzo81 (1) Sweeny42 (1) jduke-halls (1) pjordanovic (1) dependabot (1) TheMysteriousX (1) swiftnode-linden (1) cguillaumie (1) luc-ass (1) VVelox (1) Leo-FJ (1) MaxPecc (1) jerji (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (20) murrant (16) PipoCanaja (15) electrocret (12) craig-nokia (1) ottorei (1) Device Ignore nameless health sensors for Fortigate ( #15678 ) - iliessens Add support for RoomAlert 32S device ( #15676 ) - sarcastic6 Device - Add Cisco REP Segment state sensor ( #15666 ) - rudybroersma Added better support for some HiveOS Wireless devices ( #15661 ) - laf Fix HPE iLO CPU Status Sensor Description ( #15660 ) - mtentilucci Fix OcNOS detection for recent firmware versions ( #15642 ) - murrant Add support for Fortinet FortiAPs ( #15641 ) - atj Fixing memory scale for datacom-dmos devices ( #15640 ) - lhwolfarth Add support for Forcepoint NGFW 6.10 and older ( #15632 ) - vhuk Add memory readings for Draytek OS ( #15618 ) - Sweeny42 Updated support for HiveOS Wireless newer models ( #15610 ) - laf Add HPE iLO 6 to discovery ( #15607 ) - jduke-halls Incorrect discovery APC Smart-UPS RT 3000 XL 4.1 ( APC Web/SNMP Management Card (AP9619 MB:v4.1.1 PF:v3.9.4) as multi-phase ups ( #15602 ) - pjordanovic Device - McAfee Web Gateway -> SkyHigh Web Gateway ( #15596 ) - PipoCanaja Add and extend support for Hirshmann devices ( #15588 ) - cguillaumie Updated regex for HWG STE2 r2 to better detect hardware and software version ( #15573 ) - luc-ass Update entity-sensor.inc.php for xos' os ( #15552 ) - Leo-FJ Added support of new OS for NTP/PTP systems: Meinberg OS, Safran (Orolia), Oscilloquartz (Adva) ( #15453 ) - MaxPecc Zhone health ( #15276 ) - jerji Fix wrong ASN discovery on non-BGP Devices ( #14948 ) - Bierchermuesli Webui Clarify In/Out on Ports table. ( #15680 ) - electrocret WebUI - Filter FDB and ARP tabs in port page if empty ( #15653 ) - PipoCanaja Update Pushover.php ( #15652 ) - brianegge Mark old alert email settings as deprecated ( #15650 ) - murrant Add bad port settings to webui ( #15649 ) - murrant Bug - FDB Table - allow empty searchby as well ( #15626 ) - PipoCanaja Update alertlog query to be more efficient ( #15622 ) - laf Add vendor to searchby rules function ( #15619 ) - bonzo81 Fix grabled characters when oid already UTF-8 ( #15615 ) - MittWillson Graphs Change default graph image to SVG ( #15586 ) - electrocret Api API add_device: Add ping_ping fallback option ( #15637 ) - murrant More filter options for the BGP peer API endpoint ( #15599 ) - Bierchermuesli Discovery Set array before use to stop discovery erroring ( #15604 ) - laf Authentication Add support for Okta Group claims to set Roles ( #15592 ) - peejaychilds Output Roles in auth_test script ( #15587 ) - peejaychilds Bug Fix Rancid error messages ( #15683 ) - vhuk Fix smart application parsing ( #15672 ) - SourceDoctor Fix pagination in alert rules page ( #15659 ) - tuxgasy Bug - \"null\" checks for SAR 7705 release 8.X ( #15657 ) - craig-nokia Bug - missing \"use\" statement in NTP Cisco ( #15656 ) - PipoCanaja Bug - Fix Cisco NTP values ( #15639 ) - PipoCanaja Bug - TPLink - fix null exception for LLDP discovery WIP ( #15628 ) - PipoCanaja Bug - timos MPLS - more poller fixes ( #15624 ) - PipoCanaja Bug - bgp-peers error in Timos -> dbFacile cleanup ( #15620 ) - PipoCanaja Bug - ADSL ifIndex to port error not handled ( #15617 ) - PipoCanaja Bug - XDSL adslAtucCurrOutputPwr exception (Cisco CSCvj53634) ( #15614 ) - PipoCanaja Bug - null checks in Nokia MPLS polling ( #15613 ) - PipoCanaja Bug - Nokia discovery protocols ( #15606 ) - PipoCanaja Make vminfo.vmwVmGuestOS wider ( #15595 ) - TheMysteriousX Fixed state flag causing sql issues in test-template.php ( #15589 ) - laf Documentation Add traceroute to the installed packages doc ( #15645 ) - VirTechSystems Fix documentation formatting ( #15635 ) - Jellyfrog Fix formatting in OAuth-SAML.md ( #15616 ) - peejaychilds Update Debian 12 Installation Instructions. ( #15590 ) - swiftnode-linden Add Debian 12 to install docs ( #15559 ) - VVelox Misc Updating the logo to higher resolution one ( #15669 ) - altf4arnold Update the type of nummonbssid column in the access_points table ( #15647 ) - amyjohn000 Fix device format missing display field ( #15623 ) - MittWillson Link Model ( #15611 ) - murrant Add space to Oxidized error msg ( #15603 ) - electrocret Internal Features New utility Number::constrainInteger() ( #15663 ) - murrant Mibs Update MIKROTIK-MIB ( #15690 ) - netravnen Dependencies Update javascript dependencies ( #15651 ) - murrant Bump phpseclib/phpseclib from 3.0.21 to 3.0.34 ( #15600 ) - dependabot 24.1.0 (2024-01-07) A big thank you to the following 37 contributors this last month: PipoCanaja (12) murrant (7) laf (5) electrocret (3) peejaychilds (3) Jellyfrog (2) vhuk (2) MittWillson (2) Bierchermuesli (2) netravnen (1) iliessens (1) sarcastic6 (1) SourceDoctor (1) altf4arnold (1) robje (1) rudybroersma (1) mtentilucci (1) tuxgasy (1) craig-nokia (1) brianegge (1) amyjohn000 (1) VirTechSystems (1) atj (1) lhwolfarth (1) bonzo81 (1) Sweeny42 (1) jduke-halls (1) pjordanovic (1) dependabot (1) TheMysteriousX (1) swiftnode-linden (1) cguillaumie (1) luc-ass (1) VVelox (1) Leo-FJ (1) MaxPecc (1) jerji (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (20) murrant (16) PipoCanaja (15) electrocret (12) craig-nokia (1) ottorei (1) Device Ignore nameless health sensors for Fortigate ( #15678 ) - iliessens Add support for RoomAlert 32S device ( #15676 ) - sarcastic6 Device - Add Cisco REP Segment state sensor ( #15666 ) - rudybroersma Added better support for some HiveOS Wireless devices ( #15661 ) - laf Fix HPE iLO CPU Status Sensor Description ( #15660 ) - mtentilucci Fix OcNOS detection for recent firmware versions ( #15642 ) - murrant Add support for Fortinet FortiAPs ( #15641 ) - atj Fixing memory scale for datacom-dmos devices ( #15640 ) - lhwolfarth Bug - Fix Cisco NTP values ( #15639 ) - PipoCanaja Add support for Forcepoint NGFW 6.10 and older ( #15632 ) - vhuk Bug - timos MPLS - more poller fixes ( #15624 ) - PipoCanaja Add memory readings for Draytek OS ( #15618 ) - Sweeny42 Updated support for HiveOS Wireless newer models ( #15610 ) - laf Add HPE iLO 6 to discovery ( #15607 ) - jduke-halls Incorrect discovery APC Smart-UPS RT 3000 XL 4.1 ( APC Web/SNMP Management Card (AP9619 MB:v4.1.1 PF:v3.9.4) as multi-phase ups ( #15602 ) - pjordanovic Device - McAfee Web Gateway -> SkyHigh Web Gateway ( #15596 ) - PipoCanaja Add and extend support for Hirshmann devices ( #15588 ) - cguillaumie Updated regex for HWG STE2 r2 to better detect hardware and software version ( #15573 ) - luc-ass Update entity-sensor.inc.php for xos' os ( #15552 ) - Leo-FJ Added support of new OS for NTP/PTP systems: Meinberg OS, Safran (Orolia), Oscilloquartz (Adva) ( #15453 ) - MaxPecc Zhone health ( #15276 ) - jerji Fix wrong ASN discovery on non-BGP Devices ( #14948 ) - Bierchermuesli Webui Clarify In/Out on Ports table. ( #15680 ) - electrocret WebUI - Filter FDB and ARP tabs in port page if empty ( #15653 ) - PipoCanaja Update Pushover.php ( #15652 ) - brianegge Mark old alert email settings as deprecated ( #15650 ) - murrant Add bad port settings to webui ( #15649 ) - murrant Bug - FDB Table - allow empty searchby as well ( #15626 ) - PipoCanaja Update alertlog query to be more efficient ( #15622 ) - laf Add vendor to searchby rules function ( #15619 ) - bonzo81 Fix grabled characters when oid already UTF-8 ( #15615 ) - MittWillson Graphs Change default graph image to SVG ( #15586 ) - electrocret Api API add_device: Add ping_ping fallback option ( #15637 ) - murrant More filter options for the BGP peer API endpoint ( #15599 ) - Bierchermuesli Discovery Set array before use to stop discovery erroring ( #15604 ) - laf Authentication Add support for Okta Group claims to set Roles ( #15592 ) - peejaychilds Output Roles in auth_test script ( #15587 ) - peejaychilds Bug Fix Rancid error messages ( #15683 ) - vhuk Fix smart application parsing ( #15672 ) - SourceDoctor Fix pagination in alert rules page ( #15659 ) - tuxgasy Bug - \"null\" checks for SAR 7705 release 8.X ( #15657 ) - craig-nokia Bug - missing \"use\" statement in NTP Cisco ( #15656 ) - PipoCanaja Bug - TPLink - fix null exception for LLDP discovery WIP ( #15628 ) - PipoCanaja Bug - bgp-peers error in Timos -> dbFacile cleanup ( #15620 ) - PipoCanaja Bug - ADSL ifIndex to port error not handled ( #15617 ) - PipoCanaja Bug - XDSL adslAtucCurrOutputPwr exception (Cisco CSCvj53634) ( #15614 ) - PipoCanaja Bug - null checks in Nokia MPLS polling ( #15613 ) - PipoCanaja Bug - Nokia discovery protocols ( #15606 ) - PipoCanaja Make vminfo.vmwVmGuestOS wider ( #15595 ) - TheMysteriousX Fixed state flag causing sql issues in test-template.php ( #15589 ) - laf Documentation Add traceroute to the installed packages doc ( #15645 ) - VirTechSystems Fix documentation formatting ( #15635 ) - Jellyfrog Fix formatting in OAuth-SAML.md ( #15616 ) - peejaychilds Update Debian 12 Installation Instructions. ( #15590 ) - swiftnode-linden Add Debian 12 to install docs ( #15559 ) - VVelox Misc Updating the logo to higher resolution one ( #15669 ) - altf4arnold Update the type of nummonbssid column in the access_points table ( #15647 ) - amyjohn000 Fix device format missing display field ( #15623 ) - MittWillson Link Model ( #15611 ) - murrant Add space to Oxidized error msg ( #15603 ) - electrocret Internal Features New utility Number::constrainInteger() ( #15663 ) - murrant Mibs Update MIKROTIK-MIB ( #15690 ) - netravnen Dependencies Update javascript dependencies ( #15651 ) - murrant Bump phpseclib/phpseclib from 3.0.21 to 3.0.34 ( #15600 ) - dependabot 23.11.0 (2023-11-17) A big thank you to the following 37 contributors this last month: murrant (26) PipoCanaja (5) jepke (3) peelman (3) dependabot (2) Galileo77 (2) tim427 (2) ottorei (2) eskyuu (1) arjenz (1) electrocret (1) GramThanos (1) bnerickson (1) peejaychilds (1) laf (1) luttermann (1) helppp (1) slalomsk8er (1) VirTechSystems (1) westerterp (1) cmadamsgit (1) lhwolfarth (1) webtroter (1) fbouynot (1) Wooboy (1) kmodzel (1) jaannnis (1) Fehler12 (1) not-known (1) drykov-ttc (1) tydal-borge (1) iNuc1ear (1) mpikzink (1) WilliamDEdwards (1) RandGH (1) underscoredje (1) Schouwenburg (1) Thanks to maintainers and others that helped with pull requests this month: murrant (40) Jellyfrog (10) electrocret (9) laf (2) ottorei (2) kwangsing3 (1) Feature Mail Transport: option to use BCC ( #15554 ) - murrant New command: lnms report:devices ( #15539 ) - murrant Breaking Change Plugin update (breaking) ( #15498 ) - murrant Security Fix a few XSS vulnerabilities in device group popups ( #15581 ) - murrant Disable GET login by default ( #15558 ) - murrant Use GitHub for vulnerability reporting ( #15555 ) - murrant Device [APC sensor] Actual state of alarm contact beside config state ( #15576 ) - jepke Vertiv PDU show power graph in mouesover and device overview ( #15543 ) - Galileo77 Cisco WLC: fetch LWAPP SSIDs for client counts ( #15531 ) - murrant Add sysObjectIDs for other models of PSS shelves ( #15525 ) - peelman Added values from SFP DDM values for awplus switches ( #15522 ) - luttermann Add support for Nokia 1830 PSS Optical gear ( #15516 ) - peelman Add Support for Samlex America PSR-1200-48 Inverters ( #15515 ) - peelman TrueNAS no longer supports zpool space usage ( #15490 ) - murrant Vertiv pdu mg02e4w1 ( #15484 ) - Galileo77 Add FortiGate Environment stats ( #15464 ) - westerterp Add support for FiberStore \"data center\" switches ( #15445 ) - cmadamsgit Adding basic support for Datacom DmOS devices. ( #15436 ) - lhwolfarth Apc ap 7900b ( #15392 ) - webtroter Add definition fujifilmprinter ( #15381 ) - Wooboy Initial support for Moxa EDS-4000 Series switches ( #15293 ) - kmodzel Cisco SB Switch Temp and Fanspeed fix ( #15225 ) - Fehler12 Add support eltex more devices ( #15108 ) - drykov-ttc Add support for Security Radar ( #15053 ) - tydal-borge Add disk sensors for Oceanstor ( #15010 ) - iNuc1ear Fix Fortinet HA-status polling state translations ( #14921 ) - ottorei Add Quantum Scalar I6000 Tape Library ( #14915 ) - mpikzink Add liebert detailsv2 ( #14746 ) - RandGH Zyxel AP wireless client discovery enhancement ( #14704 ) - underscoredje Dantherm hostname ( #14223 ) - Schouwenburg Add Panorama log collection write rate ( #13864 ) - ottorei Webui Device links formatting changes ( #15580 ) - eskyuu Only set user roles if they are defined ( #15577 ) - murrant Fix Down/Up time error if device is unpolled ( #15545 ) - murrant Fix health temperature degree display ( #15541 ) - murrant Fixed BGP Remote peer link and graph in Routing Overview, or just static text when not a device in LibreNMS ( #15535 ) - tim427 Added BGP Remote peer link and graph in Routing Overview ( #15532 ) - tim427 Respect web_mouseover setting in popup component ( #15530 ) - murrant Prefetch devices in group to avoid cost of subquery ( #15511 ) - slalomsk8er Alerting Give reason for alert template fallback ( #15583 ) - murrant Add option to disable the send of acknowledgement alerts. ( #15208 ) - not-known Applications [bugfix] Passing $device into data_update_helper functions instead of declaring it as global. ( #15542 ) - bnerickson Api API Oxidized http source optimization ( #15560 ) - murrant Get poller group ( #15493 ) - VirTechSystems Discovery UCD buffers and cache discovered with inverted free/used values ( #15538 ) - murrant Polling Prevent non-unicode characters in ifAlias ( #15585 ) - murrant BGP-peers if no data, skip ( #15548 ) - murrant UCD-MIB polling check isset ( #15547 ) - murrant Fix Ciscowlc error when bsnApIfNoOfUsers is not present ( #15529 ) - murrant Authentication Add auth_ldap_cacertfile and auth_ldap_ignorecert options ( #15526 ) - peejaychilds Bug Bug - Fix API Content-Type Header handling ( #15574 ) - PipoCanaja Huawei Controllers - Exception removed and changed OID for AP Type ( #15564 ) - PipoCanaja Fix graphs device check before auth ( #15551 ) - murrant Prometheus on failure, disable for rest of run ( #15546 ) - murrant Bug - Fix missing device_id in NAC tab view ( #15534 ) - PipoCanaja Bug - string VS array ( #15533 ) - PipoCanaja OSPF tables fix integer types ( #15528 ) - murrant Fixed the wrong field being used for join ( #15524 ) - laf Dark mode fix routing tabs & pages ( #15485 ) - jepke Minor fix and tweak for graylog integration ( #15455 ) - jepke Smokeping menu and title use device displayname ( #15387 ) - fbouynot Increase max package name length to 128 characters ( #14895 ) - WilliamDEdwards Cleanup Remove api_demo config setting ( #15563 ) - electrocret Wifi module does not exist anymore ( #15549 ) - murrant Misc device column cleanups ( #15518 ) - murrant Documentation Update Docker docs ( #15556 ) - GramThanos Changed log item, source(s_sys) to source(s_src) ( #15521 ) - helppp Translation Change spelling disc -> disk ( #15569 ) - arjenz Misc Update renamehost to include more logging if a folder already exists# ( #15280 ) - jaannnis Internal Features Print stack trace in error dumps ( #15514 ) - murrant SnmpQuery runtime cache ( #15512 ) - murrant Dependencies Bump axios from 0.25.0 to 1.6.0 ( #15571 ) - dependabot Bump browserify-sign from 4.2.1 to 4.2.2 ( #15510 ) - dependabot 23.10.0 (2023-10-26) A big thank you to the following 30 contributors this last month: murrant (84) SourceDoctor (6) tim427 (4) electrocret (3) dependabot (3) noaheroufus (3) PipoCanaja (3) Galileo77 (2) fbouynot (2) Jellyfrog (2) peejaychilds (1) cwispy (1) qwerin (1) lhwolfarth (1) CTV-2023 (1) barryodonovan (1) MrShunz (1) brointhemix (1) I-FGSD (1) Ac0lyte (1) Jimmy-Cl (1) waddles (1) bnerickson (1) netravnen (1) jepke (1) TheMysteriousX (1) rolfbergheim (1) VVelox (1) davromaniak (1) metrojworthington (1) Thanks to maintainers and others that helped with pull requests this month: murrant (30) Jellyfrog (23) electrocret (21) PipoCanaja (2) RafalNiewinski (1) rcmcronny (1) Feature Muteable acknowledged alert notifications ( #15456 ) - SourceDoctor Throttle error reporting ( #15391 ) - murrant Deprecate poller.php ( #15370 ) - murrant Security Fix MAC search sql injection ( #15402 ) - murrant Validate secure cookies ( #15401 ) - murrant Fix xss in device groups overview ( #15399 ) - murrant Update Tnmsne table backend ( #15384 ) - murrant Fix unescaped output in ipv6 search page ( #15327 ) - murrant Device Fix websensor temp user_func ( #15492 ) - murrant Discover AEN with sysobjectid instead of sysdescr ( #15482 ) - fbouynot Huawei VRP AP controller fixes ( #15450 ) - murrant Timos MPLS nullables round 2 ( #15448 ) - murrant Fortimail add mail queues message count ( #15444 ) - cwispy Fix timos mpls, add checks ( #15430 ) - murrant Fix VRP polling ( #15428 ) - murrant Updating Datacom logo ( #15427 ) - lhwolfarth Moxa EDS improve discovery ( #15375 ) - murrant Fix Raisecom devices having not increasing OIDs on snmpwalk ( #15365 ) - MrShunz Aviat svg logos ( #15360 ) - murrant Add Fortinet logo ( #15359 ) - murrant Added support for Cambium cnWave60 gear ( #15358 ) - noaheroufus Added support for Cambium cnMatrix switches ( #15351 ) - noaheroufus Update Windows version naming ( #15350 ) - I-FGSD Calix logo update ( #15348 ) - murrant Calix AXOS Sensor Changes ( #15343 ) - noaheroufus Adding Active Power in Watts to APCs ( #15337 ) - Jimmy-Cl Device stulz WIB8000 ( #15271 ) - jepke Added some groups and corrected some references ( #15129 ) - rolfbergheim Add model for Christie Digital projectors ( #15088 ) - davromaniak Vmware vminfo modernize ( #15008 ) - murrant Mcc valere ( #14753 ) - metrojworthington Webui Do not update device IP when DNS resolution fails ( #15499 ) - murrant Fix FDB table ip addresses missing ( #15481 ) - murrant Fix bug saving snmpv3 device changes ( #15419 ) - murrant Fix graph errors ( #15407 ) - murrant Calculate downtime from device_outages table ( #15397 ) - murrant Sort services by type and name ( #15367 ) - SourceDoctor Vertically center device icons ( #15361 ) - murrant Fix BGP peer IP missing in Routing page ( #15352 ) - tim427 Fix incorrect pages offset on app ntp page ( #15349 ) - Ac0lyte Show Temperature Graphs on Smart App Overview ( #15342 ) - SourceDoctor Show never polled Information on Widget and in Device itself ( #15341 ) - SourceDoctor Show device group on device overview ( #15338 ) - SourceDoctor FDB Tables improve performance ( #15333 ) - murrant Fix some issues with admin self settings ( #15332 ) - murrant Fix eventlog debug code left in ( #15331 ) - murrant Device NAC page to Laravel Blade ( #15329 ) - PipoCanaja Alerting Send event log when alert rule fails ( #15440 ) - murrant Fix Linemessagingapi class name ( #15356 ) - murrant Fix alerting find owner contacts on old SQL server versions ( #15355 ) - murrant Add alert transport for Grafana Oncall ( #15330 ) - waddles Show which host marked a device as down. ( #15209 ) - TheMysteriousX Graphs Fix rrd exists check ( #15466 ) - murrant Scale disk spezific SMART Graph from 0 ( #15339 ) - SourceDoctor Applications Unix Agent and Application fixes ( #15460 ) - murrant Adding Socket Statistics Application Support ( #15307 ) - bnerickson Update docs for osupdate when being used as a script for the agent ( #15099 ) - VVelox Api Fix API get_location by ID ( #15506 ) - murrant Allow add device to set location ( #15469 ) - murrant Settings Rearrange AD auth settings ( #15363 ) - murrant Polling IS-IS polling handle missing data ( #15491 ) - murrant Fix polling down retry (and other items) ( #15483 ) - murrant Ports min polled period of 1 ( #15472 ) - murrant Ports module: fix nulls not updating ( #15467 ) - murrant Always create rrd folder on localhost ( #15457 ) - murrant Fix port module wrong null ( #15431 ) - murrant Fix an agent bug if a process ran more than 999 days ( #15411 ) - murrant Type safety check ( #15409 ) - murrant Add rewrites include for legacy modules ( #15405 ) - murrant Fix last polled in wrong column ( #15398 ) - murrant Fix last polled ( #15396 ) - murrant Availability module fixes ( #15369 ) - murrant Bug Add Wrong Type work around to snmp_get function ( #15509 ) - peejaychilds Ospf metrics fix ( #15508 ) - murrant IP::fromHexString handle ascii ( #15504 ) - murrant Fix poller perf graph time ( #15500 ) - murrant Fix auth_ad_url validation ( #15487 ) - murrant Fix regression causing wall of ping latency ( #15486 ) - fbouynot Fix Device ip address mutator ( #15480 ) - murrant Fix Typo in FdbTablesController ( #15477 ) - electrocret Allow inserting null values for sensors ( #15470 ) - Jellyfrog Never set bgp and ports delta fields to unsigned ( #15468 ) - murrant Error when device is not found ( #15459 ) - murrant Restore _delta fields to signed ( #15458 ) - murrant Change port and BGP stats fields to unsigned ( #15449 ) - murrant Fix Top menu search on mobile respo ( #15439 ) - qwerin Packages fixes (+pacman) ( #15415 ) - murrant Fix bug in graphite ( #15393 ) - murrant Fixing Private eBGP visualization, corrected 16bit ASN private range, added 32bit ASN range ( #15357 ) - tim427 Improve \"count\" graphs for F5OS ( #15335 ) - PipoCanaja Refactor Refactor MAC utilities into a single class ( #15379 ) - murrant Refactor discovery-protocols with SnmpQuery ( #15324 ) - PipoCanaja Cleanup ARP Discovery use MacHelper ( #15479 ) - electrocret Ports ifPhysAddress use MAC helper ( #15478 ) - murrant Module status cleanups ( #15461 ) - murrant Use modern device attrib handling ( #15429 ) - murrant Remove some lightly used or unused dbFacile functions ( #15418 ) - murrant Misc fixes 42 ( #15413 ) - murrant Remove snmp functions that are barely used ( #15377 ) - murrant Remove legacy addhost code ( #15376 ) - murrant Remove unused functions ( #15371 ) - murrant Documentation Redirect old install docs ( #15505 ) - murrant Update supported OS list ( #15426 ) - Jellyfrog Documentation - Smokeping Integration in Centos - Update Smokeping.md ( #15390 ) - CTV-2023 Specify radius attributes for auth roles ( #15374 ) - barryodonovan Add unzip to all install docs dependencies ( #15354 ) - brointhemix Docs security secure session cookie ( #15328 ) - murrant Stable release update clarification ( #15326 ) - murrant Bird2 set timeformat protocols ( #15292 ) - netravnen Translation German and English typo correction ( #15503 ) - Galileo77 German translation corrected and some visual improvements added. ( #15502 ) - Galileo77 Missing device ip translation ( #15465 ) - murrant Tests Exclude availability module from default testing ( #15462 ) - murrant Misc Fixes check_dns against localhost when a search-domain is configured ( #15373 ) - tim427 Added extra ASN-range comments, added Priv eBGP on host details, changed color to light-blue instead of red ( #15372 ) - tim427 Internal Features Add application metrics model and relationships ( #15417 ) - murrant Error Reporting: Log instead of dump ( #15412 ) - murrant Dependencies Bump @babel/traverse from 7.16.10 to 7.23.2 ( #15473 ) - dependabot Bump postcss from 8.4.19 to 8.4.31 ( #15380 ) - dependabot Bump composer/composer from 2.5.8 to 2.6.4 ( #15364 ) - dependabot 23.9.0 (2023-09-15) A big thank you to the following 16 contributors this last month: murrant (33) SourceDoctor (3) VVelox (3) eskyuu (2) PipoCanaja (2) MrMoCoDev (1) electrocret (1) Pelt10 (1) LoveSkylark (1) slashdoom (1) jepke (1) hanserasmus (1) adamsweet (1) fbourqui (1) fbouynot (1) Fehler12 (1) Thanks to maintainers and others that helped with pull requests this month: murrant (10) Jellyfrog (9) electrocret (8) PipoCanaja (3) VVelox (1) cltnoc (1) ottorei (1) Feature Additional contact options for email transports ( #15266 ) - murrant Implement RBAC (only built in roles) ( #15212 ) - murrant Security Fix injection vulnerability in fdb search page ( #15315 ) - murrant Fix injection vulnerability in ports pages ( #15314 ) - murrant Fix another addcslashes incorrect escape in eventlog ( #15313 ) - murrant Fix another injection in ipv4 search page ( #15312 ) - murrant Fix injection in search pages ipv4, etc ( #15311 ) - murrant Fix improperly escaped output in outages page ( #15310 ) - murrant Device Fix smartos-dcp-m.yaml ( #15295 ) - electrocret Use mtxrGaugeTable instead of mtxrHealthGroup ( #15289 ) - murrant Added support for Nutanix VM count, disk state, CPU usage and RAM usage ( #15252 ) - eskyuu Initial support for f5os ( #15241 ) - fbouynot Webui Fix login page HTML ( #15321 ) - murrant Fix device display name in top interfaces widget ( #15319 ) - murrant Timezone, fix user set no timezone ( #15296 ) - murrant Availability Map: Show ignored device up when up ( #15283 ) - SourceDoctor Custom ssh,telnet port with oxidized ( #15255 ) - jepke WebUI Services, generate more compact table ( #15243 ) - fbourqui Added empty string check ( #15235 ) - Fehler12 Use full name for vendor_oui ( #15234 ) - PipoCanaja Add global NAC page ( #15228 ) - PipoCanaja Alerting Fix error when mail-contact is missing ( #15305 ) - murrant Hide token, keys and passwords in Transports ( #15274 ) - LoveSkylark Applications For the applications table set the defaults for app_instance and app_instance to '' ( #15278 ) - VVelox Application Soft Delete ( #15270 ) - VVelox Api Allow port search API to search ifAlias again ( #15320 ) - murrant Fix API availability graph duration ( #15250 ) - murrant Settings Add ui description for reporting dump_errors ( #15264 ) - murrant Polling Fix port ifAlias polling ( #15279 ) - murrant Fix ifSpeed override not being applied ( #15237 ) - murrant Authentication ADAuthorizer auth skip count entry ( #15322 ) - murrant Radius enforce roles ( #15294 ) - murrant Bug FIX TP-Link JetStream 3.0.0 Build 20180511 Rel.36491(s) T1500-28PCT 3.0 ( #15318 ) - MrMoCoDev Fix issue with rrdcached application and bad input ( #15301 ) - murrant Fix .env quoting issue ( #15298 ) - murrant Fix typo in default mibs for SnmpQuery ( #15297 ) - murrant Readd missing key ( #15291 ) - SourceDoctor Fix missing keys for new status ( #15284 ) - SourceDoctor Revert \"Added empty string check\" ( #15249 ) - murrant Fix manual port speed storage ( #15238 ) - murrant Make the service template controller re-evaluate dynamic membership when apply all button is pushed ( #15214 ) - eskyuu Cleanup Return an 5XX error when an exception is raise ( #15285 ) - Pelt10 Documentation Note the package install command for dhcpd-pools for FreeBSD ( #15247 ) - VVelox Update severity colours in SNMP-Traps.md ( #15244 ) - adamsweet Misc Another OR statement in GrayLog API ( #15246 ) - hanserasmus Dispatcher option to log output ( #15230 ) - murrant 23.8.0 (2023-08-19) A big thank you to the following 32 contributors this last month: murrant (31) VVelox (5) Jellyfrog (4) electrocret (4) santiag0z (3) laf (3) viptampa (3) arjenz (2) knpo (1) WhiteyDude (1) jacobw (1) jepke (1) sjtarik (1) pjordanovic (1) Schouwenburg (1) eggbeater98 (1) i4networks (1) fbourqui (1) hirose003 (1) richard-ririe (1) robje (1) peejaychilds (1) bonzo81 (1) slashdoom (1) eskyuu (1) j796160836 (1) TheMysteriousX (1) VirTechSystems (1) fufroma (1) zappiehost (1) jgelinas (1) mwobst (1) Thanks to maintainers and others that helped with pull requests this month: murrant (26) Jellyfrog (25) electrocret (23) PipoCanaja (3) laf (2) VVelox (2) ottorei (1) streamthing (1) Feature Add FDB table vendor search drop down ( #15072 ) - bonzo81 Port_error_perc macro ( #15016 ) - electrocret Security Fix unsanitized input injection ( #15184 ) - murrant Fix some xss injection for sysLocation and some other fields ( #15183 ) - murrant Device Fix version comparison for RouterOS ( #15227 ) - knpo Netscaler, don't use 0 divisor ( #15204 ) - murrant Update Alpine Linux logos to SVG ( #15185 ) - murrant APC new sensors and fix ( #15179 ) - jepke Add SHARP BP series of devices ( #15169 ) - pjordanovic Fix Timos SAR Cellular RSRP and RSSI sensors ( #15163 ) - Schouwenburg Update bgp-peers.inc.php for timos ( #15154 ) - i4networks Fortigate ipv6 ipsec ( #15150 ) - fbourqui Add Calix E7 (EXA) PON port sensors ( #15145 ) - murrant Add os check in discovery for aix/freenas storage and cisco cdp ( #15104 ) - peejaychilds Add VLAN Discovery for arubaos-cx ( #15055 ) - slashdoom Openmanage enterprise modular ( #14408 ) - jgelinas Webui Fixed CSS error causing generic image widgets not to do height correctly ( #15220 ) - WhiteyDude Fix error when there is an untranslated sensor type ( #15176 ) - murrant Fix select2 search field focus ( #15171 ) - murrant Update text color in dark.css ( #15155 ) - eggbeater98 Alerting Discord Transport user configurable embed fields ( #15068 ) - murrant Implement LINE Messaging API ( #14867 ) - j796160836 Graphs Fix Memmory spelling ( #15231 ) - arjenz Add generic stats graph munging support and make uptime display as days again ( #15097 ) - VVelox Applications Add the Mojo CAPE Submit app ( #15140 ) - VVelox Logsize monitoring for LibreNMS ( #15137 ) - VVelox Update SMART monitoring to the use JSON ( #15132 ) - VVelox Add a flag for adding app data to tests generated via scripts/json-app-tool.php ( #15080 ) - VVelox Add BIRD2 BGP Peers application support ( #14466 ) - zappiehost Billing Fixed a zero value data insertion for billing ( #15194 ) - laf Updated poll-billing.php to only query for data via snmp when the device and port are both up ( #15164 ) - laf Added basic support for distributing billing ( #15156 ) - laf Api Add API endpoint to get service graphs ( #15138 ) - richard-ririe API get_location ( #14779 ) - VirTechSystems Discovery Always mark device last_discovered ( #15218 ) - murrant Polling Allow dispatcher service master timeout to be set ( #15161 ) - murrant Fix fping 4.0+ prefers IPv6 ( #14825 ) - TheMysteriousX Add module support for wrapper script calls ( #14055 ) - mwobst Authentication Remove user_id cast to int ( #15205 ) - jacobw Bug Print a useful error if logfile is not writable ( #15233 ) - murrant Make the installer use the schema dump ( #15211 ) - Jellyfrog Change leaflet.default_zoom to Float ( #15207 ) - electrocret Handle empty dbSchema table ( #15198 ) - murrant Fix timezone controller bad return ( #15191 ) - murrant Graylog API properly throw errors ( #15188 ) - murrant Fixing the mac/vendor database download from wireshark, updated file \u2026 ( #15175 ) - sjtarik Fix alert.macros.rule ( #15172 ) - electrocret Miscellaneous fixes ( #15162 ) - murrant Change display query of list_devices to pattern match ( #15147 ) - hirose003 Change rrd_prune find command to exlcude .gitignore ( #15134 ) - robje Apply service templates on a per-device basis ( #15024 ) - eskyuu RFC1628 - Force cast on some values before doing arithmetic ( #14613 ) - fufroma Refactor Fix sensor discovery fetch issue ( #15193 ) - murrant MAC Vendor OUI use scheduler ( #15187 ) - murrant Cleanup Misc fixes 2 ( #15190 ) - murrant Severity Enum ( #14620 ) - murrant Documentation [DOC] Added social links in footer ( #15195 ) - santiag0z OS discovery clarification ( #15182 ) - murrant [DOC] Remove ~$ from BIND9 code block aka named ( #15181 ) - santiag0z Fix settings titles in dark mode ( #15174 ) - murrant Update Routeros.md ( #15165 ) - viptampa Update Routeros.md ( #15160 ) - viptampa RouterOS Vlan agent script clarification ( #15158 ) - viptampa Fix bad link in Install-LibreNMS.md ( #15152 ) - arjenz Tests Only dump snmp logs on failure ( #15200 ) - murrant Misc Use Laravel schema migration command directly ( #14039 ) - Jellyfrog Internal Features Set mibs explicitly in SnmpQuery ( #15199 ) - murrant Editor yaml indent fine tuning ( #15189 ) - murrant Dependencies Update composer dependencies ( #15167 ) - Jellyfrog Update Ziggy ( #15151 ) - murrant Dependency Updates ( #15149 ) - murrant 23.7.0 (2023-07-16) A big thank you to the following 19 contributors this last month: peejaychilds (4) tuxgasy (3) murrant (3) jepke (2) VVelox (2) laf (1) PipoCanaja (1) eggbeater98 (1) illogik (1) elianmanzueta (1) peelman (1) Blinq-SanderBlom (1) vincent5753 (1) electrocret (1) mtentilucci (1) edgesite (1) davromaniak (1) TheMysteriousX (1) sjtarik (1) Thanks to maintainers and others that helped with pull requests this month: murrant (12) electrocret (6) Jellyfrog (6) ottorei (4) laf (3) PipoCanaja (1) FadhliRais (1) VVelox (1) PJGuyTen (1) Device Fix MPLS Tab Display for Nokia devices using LDP and not RSVP ( #15128 ) - peelman Change state value for unplugged linecard ( #15126 ) - Blinq-SanderBlom Convert several JunOS sensors to yaml ( #15118 ) - murrant Update Trellix NSP discovery ( #15117 ) - mtentilucci APC new sensors ( #15090 ) - jepke Add regex for Supermicro switches running firmware 2.0 or newer, now called \"SuperSwitch\" ( #15083 ) - davromaniak Add support for PrimeKey Software Appliance ( #15059 ) - TheMysteriousX Webui Update Dark theme for readability on availability map ( #15141 ) - eggbeater98 Add Oxidized search clarification ( #15124 ) - electrocret Sort port by interface name while list ports. ( #15093 ) - edgesite Alerting Alert transport slack config fixes ( #15131 ) - illogik Transport Messagebird voice message API ( #15115 ) - jepke Applications Add Privoxy stats support ( #15114 ) - VVelox Add Suricata Extract submission stats app ( #15105 ) - VVelox Api Adding human readable version of /api/v0/fdb/{mac}/detail ( #15045 ) - sjtarik Discovery Fix bogus reply from snmpwalk in ipNetToPhysicalPhysAddress ( #15142 ) - PipoCanaja Polling Fix for hrStorageIndex agility ( #15028 ) - peejaychilds Bug Skip hostnames which are blank when generating the smokeping config ( #15144 ) - laf Change chunk to chunkById ( #15139 ) - peejaychilds Use lock ports_purge in ports_purge rather than syslog_purge lock ( #15135 ) - peejaychilds Fix validation: memcached required only if it is configured in .env ( #15122 ) - tuxgasy Exit non-zero if composer bin not found ( #15120 ) - tuxgasy Documentation Update openwrt doc following PR #15096 ( #15119 ) - tuxgasy Translation Fix typo in delhost.inc.php ( #15130 ) - elianmanzueta Added missing zh-tw translation. ( #15125 ) - vincent5753 Internal Features Yaml value filling improvements ( #15116 ) - murrant 23.6.0 (2023-06-23) A big thank you to the following 14 contributors this last month: VVelox (4) Jellyfrog (4) murrant (2) si458 (1) netravnen (1) tuxgasy (1) jepke (1) ajsiersema (1) wrongecho (1) peejaychilds (1) tim427 (1) kg6uyz (1) d-k-7 (1) electrocret (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (9) murrant (6) electrocret (4) ottorei (2) Feature Alert transport cleanup, no_proxy support and other proxy cleanups ( #14763 ) - murrant Device Improve OpenWRT detection ( #15096 ) - tuxgasy TEG-S50ES and TPE-P521ES device detection ( #15052 ) - kg6uyz Add sensor support for cefcModuleOperStatus ( #15026 ) - d-k-7 Extend Avocent Support ( #14914 ) - electrocret Alerting Messagebird transport ( #15079 ) - jepke Remove asterisk from recurring input ( #15074 ) - wrongecho Fix syslog transport output format ( #15070 ) - peejaychilds Fixed Markdown/Parse mode for Telegram ( #15066 ) - tim427 Applications Add ZFS L2 support ( #15095 ) - VVelox Add Linux Softnet Stat app ( #15094 ) - VVelox Add Sneck support, making it very trivial to use Nagios style checks in a NRPE like manner ( #13954 ) - VVelox Bug Fixes #14975 Services in Device Groups not displayed correctly in Availability widget ( #15076 ) - ajsiersema Fix Dusk tests after 13626 ( #15057 ) - Jellyfrog Cleanup Add AllowDynamicProperties to DynamicConfigItem ( #15058 ) - Jellyfrog Documentation Add archlinux example ( #15113 ) - si458 Fix minor typo in Applications.md ( #15111 ) - VVelox Mibs Update MIKROTIK-MIB to v7.10 release ( #15110 ) - netravnen Dependencies Laravel 10.x Shift ( #14995 ) - Jellyfrog 23.5.0 (2023-05-19) A big thank you to the following 37 contributors this last month: murrant (29) Jellyfrog (6) mtentilucci (5) peelman (4) electrocret (4) laf (3) cjsoftuk (3) alchemyx (2) Bierchermuesli (2) bakerds (2) mpikzink (2) TheMysteriousX (2) QuadPiece (1) elipsion (1) etiennewan (1) jlo-lirmm (1) dscw (1) fbouynot (1) santiag0z (1) dependabot (1) VoipTelCH (1) otkd (1) ajsiersema (1) JStandiford (1) PipoCanaja (1) arjenz (1) maticomba (1) SourceDoctor (1) pjroehl (1) cjwbath (1) MajesticFalcon (1) bnerickson (1) bestlong (1) Olen (1) mboehn (1) ollb (1) eskyuu (1) Thanks to maintainers and others that helped with pull requests this month: murrant (47) electrocret (18) Jellyfrog (16) ottorei (1) PipoCanaja (1) JohnnyBBravo (1) Feature Set focus to Global Search on Ctrl-F ( #14947 ) - Bierchermuesli Add link to hosts mgmt (ipmi) interface ( #14905 ) - mpikzink Implement authentication for Redis/Sentinel ( #14805 ) - TheMysteriousX Security Convert the inventory page to Laravel ( #15004 ) - murrant Device Add RoomAlert 12E Switch Sensors, fix Humidity Sensor ( #15049 ) - peelman Fix WISI over graphs ( #15040 ) - peelman Fix inventory display for Calix AXOS devices ( #15039 ) - peelman Map GPS lat and lon to os module ( #15033 ) - QuadPiece Firebrick CPU Monitoring ( #15030 ) - cjsoftuk Fix Firebrick mempool polling ( #15022 ) - cjsoftuk Add support for memory monitoring on Firebrick platform ( #15021 ) - cjsoftuk Fix vsolution discovery yaml ( #14970 ) - murrant Fix tait tnadmin processors ( #14969 ) - murrant Fix Raisecom Processor ( #14968 ) - murrant Fix Raisecom ROS processor collection ( #14966 ) - murrant Add support for Trellix ATD devices ( #14965 ) - mtentilucci Add support for Trellix NSP devices ( #14964 ) - mtentilucci Cisco QFP polling fixes ( #14961 ) - Bierchermuesli Add version, hardware and serial collection ( #14956 ) - JStandiford Add Rubrik Discovery ( #14951 ) - mtentilucci Add Nutanix AOS discovery ( #14950 ) - mtentilucci RouterOS runtime quirk on first discovery ( #14945 ) - murrant Added sensor support for older APC InfraStruXure PDUs ( #14944 ) - bakerds Expand discovery of gigavue os ( #14933 ) - mtentilucci Add discovery of NVT Phybridge FLEX24 ( #14913 ) - pjroehl Add initial OS detection for LoadBalancer.org ( #14902 ) - cjwbath Added graphing of DDoS-protection related OIDs for PAN-OS ( #14847 ) - bakerds Add support for Alpha CXC HP Controller ( #14829 ) - MajesticFalcon Change ESXi port naming to be stable ( #14639 ) - TheMysteriousX Add advantech icr-os for advantech routers ( #14171 ) - mboehn Fix cisco dbm sensors port link on discovery (NCS55A2) ( #13965 ) - ollb Webui Ondemand popup graphs ( #15050 ) - murrant Add a global setting for Ctrl-F focus (improve #14947) ( #15023 ) - etiennewan [About] Link to LinkedIn ( #14991 ) - santiag0z Clarify Alert Notify Settings ( #14974 ) - electrocret Fix Legacy vars Processing ( #14967 ) - murrant Correct PowerConsumed SI Units in Overview ( #14425 ) - mpikzink Added support for user timezones and user browser timezone by default (incomplete) ( #13626 ) - eskyuu Alerting Fix undefined array key ( #15025 ) - Jellyfrog Graphs Php implode arg mismatch ( #15014 ) - jlo-lirmm Fix availability graphs to 100% ( #15013 ) - laf Fix scale_rigid accidentally being set to false ( #14992 ) - murrant Set device ping_perf scale_min to 0 ( #14989 ) - murrant Poller perf: add per device average ( #14940 ) - murrant Stacked graphs on zoom to speed ( #14928 ) - electrocret Applications Adding linux_config_files application support ( #14776 ) - bnerickson Agent support OS Updates ( #14687 ) - bestlong Api Allow device ignore to be set via API ( #14985 ) - electrocret Enable disabling a device via api ( #14983 ) - VoipTelCH Discovery Snmp-scan filter for dns resolved devices ( #14934 ) - SourceDoctor Polling Fixes #14957 missing IPv6 BGP peers ( #14959 ) - ajsiersema Fix SnmpQuery and max_oid ( #14955 ) - murrant Bug Fix timetaken columns too small ( #15042 ) - murrant Fix some undefined constants ( #14993 ) - murrant Fix routes after Laravel9 ( #14977 ) - Jellyfrog Fix more divide by zero issues ( #14954 ) - murrant Bug - wrong type in ports.inc.php ( #14952 ) - PipoCanaja Solves error in discovering services module ( #14939 ) - maticomba Ensure irc fifo-file is shared between dispatcher and core containers ( #14647 ) - Olen Refactor Add a validation for checking if the scheduler is running ( #14987 ) - Jellyfrog Refactor billing ( #14979 ) - murrant Cleanup Remove old unused adduser page and script ( #15035 ) - murrant Adopt anonymous migrations ( #15005 ) - Jellyfrog Remove unused port fields ( #14963 ) - murrant Cleanup enable bgp setting ( #14931 ) - electrocret Documentation Re-add the Ubuntu Image page and links ( #15041 ) - laf Remove references to VM images ( #15031 ) - murrant Updated WebUI config options in docs to support direct linking to installs ( #15009 ) - laf Fix spelling error in Graylog section ( #15002 ) - dscw Update OAuth-SAML.md to prevent http code 419 error ( #15000 ) - fbouynot Update Smokeping.md with better nginx config instructions ( #14999 ) - alchemyx Update Copyright year to 2023 in README.md ( #14972 ) - otkd Update Install-LibreNMS.md ( #14949 ) - alchemyx Tests Reduce OS module test noise ( #15046 ) - murrant Test PHP 8.2 and MariaDB 10.11 ( #15007 ) - murrant Slightly better OS module test output ( #15001 ) - murrant Fix a bug when creating test data; if a community contained the strin\u2026 ( #14739 ) - peelman Mibs Bump VMware MIBs ( #15029 ) - elipsion Dependencies Bump guzzlehttp/psr7 from 2.4.4 to 2.5.0 ( #14986 ) - dependabot Laravel 9.x Shift ( #14504 ) - Jellyfrog 23.5.0 (2023-05-19) A big thank you to the following 37 contributors this last month: murrant (29) Jellyfrog (6) mtentilucci (5) peelman (4) electrocret (4) laf (3) cjsoftuk (3) alchemyx (2) Bierchermuesli (2) bakerds (2) mpikzink (2) TheMysteriousX (2) QuadPiece (1) elipsion (1) etiennewan (1) jlo-lirmm (1) dscw (1) fbouynot (1) santiag0z (1) dependabot (1) VoipTelCH (1) otkd (1) ajsiersema (1) JStandiford (1) PipoCanaja (1) arjenz (1) maticomba (1) SourceDoctor (1) pjroehl (1) cjwbath (1) MajesticFalcon (1) bnerickson (1) bestlong (1) Olen (1) mboehn (1) ollb (1) eskyuu (1) Thanks to maintainers and others that helped with pull requests this month: murrant (47) electrocret (18) Jellyfrog (16) ottorei (1) PipoCanaja (1) JohnnyBBravo (1) Feature Set focus to Global Search on Ctrl-F ( #14947 ) - Bierchermuesli Add link to hosts mgmt (ipmi) interface ( #14905 ) - mpikzink Security Convert the inventory page to Laravel ( #15004 ) - murrant Device Add RoomAlert 12E Switch Sensors, fix Humidity Sensor ( #15049 ) - peelman Fix WISI over graphs ( #15040 ) - peelman Fix inventory display for Calix AXOS devices ( #15039 ) - peelman Map GPS lat and lon to os module ( #15033 ) - QuadPiece Fix vsolution discovery yaml ( #14970 ) - murrant Fix tait tnadmin processors ( #14969 ) - murrant Fix Raisecom Processor ( #14968 ) - murrant Fix Raisecom ROS processor collection ( #14966 ) - murrant Add support for Trellix ATD devices ( #14965 ) - mtentilucci Add support for Trellix NSP devices ( #14964 ) - mtentilucci Cisco QFP polling fixes ( #14961 ) - Bierchermuesli Add version, hardware and serial collection ( #14956 ) - JStandiford Add Rubrik Discovery ( #14951 ) - mtentilucci Add Nutanix AOS discovery ( #14950 ) - mtentilucci RouterOS runtime quirk on first discovery ( #14945 ) - murrant Added sensor support for older APC InfraStruXure PDUs ( #14944 ) - bakerds Expand discovery of gigavue os ( #14933 ) - mtentilucci Add discovery of NVT Phybridge FLEX24 ( #14913 ) - pjroehl Add initial OS detection for LoadBalancer.org ( #14902 ) - cjwbath Added graphing of DDoS-protection related OIDs for PAN-OS ( #14847 ) - bakerds Add support for Alpha CXC HP Controller ( #14829 ) - MajesticFalcon Add advantech icr-os for advantech routers ( #14171 ) - mboehn Fix cisco dbm sensors port link on discovery (NCS55A2) ( #13965 ) - ollb Webui Ondemand popup graphs ( #15050 ) - murrant Clarify Alert Notify Settings ( #14974 ) - electrocret Fix Legacy vars Processing ( #14967 ) - murrant Correct PowerConsumed SI Units in Overview ( #14425 ) - mpikzink Added support for user timezones and user browser timezone by default (incomplete) ( #13626 ) - eskyuu Alerting Fix undefined array key ( #15025 ) - Jellyfrog Graphs Php implode arg mismatch ( #15014 ) - jlo-lirmm Fix availability graphs to 100% ( #15013 ) - laf Fix scale_rigid accidentally being set to false ( #14992 ) - murrant Set device ping_perf scale_min to 0 ( #14989 ) - murrant Poller perf: add per device average ( #14940 ) - murrant Stacked graphs on zoom to speed ( #14928 ) - electrocret Applications Agent support OS Updates ( #14687 ) - bestlong Api Allow device ignore to be set via API ( #14985 ) - electrocret Enable disabling a device via api ( #14983 ) - VoipTelCH Discovery Snmp-scan filter for dns resolved devices ( #14934 ) - SourceDoctor Polling Fixes #14957 missing IPv6 BGP peers ( #14959 ) - ajsiersema Fix SnmpQuery and max_oid ( #14955 ) - murrant Bug Fix timetaken columns too small ( #15042 ) - murrant Fix some undefined constants ( #14993 ) - murrant Fix routes after Laravel9 ( #14977 ) - Jellyfrog Fix more divide by zero issues ( #14954 ) - murrant Bug - wrong type in ports.inc.php ( #14952 ) - PipoCanaja Solves error in discovering services module ( #14939 ) - maticomba Refactor Add a validation for checking if the scheduler is running ( #14987 ) - Jellyfrog Refactor billing ( #14979 ) - murrant Cleanup Remove old unused adduser page and script ( #15035 ) - murrant Remove unused port fields ( #14963 ) - murrant Cleanup enable bgp setting ( #14931 ) - electrocret Documentation Re-add the Ubuntu Image page and links ( #15041 ) - laf Remove references to VM images ( #15031 ) - murrant Updated WebUI config options in docs to support direct linking to installs ( #15009 ) - laf Fix spelling error in Graylog section ( #15002 ) - dscw Update OAuth-SAML.md to prevent http code 419 error ( #15000 ) - fbouynot Update Smokeping.md with better nginx config instructions ( #14999 ) - alchemyx Update Copyright year to 2023 in README.md ( #14972 ) - otkd Update Install-LibreNMS.md ( #14949 ) - alchemyx Tests Reduce OS module test noise ( #15046 ) - murrant Test PHP 8.2 and MariaDB 10.11 ( #15007 ) - murrant Slightly better OS module test output ( #15001 ) - murrant Fix a bug when creating test data; if a community contained the strin\u2026 ( #14739 ) - peelman Misc Firebrick CPU Monitoring ( #15030 ) - cjsoftuk Add a global setting for Ctrl-F focus (improve #14947) ( #15023 ) - etiennewan Fix Firebrick mempool polling ( #15022 ) - cjsoftuk Add support for memory monitoring on Firebrick platform ( #15021 ) - cjsoftuk Adopt anonymous migrations ( #15005 ) - Jellyfrog [About] Link to LinkedIn ( #14991 ) - santiag0z Implement authentication for Redis/Sentinel ( #14805 ) - TheMysteriousX Adding linux_config_files application support ( #14776 ) - bnerickson Ensure irc fifo-file is shared between dispatcher and core containers ( #14647 ) - Olen Change ESXi port naming to be stable ( #14639 ) - TheMysteriousX Laravel 9.x Shift ( #14504 ) - Jellyfrog Mibs Bump VMware MIBs ( #15029 ) - elipsion Dependencies Bump guzzlehttp/psr7 from 2.4.4 to 2.5.0 ( #14986 ) - dependabot 23.4.0 (2023-04-06) A big thank you to the following 25 contributors this last month: electrocret (8) VVelox (6) Jellyfrog (5) mtentilucci (4) Bierchermuesli (3) murrant (2) GeantRA (2) mwobst (2) dependabot (2) not-known (2) torbeckattsp (1) d-k-7 (1) arjenz (1) kirk444 (1) robje (1) pjroehl (1) peejaychilds (1) lukeofthetauri (1) fbouynot (1) bakerds (1) westerterp (1) peelman (1) jellejans (1) LoveSkylark (1) hvanoch (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (31) murrant (14) ottorei (6) electrocret (3) PipoCanaja (1) Feature Indicator on Port Notes tab when Port has notes ( #14923 ) - electrocret Syslog sink over http for logstash (or any json source) ( #14424 ) - Bierchermuesli Device Update hikvision camera detection ( #14943 ) - torbeckattsp APC UPS UIO sensor discovery bug ( #14942 ) - d-k-7 Add additional MOS / 7130 devices ( #14922 ) - kirk444 Add support for WTI console products ( #14920 ) - robje Update junos discovery yaml to reference total memory instead of buff\u2026 ( #14919 ) - GeantRA Add support for Trellix FireEye OS ( #14908 ) - mtentilucci Added cisco FTD 1150 to ftd.yaml ( #14907 ) - pjroehl Add more OIDs for determining hardware and serial attributes correctly ( #14904 ) - mwobst Add Cisco FTD Support for security appliances (x3) ( #14893 ) - mwobst Update test data to account for new vertiv.svg icon ( #14892 ) - mtentilucci Improve Corero CMS support ( #14876 ) - electrocret Add Avocent MergePoint Unity KVM Switch Support ( #14874 ) - mtentilucci Add Fortigate Webfilter stats ( #14873 ) - electrocret Add Cisco Firepower 4112 Support ( #14872 ) - lukeofthetauri Added PoE controller load and status sensors for Junos devices ( #14868 ) - bakerds Add Montclair EDFA Support ( #14852 ) - peelman Device - Add support for Scalance SC646-2C ( #14835 ) - jellejans Add Fortigate packet loss monitoring for Link-Monitor and SD-WAN ( #14828 ) - not-known Refactored Juniper SLA to include support for TWAMP and remove ambigu\u2026 ( #14787 ) - GeantRA Deltanet Lambdatrail LT2-S,HS ( #14661 ) - Bierchermuesli Add support for Battery Recommended Days Remaining ( #14653 ) - Jellyfrog Webui Pseudowires refresh ( #14882 ) - Bierchermuesli Alerting Jira transport: use template title ( #14883 ) - not-known Remove Time Elapsed extra space ( #14880 ) - electrocret Fix Alertlog messaging ( #14861 ) - electrocret Graphs Add graph_stat_percentile_disable config item to disable percentile lines/value printing ( #14887 ) - VVelox Convert NTP freq to use generic_stats ( #14834 ) - VVelox Update fail2ban to have better stat graphs and and fix generic_stats graph.php ( #14818 ) - VVelox Update various device graphs to to have better stats ( #14815 ) - VVelox Applications Add more docker stats ( #14767 ) - hvanoch Bug SnmpQuery, respect snmp.max_oid ( #14894 ) - murrant Add poller_groups (served) to the poller_cluster table ( #14886 ) - peejaychilds Actually use the stats graph for ntp-server_freq now, which as missed in #14834 ( #14884 ) - VVelox Add type checking to generic_stats.inc.php for $vars['to'] and $vars['from'] ( #14871 ) - VVelox Fix graphs for a search query ( #14864 ) - westerterp Fix interface parse unsets ( #14860 ) - electrocret Fix dbm calculation to return -60 instead of 0 ( #14858 ) - electrocret Cleanup Store empty user_func as null ( #14900 ) - Jellyfrog Documentation Fix typo in lnms device:add help ( #14937 ) - arjenz Add Azure example configuration for SAML authentication in documentation ( #14870 ) - fbouynot Tests Re-throw exceptions if we're in CI ( #14890 ) - Jellyfrog Misc Reorder check_icmp command to follow documented usage ( #14910 ) - mtentilucci Add multi-PR GitHub-apply ( #14875 ) - electrocret Allows GEO lookup with detailed internal Location information wrapped inside parentheses. ( #14799 ) - LoveSkylark Dependencies PHP dependency update ( #14927 ) - murrant Bump phpseclib/phpseclib from 3.0.18 to 3.0.19 ( #14903 ) - dependabot Bump webpack from 5.66.0 to 5.76.1 ( #14901 ) - dependabot 22.4.0 (2023-04-06) A big thank you to the following 180 contributors this last month: murrant (230) Jellyfrog (73) electrocret (29) PipoCanaja (25) fbouynot (24) VVelox (21) Npeca75 (17) dependabot (15) bnerickson (11) gs-kamnas (10) bonzo81 (8) santiag0z (8) rhinoau (8) mwobst (7) Martin22 (7) westerterp (6) peelman (6) laf (6) LoveSkylark (5) TheMysteriousX (5) SourceDoctor (5) KayckMatias (5) mtentilucci (4) not-known (4) Bierchermuesli (4) hanserasmus (4) noaheroufus (4) opalivan (4) geg347 (4) ottorei (4) Fehler12 (4) ppasserini (4) tim427 (3) fcqpl (3) kimhaak (3) luc-ass (3) bp0 (3) loopodoopo (3) earendilfr (3) bl3nd3r (3) charlyforot (3) GeantRA (2) systeembeheerder (2) dennypage (2) jasoncheng7115 (2) carbinefreak (2) gdepeyrot (2) bogdanrotariu (2) mabra94 (2) josh-silvas (2) mprins-RAM (2) SirMaple (2) quentinsch (2) Schouwenburg (2) aztec102 (2) wrongecho (2) bennet-esyoil (2) duhow (2) Mar974 (2) QuadPiece (2) kruczek8989 (2) slimey99uk (2) Jimmy-Cl (2) si458 (2) torbeckattsp (1) d-k-7 (1) arjenz (1) kirk444 (1) robje (1) pjroehl (1) peejaychilds (1) lukeofthetauri (1) bakerds (1) guipoletto (1) goebelmeier (1) MarlinMr (1) florisvdk (1) jellejans (1) kylegordon (1) zenbeam (1) gilrim (1) AleksNovak (1) tristanbob (1) da-me (1) fdomain (1) jaannnis (1) knpo (1) trs80 (1) MANT5149 (1) support-capensis (1) zeroservices (1) hvanoch (1) angeletdemon (1) alchemyx (1) rinsekloek (1) gewuerfelt (1) tuxgasy (1) hugalafutro (1) Blinq-SanderBlom (1) nightcore500 (1) mrwold (1) koocotte (1) VoipTelCH (1) cfitzw (1) jaaruizgu (1) pertruccio (1) ianhodgson (1) talkstraightuk (1) fufroma (1) fuzzbawl (1) otkd (1) kiwibrew (1) andrekeller (1) Olen (1) Frazew (1) jgelinas (1) mpikzink (1) squidly (1) daniel-franca (1) sashashura (1) tuomari (1) sembeek (1) huntr-helper (1) ktims (1) VirTechSystems (1) washcroft (1) Laplacence (1) Jarod2801 (1) ciscoqid (1) enferas (1) 00gh (1) PedroChaps (1) ajsiersema (1) prahal (1) paulgear (1) mostdaysarebaddays (1) dagbdagb (1) bile0026 (1) hjcday (1) spyfly (1) Bobdave (1) DaftBrit (1) nox-x (1) SanderBlom (1) thecityofguanyu (1) nsn-amagruder (1) mkuurstra (1) booth-f (1) sajiby3k (1) skandragon (1) glance- (1) twelch24 (1) kevinwallace (1) lfkeitel (1) steffann (1) p4k8 (1) micko (1) cliffalbert (1) HolgerHees (1) frenchie (1) claude191 (1) Cormoran96 (1) WillIrvine (1) lucalo72 (1) ssasso (1) dandare100 (1) ospfbgp (1) MrXermon (1) pandalion98 (1) eskyuu (1) martinberg (1) lpailhas (1) jonathanjdavis (1) IVI053 (1) LTangaF (1) dlangille (1) pfromme25 (1) woidi (1) manonfgoo (1) mzacchi (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (328) murrant (260) PipoCanaja (50) ottorei (36) laf (18) SourceDoctor (7) VVelox (6) electrocret (3) mpikzink (3) santiag0z (2) crazy-max (1) westerterp (1) SeeMyPing (1) fbouynot (1) Cormoran96 (1) bennet-esyoil (1) f0o (1) haxmeadroom (1) bboy8012 (1) Feature Indicator on Port Notes tab when Port has notes ( #14923 ) - electrocret Add display query to list_devices function ( #14747 ) - bonzo81 Split out lnms snmp convenience commands ( #14603 ) - murrant Add --forgot-key to key:rotate command ( #14495 ) - murrant Syslog sink over http for logstash (or any json source) ( #14424 ) - Bierchermuesli Improved Modern Modules ( #14315 ) - murrant Add @signedGraphTag() and @signedGraphUrl() blade directives ( #14269 ) - murrant Device settings: attempt to open related tab ( #14250 ) - murrant Error reporting ( #14190 ) - Jellyfrog Prepare for PHP 8.1 ( #14156 ) - Jellyfrog New Poller validations ( #14148 ) - murrant New lnms command to enable and disable plugins ( #14147 ) - murrant Support for SSL/TLS protected connections to MySQL databases ( #14142 ) - gs-kamnas Collect OS distro and LibreNMS version ( #14138 ) - murrant Lnms device:poll better feedback ( #14130 ) - murrant Per-App data storage ( #14087 ) - VVelox SnmpQuery walk multiple oids ( #14015 ) - murrant Add support to REST API for creating Maintenance Schedules for Device Groups ( #13985 ) - thecityofguanyu Automatic fixes for validation failures ( #13930 ) - murrant Allow unordered OIDs (global and per-os) ( #13923 ) - murrant Pre-Install settings ( #13906 ) - murrant Add ISIS discovery and polling for iosxe devices ( #13880 ) - WillIrvine Device_add support display field ( #13846 ) - murrant Add configuration support for IPMIv2 Kg key ( #13845 ) - pandalion98 Display Name in availability map ( #13841 ) - murrant Added --ping-only to snmp-scan.py ( #13810 ) - IVI053 Implement OAuth and SAML2 support ( #13764 ) - Jellyfrog Security Fix Service Template XSS ( #14659 ) - murrant Fix neighbours XSS ( #14658 ) - murrant Fix SNMP trap -> Eventlog XSS ( #14657 ) - murrant Fix XSS in api access ( #14551 ) - murrant XSS sanitize pwrstatd application script inputs ( #14545 ) - bnerickson Block disabled user session auth ( #14473 ) - murrant Fix group delete xss ( #14472 ) - murrant Fix alert rules XSS ( #14471 ) - murrant Fix xss in browser push transport ( #14470 ) - murrant Fix users xss ( #14469 ) - murrant Fix user mass assignment vulnerability ( #14468 ) - murrant Fix billing xss ( #14465 ) - murrant Fix memcached unserialize vulnerability ( #14459 ) - murrant Fix possible RSS XSS ( #14457 ) - murrant GitHub Workflows security hardening ( #14388 ) - sashashura Fix scheduled maintenance xss ( #14360 ) - murrant Add huntr.dev to SECURITY.md ( #14359 ) - huntr-helper Security fixes XSS in oxidized-cfg-check.inc.php and print-customoid.php ( #14126 ) - enferas Bumpver handlebars.js to 4.7.7 to resolve CVE-2021-23369 ( #13990 ) - gs-kamnas Fix services command injection ( #13932 ) - murrant Fix Graylog XSS ( #13931 ) - murrant Bump minimist from 1.2.5 to 1.2.6 ( #13872 ) - dependabot Fix SQL injection in get-host-dependencies ( #13868 ) - Jellyfrog Resolved XSS issue from alert rule list modal ( #13805 ) - laf Device Update hikvision camera detection ( #14943 ) - torbeckattsp APC UPS UIO sensor discovery bug ( #14942 ) - d-k-7 Add additional MOS / 7130 devices ( #14922 ) - kirk444 Add support for WTI console products ( #14920 ) - robje Update junos discovery yaml to reference total memory instead of buff\u2026 ( #14919 ) - GeantRA Add support for Trellix FireEye OS ( #14908 ) - mtentilucci Added cisco FTD 1150 to ftd.yaml ( #14907 ) - pjroehl Add more OIDs for determining hardware and serial attributes correctly ( #14904 ) - mwobst Add Cisco FTD Support for security appliances (x3) ( #14893 ) - mwobst Update test data to account for new vertiv.svg icon ( #14892 ) - mtentilucci Improve Corero CMS support ( #14876 ) - electrocret Add Avocent MergePoint Unity KVM Switch Support ( #14874 ) - mtentilucci Add Fortigate Webfilter stats ( #14873 ) - electrocret Add Cisco Firepower 4112 Support ( #14872 ) - lukeofthetauri Added PoE controller load and status sensors for Junos devices ( #14868 ) - bakerds Fortigate IPS Intrusions detected stats ( #14857 ) - electrocret Add support for Vsol v1600d EPON OLT ( #14853 ) - guipoletto Add Montclair EDFA Support ( #14852 ) - peelman Fix discovery for apc ats ( #14837 ) - florisvdk Device - Add support for Scalance SC646-2C ( #14835 ) - jellejans Include Samsung X Series printers ( #14831 ) - kylegordon Add Fortigate packet loss monitoring for Link-Monitor and SD-WAN ( #14828 ) - not-known EdgeOS OLT new sensors and changes ( #14807 ) - noaheroufus Update XDP string to exclude modern Cisco lightweight APs from discovery ( #14803 ) - tristanbob Extend filtering of graphs device_bits on cisco ASA ( #14796 ) - PipoCanaja Changed discovery OID in ets.yaml ( #14795 ) - da-me Added Support for SNS-3615-K9 ( #14792 ) - jaannnis Routeros fix lldp discovery on 7.7+ ( #14791 ) - knpo Refactored Juniper SLA to include support for TWAMP and remove ambigu\u2026 ( #14787 ) - GeantRA Fix cisco-flash ( #14772 ) - electrocret Eaton matrix wattage fix ( #14770 ) - peelman Add Universal Input Output support for APC ( #14766 ) - dennypage Eltek Enexus; Fix SmartpackS divisor and hardware discovery ( #14762 ) - peelman Nokia PMC Microwave Improvements ( #14761 ) - carbinefreak Additional sensors ( #14756 ) - peelman Add AXOS sensor data for PON Transceivers (the only transceivers Cali\u2026 ( #14741 ) - peelman Adding discovery of LSI MegaRAID Device Media Errors, Other Errors, a\u2026 ( #14729 ) - bnerickson Update fs-nmu.inc.php ( #14702 ) - gewuerfelt Stop net-snmp from interpreting the octet-string from rttMonEchoAdmin\u2026 ( #14676 ) - not-known Add state of the Fortigate link monitor health checks ( #14675 ) - not-known Adding support for loop-telecom devices ( #14674 ) - Blinq-SanderBlom Support Huawei SMU02B ( #14673 ) - nightcore500 Use 'counter' RRD type for some TrueNAS sensors ( #14670 ) - TheMysteriousX Device - Add support for \"Smartpack R\" ( #14665 ) - mrwold Deltanet Lambdatrail LT2-S,HS ( #14661 ) - Bierchermuesli Added divisor to SAF Integra-X temp sensors ( #14655 ) - noaheroufus Corrected ICT MPS hardware detection ( #14654 ) - noaheroufus Add support for Battery Recommended Days Remaining ( #14653 ) - Jellyfrog Adjusted PMP to accomodate various other 450 models. ( #14652 ) - noaheroufus Added support for Eltek Micropack 1U ( #14645 ) - fcqpl Added support for Eltek Flatpack S ( #14643 ) - fcqpl Added Moxa switching ifAlias/portName mapping ( #14633 ) - rhinoau Improve VRP power display ( #14624 ) - PipoCanaja Edgeos picked up as generic device ( #14612 ) - ianhodgson Added Moxa EDS-G516E optical sensors ( #14610 ) - rhinoau Fix eNexus total current for Smartpack S ( #14606 ) - murrant Disable SNMP Bulk for Delta UPS devices ( #14599 ) - fufroma Improved AIX os information collection ( #14595 ) - murrant More inclusive Cisco SB os detection ( #14594 ) - murrant IP Infusion OcNOS basic detection ( #14588 ) - murrant Fix APC current divide by zero ( #14578 ) - murrant Extend EfficientIP SolidServer support ( #14549 ) - PipoCanaja TAIT-Infra93 - Fix state + skip_values for Battery ( #14541 ) - opalivan Timos - Improve SAP stats graphing ( #14534 ) - mabra94 McAfee Web Proxy with COUNTER rrd_type on sensors ( #14529 ) - PipoCanaja Fix 'bke.yaml' discovery file ( #14524 ) - PipoCanaja Added support for additional Moxa EDS-P model ( #14523 ) - rhinoau Fix awplus ntp polling bug ( #14521 ) - murrant Add discovery support for Riedo Networks UPDU ( #14496 ) - andrekeller Use correct description oid ( #14489 ) - Jellyfrog Correct upsBypassVoltage oid ( #14488 ) - Jellyfrog Correct variable typo ( #14486 ) - Jellyfrog Hpe ilo: fix filesystem type regex ( #14485 ) - Jellyfrog Added Fortigate SD-WAN Health checks ( #14456 ) - mprins-RAM Dont include empty storage sensor ( #14453 ) - Jellyfrog Remove undefined sensors ( #14449 ) - Jellyfrog Use correct low warn limit variable ( #14447 ) - Jellyfrog Correct aviatModemCurModulationRx oid ( #14446 ) - Jellyfrog Fortinet FortiADC detection and basic statistics ( #14434 ) - westerterp MNI Microwave OS Add ( #14427 ) - carbinefreak Add OS tait-tnadmin for TN9300 ( #14413 ) - opalivan Skip empty drac state sensors ( #14409 ) - jgelinas Added support for additional Moxa EDS-G models ( #14405 ) - rhinoau Device - Add support for Vultan Environmental Monitoring units ( #14401 ) - squidly Issue samsung printer m4080 fx ( #14391 ) - daniel-franca Added status checks for (BWCC) battery status and condition for onboa\u2026 ( #14349 ) - quentinsch Enexus system output current fix ( #14324 ) - loopodoopo UHP VSAT modems ( #14317 ) - loopodoopo Ray2 - Oid repair at ber ( #14302 ) - Martin22 Routeros - Fix displaying distance in charts ( #14300 ) - Martin22 Added support for Ubiquiti UFiber OLT ( #14256 ) - Martin22 Fix ciena-sds inventory bugs ( #14252 ) - murrant F5 partition ram ( #14226 ) - fbouynot Add Cisco Flash storage support ( #14219 ) - fbouynot Fix luminato port poll ( #14217 ) - murrant Teltonika RUT fix ( #14202 ) - loopodoopo Initial support for Moxa AWK Industrial APs ( #14197 ) - rhinoau Mikrotik wifi station mode sensors ( #14193 ) - Npeca75 Update mellanox os image ( #14184 ) - Laplacence Change state_name for Racoms modulation ( #14174 ) - Martin22 Cisco SB/CBS environment sensors ( #14154 ) - Fehler12 Fix Rocky Linux and AlmaLinux icons and logos ( #14150 ) - murrant Add additional sysObjectIDs for variants of the Arista 7130 ( #14144 ) - gs-kamnas Eltex MES 2324p Add ( #14135 ) - aztec102 Solid Optics EDFAMUX support ( #14129 ) - murrant Merge netmanplus and riello and improve device support ( #14125 ) - murrant Device - Basic hatteras dslam integration ( #14115 ) - Bierchermuesli Bats support ( #14108 ) - Schouwenburg Solved aos6 problem where Librenms wasn't identifying all vlans ( #14107 ) - PedroChaps Fix Cisco polling BGP peers in non-default VRF ( #14105 ) - ajsiersema Added support for CheckPoint 1100, 1450 & 1490 models. ( #14074 ) - quentinsch Missing \"s\" in NsBsd.php ( #14067 ) - Mar974 Add full version of Mikrotik logo ( #14063 ) - QuadPiece Ns-bsd updated for SNS LTSB 3.7.19 ( #14060 ) - Mar974 Add apc battery operation time, including display in WebUI ( #14058 ) - mwobst Fix the parsing of the temperature unit value (CMCIII devices) ( #14056 ) - mwobst ZTE ZXA10 Update (Added dBm graphs) ( #14049 ) - aztec102 Update Mikrotik logo ( #14045 ) - QuadPiece Fix use of incorrect variable to retrieve current sensor value ( #14037 ) - dennypage Support Huawei SMU11B ( #14029 ) - murrant Update Teltonika Sensors for FW R_00.07.02 ( #14012 ) - hjcday Procurve hardware description cleanup ( #14007 ) - murrant Racom Ray2 and Ray3 - Modulation states added ( #14001 ) - Martin22 Fix OS Detection for USW-Flex-XG ( #13999 ) - spyfly Add support for Cisco Nexus 3550 series (formerly Exalink Fusion) devices ( #13992 ) - gs-kamnas Improve support for Arista/Metamako MOS devices ( #13988 ) - gs-kamnas Add Cisco Business Wirless to ciscowlc.yaml ( #13984 ) - nsn-amagruder Add Eaton SC200 OS model ( #13978 ) - slimey99uk Fortigate LTE sensor addition ( #13977 ) - slimey99uk Added BKE power supply support. ( #13972 ) - Martin22 Workaround issues with lldp information from GS108Tv1 ( #13971 ) - glance- Add additional OpenBSD PF graphs ( #13963 ) - kevinwallace Don't use bulk-walk for PrimeKey Appliances ( #13958 ) - bl3nd3r Fix avtech12e sensors ( #13943 ) - lfkeitel Support tplink routers ( #13922 ) - si458 Aviat WTM reduce snmp load ( #13918 ) - murrant Fix Hytera error ( #13909 ) - murrant [mikrotik] fixed RouterOS ipv4/ipv6 routes ( #13902 ) - Npeca75 PrimeKey Improvements ( #13901 ) - bl3nd3r Enhancements for Zyxel OS ( #13897 ) - Jimmy-Cl Added support for Dell PowerVault ME4024 ( #13883 ) - laf Add support for Riello NetMan 204 ( #13878 ) - lucalo72 Fix usw flex switch hardware detection ( #13877 ) - Fehler12 Added Polycom Lens SNMP support. ( #13876 ) - Fehler12 Fix for PFSense state table removals field ( #13863 ) - dandare100 Add support for VOSS 8.6 ( #13857 ) - ospfbgp McAfee Proxy Sensor name update ( #13853 ) - PipoCanaja Device - HWG-WLD version 2 support ( #13849 ) - PipoCanaja Fix an issue with the APC current discovery ( #13837 ) - eskyuu Add VS state for Gaia ( #13831 ) - martinberg [new OS] Alpine OptoElectronics TDCM-EDFA support ( #13825 ) - charlyforot Fix db delete on cisco-vrf-lite discovery ( #13823 ) - lpailhas Add rocky linux OS identification ( #13815 ) - hanserasmus Detect truenas scale ( #13812 ) - si458 Add support for PrimeKey Hardware Appliance ( #13806 ) - bl3nd3r [comware] dropped dbfetch from discovery/sensors ( #13796 ) - Npeca75 BGP unnumbered support for Cumulus ( #13785 ) - charlyforot Correct divisor in discovery definition vertiv-pdu.yaml ( #13768 ) - woidi Netscaler new counter metrics ( #13323 ) - mzacchi Webui Pseudowires refresh ( #14882 ) - Bierchermuesli Fix port speed setting feedback ( #14743 ) - murrant Fix Cimc on Overview ( #14727 ) - electrocret Search devices also in display ( #14714 ) - gdepeyrot Fix check rrd file exists with remote rrdcached ( #14690 ) - tuxgasy Use displayname instead of hostname for Device Maintenance Modal Title ( #14681 ) - electrocret Remove ungrouped devices panel ( #14664 ) - murrant Custom port view fix ( #14637 ) - SourceDoctor Fix billing graph divide by zero when the period is zero or doesn't exist ( #14623 ) - jaaruizgu Fix port neighbors missing ( #14586 ) - murrant Fix some icons ( #14584 ) - murrant [About] Open Laravel and RRDtool link in new tab ( #14568 ) - santiag0z [About] Open the contributor list link in a new tab ( #14553 ) - santiag0z Fix v2 plugins ( #14506 ) - murrant Check if service_name is empty or equal to service_type ( #14499 ) - luc-ass Show id on device dependencies ( #14497 ) - SourceDoctor Userlist description fix ( #14482 ) - mprins-RAM Sort alert transport by name ( #14464 ) - SourceDoctor Fix missing device_id from device alert logs ( #14460 ) - ottorei Fix about date display ( #14442 ) - murrant Fix pseudowires pages ( #14441 ) - murrant Enhanced Service Overview on Device Overview Page ( #14410 ) - luc-ass Disable plugins that have errors ( #14383 ) - murrant Fix Inventory table for Dark theme ( #14377 ) - electrocret Add initselect2 to locations ports ( #14375 ) - KayckMatias Update devices filter in alert-logs to init_select2 ( #14361 ) - KayckMatias Load device selection dynamically on Ports page ( #14353 ) - KayckMatias Port pages fixes and cleanups ( #14310 ) - murrant Remove Caffeine ( #14277 ) - murrant Updated brother.svg to make it render in Safari ( #14271 ) - luc-ass Fix for Cisco group device health tab ( #14265 ) - fbouynot Fix dashboard widgets becoming unlocked (especially when using a touchscreen) ( #14222 ) - tim427 Migrate xDSL code to module, and add support for VDSL2 MIB ( #14207 ) - PipoCanaja Fix ports display ( #14183 ) - murrant Ports by device group ( #14175 ) - electrocret Empty Outages table ( #14167 ) - Npeca75 View Ports in Portgroups ( #14141 ) - electrocret Fix eventlog filtering ( #14136 ) - murrant Fix device filtering false values ( #14103 ) - murrant [gui] enable permanent vertical scroll ( #14102 ) - Npeca75 Minor visual changes to the apps-overview page ( #14090 ) - bennet-esyoil Improved sorting options for Availability Map ( #14073 ) - mwobst Search device by MAC via URL ( #14072 ) - duhow Add BGP description to eventlog BGP Peers messages ( #14061 ) - mostdaysarebaddays Slightly easier validation page error access ( #14044 ) - murrant Dashboard code cleanup ( #13996 ) - murrant Update dark mode to fix BGP and Peering page ( #13951 ) - Jimmy-Cl Validate base_url and server_name ( #13941 ) - murrant Fix snmp.timeout setting via Web UI ( #13937 ) - murrant Add ISIS-details to alert details ( #13920 ) - ottorei Fix port mini graphs ( #13911 ) - murrant Replaced OpenWRT icon with new logo ( #13891 ) - frenchie Add \"Ping Response\" graph to \"Ping Only\" Device Overview page ( #13886 ) - westerterp Remove fix size for column mac adresse ( #13881 ) - Cormoran96 Fixed the top port errors widget returning bits graphs instead ( #13860 ) - laf Fix class error name prevents to show BER graph ( #13833 ) - charlyforot Fixed displaying hostname in create bill when port is passed ( #13830 ) - laf Fix Oxidized Config tab showing when Device OS or Device Type is disabled ( #13809 ) - westerterp Position the buttons in the center on user preferences page ( #13802 ) - santiag0z Add usage hints for Display Name placeholder usage ( #13801 ) - LTangaF Fix second menu bar in Apps screens ( #13800 ) - westerterp WebUI - Search results for ports ( #13787 ) - PipoCanaja Device Types Widget ( #13670 ) - SourceDoctor Alerting Jira transport: use template title ( #14883 ) - not-known Remove Time Elapsed extra space ( #14880 ) - electrocret Fix Alertlog messaging ( #14861 ) - electrocret Fix MS Teams alert transport, correct HTTP header ( #14843 ) - goebelmeier Add support for topics ( #14804 ) - AleksNovak Adding sample alert for systemd application ( #14711 ) - bnerickson Polling poller debug ( #14691 ) - electrocret Add -I flag to Traceroute cmd ( #14667 ) - electrocret Alert map location fix ( #14380 ) - KayckMatias Populate the alert rule field with the builder json ( #14374 ) - murrant Discord ability to attach graph images ( #14276 ) - murrant Email Transport: embed graphs by default ( #14270 ) - murrant Correct logic for recurring alert rules that span UTC days ( #14145 ) - gs-kamnas Improvements to PagerDuty alert formatting ( #14143 ) - gs-kamnas Example rules for diskspace on / ( #14082 ) - VVelox Add rich (=html) support for messages via Matrix ( #14054 ) - mwobst Add macro.past_20m macro ( #14023 ) - kruczek8989 Allow the use of a custom URL for accessing the PagerDuty API and correct API schema violation ( #14010 ) - gs-kamnas Setting MSteams card summary to alert title ( #13989 ) - DaftBrit More realistic alert test data ( #13969 ) - murrant Use display name when sending alerts to Sensu ( #13967 ) - TheMysteriousX Correct type hint ( #13915 ) - TheMysteriousX Improve alert template saving ( #13910 ) - murrant Added Basic authentication capability to Alertmanager Transport ( #13867 ) - geg347 Newer versions of Jira use HTTP code 201 fore created issues ( #13852 ) - MrXermon Add extra dynamic values alerttransport alertmanager ( #13828 ) - geg347 Add generic PSU status failed alert rule template ( #13821 ) - geg347 Graphs Add graph_stat_percentile_disable config item to disable percentile lines/value printing ( #14887 ) - VVelox Convert NTP freq to use generic_stats ( #14834 ) - VVelox Update fail2ban to have better stat graphs and and fix generic_stats graph.php ( #14818 ) - VVelox Update various device graphs to to have better stats ( #14815 ) - VVelox Update HV::Monitor support to use generic_stats.inc.php ( #14814 ) - VVelox Only show Eth errors when Etherlike is enabled ( #14784 ) - electrocret Fix graph output base64 ( #14701 ) - murrant Fix some graphs not respecting device display name ( #14684 ) - murrant Adding Average into graphs ( #14679 ) - bogdanrotariu Fix device poller modules graph ( #14640 ) - murrant Bug - XDSL module - rrd_def and rrd file definition issue for Actual rate ( #14597 ) - PipoCanaja Fix graph errors wrong content type ( #14574 ) - murrant Improve graph embedded title handling ( #14544 ) - murrant Graphing cleanup ( #14492 ) - murrant Return GraphImage to include more metadata ( #14307 ) - murrant Fix unauth application graphs ( #14216 ) - murrant Allow specifying the background colour in graph images ( #14192 ) - washcroft Ping perf ( #14117 ) - 00gh [RRD] fix IPv6 folder name ( #13945 ) - Npeca75 Snmp Traps Adds Cisco DHCP Server SNMP MIB and Trap Handlers. ( #14618 ) - josh-silvas Improve LinkUp and LinkDown trap handling incomplete traps ( #14385 ) - tuomari Add Cisco Err-Disable interface event trap handler ( #13855 ) - bonzo81 Add APC SmartAvrReducing trap handlers ( #13839 ) - bonzo81 Add APC upsOnBattery & powerRestored trap handler ( #13836 ) - bonzo81 Add OspfTxRetransmit Trap Handler ( #13824 ) - bonzo81 Cisco Mac address violation trap handler ( #13811 ) - bonzo81 Applications Add a few more graphs for CAPEv2 ( #14813 ) - VVelox CAPEv2 support ( #14801 ) - VVelox Add more docker stats ( #14767 ) - hvanoch Update Nvidia application - values in wrong charts ( #14736 ) - fcqpl Removing max polling restriction for wireguard traffic RRD data ( #14710 ) - bnerickson Alarm Flag on UPS-Nut Application ( #14635 ) - SourceDoctor Adding wireguard app to the apps overview page ( #14629 ) - bnerickson Adding wireguard application support ( #14625 ) - bnerickson Adding systemd service status application ( #14540 ) - bnerickson Memcached application: improve error visibility ( #14536 ) - murrant Fix memcached polling bug ( #14501 ) - murrant Add pwrstatd application ( #14365 ) - bnerickson Add HV Monitor, a generic means for monitoring hypvervisors ( #14218 ) - VVelox Add possibility to monitor redis application through the unix-agent ( #14182 ) - earendilfr Fix error between application module and unix-agent ( #14177 ) - earendilfr Add possibility to monitor the php-fpm service with the unix agent ( #14173 ) - earendilfr Base64 gzip compression support for json_app_get ( #14169 ) - VVelox [apps] Docker only show current containers ( #14152 ) - Npeca75 Fix app docker ( #14080 ) - prahal Add support for Sagan ( #14070 ) - VVelox Add Opensearch\\Elasticsearch monitoring ( #14053 ) - VVelox Add error-state to non-responsive mysql-servers ( #13993 ) - bennet-esyoil Remove alert keys from component for Suricata ( #13959 ) - VVelox Fix a few issues with variable names for Suricata ( #13956 ) - VVelox Scripts/json-app-tool.php JSON generation fix and add -S for SNMP extend name ( #13948 ) - VVelox Add Suricata monitoring ( #13942 ) - VVelox Api Fix for RIPE NCC API Tools ( #14757 ) - LoveSkylark Use Oxidized API client and add support for groups on config get ( #14750 ) - electrocret API list_devices update with sysName, location_id and type ( #14731 ) - bonzo81 Port search API search more than one fields ( #14646 ) - murrant Added disable_notify and location_id ( #14619 ) - pertruccio Add sortorder parameter to list_logs ( #14600 ) - talkstraightuk API restore ability to update purpose and override_sysLocation ( #14596 ) - murrant API graphs, variable whitelist ( #14552 ) - murrant Graph API use new code path ( #14493 ) - murrant Adding device's field in get_alert_rule and list-alert-rules API function (new) ( #14481 ) - geg347 Fix update_device hostname handling #14435 ( #14448 ) - rhinoau Fix port search with slashes ( #14403 ) - murrant Add Columns to search_ports API function ( #14348 ) - electrocret Allow delete location by id ( #14334 ) - bp0 API update_device, make location field work (as does location_id) ( #14325 ) - bp0 Standardize device and device group maintenance API ( #14153 ) - rhinoau Fix maintenance APIs not associating device or group ( #14127 ) - murrant Ensure 'add_device' API returns indexed-array (as per doco) ( #13887 ) - claude191 Adds API call to update port notes on devices. ( #13834 ) - josh-silvas Discovery Prevent spurious MAC changes on multi-interface devices ( #14671 ) - TheMysteriousX Fix discovery ignores custom ipmi port ( #14660 ) - VoipTelCH Cisco NAC fix ( #14440 ) - murrant Fix legacy os extends ( #14220 ) - murrant Sensors - Allow changing RRD type in YAML and PHP sensor discovery ( #14208 ) - PipoCanaja Sensors, convert hex to strings ( #14121 ) - murrant Fix printer count sensors when extra garbage is returned ( #14014 ) - murrant Fix polling and discovery of FortiGate cluster sensors ( #13980 ) - mkuurstra Polling Fix ArubaInstance channel decode issue ( #14732 ) - murrant Don't poll sysDescr, sysObjectID, and sysName so frequently ( #14562 ) - murrant Add connection exception handling to all redis calls ( #14467 ) - Frazew Fix bgp-peers bgpPeerIface bug and update test data ( #14420 ) - murrant Fix ping.php skipped results ( #14368 ) - sembeek Fix for number in sensor string ( #14185 ) - Schouwenburg Increase traceroute timeout ( #14084 ) - murrant Fix STP polling bug ( #13924 ) - murrant Print full error message in poller/discovery output ( #13903 ) - murrant Rancid Add MRV OptiDriver support in gen_rancid ( #13900 ) - cliffalbert Add support for VyOS on Rancid conf ( #13874 ) - ssasso Oxidized Show display name in Oxidized config search ( #14800 ) - electrocret Adding Fortigate switches to Oxidized model mapping config ( #14782 ) - LoveSkylark Fix oxidized web requests unclosed connections or responding fast enough ( #14370 ) - fbouynot Oxidized \"allow purpose and notes\" ( #14352 ) - LoveSkylark Syslog-notify-oxidized.php now always notifies Oxidized ( #14011 ) - murrant Fix Oxidized syslog change notifier when the change was made via snmp. ( #14005 ) - kruczek8989 Oxidized API to return groups based on device purpose or notes ( #13976 ) - sajiby3k Authentication Update Radius auth to accept permissions attributes ( #14531 ) - kimhaak Rework socialite integration ( #14367 ) - Jellyfrog AD Auth PHP 8.1 fixes ( #14215 ) - murrant Add option STARTTLS for authentication via AD ( #14051 ) - dagbdagb Auth_ldap_skip_group_check when ldap_compare is not supported ( #13926 ) - micko Implement support for usernames coming from reverse proxies ( #13894 ) - HolgerHees Add LDAP bind and userlist filter support to ldap-authorization ( #13788 ) - pfromme25 Bug SnmpQuery, respect snmp.max_oid ( #14894 ) - murrant Add poller_groups (served) to the poller_cluster table ( #14886 ) - peejaychilds Actually use the stats graph for ntp-server_freq now, which as missed in #14834 ( #14884 ) - VVelox Add type checking to generic_stats.inc.php for $vars['to'] and $vars['from'] ( #14871 ) - VVelox Fix graphs for a search query ( #14864 ) - westerterp Fix interface parse unsets ( #14860 ) - electrocret Fix dbm calculation to return -60 instead of 0 ( #14858 ) - electrocret Revert \"Fix entity-state polling/discovery\" ( #14811 ) - murrant Fix entity-state polling/discovery ( #14793 ) - fdomain Update PingCheck.php to remove duplicate \"Device status changed to ... from icmp check.\" event ( #14785 ) - MANT5149 Fix calculated dbm ( #14771 ) - electrocret Handle Division by 0 error for SvcFdbTableSize ( #14672 ) - mabra94 Fix sqlite test ( #14642 ) - murrant Remove extends and hardware detection support ( #14626 ) - murrant Set 0 as integer in loading of graylog. ( #14621 ) - kimhaak Fix GeocodingHelper type-hinting ( #14604 ) - Jellyfrog Bug in Ciscowlc AP graphs definition ( #14585 ) - PipoCanaja SnmpQuery fix mib directory order ( #14580 ) - murrant SnmpQuery Handle empty oids in get more gracefully ( #14577 ) - murrant Fix PTOPO mib in module discovery-protocols ( #14564 ) - PipoCanaja Fix Type error ( #14555 ) - fbouynot Correct variable use in billing ( #14533 ) - Jellyfrog Fix sensor limit linked port rules in collection ( #14520 ) - electrocret EES Rectifier various fixes from MIB + added tests ( #14519 ) - opalivan Fix fetch ifEntry logic ( #14483 ) - Jellyfrog Add a few breaks to avoid connection flooding for the irc-bot ( #14479 ) - Olen Snmpwalk functions: dont include invalid data ( #14438 ) - Jellyfrog Fix VRP duplicate BGP Peers ( #14431 ) - PipoCanaja Version and git helper improvements ( #14412 ) - murrant Cache version data ( #14404 ) - murrant Fix rpi codec state sensor ( #14400 ) - murrant Fix libvirt count() uncountable error ( #14398 ) - murrant Fix Firebrick local ASN ( #14397 ) - murrant Fix ups nut PHP 8 issue ( #14392 ) - murrant Fix cipsec-tunnels ftd bad data causes error ( #14366 ) - murrant Handle null in unix-agent ( #14358 ) - murrant Fix the case of 'Ungrouped' in smokeping integration ( #14351 ) - fbouynot Fix for smokeping integration with ping-only devices ( #14341 ) - fbouynot Match displayname source for graylog ( #14339 ) - fbouynot Check dot1dBasePortIfIndex exists before using it ( #14337 ) - Jellyfrog Prevent errors when hrStorageTable doesn't exist ( #14327 ) - Jellyfrog Revert \"ZTE ZXA10 Update (Added dBm graphs)\" ( #14320 ) - murrant Billing module fix/cleanup ( #14309 ) - electrocret SnmpResponse filterBadLines fix ( #14306 ) - murrant Fix ARP Table on Device overview ( #14304 ) - Npeca75 Disable error reporting when dependencies are outdated ( #14291 ) - murrant Don't send zeros to Graphite for missing metrics ( #14262 ) - ktims Fix removing all port groups ( #14253 ) - murrant Move cronjob time for daily.sh ( #14245 ) - Jellyfrog Firebrick bgp polling was broken ( #14237 ) - murrant Quick fix for cipsec-tunnels Cisco implementation ( #14232 ) - PipoCanaja Fix redeclare of function breaking tests in OS eltex-mes23xx ( #14227 ) - PipoCanaja Autodiscovery fix ( #14213 ) - Npeca75 Fix alert log clearing SQL query ( #14200 ) - Jellyfrog Fix error when ldap_search returns false ( #14199 ) - Jellyfrog Fix unnecessary Updates of DB when values are equal ( #14179 ) - opalivan Fix APP_KEY generation when using fpm ( #14168 ) - Jellyfrog Fix validation error ( #14163 ) - TheMysteriousX IPv6 Debug typo ( #14162 ) - Npeca75 Replace git show --no-patch option with --quiet ( #14160 ) - ciscoqid Fix 500 error in validation when UI containers and poller containers have differing node_ids ( #14146 ) - gs-kamnas Use --no-patch to support old git clients ( #14137 ) - Jellyfrog Prevent duplicate plugin table entries ( #14120 ) - murrant Fix auth_test.php debug ( #14118 ) - murrant Fix config seeder will never run ( #14113 ) - murrant Reset the opcache after install ( #14098 ) - murrant Update config cache on install finalize step ( #14097 ) - murrant Fix more webserver validation issues ( #14096 ) - murrant Revert \"Add apc battery operation time, including display in WebUI\" ( #14068 ) - PipoCanaja Use --no-patch instead ( #14047 ) - Jellyfrog Git version validation improvement ( #14042 ) - murrant Server name validation, handle ports better ( #14041 ) - murrant Fix some broken migrations ( #14040 ) - Jellyfrog Fix rrd version validation check ( #14036 ) - murrant Fix DB timezone validation ( #14035 ) - murrant Regression fix from #13596 ( #14034 ) - Jellyfrog Fix an issue when getting the local version from git ( #14020 ) - murrant Fix migrations failing one time after dashboard cleanup ( #14002 ) - murrant Fix Netscaler VServer database updates during polling ( #13995 ) - Bobdave Fix 500 error in validations when capabilities are not supported or set ( #13991 ) - gs-kamnas Inconsistency in ldap starttls config parameter ( #13987 ) - nox-x Fix version check error ( #13981 ) - murrant Use full sudo path ( #13975 ) - skandragon Fix IPv6 in service check host ( #13939 ) - steffann Validate fixes ( #13935 ) - murrant Lnms device:add handle snmp.community bad format ( #13914 ) - murrant Fix install icons ( #13904 ) - murrant Handle bad uptime input ( #13899 ) - murrant Fix custom error messages ( #13898 ) - murrant Migrate addhost.php to lnms device:add ( #13870 ) - murrant Rewrite agent packages parsing code ( #13840 ) - murrant Fix snmpv3 context when empty SnmpQuery ( #13832 ) - murrant Regression fix from b6a8b602b891d9eb8633f62632c17bdc559cd620 ( #13819 ) - Jellyfrog Fix PHPStan Deprecated test ( #13794 ) - Jellyfrog Refactor Unify time interval formatting ( #14733 ) - murrant Remove Log::event ( #14526 ) - Jellyfrog Cleanup and optimize the availability widget ( #14329 ) - murrant Fix a few Db* to Eloquent requests ( #14278 ) - PipoCanaja Use \"database version\" instead of \"mysql version\" ( #14158 ) - Jellyfrog Improve the efficiency of some queries ( #13974 ) - murrant Move Config loading to a service provider ( #13927 ) - murrant Port Validation Page to Laravel ( #13921 ) - murrant Remove addHost from ModuleTestHelper ( #13847 ) - murrant New device:add code ( #13842 ) - murrant Cleanup Store empty user_func as null ( #14900 ) - Jellyfrog Consolidate and improve snmptranslate usage ( #14567 ) - murrant Remove graph_min ( #14561 ) - murrant Remove $_GET from graphs ( #14554 ) - murrant Undefined array key fixes ( #14532 ) - Jellyfrog Use Collection instead of collect() ( #14527 ) - Jellyfrog Convert string references to ::class ( #14508 ) - Jellyfrog Miscellaneous cleanup - part 5 ( #14502 ) - Jellyfrog Type API methods and properties ( #14476 ) - fbouynot Miscellaneous cleanup - part 4 ( #14452 ) - Jellyfrog Miscellaneous cleanup - part 3 ( #14450 ) - Jellyfrog Miscellaneous cleanup, mostly undefined variables - part2 ( #14445 ) - Jellyfrog Remove tabs from yaml ( #14437 ) - Jellyfrog Miscellaneous fixes, mostly undefined variables ( #14432 ) - Jellyfrog Trim whitespaces from device data ( #14429 ) - Jellyfrog Fix bgp_peer array_merge error ( #14416 ) - PipoCanaja Defer loading cli option defaults ( #14363 ) - Jellyfrog Remove call to Config from artisan ( #14362 ) - Jellyfrog Mibs - Cleanup names ( #14323 ) - PipoCanaja Enable more checks ( #14318 ) - Jellyfrog Do not include _token in legacy vars ( #14313 ) - murrant Don't include null os when loading defs ( #14312 ) - murrant 2fa not all routes have names ( #14311 ) - murrant Cache astext for 1 day ( #14303 ) - murrant Linux distro images require feature field ( #14301 ) - murrant Silence return type mismatch ( #14298 ) - Jellyfrog Fix more percent calculations ( #14294 ) - murrant Fix rounding null in mempools module ( #14290 ) - murrant Check if polling module exists ( #14289 ) - murrant Fix undefined variable ( #14287 ) - murrant Handle connection timed out errors in unix agent ( #14286 ) - murrant Remove unused function ( #14283 ) - murrant Remove reference to unused variable ( #14280 ) - murrant Cleanup some RunAlerts issues ( #14274 ) - murrant Fix a bunch of \"Since fakerphp/faker 1.14: Accessing property..\" ( #14267 ) - Jellyfrog Fix more error exceptions ( #14266 ) - Jellyfrog Fix hrStorageType being undefined ( #14260 ) - Jellyfrog Misc errors cleanup ( #14257 ) - Jellyfrog Fix ipv6 hexdec error ( #14254 ) - murrant Use empty string instead of null for routes ( #14247 ) - Jellyfrog Sort device types alphabetically ( #14244 ) - VirTechSystems Misc webui code cleanups ( #14242 ) - murrant Fix some ErrorExceptions ( #14241 ) - Jellyfrog Fix os_group unset errors ( #14238 ) - murrant Juniper bgp-peers cleanup ( #14236 ) - murrant Percentage calculation helper ( #14235 ) - murrant Memcached app undefined vars ( #14225 ) - Npeca75 Fix Undefined variable/key warnings ( #14134 ) - murrant Remove mib poller module remnants ( #14077 ) - murrant Remove traceroute6, it is unused ( #14019 ) - murrant Remove DefaultWidgetSeeder ( #14006 ) - murrant Better device:add error output ( #13913 ) - murrant Remove non-working Dell specific alert rules from the collection ( #13706 ) - Fehler12 Documentation Fix typo in lnms device:add help ( #14937 ) - arjenz Add Azure example configuration for SAML authentication in documentation ( #14870 ) - fbouynot Fix Okta image in docs ( #14848 ) - westerterp Change socialite settings URI ( #14845 ) - fbouynot Fix possible confusion around php-fpm settings ( #14844 ) - hanserasmus Use docker compose v2 ( #14841 ) - MarlinMr Fix typo in Oauth doc ( #14840 ) - fbouynot Add Zenduty Integration info to Transports.md docs ( #14826 ) - zenbeam Update config docs - dump current config ( #14820 ) - hanserasmus Add SELinux instructions for nginx monitoring ( #14812 ) - fbouynot Add SELinux instructions for systemd monitoring ( #14809 ) - fbouynot Add SELinux instructions for systemd monitoring ( #14806 ) - fbouynot Debian 11 Sury DPA provides PHP 8.2 ( #14798 ) - tim427 Update Syslog.md ( #14794 ) - systeembeheerder Update Authentication.md ( #14788 ) - trs80 Fix Doc Link for Canopsis transport ( #14778 ) - support-capensis Update ElasticSearch Index pattern for php 8.1 changes ( #14775 ) - zeroservices Install updates for Rocky8 ( #14722 ) - angeletdemon Updating certificate script documentation ( #14721 ) - bnerickson Update Docker.md with proper path to unzipped files ( #14717 ) - alchemyx Fix typo: purge-port.php file name ( #14712 ) - santiag0z Alert template example uses incorrect variable ( #14683 ) - electrocret Correct squid snmpd.conf proxy host syntax ( #14678 ) - hugalafutro Fix Traceroute debug alert template snippet ( #14668 ) - electrocret Update Dispatcher docs for Debian and for non /opt/librenms installation ( #14663 ) - koocotte Fix Location mapping docs ( #14644 ) - electrocret Update config name for the default device display ( #14641 ) - cfitzw Update Dispatcher-Service.md ( #14632 ) - systeembeheerder Updating postgres application documentation ( #14627 ) - bnerickson Documentation for Observium Migration ( #14601 ) - LoveSkylark Add snmp_flags and tips on string oids to the docs ( #14579 ) - murrant Clarify Dispatcher-Service.md for systemd ( #14575 ) - fuzzbawl Update license section of readme ( #14571 ) - otkd Remove outdated rules videos ( #14505 ) - kiwibrew Docker quick install ( #14475 ) - murrant Updating details of my LibreNMS install ( #14458 ) - SirMaple Fix php7.2 occurence in Performance.md documentation ( #14394 ) - fbouynot Fix documentation for php8.1 and bad package name ( #14393 ) - fbouynot Move list_locations from devices to locations ( #14328 ) - bp0 Cisco-sla module was renamed to slas ( #14288 ) - murrant Update docs around APP_URL ( #14282 ) - murrant Update to mkdocs-material 8.3.9 ( #14189 ) - Jellyfrog SNMP extend / fix mdadm documentation ( #14186 ) - Npeca75 Update index.md ( #14178 ) - Jarod2801 Add instructions for PHP 8.1 and Ubuntu 22.04 ( #14166 ) - Jellyfrog Update php installation instruction for CentOS 8 to reflect the minim\u2026 ( #14159 ) - fbouynot Fix typo in Smokeping SELinux documentation ( #14155 ) - fbouynot Add device_default_display info ( #14151 ) - murrant Change SELinux context for logs ( #14128 ) - fbouynot Small documentation typos ( #14101 ) - wrongecho Documentation typos ( #14099 ) - wrongecho Add SELinux configuration for SNMPd on Centos8 in the documentation ( #14095 ) - fbouynot Add SELinux configuration for LDAP/AD authentication on Centos8 in the documentation ( #14094 ) - fbouynot Add SELinux configuration for Smokeping on Centos8 in the documentation ( #14093 ) - fbouynot Add SELinux configuration for RRDCached on Centos8 in the documentation ( #14092 ) - fbouynot Corrected API devicegroup curl creation examples ( #14081 ) - rhinoau Minor grammar fixes in doc ( #14078 ) - paulgear Add documentation for Chrony application monitoring ( #14066 ) - ottorei Okta saml ( #14038 ) - bile0026 HPE Comware snmp config example ( #13997 ) - murrant Fix typo in dispatcher service doc ( #13979 ) - booth-f Fix a typo in alerting doc ( #13970 ) - twelch24 DOCS, switch to dark or light mode ( #13953 ) - santiag0z Assorted cleanups to alerting docs, primarily to make mdl happier ( #13950 ) - VVelox Update test doc making it more mdl happy and add a section on writing JSON app tests ( #13949 ) - VVelox Docs, fix code block in oxidized group ( #13908 ) - santiag0z [DOC] Fix Code blocks Step 2 Installing Network-WeatherMap ( #13905 ) - santiag0z [DOC] Styling the .env word quote ( #13889 ) - santiag0z Docs, fix Linux SNMP example only listening on ::1 ( #13882 ) - murrant Script that describes how to migrate traffic bills from observium. ( #13757 ) - manonfgoo Translation Update zh-TW.json ( #14765 ) - jasoncheng7115 Create files with Traditional Chinese translation ( #14764 ) - jasoncheng7115 Fix Typo in Settings ( #14443 ) - electrocret Serbian translation, part3 ( #14205 ) - Npeca75 More Serbian translation ( #14181 ) - Npeca75 Enable translation on Eventlog & Component-status widgets ( #14180 ) - Npeca75 Initial support for Serbian language ( #14165 ) - Npeca75 Enable translation in 3 Alert widget ( #14164 ) - Npeca75 Few more updates to Ita lang ( #14091 ) - ppasserini Italian language update ( #14085 ) - ppasserini Adjustments to german translation ( #14083 ) - mwobst Small Italian lang update ( #13960 ) - ppasserini Ukrainian translation update ( #13933 ) - p4k8 Few more language (ITA) updates ( #13890 ) - ppasserini Tests Re-throw exceptions if we're in CI ( #14890 ) - Jellyfrog Adding certificate application tests ( #14708 ) - bnerickson Mock astext ( #14581 ) - murrant Github tests log improvement ( #14559 ) - murrant Improve trap testing ( #14546 ) - murrant Remove unused phpstan tests ( #14503 ) - Jellyfrog Speed up tests ( #14421 ) - murrant Fix cisco-pw test capture ( #14415 ) - murrant Test supported PHP versions only ( #14389 ) - murrant Run CI on ubuntu 22.04 ( #14379 ) - Jellyfrog Do not allow sysDescr to be fetched in os module yaml ( #14331 ) - murrant Remove PHP version constraint ( #14314 ) - Jellyfrog Lnms dev:simulate check simulated device exists ( #14243 ) - murrant Save-test-data to refresh all variants of an OS ( #14231 ) - PipoCanaja Allow save-test-data.php to run all modules explicitely ( #14212 ) - PipoCanaja Increase OS detection time, sometimes it is not ready by 5s ( #14133 ) - murrant Test PHP 8.1 ( #14109 ) - murrant Fix tests failing when device with IP 127.1.6.1 exists ( #14016 ) - murrant PHP8 phpstan fix ( #13843 ) - murrant Fix tests for MariaDB > 10.5.15 ( #13829 ) - Jellyfrog Misc Reorder check_icmp command to follow documented usage ( #14910 ) - mtentilucci Add multi-PR GitHub-apply ( #14875 ) - electrocret Use Device displayname on VRF page ( #14851 ) - electrocret Fix empty output on validation test ( #14822 ) - hanserasmus Allows GEO lookup with detailed internal Location information wrapped inside parentheses. ( #14799 ) - LoveSkylark Add MAC OUI caching when code updates are disabled ( #14713 ) - gdepeyrot New schema dump ( #14630 ) - Jellyfrog Add check_hetzner_storagebox to includes/services ( #14463 ) - SirMaple Add instance id to error reports ( #14444 ) - murrant Update ports_purge docs and definitions ( #14402 ) - KayckMatias Added Ubuntu and Raspbian to ifAlias script ( #14399 ) - tim427 Defer loading cli option values ( #14354 ) - murrant Allow dumping of errors and warnings ( #14275 ) - murrant Allow reapply yaml config via env ( #14100 ) - murrant Lnms scan respect -q parameter ( #14027 ) - murrant Improve lnms shortcut validation ( #13982 ) - murrant Internal Features Number Casting allow preceding space ( #14699 ) - murrant DeviceCache::get() allow hostname ( #14649 ) - murrant Improve SnmpResponse value() ( #14605 ) - murrant SnmpQuery numeric accept a boolean ( #14565 ) - murrant Support regex in os field replace ( #14563 ) - murrant More Replacement Capabilities for sensor index computation ( #14522 ) - PipoCanaja Ignore CommandNotFoundException from reporting ( #14342 ) - Jellyfrog Allow SnmpQuery to optionally abort walks if one fails ( #14255 ) - murrant Mibs Add CISCO-ENTITY-ALARM-MIB file ( #14754 ) - bonzo81 Update Nokia MIBs to release R22.2 ( #14734 ) - peelman More MIB fixing ( #14018 ) - Jellyfrog Update MIBs ( #14017 ) - Jellyfrog Updated existing Siemens MIBs and added trap MIB ( #13986 ) - SanderBlom Dependencies PHP dependency update ( #14927 ) - murrant Bump phpseclib/phpseclib from 3.0.18 to 3.0.19 ( #14903 ) - dependabot Bump webpack from 5.66.0 to 5.76.1 ( #14901 ) - dependabot Bump symfony/http-kernel from 5.4.16 to 5.4.20 ( #14824 ) - dependabot Bump json5 from 1.0.1 to 1.0.2 ( #14774 ) - dependabot Update PHP dependencies (fix dependencies on PHP 8.2) ( #14759 ) - murrant Bump qs and express ( #14705 ) - dependabot Bump loader-utils from 1.4.0 to 1.4.2 ( #14628 ) - dependabot Increase minimum version to PHP 8.1 ( #14378 ) - murrant Update dependencies ( #14319 ) - murrant Bump php-cs-fixer to 3.4.0 ( #14224 ) - murrant Bump terser from 4.8.0 to 4.8.1 ( #14123 ) - dependabot Bump guzzlehttp/guzzle from 7.4.4 to 7.4.5 ( #14059 ) - dependabot Update Larastan ( #14031 ) - murrant Update PHP dependencies ( #14028 ) - murrant Bump guzzlehttp/guzzle from 7.4.3 to 7.4.4 ( #14025 ) - dependabot Bump guzzlehttp/guzzle from 7.4.1 to 7.4.3 ( #13994 ) - dependabot Bump async from 2.6.3 to 2.6.4 ( #13947 ) - dependabot Bump composer/composer from 2.2.4 to 2.3.5 ( #13944 ) - dependabot Bump guzzlehttp/psr7 from 2.1.0 to 2.2.1 ( #13879 ) - dependabot Bump jpgraph version to 4 ( #13875 ) - ottorei Bump node-forge from 1.2.1 to 1.3.0 ( #13869 ) - dependabot 23.2.0 (2023-02-23) A big thank you to the following 20 contributors this last month: electrocret (5) fbouynot (5) hanserasmus (3) VVelox (3) guipoletto (1) westerterp (1) goebelmeier (1) MarlinMr (1) florisvdk (1) kylegordon (1) zenbeam (1) dependabot (1) gilrim (1) murrant (1) noaheroufus (1) AleksNovak (1) tristanbob (1) tim427 (1) PipoCanaja (1) bonzo81 (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (22) murrant (9) ottorei (4) crazy-max (1) VVelox (1) westerterp (1) Feature Add display query to list_devices function ( #14747 ) - bonzo81 Device Fortigate IPS Intrusions detected stats ( #14857 ) - electrocret Add support for Vsol v1600d EPON OLT ( #14853 ) - guipoletto Fix discovery for apc ats ( #14837 ) - florisvdk Include Samsung X Series printers ( #14831 ) - kylegordon EdgeOS OLT new sensors and changes ( #14807 ) - noaheroufus Update XDP string to exclude modern Cisco lightweight APs from discovery ( #14803 ) - tristanbob Extend filtering of graphs device_bits on cisco ASA ( #14796 ) - PipoCanaja Alerting Fix MS Teams alert transport, correct HTTP header ( #14843 ) - goebelmeier Add support for topics ( #14804 ) - AleksNovak Graphs Update HV::Monitor support to use generic_stats.inc.php ( #14814 ) - VVelox Only show Eth errors when Etherlike is enabled ( #14784 ) - electrocret Applications Add a few more graphs for CAPEv2 ( #14813 ) - VVelox CAPEv2 support ( #14801 ) - VVelox Api Use Oxidized API client and add support for groups on config get ( #14750 ) - electrocret Oxidized Show display name in Oxidized config search ( #14800 ) - electrocret Bug Revert \"Fix entity-state polling/discovery\" ( #14811 ) - murrant Documentation Fix Okta image in docs ( #14848 ) - westerterp Change socialite settings URI ( #14845 ) - fbouynot Fix possible confusion around php-fpm settings ( #14844 ) - hanserasmus Use docker compose v2 ( #14841 ) - MarlinMr Fix typo in Oauth doc ( #14840 ) - fbouynot Add Zenduty Integration info to Transports.md docs ( #14826 ) - zenbeam Update config docs - dump current config ( #14820 ) - hanserasmus Add SELinux instructions for nginx monitoring ( #14812 ) - fbouynot Add SELinux instructions for systemd monitoring ( #14809 ) - fbouynot Add SELinux instructions for systemd monitoring ( #14806 ) - fbouynot Debian 11 Sury DPA provides PHP 8.2 ( #14798 ) - tim427 Misc Use Device displayname on VRF page ( #14851 ) - electrocret Fix empty output on validation test ( #14822 ) - hanserasmus Dependencies Bump symfony/http-kernel from 5.4.16 to 5.4.20 ( #14824 ) - dependabot 23.1.0 (2023-01-24) A big thank you to the following 19 contributors this last month: electrocret (3) peelman (3) jasoncheng7115 (2) not-known (2) da-me (1) systeembeheerder (1) fdomain (1) jaannnis (1) knpo (1) trs80 (1) MANT5149 (1) LoveSkylark (1) support-capensis (1) zeroservices (1) dependabot (1) dennypage (1) carbinefreak (1) bnerickson (1) Blinq-SanderBlom (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (23) murrant (2) SourceDoctor (1) PipoCanaja (1) Device Changed discovery OID in ets.yaml ( #14795 ) - da-me Added Support for SNS-3615-K9 ( #14792 ) - jaannnis Routeros fix lldp discovery on 7.7+ ( #14791 ) - knpo Fix cisco-flash ( #14772 ) - electrocret Eaton matrix wattage fix ( #14770 ) - peelman Add Universal Input Output support for APC ( #14766 ) - dennypage Eltek Enexus; Fix SmartpackS divisor and hardware discovery ( #14762 ) - peelman Nokia PMC Microwave Improvements ( #14761 ) - carbinefreak Add AXOS sensor data for PON Transceivers (the only transceivers Cali\u2026 ( #14741 ) - peelman Adding discovery of LSI MegaRAID Device Media Errors, Other Errors, a\u2026 ( #14729 ) - bnerickson Stop net-snmp from interpreting the octet-string from rttMonEchoAdmin\u2026 ( #14676 ) - not-known Add state of the Fortigate link monitor health checks ( #14675 ) - not-known Adding support for loop-telecom devices ( #14674 ) - Blinq-SanderBlom Oxidized Adding Fortigate switches to Oxidized model mapping config ( #14782 ) - LoveSkylark Bug Fix entity-state polling/discovery ( #14793 ) - fdomain Update PingCheck.php to remove duplicate \"Device status changed to ... from icmp check.\" event ( #14785 ) - MANT5149 Fix calculated dbm ( #14771 ) - electrocret Documentation Update Syslog.md ( #14794 ) - systeembeheerder Update Authentication.md ( #14788 ) - trs80 Fix Doc Link for Canopsis transport ( #14778 ) - support-capensis Update ElasticSearch Index pattern for php 8.1 changes ( #14775 ) - zeroservices Translation Update zh-TW.json ( #14765 ) - jasoncheng7115 Create files with Traditional Chinese translation ( #14764 ) - jasoncheng7115 Misc Use displayname instead of hostname for Device Maintenance Modal Title ( #14681 ) - electrocret Dependencies Bump json5 from 1.0.1 to 1.0.2 ( #14774 ) - dependabot 22.12.0 (2022-12-28) A big thank you to the following 21 contributors this last month: murrant (10) electrocret (4) bnerickson (4) peelman (2) bonzo81 (2) gdepeyrot (2) bogdanrotariu (2) TheMysteriousX (2) LoveSkylark (1) fcqpl (1) angeletdemon (1) alchemyx (1) rinsekloek (1) SantiagoSilvaZ (1) dependabot (1) gewuerfelt (1) tuxgasy (1) hugalafutro (1) nightcore500 (1) mrwold (1) rhinoau (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (15) murrant (14) PipoCanaja (3) ottorei (3) SeeMyPing (1) Feature Pre-Install settings ( #13906 ) - murrant Device Additional sensors ( #14756 ) - peelman Update fs-nmu.inc.php ( #14702 ) - gewuerfelt Support Huawei SMU02B ( #14673 ) - nightcore500 Use 'counter' RRD type for some TrueNAS sensors ( #14670 ) - TheMysteriousX Device - Add support for \"Smartpack R\" ( #14665 ) - mrwold Added Moxa switching ifAlias/portName mapping ( #14633 ) - rhinoau Webui Fix port speed setting feedback ( #14743 ) - murrant Fix Cimc on Overview ( #14727 ) - electrocret Search devices also in display ( #14714 ) - gdepeyrot Fix check rrd file exists with remote rrdcached ( #14690 ) - tuxgasy Alerting Adding sample alert for systemd application ( #14711 ) - bnerickson Polling poller debug ( #14691 ) - electrocret Add -I flag to Traceroute cmd ( #14667 ) - electrocret Graphs Fix graph output base64 ( #14701 ) - murrant Fix some graphs not respecting device display name ( #14684 ) - murrant Adding Average into graphs ( #14679 ) - bogdanrotariu Applications Update Nvidia application - values in wrong charts ( #14736 ) - fcqpl Removing max polling restriction for wireguard traffic RRD data ( #14710 ) - bnerickson Api Fix for RIPE NCC API Tools ( #14757 ) - LoveSkylark API list_devices update with sysName, location_id and type ( #14731 ) - bonzo81 Discovery Prevent spurious MAC changes on multi-interface devices ( #14671 ) - TheMysteriousX Polling Fix ArubaInstance channel decode issue ( #14732 ) - murrant Refactor Unify time interval formatting ( #14733 ) - murrant Documentation Install updates for Rocky8 ( #14722 ) - angeletdemon Updating certificate script documentation ( #14721 ) - bnerickson Update Docker.md with proper path to unzipped files ( #14717 ) - alchemyx Fix typo: purge-port.php file name ( #14712 ) - SantiagoSilvaZ Alert template example uses incorrect variable ( #14683 ) - electrocret Correct squid snmpd.conf proxy host syntax ( #14678 ) - hugalafutro Tests Adding certificate application tests ( #14708 ) - bnerickson Misc Add MAC OUI caching when code updates are disabled ( #14713 ) - gdepeyrot Internal Features Number Casting allow preceding space ( #14699 ) - murrant Improve SnmpResponse value() ( #14605 ) - murrant Mibs Add CISCO-ENTITY-ALARM-MIB file ( #14754 ) - bonzo81 Update Nokia MIBs to release R22.2 ( #14734 ) - peelman Dependencies Update PHP dependencies (fix dependencies on PHP 8.2) ( #14759 ) - murrant Bump qs and express ( #14705 ) - dependabot 22.11.0 (2022-11-24) A big thank you to the following 40 contributors this last month: murrant (52) Jellyfrog (23) PipoCanaja (9) bnerickson (5) electrocret (4) SourceDoctor (4) noaheroufus (3) rhinoau (3) mabra94 (2) fcqpl (2) kimhaak (2) SantiagoSilvaZ (2) fbouynot (2) opalivan (2) mprins-RAM (2) VVelox (2) koocotte (1) VoipTelCH (1) cfitzw (1) systeembeheerder (1) dependabot (1) jaaruizgu (1) pertruccio (1) josh-silvas (1) ianhodgson (1) LoveSkylark (1) talkstraightuk (1) fufroma (1) fuzzbawl (1) otkd (1) kiwibrew (1) luc-ass (1) andrekeller (1) geg347 (1) Olen (1) Frazew (1) SirMaple (1) westerterp (1) squidly (1) Bierchermuesli (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (53) murrant (44) PipoCanaja (15) ottorei (1) VVelox (1) SantiagoSilvaZ (1) fbouynot (1) Feature Split out lnms snmp convenience commands ( #14603 ) - murrant Add --forgot-key to key:rotate command ( #14495 ) - murrant Security Fix Service Template XSS ( #14659 ) - murrant Fix neighbours XSS ( #14658 ) - murrant Fix SNMP trap -> Eventlog XSS ( #14657 ) - murrant Fix XSS in api access ( #14551 ) - murrant XSS sanitize pwrstatd application script inputs ( #14545 ) - bnerickson Device Added divisor to SAF Integra-X temp sensors ( #14655 ) - noaheroufus Corrected ICT MPS hardware detection ( #14654 ) - noaheroufus Adjusted PMP to accomodate various other 450 models. ( #14652 ) - noaheroufus Added support for Eltek Micropack 1U ( #14645 ) - fcqpl Added support for Eltek Flatpack S ( #14643 ) - fcqpl Improve VRP power display ( #14624 ) - PipoCanaja Edgeos picked up as generic device ( #14612 ) - ianhodgson Added Moxa EDS-G516E optical sensors ( #14610 ) - rhinoau Fix eNexus total current for Smartpack S ( #14606 ) - murrant Disable SNMP Bulk for Delta UPS devices ( #14599 ) - fufroma Improved AIX os information collection ( #14595 ) - murrant More inclusive Cisco SB os detection ( #14594 ) - murrant IP Infusion OcNOS basic detection ( #14588 ) - murrant Fix APC current divide by zero ( #14578 ) - murrant Extend EfficientIP SolidServer support ( #14549 ) - PipoCanaja TAIT-Infra93 - Fix state + skip_values for Battery ( #14541 ) - opalivan Timos - Improve SAP stats graphing ( #14534 ) - mabra94 McAfee Web Proxy with COUNTER rrd_type on sensors ( #14529 ) - PipoCanaja Fix 'bke.yaml' discovery file ( #14524 ) - PipoCanaja Added support for additional Moxa EDS-P model ( #14523 ) - rhinoau Fix awplus ntp polling bug ( #14521 ) - murrant Add discovery support for Riedo Networks UPDU ( #14496 ) - andrekeller Use correct description oid ( #14489 ) - Jellyfrog Correct upsBypassVoltage oid ( #14488 ) - Jellyfrog Correct variable typo ( #14486 ) - Jellyfrog Hpe ilo: fix filesystem type regex ( #14485 ) - Jellyfrog Added Fortigate SD-WAN Health checks ( #14456 ) - mprins-RAM Dont include empty storage sensor ( #14453 ) - Jellyfrog Remove undefined sensors ( #14449 ) - Jellyfrog Use correct low warn limit variable ( #14447 ) - Jellyfrog Fortinet FortiADC detection and basic statistics ( #14434 ) - westerterp Device - Add support for Vultan Environmental Monitoring units ( #14401 ) - squidly Device - Basic hatteras dslam integration ( #14115 ) - Bierchermuesli Webui Remove ungrouped devices panel ( #14664 ) - murrant Custom port view fix ( #14637 ) - SourceDoctor Fix billing graph divide by zero when the period is zero or doesn't exist ( #14623 ) - jaaruizgu Fix port neighbors missing ( #14586 ) - murrant Fix some icons ( #14584 ) - murrant [About] Open Laravel and RRDtool link in new tab ( #14568 ) - SantiagoSilvaZ [About] Open the contributor list link in a new tab ( #14553 ) - SantiagoSilvaZ Fix v2 plugins ( #14506 ) - murrant Check if service_name is empty or equal to service_type ( #14499 ) - luc-ass Show id on device dependencies ( #14497 ) - SourceDoctor Userlist description fix ( #14482 ) - mprins-RAM Sort alert transport by name ( #14464 ) - SourceDoctor Graphs Fix device poller modules graph ( #14640 ) - murrant Bug - XDSL module - rrd_def and rrd file definition issue for Actual rate ( #14597 ) - PipoCanaja Fix graph errors wrong content type ( #14574 ) - murrant Improve graph embedded title handling ( #14544 ) - murrant Graphing cleanup ( #14492 ) - murrant Snmp Traps Adds Cisco DHCP Server SNMP MIB and Trap Handlers. ( #14618 ) - josh-silvas Applications Alarm Flag on UPS-Nut Application ( #14635 ) - SourceDoctor Adding wireguard app to the apps overview page ( #14629 ) - bnerickson Adding wireguard application support ( #14625 ) - bnerickson Adding systemd service status application ( #14540 ) - bnerickson Memcached application: improve error visibility ( #14536 ) - murrant Fix memcached polling bug ( #14501 ) - murrant Add HV Monitor, a generic means for monitoring hypvervisors ( #14218 ) - VVelox Base64 gzip compression support for json_app_get ( #14169 ) - VVelox Api Port search API search more than one fields ( #14646 ) - murrant Added disable_notify and location_id ( #14619 ) - pertruccio Add sortorder parameter to list_logs ( #14600 ) - talkstraightuk API restore ability to update purpose and override_sysLocation ( #14596 ) - murrant API graphs, variable whitelist ( #14552 ) - murrant Graph API use new code path ( #14493 ) - murrant Adding device's field in get_alert_rule and list-alert-rules API function (new) ( #14481 ) - geg347 Fix update_device hostname handling #14435 ( #14448 ) - rhinoau Add Columns to search_ports API function ( #14348 ) - electrocret Discovery Fix discovery ignores custom ipmi port ( #14660 ) - VoipTelCH Sensors - Allow changing RRD type in YAML and PHP sensor discovery ( #14208 ) - PipoCanaja Polling Don't poll sysDescr, sysObjectID, and sysName so frequently ( #14562 ) - murrant Add connection exception handling to all redis calls ( #14467 ) - Frazew Authentication Update Radius auth to accept permissions attributes ( #14531 ) - kimhaak Bug Handle Division by 0 error for SvcFdbTableSize ( #14672 ) - mabra94 Fix sqlite test ( #14642 ) - murrant Remove extends and hardware detection support ( #14626 ) - murrant Set 0 as integer in loading of graylog. ( #14621 ) - kimhaak Fix GeocodingHelper type-hinting ( #14604 ) - Jellyfrog Bug in Ciscowlc AP graphs definition ( #14585 ) - PipoCanaja SnmpQuery fix mib directory order ( #14580 ) - murrant SnmpQuery Handle empty oids in get more gracefully ( #14577 ) - murrant Fix PTOPO mib in module discovery-protocols ( #14564 ) - PipoCanaja Fix Type error ( #14555 ) - fbouynot Correct variable use in billing ( #14533 ) - Jellyfrog Fix sensor limit linked port rules in collection ( #14520 ) - electrocret EES Rectifier various fixes from MIB + added tests ( #14519 ) - opalivan Fix fetch ifEntry logic ( #14483 ) - Jellyfrog Add a few breaks to avoid connection flooding for the irc-bot ( #14479 ) - Olen Refactor Remove Log::event ( #14526 ) - Jellyfrog Cleanup Fix snmp_disable type ( #14650 ) - murrant Consolidate and improve snmptranslate usage ( #14567 ) - murrant Remove graph_min ( #14561 ) - murrant Remove $_GET from graphs ( #14554 ) - murrant Undefined array key fixes ( #14532 ) - Jellyfrog Use Collection instead of collect() ( #14527 ) - Jellyfrog Convert string references to ::class ( #14508 ) - Jellyfrog Miscellaneous cleanup - part 5 ( #14502 ) - Jellyfrog Type API methods and properties ( #14476 ) - fbouynot Miscellaneous cleanup - part 4 ( #14452 ) - Jellyfrog Miscellaneous cleanup - part 3 ( #14450 ) - Jellyfrog Miscellaneous cleanup, mostly undefined variables - part2 ( #14445 ) - Jellyfrog Documentation Fix Traceroute debug alert template snippet ( #14668 ) - electrocret Update Dispatcher docs for Debian and for non /opt/librenms installation ( #14663 ) - koocotte Fix Location mapping docs ( #14644 ) - electrocret Update config name for the default device display ( #14641 ) - cfitzw Update Dispatcher-Service.md ( #14632 ) - systeembeheerder Updating postgres application documentation ( #14627 ) - bnerickson Documentation for Observium Migration ( #14601 ) - LoveSkylark Add snmp_flags and tips on string oids to the docs ( #14579 ) - murrant Clarify Dispatcher-Service.md for systemd ( #14575 ) - fuzzbawl Update license section of readme ( #14571 ) - otkd Remove outdated rules videos ( #14505 ) - kiwibrew Docker quick install ( #14475 ) - murrant Tests Mock astext ( #14581 ) - murrant Github tests log improvement ( #14559 ) - murrant Improve trap testing ( #14546 ) - murrant Remove unused phpstan tests ( #14503 ) - Jellyfrog Misc New schema dump ( #14630 ) - Jellyfrog Add check_hetzner_storagebox to includes/services ( #14463 ) - SirMaple Add instance id to error reports ( #14444 ) - murrant Internal Features DeviceCache::get() allow hostname ( #14649 ) - murrant SnmpQuery numeric accept a boolean ( #14565 ) - murrant Support regex in os field replace ( #14563 ) - murrant More Replacement Capabilities for sensor index computation ( #14522 ) - PipoCanaja Dependencies Bump loader-utils from 1.4.0 to 1.4.2 ( #14628 ) - dependabot 22.10.0 (2022-10-17) A big thank you to the following 22 contributors this last month: murrant (29) Jellyfrog (8) KayckMatias (4) Martin22 (3) PipoCanaja (3) fbouynot (3) electrocret (2) ottorei (1) SirMaple (1) carbinefreak (1) opalivan (1) luc-ass (1) jgelinas (1) mpikzink (1) rhinoau (1) tim427 (1) daniel-franca (1) sashashura (1) tuomari (1) kimhaak (1) bnerickson (1) loopodoopo (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (20) murrant (16) PipoCanaja (11) ottorei (3) VVelox (2) SantiagoSilvaZ (1) Security Block disabled user session auth ( #14473 ) - murrant Fix group delete xss ( #14472 ) - murrant Fix alert rules XSS ( #14471 ) - murrant Fix xss in browser push transport ( #14470 ) - murrant Fix users xss ( #14469 ) - murrant Fix user mass assignment vulnerability ( #14468 ) - murrant Fix billing xss ( #14465 ) - murrant Fix memcached unserialize vulnerability ( #14459 ) - murrant Fix possible RSS XSS ( #14457 ) - murrant GitHub Workflows security hardening ( #14388 ) - sashashura Device Correct aviatModemCurModulationRx oid ( #14446 ) - Jellyfrog MNI Microwave OS Add ( #14427 ) - carbinefreak Add OS tait-tnadmin for TN9300 ( #14413 ) - opalivan Skip empty drac state sensors ( #14409 ) - jgelinas Added support for additional Moxa EDS-G models ( #14405 ) - rhinoau Issue samsung printer m4080 fx ( #14391 ) - daniel-franca Enexus system output current fix ( #14324 ) - loopodoopo Routeros - Fix displaying distance in charts ( #14300 ) - Martin22 Added support for Ubiquiti UFiber OLT ( #14256 ) - Martin22 Webui Fix missing device_id from device alert logs ( #14460 ) - ottorei Fix about date display ( #14442 ) - murrant Fix pseudowires pages ( #14441 ) - murrant Enhanced Service Overview on Device Overview Page ( #14410 ) - luc-ass Disable plugins that have errors ( #14383 ) - murrant Fix Inventory table for Dark theme ( #14377 ) - electrocret Add initselect2 to locations ports ( #14375 ) - KayckMatias Update devices filter in alert-logs to init_select2 ( #14361 ) - KayckMatias Alerting Alert map location fix ( #14380 ) - KayckMatias Populate the alert rule field with the builder json ( #14374 ) - murrant Snmp Traps Improve LinkUp and LinkDown trap handling incomplete traps ( #14385 ) - tuomari Applications Add pwrstatd application ( #14365 ) - bnerickson Api Fix port search with slashes ( #14403 ) - murrant Discovery Cisco NAC fix ( #14440 ) - murrant Polling Fix bgp-peers bgpPeerIface bug and update test data ( #14420 ) - murrant Oxidized Fix oxidized web requests unclosed connections or responding fast enough ( #14370 ) - fbouynot Authentication Rework socialite integration ( #14367 ) - Jellyfrog Bug Snmpwalk functions: dont include invalid data ( #14438 ) - Jellyfrog Fix VRP duplicate BGP Peers ( #14431 ) - PipoCanaja Version and git helper improvements ( #14412 ) - murrant Cache version data ( #14404 ) - murrant Fix rpi codec state sensor ( #14400 ) - murrant Fix libvirt count() uncountable error ( #14398 ) - murrant Fix Firebrick local ASN ( #14397 ) - murrant Fix ups nut PHP 8 issue ( #14392 ) - murrant Refactor Fix a few Db* to Eloquent requests ( #14278 ) - PipoCanaja Cleanup Remove tabs from yaml ( #14437 ) - Jellyfrog Miscellaneous fixes, mostly undefined variables ( #14432 ) - Jellyfrog Trim whitespaces from device data ( #14429 ) - Jellyfrog Fix bgp_peer array_merge error ( #14416 ) - PipoCanaja Documentation Updating details of my LibreNMS install ( #14458 ) - SirMaple Fix php7.2 occurence in Performance.md documentation ( #14394 ) - fbouynot Fix documentation for php8.1 and bad package name ( #14393 ) - fbouynot Translation Fix Typo in Settings ( #14443 ) - electrocret Tests Speed up tests ( #14421 ) - murrant Fix cisco-pw test capture ( #14415 ) - murrant Test supported PHP versions only ( #14389 ) - murrant Run CI on ubuntu 22.04 ( #14379 ) - Jellyfrog Misc Update ports_purge docs and definitions ( #14402 ) - KayckMatias Added Ubuntu and Raspbian to ifAlias script ( #14399 ) - tim427 Dependencies Increase minimum version to PHP 8.1 ( #14378 ) - murrant 22.9.0 (2022-09-21) A big thank you to the following 19 contributors this last month: murrant (53) Jellyfrog (17) PipoCanaja (7) fbouynot (6) bp0 (3) Npeca75 (2) sembeek (1) huntr-helper (1) KayckMatias (1) LoveSkylark (1) quentinsch (1) loopodoopo (1) electrocret (1) Martin22 (1) luc-ass (1) ktims (1) VirTechSystems (1) tim427 (1) mwobst (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (43) murrant (39) PipoCanaja (9) ottorei (4) SourceDoctor (1) Feature Improved Modern Modules ( #14315 ) - murrant Add @signedGraphTag() and @signedGraphUrl() blade directives ( #14269 ) - murrant Device settings: attempt to open related tab ( #14250 ) - murrant Error reporting ( #14190 ) - Jellyfrog Security Fix scheduled maintenance xss ( #14360 ) - murrant Add huntr.dev to SECURITY.md ( #14359 ) - huntr-helper Device Added status checks for (BWCC) battery status and condition for onboa\u2026 ( #14349 ) - quentinsch UHP VSAT modems ( #14317 ) - loopodoopo Ray2 - Oid repair at ber ( #14302 ) - Martin22 Fix ciena-sds inventory bugs ( #14252 ) - murrant F5 partition ram ( #14226 ) - fbouynot Add Cisco Flash storage support ( #14219 ) - fbouynot Webui Load device selection dynamically on Ports page ( #14353 ) - KayckMatias Port pages fixes and cleanups ( #14310 ) - murrant Remove Caffeine ( #14277 ) - murrant Updated brother.svg to make it render in Safari ( #14271 ) - luc-ass Fix for Cisco group device health tab ( #14265 ) - fbouynot Fix dashboard widgets becoming unlocked (especially when using a touchscreen) ( #14222 ) - tim427 Migrate xDSL code to module, and add support for VDSL2 MIB ( #14207 ) - PipoCanaja Improved sorting options for Availability Map ( #14073 ) - mwobst Alerting Discord ability to attach graph images ( #14276 ) - murrant Email Transport: embed graphs by default ( #14270 ) - murrant Graphs Return GraphImage to include more metadata ( #14307 ) - murrant Api Allow delete location by id ( #14334 ) - bp0 API update_device, make location field work (as does location_id) ( #14325 ) - bp0 Polling Fix ping.php skipped results ( #14368 ) - sembeek Oxidized Oxidized \"allow purpose and notes\" ( #14352 ) - LoveSkylark Bug Fix cipsec-tunnels ftd bad data causes error ( #14366 ) - murrant Handle null in unix-agent ( #14358 ) - murrant Fix the case of 'Ungrouped' in smokeping integration ( #14351 ) - fbouynot Fix for smokeping integration with ping-only devices ( #14341 ) - fbouynot Match displayname source for graylog ( #14339 ) - fbouynot Check dot1dBasePortIfIndex exists before using it ( #14337 ) - Jellyfrog Prevent errors when hrStorageTable doesn't exist ( #14327 ) - Jellyfrog Revert \"ZTE ZXA10 Update (Added dBm graphs)\" ( #14320 ) - murrant Billing module fix/cleanup ( #14309 ) - electrocret SnmpResponse filterBadLines fix ( #14306 ) - murrant Fix ARP Table on Device overview ( #14304 ) - Npeca75 Disable error reporting when dependencies are outdated ( #14291 ) - murrant Don't send zeros to Graphite for missing metrics ( #14262 ) - ktims Fix removing all port groups ( #14253 ) - murrant Move cronjob time for daily.sh ( #14245 ) - Jellyfrog Firebrick bgp polling was broken ( #14237 ) - murrant Quick fix for cipsec-tunnels Cisco implementation ( #14232 ) - PipoCanaja Fix redeclare of function breaking tests in OS eltex-mes23xx ( #14227 ) - PipoCanaja Refactor Cleanup and optimize the availability widget ( #14329 ) - murrant Cleanup Defer loading cli option defaults ( #14363 ) - Jellyfrog Remove call to Config from artisan ( #14362 ) - Jellyfrog Mibs - Cleanup names ( #14323 ) - PipoCanaja Enable more checks ( #14318 ) - Jellyfrog Do not include _token in legacy vars ( #14313 ) - murrant Don't include null os when loading defs ( #14312 ) - murrant 2fa not all routes have names ( #14311 ) - murrant Cache astext for 1 day ( #14303 ) - murrant Linux distro images require feature field ( #14301 ) - murrant Silence return type mismatch ( #14298 ) - Jellyfrog Fix more percent calculations ( #14294 ) - murrant Fix rounding null in mempools module ( #14290 ) - murrant Check if polling module exists ( #14289 ) - murrant Fix undefined variable ( #14287 ) - murrant Handle connection timed out errors in unix agent ( #14286 ) - murrant Remove unused function ( #14283 ) - murrant Remove reference to unused variable ( #14280 ) - murrant Cleanup some RunAlerts issues ( #14274 ) - murrant Fix a bunch of \"Since fakerphp/faker 1.14: Accessing property..\" ( #14267 ) - Jellyfrog Fix more error exceptions ( #14266 ) - Jellyfrog Fix hrStorageType being undefined ( #14260 ) - Jellyfrog Misc errors cleanup ( #14257 ) - Jellyfrog Fix ipv6 hexdec error ( #14254 ) - murrant Use empty string instead of null for routes ( #14247 ) - Jellyfrog Sort device types alphabetically ( #14244 ) - VirTechSystems Misc webui code cleanups ( #14242 ) - murrant Fix some ErrorExceptions ( #14241 ) - Jellyfrog Fix os_group unset errors ( #14238 ) - murrant Juniper bgp-peers cleanup ( #14236 ) - murrant Percentage calculation helper ( #14235 ) - murrant Memcached app undefined vars ( #14225 ) - Npeca75 Fix Undefined variable/key warnings ( #14134 ) - murrant Documentation Move list_locations from devices to locations ( #14328 ) - bp0 Cisco-sla module was renamed to slas ( #14288 ) - murrant Update docs around APP_URL ( #14282 ) - murrant Tests Do not allow sysDescr to be fetched in os module yaml ( #14331 ) - murrant Remove PHP version constraint ( #14314 ) - Jellyfrog Lnms dev:simulate check simulated device exists ( #14243 ) - murrant Save-test-data to refresh all variants of an OS ( #14231 ) - PipoCanaja Misc Defer loading cli option values ( #14354 ) - murrant Ignore CommandNotFoundException from reporting ( #14342 ) - Jellyfrog Allow dumping of errors and warnings ( #14275 ) - murrant Allow SnmpQuery to optionally abort walks if one fails ( #14255 ) - murrant Dependencies Update dependencies ( #14319 ) - murrant Bump php-cs-fixer to 3.4.0 ( #14224 ) - murrant 22.8.0 (2022-08-19) A big thank you to the following 26 contributors this last month: murrant (18) Npeca75 (12) Jellyfrog (9) gs-kamnas (5) earendilfr (3) fbouynot (3) VVelox (3) rhinoau (2) Schouwenburg (2) electrocret (2) aztec102 (2) PipoCanaja (1) loopodoopo (1) washcroft (1) Laplacence (1) opalivan (1) Jarod2801 (1) Martin22 (1) TheMysteriousX (1) ciscoqid (1) Fehler12 (1) PedroChaps (1) ajsiersema (1) quentinsch (1) Mar974 (1) mwobst (1) Thanks to maintainers and others that helped with pull requests this month: murrant (46) Jellyfrog (26) PipoCanaja (2) VVelox (1) Cormoran96 (1) bennet-esyoil (1) ottorei (1) Feature Prepare for PHP 8.1 ( #14156 ) - Jellyfrog New Poller validations ( #14148 ) - murrant New lnms command to enable and disable plugins ( #14147 ) - murrant Support for SSL/TLS protected connections to MySQL databases ( #14142 ) - gs-kamnas Collect OS distro and LibreNMS version ( #14138 ) - murrant Lnms device:poll better feedback ( #14130 ) - murrant Per-App data storage ( #14087 ) - VVelox Device Fix luminato port poll ( #14217 ) - murrant Teltonika RUT fix ( #14202 ) - loopodoopo Initial support for Moxa AWK Industrial APs ( #14197 ) - rhinoau Mikrotik wifi station mode sensors ( #14193 ) - Npeca75 Update mellanox os image ( #14184 ) - Laplacence Change state_name for Racoms modulation ( #14174 ) - Martin22 Cisco SB/CBS environment sensors ( #14154 ) - Fehler12 Fix Rocky Linux and AlmaLinux icons and logos ( #14150 ) - murrant Add additional sysObjectIDs for variants of the Arista 7130 ( #14144 ) - gs-kamnas Eltex MES 2324p Add ( #14135 ) - aztec102 Solid Optics EDFAMUX support ( #14129 ) - murrant Merge netmanplus and riello and improve device support ( #14125 ) - murrant Bats support ( #14108 ) - Schouwenburg Solved aos6 problem where Librenms wasn't identifying all vlans ( #14107 ) - PedroChaps Fix Cisco polling BGP peers in non-default VRF ( #14105 ) - ajsiersema Added support for CheckPoint 1100, 1450 & 1490 models. ( #14074 ) - quentinsch Ns-bsd updated for SNS LTSB 3.7.19 ( #14060 ) - Mar974 ZTE ZXA10 Update (Added dBm graphs) ( #14049 ) - aztec102 Webui Fix ports display ( #14183 ) - murrant Ports by device group ( #14175 ) - electrocret Empty Outages table ( #14167 ) - Npeca75 View Ports in Portgroups ( #14141 ) - electrocret Fix eventlog filtering ( #14136 ) - murrant [gui] enable permanent vertical scroll ( #14102 ) - Npeca75 Alerting Correct logic for recurring alert rules that span UTC days ( #14145 ) - gs-kamnas Improvements to PagerDuty alert formatting ( #14143 ) - gs-kamnas Add rich (=html) support for messages via Matrix ( #14054 ) - mwobst Graphs Fix unauth application graphs ( #14216 ) - murrant Allow specifying the background colour in graph images ( #14192 ) - washcroft Applications Add possibility to monitor redis application through the unix-agent ( #14182 ) - earendilfr Fix error between application module and unix-agent ( #14177 ) - earendilfr Add possibility to monitor the php-fpm service with the unix agent ( #14173 ) - earendilfr [apps] Docker only show current containers ( #14152 ) - Npeca75 Add support for Sagan ( #14070 ) - VVelox Add Opensearch\\Elasticsearch monitoring ( #14053 ) - VVelox Api Standardize device and device group maintenance API ( #14153 ) - rhinoau Fix maintenance APIs not associating device or group ( #14127 ) - murrant Discovery Fix legacy os extends ( #14220 ) - murrant Sensors, convert hex to strings ( #14121 ) - murrant Polling Fix for number in sensor string ( #14185 ) - Schouwenburg Authentication AD Auth PHP 8.1 fixes ( #14215 ) - murrant Bug Autodiscovery fix ( #14213 ) - Npeca75 Fix alert log clearing SQL query ( #14200 ) - Jellyfrog Fix error when ldap_search returns false ( #14199 ) - Jellyfrog Fix unnecessary Updates of DB when values are equal ( #14179 ) - opalivan Fix APP_KEY generation when using fpm ( #14168 ) - Jellyfrog Fix validation error ( #14163 ) - TheMysteriousX IPv6 Debug typo ( #14162 ) - Npeca75 Replace git show --no-patch option with --quiet ( #14160 ) - ciscoqid Fix 500 error in validation when UI containers and poller containers have differing node_ids ( #14146 ) - gs-kamnas Use --no-patch to support old git clients ( #14137 ) - Jellyfrog Refactor Use \"database version\" instead of \"mysql version\" ( #14158 ) - Jellyfrog Documentation Update to mkdocs-material 8.3.9 ( #14189 ) - Jellyfrog SNMP extend / fix mdadm documentation ( #14186 ) - Npeca75 Update index.md ( #14178 ) - Jarod2801 Add instructions for PHP 8.1 and Ubuntu 22.04 ( #14166 ) - Jellyfrog Update php installation instruction for CentOS 8 to reflect the minim\u2026 ( #14159 ) - fbouynot Fix typo in Smokeping SELinux documentation ( #14155 ) - fbouynot Add device_default_display info ( #14151 ) - murrant Change SELinux context for logs ( #14128 ) - fbouynot Translation Serbian translation, part3 ( #14205 ) - Npeca75 More Serbian translation ( #14181 ) - Npeca75 Enable translation on Eventlog & Component-status widgets ( #14180 ) - Npeca75 Initial support for Serbian language ( #14165 ) - Npeca75 Enable translation in 3 Alert widget ( #14164 ) - Npeca75 Tests Allow save-test-data.php to run all modules explicitely ( #14212 ) - PipoCanaja Increase OS detection time, sometimes it is not ready by 5s ( #14133 ) - murrant 22.7.0 (2022-07-20) A big thank you to the following 21 contributors this last month: murrant (12) fbouynot (4) mwobst (3) dependabot (2) wrongecho (2) ppasserini (2) QuadPiece (2) Jellyfrog (2) enferas (1) 00gh (1) bennet-esyoil (1) VVelox (1) rhinoau (1) prahal (1) paulgear (1) duhow (1) PipoCanaja (1) Mar974 (1) ottorei (1) mostdaysarebaddays (1) dagbdagb (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (19) murrant (14) ottorei (2) PipoCanaja (2) mpikzink (1) VVelox (1) Security Security fixes XSS in oxidized-cfg-check.inc.php and print-customoid.php ( #14126 ) - enferas Device Missing \"s\" in NsBsd.php ( #14067 ) - Mar974 Add full version of Mikrotik logo ( #14063 ) - QuadPiece Add apc battery operation time, including display in WebUI ( #14058 ) - mwobst Fix the parsing of the temperature unit value (CMCIII devices) ( #14056 ) - mwobst Update Mikrotik logo ( #14045 ) - QuadPiece Aviat WTM reduce snmp load ( #13918 ) - murrant Webui Fix device filtering false values ( #14103 ) - murrant Minor visual changes to the apps-overview page ( #14090 ) - bennet-esyoil Search device by MAC via URL ( #14072 ) - duhow Add BGP description to eventlog BGP Peers messages ( #14061 ) - mostdaysarebaddays Alerting Example rules for diskspace on / ( #14082 ) - VVelox Graphs Ping perf ( #14117 ) - 00gh Applications Fix app docker ( #14080 ) - prahal Polling Increase traceroute timeout ( #14084 ) - murrant Authentication Add option STARTTLS for authentication via AD ( #14051 ) - dagbdagb Bug Prevent duplicate plugin table entries ( #14120 ) - murrant Fix auth_test.php debug ( #14118 ) - murrant Fix config seeder will never run ( #14113 ) - murrant Reset the opcache after install ( #14098 ) - murrant Update config cache on install finalize step ( #14097 ) - murrant Fix more webserver validation issues ( #14096 ) - murrant Revert \"Add apc battery operation time, including display in WebUI\" ( #14068 ) - PipoCanaja Use --no-patch instead ( #14047 ) - Jellyfrog Cleanup Remove mib poller module remnants ( #14077 ) - murrant Documentation Small documentation typos ( #14101 ) - wrongecho Documentation typos ( #14099 ) - wrongecho Add SELinux configuration for SNMPd on Centos8 in the documentation ( #14095 ) - fbouynot Add SELinux configuration for LDAP/AD authentication on Centos8 in the documentation ( #14094 ) - fbouynot Add SELinux configuration for Smokeping on Centos8 in the documentation ( #14093 ) - fbouynot Add SELinux configuration for RRDCached on Centos8 in the documentation ( #14092 ) - fbouynot Corrected API devicegroup curl creation examples ( #14081 ) - rhinoau Minor grammar fixes in doc ( #14078 ) - paulgear Add documentation for Chrony application monitoring ( #14066 ) - ottorei Translation Few more updates to Ita lang ( #14091 ) - ppasserini Italian language update ( #14085 ) - ppasserini Adjustments to german translation ( #14083 ) - mwobst Tests Test PHP 8.1 ( #14109 ) - murrant Misc Allow reapply yaml config via env ( #14100 ) - murrant Mibs More MIB fixing ( #14018 ) - Jellyfrog Dependencies Bump terser from 4.8.0 to 4.8.1 ( #14123 ) - dependabot Bump guzzlehttp/guzzle from 7.4.4 to 7.4.5 ( #14059 ) - dependabot 22.6.0 (2022-06-14) A big thank you to the following 22 contributors this last month: murrant (22) gs-kamnas (5) Jellyfrog (4) dependabot (2) kruczek8989 (2) bile0026 (1) dennypage (1) hjcday (1) Martin22 (1) spyfly (1) Bobdave (1) bennet-esyoil (1) DaftBrit (1) SanderBlom (1) thecityofguanyu (1) glance- (1) duhow (1) TheMysteriousX (1) kevinwallace (1) HolgerHees (1) charlyforot (1) SourceDoctor (1) Thanks to maintainers and others that helped with pull requests this month: murrant (21) Jellyfrog (14) ottorei (5) PipoCanaja (2) mpikzink (1) f0o (1) Feature SnmpQuery walk multiple oids ( #14015 ) - murrant Add support to REST API for creating Maintenance Schedules for Device Groups ( #13985 ) - thecityofguanyu Automatic fixes for validation failures ( #13930 ) - murrant Security Bumpver handlebars.js to 4.7.7 to resolve CVE-2021-23369 ( #13990 ) - gs-kamnas Device Fix use of incorrect variable to retrieve current sensor value ( #14037 ) - dennypage Support Huawei SMU11B ( #14029 ) - murrant Update Teltonika Sensors for FW R_00.07.02 ( #14012 ) - hjcday Procurve hardware description cleanup ( #14007 ) - murrant Racom Ray2 and Ray3 - Modulation states added ( #14001 ) - Martin22 Fix OS Detection for USW-Flex-XG ( #13999 ) - spyfly Add support for Cisco Nexus 3550 series (formerly Exalink Fusion) devices ( #13992 ) - gs-kamnas Improve support for Arista/Metamako MOS devices ( #13988 ) - gs-kamnas Workaround issues with lldp information from GS108Tv1 ( #13971 ) - glance- Add additional OpenBSD PF graphs ( #13963 ) - kevinwallace BGP unnumbered support for Cumulus ( #13785 ) - charlyforot Webui Dashboard code cleanup ( #13996 ) - murrant Device Types Widget ( #13670 ) - SourceDoctor Alerting Add macro.past_20m macro ( #14023 ) - kruczek8989 Allow the use of a custom URL for accessing the PagerDuty API and correct API schema violation ( #14010 ) - gs-kamnas Setting MSteams card summary to alert title ( #13989 ) - DaftBrit Use display name when sending alerts to Sensu ( #13967 ) - TheMysteriousX Applications Add error-state to non-responsive mysql-servers ( #13993 ) - bennet-esyoil Discovery Fix printer count sensors when extra garbage is returned ( #14014 ) - murrant Oxidized Syslog-notify-oxidized.php now always notifies Oxidized ( #14011 ) - murrant Fix Oxidized syslog change notifier when the change was made via snmp. ( #14005 ) - kruczek8989 Authentication Implement support for usernames coming from reverse proxies ( #13894 ) - HolgerHees Bug Git version validation improvement ( #14042 ) - murrant Server name validation, handle ports better ( #14041 ) - murrant Fix some broken migrations ( #14040 ) - Jellyfrog Fix rrd version validation check ( #14036 ) - murrant Fix DB timezone validation ( #14035 ) - murrant Regression fix from #13596 ( #14034 ) - Jellyfrog Fix an issue when getting the local version from git ( #14020 ) - murrant Fix migrations failing one time after dashboard cleanup ( #14002 ) - murrant Fix Netscaler VServer database updates during polling ( #13995 ) - Bobdave Fix 500 error in validations when capabilities are not supported or set ( #13991 ) - gs-kamnas Cleanup Remove traceroute6, it is unused ( #14019 ) - murrant Remove DefaultWidgetSeeder ( #14006 ) - murrant Documentation Okta saml ( #14038 ) - bile0026 HPE Comware snmp config example ( #13997 ) - murrant Tests Fix tests failing when device with IP 127.1.6.1 exists ( #14016 ) - murrant Misc Slightly easier validation page error access ( #14044 ) - murrant Lnms scan respect -q parameter ( #14027 ) - murrant Custom OID processing of numeric strings with filters ( #13968 ) - duhow Validate base_url and server_name ( #13941 ) - murrant Mibs Update MIBs ( #14017 ) - Jellyfrog Updated existing Siemens MIBs and added trap MIB ( #13986 ) - SanderBlom Dependencies Update Larastan ( #14031 ) - murrant Update PHP dependencies ( #14028 ) - murrant Bump guzzlehttp/guzzle from 7.4.3 to 7.4.4 ( #14025 ) - dependabot Bump guzzlehttp/guzzle from 7.4.1 to 7.4.3 ( #13994 ) - dependabot 22.5.0 (2022-05-21) A big thank you to the following 23 contributors this last month: murrant (7) VVelox (6) slimey99uk (2) dependabot (2) Npeca75 (2) nox-x (1) nsn-amagruder (1) mkuurstra (1) booth-f (1) sajiby3k (1) skandragon (1) Martin22 (1) twelch24 (1) ppasserini (1) bl3nd3r (1) SantiagoSilvaZ (1) Jimmy-Cl (1) lfkeitel (1) steffann (1) micko (1) IVI053 (1) pfromme25 (1) mzacchi (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (19) murrant (16) ottorei (3) mpikzink (1) Feature Allow unordered OIDs (global and per-os) ( #13923 ) - murrant Added --ping-only to snmp-scan.py ( #13810 ) - IVI053 Device Add Cisco Business Wirless to ciscowlc.yaml ( #13984 ) - nsn-amagruder Add Eaton SC200 OS model ( #13978 ) - slimey99uk Fortigate LTE sensor addition ( #13977 ) - slimey99uk Added BKE power supply support. ( #13972 ) - Martin22 Don't use bulk-walk for PrimeKey Appliances ( #13958 ) - bl3nd3r Fix avtech12e sensors ( #13943 ) - lfkeitel [mikrotik] fixed RouterOS ipv4/ipv6 routes ( #13902 ) - Npeca75 Netscaler new counter metrics ( #13323 ) - mzacchi Webui Update dark mode to fix BGP and Peering page ( #13951 ) - Jimmy-Cl Fix snmp.timeout setting via Web UI ( #13937 ) - murrant Alerting More realistic alert test data ( #13969 ) - murrant Graphs [RRD] fix IPv6 folder name ( #13945 ) - Npeca75 Applications Remove alert keys from component for Suricata ( #13959 ) - VVelox Fix a few issues with variable names for Suricata ( #13956 ) - VVelox Scripts/json-app-tool.php JSON generation fix and add -S for SNMP extend name ( #13948 ) - VVelox Add Suricata monitoring ( #13942 ) - VVelox Discovery Fix polling and discovery of FortiGate cluster sensors ( #13980 ) - mkuurstra Oxidized Oxidized API to return groups based on device purpose or notes ( #13976 ) - sajiby3k Authentication Auth_ldap_skip_group_check when ldap_compare is not supported ( #13926 ) - micko Add LDAP bind and userlist filter support to ldap-authorization ( #13788 ) - pfromme25 Bug Inconsistency in ldap starttls config parameter ( #13987 ) - nox-x Fix version check error ( #13981 ) - murrant Use full sudo path ( #13975 ) - skandragon Fix IPv6 in service check host ( #13939 ) - steffann Refactor Improve the efficiency of some queries ( #13974 ) - murrant Move Config loading to a service provider ( #13927 ) - murrant Documentation Fix typo in dispatcher service doc ( #13979 ) - booth-f Fix a typo in alerting doc ( #13970 ) - twelch24 DOCS, switch to dark or light mode ( #13953 ) - SantiagoSilvaZ Assorted cleanups to alerting docs, primarily to make mdl happier ( #13950 ) - VVelox Update test doc making it more mdl happy and add a section on writing JSON app tests ( #13949 ) - VVelox Translation Small Italian lang update ( #13960 ) - ppasserini Misc Improve lnms shortcut validation ( #13982 ) - murrant Dependencies Bump async from 2.6.3 to 2.6.4 ( #13947 ) - dependabot Bump composer/composer from 2.2.4 to 2.3.5 ( #13944 ) - dependabot 22.4.0 (2022-04-21) A big thank you to the following 27 contributors this last month: murrant (18) SantiagoSilvaZ (3) laf (3) dependabot (3) Fehler12 (3) ottorei (2) bl3nd3r (2) p4k8 (1) si458 (1) TheMysteriousX (1) cliffalbert (1) Jimmy-Cl (1) frenchie (1) ppasserini (1) claude191 (1) westerterp (1) Cormoran96 (1) WillIrvine (1) lucalo72 (1) ssasso (1) Jellyfrog (1) geg347 (1) dandare100 (1) bonzo81 (1) PipoCanaja (1) jonathanjdavis (1) manonfgoo (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (25) murrant (16) laf (10) ottorei (3) PipoCanaja (3) SourceDoctor (2) haxmeadroom (1) Feature Add ISIS discovery and polling for iosxe devices ( #13880 ) - WillIrvine Security Fix services command injection ( #13932 ) - murrant Fix Graylog XSS ( #13931 ) - murrant Bump minimist from 1.2.5 to 1.2.6 ( #13872 ) - dependabot Fix SQL injection in get-host-dependencies ( #13868 ) - Jellyfrog Device Support tplink routers ( #13922 ) - si458 Fix Hytera error ( #13909 ) - murrant PrimeKey Improvements ( #13901 ) - bl3nd3r Enhancements for Zyxel OS ( #13897 ) - Jimmy-Cl Added support for Dell PowerVault ME4024 ( #13883 ) - laf Add support for Riello NetMan 204 ( #13878 ) - lucalo72 Fix usw flex switch hardware detection ( #13877 ) - Fehler12 Added Polycom Lens SNMP support. ( #13876 ) - Fehler12 Fix for PFSense state table removals field ( #13863 ) - dandare100 McAfee Proxy Sensor name update ( #13853 ) - PipoCanaja Add support for PrimeKey Hardware Appliance ( #13806 ) - bl3nd3r Webui Add ISIS-details to alert details ( #13920 ) - ottorei Fix port mini graphs ( #13911 ) - murrant Replaced OpenWRT icon with new logo ( #13891 ) - frenchie Add \"Ping Response\" graph to \"Ping Only\" Device Overview page ( #13886 ) - westerterp Remove fix size for column mac adresse ( #13881 ) - Cormoran96 Fixed the top port errors widget returning bits graphs instead ( #13860 ) - laf Alerting Correct type hint ( #13915 ) - TheMysteriousX Improve alert template saving ( #13910 ) - murrant Added Basic authentication capability to Alertmanager Transport ( #13867 ) - geg347 Snmp Traps Add Cisco Err-Disable interface event trap handler ( #13855 ) - bonzo81 Api Ensure 'add_device' API returns indexed-array (as per doco) ( #13887 ) - claude191 Polling Fix STP polling bug ( #13924 ) - murrant Print full error message in poller/discovery output ( #13903 ) - murrant Rancid Add MRV OptiDriver support in gen_rancid ( #13900 ) - cliffalbert Add support for VyOS on Rancid conf ( #13874 ) - ssasso Bug Validate fixes ( #13935 ) - murrant Lnms device:add handle snmp.community bad format ( #13914 ) - murrant Fix install icons ( #13904 ) - murrant Handle bad uptime input ( #13899 ) - murrant Fix custom error messages ( #13898 ) - murrant Migrate addhost.php to lnms device:add ( #13870 ) - murrant Refactor Port Validation Page to Laravel ( #13921 ) - murrant Cleanup Better device:add error output ( #13913 ) - murrant Remove non-working Dell specific alert rules from the collection ( #13706 ) - Fehler12 Documentation Docs, fix code block in oxidized group ( #13908 ) - SantiagoSilvaZ [DOC] Fix Code blocks Step 2 Installing Network-WeatherMap ( #13905 ) - SantiagoSilvaZ [DOC] Styling the .env word quote ( #13889 ) - SantiagoSilvaZ Docs, fix Linux SNMP example only listening on ::1 ( #13882 ) - murrant Script that describes how to migrate traffic bills from observium. ( #13757 ) - manonfgoo Translation Ukrainian translation update ( #13933 ) - p4k8 Few more language (ITA) updates ( #13890 ) - ppasserini Dependencies Bump guzzlehttp/psr7 from 2.1.0 to 2.2.1 ( #13879 ) - dependabot Bump jpgraph version to 4 ( #13875 ) - ottorei Bump node-forge from 1.2.1 to 1.3.0 ( #13869 ) - dependabot 22.3.0 (2022-03-17) A big thank you to the following 22 contributors this last month: murrant (7) Jellyfrog (5) bonzo81 (4) laf (3) PipoCanaja (2) charlyforot (2) geg347 (2) westerterp (2) ospfbgp (1) MrXermon (1) pandalion98 (1) eskyuu (1) josh-silvas (1) martinberg (1) lpailhas (1) hanserasmus (1) si458 (1) SantiagoSilvaZ (1) LTangaF (1) dlangille (1) Npeca75 (1) woidi (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (19) murrant (10) laf (8) SourceDoctor (3) ottorei (1) bboy8012 (1) PipoCanaja (1) Feature Device_add support display field ( #13846 ) - murrant Display Name in availability map ( #13841 ) - murrant Implement OAuth and SAML2 support ( #13764 ) - Jellyfrog Security Resolved XSS issue from alert rule list modal ( #13805 ) - laf Device Add support for VOSS 8.6 ( #13857 ) - ospfbgp Device - HWG-WLD version 2 support ( #13849 ) - PipoCanaja Fix an issue with the APC current discovery ( #13837 ) - eskyuu Add VS state for Gaia ( #13831 ) - martinberg [new OS] Alpine OptoElectronics TDCM-EDFA support ( #13825 ) - charlyforot Fix db delete on cisco-vrf-lite discovery ( #13823 ) - lpailhas Add rocky linux OS identification ( #13815 ) - hanserasmus Detect truenas scale ( #13812 ) - si458 [comware] dropped dbfetch from discovery/sensors ( #13796 ) - Npeca75 Correct divisor in discovery definition vertiv-pdu.yaml ( #13768 ) - woidi Webui Fixed displaying hostname in create bill when port is passed ( #13830 ) - laf Fix Oxidized Config tab showing when Device OS or Device Type is disabled ( #13809 ) - westerterp Position the buttons in the center on user preferences page ( #13802 ) - SantiagoSilvaZ Add usage hints for Display Name placeholder usage ( #13801 ) - LTangaF Fix second menu bar in Apps screens ( #13800 ) - westerterp WebUI - Search results for ports ( #13787 ) - PipoCanaja Alerting Newer versions of Jira use HTTP code 201 fore created issues ( #13852 ) - MrXermon Add extra dynamic values alerttransport alertmanager ( #13828 ) - geg347 Snmp Traps Add APC SmartAvrReducing trap handlers ( #13839 ) - bonzo81 Add APC upsOnBattery & powerRestored trap handler ( #13836 ) - bonzo81 Add OspfTxRetransmit Trap Handler ( #13824 ) - bonzo81 Cisco Mac address violation trap handler ( #13811 ) - bonzo81 Api Adds API call to update port notes on devices. ( #13834 ) - josh-silvas Bug Rewrite agent packages parsing code ( #13840 ) - murrant Fix snmpv3 context when empty SnmpQuery ( #13832 ) - murrant Regression fix from b6a8b602b891d9eb8633f62632c17bdc559cd620 ( #13819 ) - Jellyfrog Fix PHPStan Deprecated test ( #13794 ) - Jellyfrog Refactor Remove addHost from ModuleTestHelper ( #13847 ) - murrant Tests PHP8 phpstan fix ( #13843 ) - murrant Fix tests for MariaDB > 10.5.15 ( #13829 ) - Jellyfrog Add MIB to OS helper to tests ( #13795 ) - Jellyfrog Misc Add configuration support for IPMIv2 Kg key ( #13845 ) - pandalion98 New device:add code ( #13842 ) - murrant Fix class error name prevents to show BER graph ( #13833 ) - charlyforot Add generic PSU status failed alert rule template ( #13821 ) - geg347 Bump version to 22.2.1 ( #13798 ) - dlangille 22.2.0 (2022-02-16) A big thank you to the following 22 contributors this last month: Jellyfrog (22) murrant (11) PipoCanaja (7) Npeca75 (7) ilGino (6) SantiagoSilvaZ (4) laf (3) h-barnhart (2) aztec102 (2) Fehler12 (1) JKJameson (1) jepke (1) sGoico (1) dorkmatt (1) SourceDoctor (1) si458 (1) dfitton (1) Martin22 (1) fsmeets (1) dependabot (1) knpo (1) guipoletto (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (35) murrant (16) laf (14) PipoCanaja (10) ottorei (6) SourceDoctor (5) kkrumm1 (1) Feature Implement system for user packages in composer ( #13718 ) - Jellyfrog Security Hide community and make it XSS safer ( #13783 ) - PipoCanaja Moved some pages to be within admin route ( #13782 ) - laf XSS fix ( #13780 ),( #13778 ),( #13776 ),( #13775 ) - PipoCanaja Bump follow-redirects package from 1.14.7 to 1.14.8 ( #13774 ) - dependabot Device Support for Terra sdi410c / sdi480 devices ( #13759 ) - Npeca75 Added BER to Racom Ray and Ray3 ( #13758 ) - Martin22 Added system temperature support including state for Extreme VSP 4900 devices ( #13743 ) - laf Added ipv6 route discovery for Mikrotik devices ( #13737 ) - Npeca75 Fixed airos temp in 8.7.7 for ubnt devices ( #13731 ) - murrant Added sensors to ZXA OS ( #13724 ) - aztec102 Added support for Volius OS ( #13723 ) - aztec102 Updated DDM MIBs for Jetstream OS ( #13715 ) - Npeca75 Added support for Ubiquiti Airfiber60 devices ( #13680 ) - jepke Fixed Temperature Sensor for AirOS 8.7.4+ ( #13655 ) - JKJameson Added support for Lenovo think station devices ( #13617 ) - Fehler12 Added sensors for huawei vrp devices ( #13352 ) - guipoletto Webui Rewrite includes/html/pages/device/health.inc.php ( #13777 ) - Npeca75 Various fixes for STP ( #13773 ) - PipoCanaja Added missing icons for progressive web app ( #13771 ) - murrant Show selected selection option on graphs page in Mono theme ( #13765 ) - SantiagoSilvaZ Show selected option of devices-graphs-select in Mono theme ( #13752 ) - SantiagoSilvaZ Upgrade to font awesome 6 ( #13760 ) - Jellyfrog Upgrade to font awesome 5 ( #13754 ) - Jellyfrog Update dark.css to improve visibility ( #13749 ) - dfitton Removing colon symbol from multiple dialogs ( #13742 ) - ilGino Added the word Actions in the header of the oxidized-nodes table ( #13741 ) - SantiagoSilvaZ Updated icons of links pointing to Health pages ( #13729 ) - ilGino Updated to a more consistent Fontawesome icon for the Export to PDF ( #13713 ) - ilGino Removing the colon symbol to the right of a control labels ( #13704 ),( #13705 ) - ilGino Update to tailwind 3 ( #13695 ) - Jellyfrog Alerting Added better default sensor alert template ( #13703 ) - Jellyfrog Snmp Traps Added SNMP Traps for Brocade login traps ( #13770 ) - h-barnhart Added SNMP Traps for APC Overload Traps ( #13726 ) - h-barnhart Discovery Check for empty SLA tags so we skip bad entries ( #13679 ) - laf Bug Only try contexts in STP for Cisco devices ( #13767 ) - murrant Fix settings array initial value ( #13755 ) - Jellyfrog Use better filesystem functions to delete host rrd dir ( #13735 ) - Jellyfrog Device:poll log poll complete ( #13733 ) - murrant Fixed \\< 0 exception in ports poller ( #13732 ) - murrant Fixed ups-nut check ( #13722 ) - Jellyfrog Changed fping hardcoded binary to user defined fping ( #13720 ) - sGoico Refactor Oxidized reload called on Device update and remove ( #13730 ) - murrant Stp module rewrite ( #13570 ) - murrant Cleanup Dropped dbfetch from discovery/sensors for pbn devices ( #13789 ) - Npeca75 Dropped dbfetch from discovery/sensors for junos devices ( #13784 ) - Npeca75 Removed contrib directory ( #13727 ) - murrant Removed old vendor fix ( #13717 ) - Jellyfrog Replace Requests library with HTTP Client ( #13689 ) - Jellyfrog Use built in method to render a string with Blade ( #13688 ) - Jellyfrog Documentation Simple docs tweaking ( #13792 ) - Jellyfrog Update Switching API doc to fix link ( #13786 ) - knpo Rename DHCP Stats to ISC DHCP Stats ( #13756 ) - SourceDoctor Update Install-LibreNMS.md to include pip3 install ( #13746 ) - si458 validate-config-icon better positioning in the text ( #13744 ) - SantiagoSilvaZ Updated Debian install docs to include pip3 install ( #13721 ) - dorkmatt Full rework of documentation for better nav, cleanup and fixes ( #13709 ) - Jellyfrog Tests Bump test timeout to 2 hours ( #13769 ) - Jellyfrog Speed up tests by reducing snmp timeout ( #13725 ) - murrant Lnms dev:check add --os-modules-only option ( #13700 ) - murrant Misc Set default DB_TEST_PORT in database config ( #13793 ) - Jellyfrog Fixed links to connected devices in old style maps ( #13762 ) - fsmeets Updated Top Devices widget to include filtering on ifOperStatus ( #13748 ) - Npeca75 Correct prefix for \"kilo\" should be small k, not capital K ( #13714 ) - ilGino Remove old composer preinstall script ( #13712 ) - Jellyfrog Improve Proxy::shouldBeUsed ( #13702 ) - Jellyfrog Use commit date to compare pull requestes ( #13701 ) - Jellyfrog Dependencies Update JS deps ( #13694 ) - Jellyfrog Update dependencies ( #13684 ) - Jellyfrog 22.1.0 (2022-01-23) A big thank you to the following 26 contributors this last month: murrant (9) Npeca75 (4) loopodoopo (3) ilGino (2) Jellyfrog (2) SourceDoctor (2) laf (2) aztec102 (2) twelch24 (1) tkjaer (1) ssasso (1) TechieDylan (1) hvanoch (1) h-barnhart (1) gdepeyrot (1) k0079898 (1) efelon (1) westerterp (1) avermeer-tc (1) Fehler12 (1) bonzo81 (1) glance- (1) VirTechSystems (1) iopsthecloud (1) blubecks (1) thford89 (1) Thanks to maintainers and others that helped with pull requests this month: murrant (22) Jellyfrog (13) laf (10) PipoCanaja (6) ottorei (2) SourceDoctor (2) Feature Add Sla jitter packet loss percent graph ( #13600 ) - bonzo81 Add API-routes for listing MPLS SAPs and services ( #13561 ) - blubecks Device Merge enviromux-micro in existing NTI ( #13696 ) - Npeca75 Change the variable to detect version for mikrotik ups runtime device divisor ( #13678 ) - TechieDylan VRP BGP fixes ( #13675 ) - murrant Added new sensors to mes23xx ( #13671 ) - Npeca75 Added initial detection MES2324F or MES2324FB ( #13669 ) - aztec102 New OS: Adva XG 304 ( #13668 ) - h-barnhart Basic ZTE ZXA10 detection ( #13658 ) - murrant Added CET Power T2S TSI ( #13645 ) - aztec102 Eltek ospf poller disable ( #13635 ) - loopodoopo Smartoptics dcp m 40 zr ( #13634 ) - avermeer-tc Updated XOS (Extreme) processor data to use correct OID ( #13633 ) - laf Initial Support for Fujitsu RX300 with iRMC4 ( #13631 ) - Fehler12 Teleste Luminato ports & qam/asi output sensors & yaml ( #13616 ) - Npeca75 Workaround linksys always mapping to g1 ( #13595 ) - glance- Equallogic fix typo on os name in the storage module ( #13580 ) - iopsthecloud Webui [WebUI] Removing the colon symbol to the right of a control label ( #13698 ) - ilGino Remove unneccessary Section Description ( #13677 ) - SourceDoctor Device tracepath using wrong variables to check for traceroute output ( #13674 ) - laf Allow filter by display name in device list ( #13665 ) - gdepeyrot Sort Vlan Ports by ifName, ifDescr ( #13657 ) - SourceDoctor Fix horizontal scrollbar in device list always visible ( #13653 ) - efelon Alerting Use display name in alerts ( #13650 ) - murrant Graphs Timos sap dot1q graphing fix ( #13654 ) - loopodoopo Applications Add supervisord application ( #13673 ) - hvanoch Api API detect if new location should be fixed by default ( #13637 ) - murrant Set fixed_coordinates via api ( #13593 ) - VirTechSystems Polling Added oids.no_bulk os setting ( #13666 ) - Npeca75 Add consistent output of name and app_id to Poller for all Applications (fixes #13641) ( #13648 ) - westerterp Fix SnmpQuery bulk boolean backwards ( #13636 ) - murrant Rancid Gen RANCID host also for FS.com devices ( #13682 ) - ssasso Bug Use PHP_BINARY directly instead of trying to build path to PHP binary ( #13690 ) - Jellyfrog Small text change for misspelled Virtual ( #13686 ) - ilGino Snmp timeout is a float, allow in config ( #13676 ) - murrant Fix NULL device alert caused by services ( #13663 ) - k0079898 Disable VRP VLANs test, seems to be a bug in snmpsim snmpbulkwalk ( #13649 ) - murrant Remove extra rows with duplicate keys in SyncsModels trait ( #13632 ) - murrant Documentation Update rrdcached link ( #13692 ) - twelch24 Add missing python3-pip installation dependency for debian11 ( #13691 ) - tkjaer Translation Fix settings language file to include Distributed Poller labels. ( #13511 ) - thford89 Dependencies Update recommended PHP version to 8.0 ( #13687 ) - Jellyfrog 21.12.0 (2021-12-21) A big thank you to the following 30 contributors this last month: murrant (38) Npeca75 (6) Jellyfrog (3) twelch24 (3) johnstruse (2) nightcore500 (2) Martin22 (2) wkamlun (2) martinberg (1) mathieu-artic (1) dependabot (1) carranzamarioagustin (1) SourceDoctor (1) si458 (1) Cormoran96 (1) claude191 (1) ottorei (1) banachtarski-91 (1) RockyVod (1) enferas (1) jepke (1) duhow (1) Nocturr (1) hjcday (1) djamp42 (1) PipoCanaja (1) amanualgoldstein (1) pepperoni-pi (1) paulierco (1) TheGreatDoc (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (42) murrant (20) SourceDoctor (3) ottorei (3) bakerds (2) jaypo82 (1) mpikzink (1) troublestarter (1) PipoCanaja (1) Feature Catch all module errors ( #13542 ) - murrant Lnms snmp:fetch query multiple devices ( #13538 ) - murrant Configurable device display name ( #13528 ) - murrant RRD Allow specifying a source file and ds to fill data ( #13480 ) - murrant Security Fix unescaped strings XSS issues ( #13554 ) - enferas Device Fix EdgeOS hardware detection ( #13629 ) - johnstruse Add additional ICX 7150 devices ( #13627 ) - johnstruse Fix axiscam serial format ( #13620 ) - murrant Fix Cisco WLC AP cleanup ( #13615 ) - murrant CPU, HW type, HW ver, Fan state discovery ( #13608 ) - Npeca75 Initial Eltex-mes IPv6 address discovery ( #13594 ) - Npeca75 Add better support for Eaton UPS ( #13588 ) - mathieu-artic SmartAX supports IF-MIB, skip custom polling and fix polling GPON ports ( #13579 ) - carranzamarioagustin Add back Areca secondary hardware OID ( #13562 ) - murrant Ray3 - Added memory chart ( #13557 ) - Martin22 Add all Aviat WTM4k family devices ( #13556 ) - RockyVod Fix discovery and pooling Racom Ray2 ( #13553 ) - Martin22 Add version for ironware ( #13551 ) - wkamlun Add ICX 7150 description ( #13550 ) - wkamlun Add discovery for APC EPDU1132M ( #13545 ) - duhow Split Eltex-mes OS to mes21xx / mes23xx. + few improvements ( #13544 ) - Npeca75 Add Initial Support for VMware SD-WAN / Velocloud ( #13536 ) - Nocturr Arista EOS, use sysObjectID for detection (to include vEOS) ( #13534 ) - murrant RUTX fix sensor limits ( #13526 ) - hjcday Added support for Himoinsa gensets status state sensors ( #13456 ) - TheGreatDoc Webui VLANs sort in GUI ( #13628 ) - Npeca75 Fix broken links ( #13625 ) - murrant Fix the displayed unit for frequency and distance in the wireless section ( #13614 ) - nightcore500 Add more device fields to oxidized map configuration ( #13604 ) - martinberg Correct graph row component responsive layout for linked graphs ( #13587 ) - murrant Global search: search device display ( #13583 ) - murrant Availibility Map - show Display Name if set ( #13574 ) - SourceDoctor Do not show location in device overview if location is not found ( #13572 ) - murrant Don't use @lang() it doesn't escape the string ( #13566 ) - murrant Allow LegacyPlugin Pages to receive all parameters ( #13519 ) - PipoCanaja Alerting Use http for proxy urls via guzzle ( #13601 ) - Jellyfrog Twilio change text to show alert termplate msg ( #13521 ) - djamp42 Graphs Fix nototal graph option ( #13589 ) - nightcore500 Add additional type tag for Bind metrics ( #13581 ) - murrant Snmp Traps Veeam SNMP traps fix and extend ( #13549 ) - jepke Add Alcatel Omniswitch Traps Handlers ( #13492 ) - paulierco Applications PHP8 compatibility for ntp-server polling app ( #13513 ) - amanualgoldstein Billing Billing fix a couple divide by zero errors ( #13517 ) - murrant Api API 'list_parents_of_host' - mostly doco, but one small code enhancement ( #13567 ) - claude191 Discovery Q-bridge-mib, discover missing VLANs, v2 ( #13569 ) - Npeca75 Polling Ios-fdb-table-fix -- Fixed misnamed dictionary keys for dot1dTpFdbPor\u2026 ( #13559 ) - banachtarski-91 OSPF issue when devices don't support OSPF-MIB::ospfIfTable ( #13530 ) - murrant Poller command rewrite ( #13414 ) - murrant Bug Escape net-snmp unformatted strings, try 2 ( #13584 ) - murrant Workaround don't poll WLC on IOSXE ( #13563 ) - murrant Fix Ciscowlc AP-polling ( #13560 ) - ottorei Mark OID not increasing as invalid ( #13548 ) - murrant Skip invalid OSPF data ( #13547 ) - murrant Remove color markers when logging to files ( #13541 ) - murrant Fix plugin_active check when plugin is not found ( #13531 ) - murrant Remove unused buggy arp_discovery code ( #13529 ) - murrant Pseudowire cpwVcID can exceed database max value ( #13510 ) - pepperoni-pi Refactor Ipv6 discovery switch to new DB syntax ( #13591 ) - Npeca75 OSPF port module ( #13498 ) - murrant Cleanup Fix bad snmp context option ( #13497 ) - murrant Polling cleanup, fix PHP warnings ( #13460 ) - murrant Documentation Clarify docker app setup on debian/ubuntu ( #13573 ) - si458 Update winbox launcher doc (again) ( #13558 ) - twelch24 Add more detailed instructions to winbox launcher ( #13552 ) - twelch24 Link for can't check Python dependencies validation ( #13520 ) - murrant Elaborate on feeding Oxidized ( #13514 ) - murrant Tests Tests dont include empty tables ( #13619 ) - murrant Collect-snmp-data.php can now capture snmp context test data ( #13596 ) - murrant Snmp.unescape setting ( #13590 ) - murrant Use phpstan-deprecation-rules instead ( #13582 ) - Jellyfrog Mibs Update netapp mib ( #13571 ) - Cormoran96 Dependencies Bump symfony/http-kernel from 5.3.9 to 5.4.0 ( #13585 ) - dependabot 21.11.0 (2021-11-12) A big thank you to the following 49 contributors this last month: murrant (39) Jellyfrog (6) arrmo (4) Nocturr (4) PipoCanaja (3) TheGreatDoc (3) martinberg (3) robje (2) loopodoopo (2) Npeca75 (2) drshawnkwang (2) jul13579 (2) bakerds (2) SourceDoctor (2) deajan (2) jonathansm (1) lfkeitel (1) Deltawings (1) fcuello-gc (1) drommc (1) techladsjamie (1) duhow (1) hjcday (1) DanielMuller-TN (1) blagh (1) cenjui (1) TheGracens (1) eskyuu (1) nq5 (1) mjbnz (1) roycruse (1) ottorei (1) si458 (1) nmanzi (1) apokryphal (1) thford89 (1) arjitc (1) tuxgasy (1) kterobinson (1) bl3nd3r (1) hanserasmus (1) mpikzink (1) dagbdagb (1) sthen (1) ahmedsajid (1) dorkmatt (1) evheros (1) nightcore500 (1) CirnoT (1) Thanks to maintainers and others that helped with pull requests this month: murrant (53) Jellyfrog (47) PipoCanaja (7) SourceDoctor (5) ottorei (5) mpikzink (2) arjitc (1) salmayno (1) yoeunes (1) Aeet (1) oussama-aitmi (1) nightcore500 (1) drshawnkwang (1) Feature Discovery on Reboot ( #13422 ) - SourceDoctor Security Fix widget title injection vulnerability ( #13452 ) - murrant Kick other sessions when changing password ( #13194 ) - murrant Device APC Load, wrong low precision oid ( #13506 ) - jonathansm Nokia SAR HMC ( #13503 ) - loopodoopo Ciena 2 ( #13491 ) - loopodoopo Added initial IPv6 Address discovery for TP-LINK Jetstream ( #13484 ) - Npeca75 Update Windows Versions ( #13474 ) - arrmo Support for PDUMNV30HVLX with PADM 20 ( #13473 ) - drommc Opengear improvement, don't needlessly fetch ogEmdTemperatureTable ( #13471 ) - drshawnkwang RouterOS now returns the correct runtime ( #13461 ) - murrant Fix latitude having an extra - in the middle after the decimal point ( #13454 ) - techladsjamie Fix Sophos-XG OID for number of active tunnels ( #13444 ) - Nocturr Fix hwg poseidon state sensors ( #13438 ) - TheGreatDoc UniFi/EdgeSwitch OS support for fw 5.x ( #13434 ) - Nocturr Added support for Extreme SLX-OS switches ( #13431 ) - bakerds Mikrotik vlans discovery, v2 ( #13427 ) - Npeca75 Added sensor discovery for APC NetworkAIR FM and InfraStruXure ATS ( #13426 ) - bakerds Add Sophos-XG OID for monitoring HA, IPSec and license state ( #13423 ) - Nocturr Add more discovery components for Dell PowerConnect 28xx ( #13420 ) - duhow Added Wireless Sensors for Teltonika RUTX Routers ( #13419 ) - hjcday Add APC PowerChute sysObjectID ( #13406 ) - cenjui Fix APC high precision divisor ( #13405 ) - TheGracens Luminato device doesn't support alternative uptimes ( #13399 ) - eskyuu Update ports module to accept VDSL2 ifType in xDSL polling ( #13393 ) - roycruse Fix windows fanspeed ( #13376 ) - si458 Add support for Teltonika RUT360 ( #13375 ) - martinberg Add support for NTI Enviromux ( #13373 ) - martinberg Update Himoinsa Genset discovery ( #13356 ) - TheGreatDoc Improve Poweralert based devices support ( #13340 ) - arjitc Add iDrac physical disk state ( #13264 ) - tuxgasy Add opengear humidity to sensors ( #13226 ) - drshawnkwang IOS/IOSXE PoE stats ( #13213 ) - martinberg Poll SPU memory from Juniper SRX devices ( #13191 ) - bl3nd3r Extend support for Endrun Sonoma Meridian II devices. ( #13069 ) - hanserasmus Bintec be.IP plus support ( #12993 ) - jul13579 Eaton Network MS xups sensors ( #12992 ) - dagbdagb Don't hardcode index for Mikrotik LTE wireless statistics ( #12976 ) - sthen OS support for West Mountain 4005i DC PDU ( #12885 ) - dorkmatt FabOS remove disabled dbm sensors ( #12877 ) - evheros Raspberry Pi: Add SNMP extend to monitor IO pins or sensor modules connected to the GPIO header ( #12749 ) - nightcore500 Use high precision OIDs for APC UPS sensors ( #12594 ) - CirnoT Webui Increase default session lifetime to one month ( #13505 ) - murrant Fix maintenance mode button in Firefox ( #13500 ) - lfkeitel Only call htmlentities on port ifAlias,ifName, and ifDescr ( #13489 ) - murrant Merchandise shop link in about ( #13485 ) - murrant Tweak new notification appearance ( #13477 ) - murrant Add missing \\ ( #13459 ) - robje Fix syslog widget priority filtering ( #13411 ) - murrant PHP-Flasher for toast messages ( #13401 ) - murrant Update alertlog-widget to allow filtering by device group ( #13380 ) - ottorei Alerting Fix slack errors when variables are not set ( #13476 ) - murrant Fix api transport mult-line parsing ( #13469 ) - murrant Drop PDConnect Install links ( #13407 ) - blagh Port Speed degraded alert rule ( #13371 ) - murrant Added Unpolled Devices rule to collection ( #12896 ) - ahmedsajid Graphs Add missing graph definition for pf_matches (pfSense firewall) ( #13507 ) - robje Snmp Traps SNMP Trap handler: UpsTrapOnBattery ( #13482 ) - TheGreatDoc Applications Doc - MySQL Application ( #13495 ) - Deltawings Api Add get_ports_by_group API function ( #13361 ) - nmanzi Discovery Fix Dispatcher service not discovering poller groups ( #13377 ) - murrant Modified SQL delete statement for vrf is null ( #13199 ) - kterobinson Polling Added TOS support for fping ( #13496 ) - PipoCanaja Fix SnmpQuery mibdir from os group ( #13475 ) - murrant Fix application and storage query errors ( #13417 ) - murrant Fix uptime polling event ( #13388 ) - murrant Keep stats for snmptranslate ( #13379 ) - murrant Rewrite netstats polling ( #13368 ) - murrant Run Alert Rules on Service status change. ( #13348 ) - thford89 Rancid Show single quotes correcting for device configs ( #13360 ) - apokryphal Oxidized Syslog hook examples and documentation for Procurve devices ( #13397 ) - nq5 Bug Fix PyMySQL upstream dependency bug ( #13508 ) - murrant Fix net-snmp unformatted strings ( #13486 ) - murrant [bug] Fix & extend MAC OUI table updates ( #13479 ) - PipoCanaja Attempt to fix dispatcher stats thread exception ( #13478 ) - murrant PHP8, correct multiplication in packages application ( #13462 ) - arrmo Don't use proxy for localhost (Oxidized and Prometheus) ( #13450 ) - murrant Better handling of some alerting errors ( #13446 ) - murrant Fix PHP8 error in sensor unit conversion ( #13433 ) - arrmo PHP8 Unit Conversion, ups-nut ( #13432 ) - arrmo Services and ping not polling default groups ( #13403 ) - murrant Increase length of devices_attribs.attrib_type column ( #13395 ) - mjbnz Bug - Fix missing uptime in fillable (Device Model) ( #13387 ) - PipoCanaja Fix regression from #12998 ( #13385 ) - Jellyfrog Refactor Change how options are handled for SnmpQuery ( #13488 ) - murrant Rename concrete SnmpQuery class to avoid confusion ( #13412 ) - murrant Fully convert core to a modern module ( #13347 ) - murrant New plugin system based on Laravel Package Development ( #12998 ) - mpikzink Cleanup Fixes for misc unset variables ( #13421 ) - murrant Remove unused snom files ( #13369 ) - murrant Fix config fetch disrupted by stderr ( #13362 ) - deajan Use PHPStan level 6 ( #13308 ) - Jellyfrog Documentation Fix typo in filepath for unit-tests to work ( #13440 ) - Nocturr Debian 11 Install Docs ( #13430 ) - SourceDoctor Don't suggest running validate.php as root ( #13378 ) - murrant Tests Fix IPV6 test ( #13468 ) - Jellyfrog Ability to save cipsec-tunnels test data ( #13463 ) - murrant Run phpstan locally with lnms dev:check lint ( #13458 ) - murrant Dusk: improve speed and safety ( #13370 ) - murrant Dependencies Bump psutil=>5.6.0 to satifsy command_runner ( #13501 ) - Jellyfrog Update to Larastan 1.0 ( #13466 ) - Jellyfrog Update PHP dependencies ( #13396 ) - murrant Install new python dependencies during daily maintenance ( #13186 ) - deajan 21.10.0 (2021-10-16) A big thank you to the following 21 contributors this last month: murrant (40) SourceDoctor (9) Jellyfrog (5) loopodoopo (3) Cupidazul (3) maxnz (3) mpikzink (3) ottorei (2) gs-kamnas (2) topranks (2) mctaguma (1) DanielMuller-TN (1) hjcday (1) dependabot (1) calvinthefreak (1) si458 (1) Laplacence (1) peelman (1) noaheroufus (1) deajan (1) lutfisan (1) Thanks to maintainers and others that helped with pull requests this month: murrant (36) Jellyfrog (29) SourceDoctor (7) ottorei (1) PipoCanaja (1) Feature New SNMP code and lnms snmp:fetch command ( #13303 ) - murrant Add eventlog on_create device version 2 w/deps ( #13302 ) - Cupidazul Push Notifications (Mobile and PC) ( #13277 ) - murrant Modified Prometheus extension to support adding a prefix to metric names ( #13272 ) - topranks Config seeder ( #13259 ) - murrant Infer character encoding for ifAlias and sysLocation ( #13248 ) - murrant Log count of logged in users in database from HOST-RESOURCES-MIB ( #13137 ) - SourceDoctor Security Use the same error message for different kind of authentiction errors ( #13306 ) - Jellyfrog Device Added support for Teltonika RUTX series routers ( #13350 ) - hjcday Ericsson TN - Wireless MSE ( #13328 ) - loopodoopo Ciena 6500 Optics sensors ( #13324 ) - loopodoopo Ericsson Traffic Node support ( #13299 ) - loopodoopo Procurve E model prefix fix ( #13261 ) - maxnz Fix axis cam discovery ( #13258 ) - maxnz Wireless and GSM Basic Monitoring ( #13255 ) - Cupidazul Added SAF Integra-X OS Support ( #13236 ) - noaheroufus Arubaos cx hardware ( #13045 ) - maxnz MegaRaid controller in Linux (Broadcom/LSI) ( #12999 ) - mpikzink Add Ericsson IPOS router support ( #12625 ) - lutfisan Webui Alert detail display fix ( #13335 ) - SourceDoctor Show Detail by default Option on Alert Widget ( #13309 ) - SourceDoctor Fix various port links ( #13296 ) - murrant Add ORDER BY to the ports query when showing the ports list on device\u2026 ( #13276 ) - peelman Use local timezone for outages pages ( #13274 ) - ottorei Remove device dark mode detection ( #13273 ) - murrant Linkable graph component ( #13263 ) - murrant Improve tailwind dark theme colors ( #13262 ) - murrant Workaround for dashboard widgets showing over popups. ( #13257 ) - murrant Alerting Fix alert transport api with POST method ( #13288 ) - Laplacence Graphs Fix graphs showing bps instead of pps ( #13266 ) - Cupidazul Snmp Traps HP Fault Traps ( #13254 ) - mpikzink Veeam backup SNMP Traps ( #13170 ) - mpikzink Api Added conditional check for rules parameter on add_device_group ( #13353 ) - DanielMuller-TN API add_device: respond with more device array ( #13251 ) - SourceDoctor API Call to assign/remove a Portgroup to Ports ( #13245 ) - SourceDoctor API Call to set instant Maintenance mode ( #13237 ) - SourceDoctor API port search by arbitrary field ( #13231 ) - SourceDoctor Settings Automatically set rrdtool_version once ( #13327 ) - murrant Discovery Quick fix for route discovery on PHP8 ( #13284 ) - murrant Polling Dispatcher bugfix queues not being disabled properly ( #13364 ) - murrant Fix for cimc polling on PHP8 ( #13357 ) - murrant Dispatch Service: Don't stop dispatching if master moves to a node with a queue disabled ( #13355 ) - murrant Fix device query when last_polled_timetaken is null ( #13331 ) - murrant Restore accidentally removed code ( #13330 ) - murrant Allow non-snmp modules to run when snmp disabled ( #13321 ) - murrant Fix python config fetch disrupted by stderr output ( #13295 ) - murrant Fix poller wrapper error ( #13290 ) - murrant Oxidized Added OneOS map for Oxidized ( #13313 ) - calvinthefreak Authentication Improvements to SSO Authorization and logout handling ( #13311 ) - gs-kamnas Bug Fix poller groups reverting when setting via the Web UI. ( #13363 ) - murrant Rename config var auth_redirect_handler -> auth_logout_handler ( #13329 ) - gs-kamnas HrSystem Columns have to be optional ( #13316 ) - SourceDoctor Hrsystem write fix ( #13314 ) - SourceDoctor Check if vlan->port exists ( #13305 ) - Jellyfrog Fix html.device.links validation ( #13269 ) - murrant Fix lnms some commands throwing errors ( #13265 ) - murrant Refactor SnmpQuery updates and more tests ( #13359 ) - murrant Remove load_os and load_discovery functions ( #13345 ) - murrant Rename NetSnmp to SnmpQuery ( #13344 ) - murrant Use Measurements for all statistic collection ( #13333 ) - murrant Use built in trusted proxy functionality ( #13318 ) - murrant Connectivity Helper to check and record device reachability ( #13315 ) - murrant Cleanup config.php.default ( #13297 ) - murrant SNMP Capabilities ( #13289 ) - murrant Cleanup device type override code ( #13256 ) - murrant Full Python code fusion / refactor and hardening 2nd edition ( #13188 ) - deajan Convert all ports backend to Laravel style ajax table ( #13184 ) - murrant Documentation Change \"move\" to \"migrate\" to make it easier to find ( #13365 ) - murrant Updated link to Dan Brown's migration scripts ( #13354 ) - mctaguma Edit existing install url ( #13342 ) - murrant Oxidized doc update, links and ignore groups ( #13341 ) - murrant Update docs: Update Dispatcher service documentation ( #13339 ) - ottorei Send security researchers to Discord ( #13319 ) - murrant Fix to puppet snmp extend formatting ( #13312 ) - si458 Update formatting of Prometheus extension doc ( #13291 ) - topranks Tests Disallow usage of deprecated functions ( #13267 ) - Jellyfrog Dependencies Bump composer/composer from 2.1.8 to 2.1.9 ( #13336 ) - dependabot Update dependencies ( #13310 ) - Jellyfrog 21.9.0 (2021-09-16) A big thank you to the following 20 contributors this last month: murrant (29) Jellyfrog (5) ottorei (3) SourceDoctor (3) Galileo77 (2) paulierco (2) Fehler12 (2) Negatifff (2) deajan (2) mpikzink (2) vakartel (2) efelon (1) pimvanpelt (1) kimhaak (1) kevinwallace (1) noaheroufus (1) si458 (1) mzacchi (1) niddey (1) PipoCanaja (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (21) murrant (19) ottorei (3) SourceDoctor (2) PipoCanaja (2) mpikzink (1) Feature API alert transport can include Options variables in the Body for POST requests ( #13167 ) - mzacchi Show port speed on port graphs, optionally set scale ( #11858 ) - murrant Device Fix Dell server sensors ( #13247 ) - murrant Add mouseover mini graphs that makes sense for Liebert PDU ( #13246 ) - Galileo77 Add ifName to osag os ( #13243 ) - paulierco IfName to mcafeewebgateway ( #13242 ) - paulierco Add VPP logo ( #13230 ) - pimvanpelt Add Support for USW-Flex ( #13229 ) - Fehler12 Added Cisco CBS 250 Support ( #13228 ) - Fehler12 Update geist-watchdog.yaml ( #13223 ) - Galileo77 Add skip_values to Liebert capacity sensor definitions ( #13200 ) - kevinwallace Procurve add SysDescr Regex ( #13196 ) - mpikzink Updated OS Support: Dragonwave Horizon ( #13193 ) - noaheroufus ZTE ZXR10 define discovery for mempool and processor ( #13192 ) - vakartel Dell Network Virtual Link Trunk Status ( #13162 ) - mpikzink Webui Update to fix table row color and hover color for dark.css ( #13244 ) - efelon Fix port minigraph layout ( #13240 ) - murrant Sort dashboard entries alphabetically ( #13238 ) - ottorei Fix graph row columns ( #13232 ) - murrant Changed map functionality in device overview ( #13225 ) - kimhaak New Blade Components: x-device-link, x-port-link, x-graph-row, x-popup ( #13197 ) - murrant Add serial search in ajax search process ( #13185 ) - Negatifff Allow device actions to appear in device list and improve docs ( #13177 ) - murrant Show count of Ports in PortGroup display ( #13164 ) - SourceDoctor Change automatic widget updates to use bootgrid when possible ( #13159 ) - niddey Alerting Fix PagerDuty transport's group field ( #13235 ) - ottorei Format port speed changes in the event log ( #13174 ) - murrant Graphs Change default graph view to zoom in on traffic. ( #13173 ) - murrant Settings Dynamic Select setting ( #13179 ) - murrant Increase config value length limit ( #13178 ) - murrant Default port group in Settings ( #13175 ) - SourceDoctor Default port_group for new ports ( #13166 ) - SourceDoctor Add support for description texts in Settings page ( #13104 ) - Jellyfrog Discovery Mark snmp disabled devices as skipped ( #13202 ) - murrant Allow more compatibility in STP port discovery/polling ( #13109 ) - PipoCanaja Polling Fix snmp_bulk setting not being applied ( #13209 ) - murrant Do not poll passive ISIS-circuits ( #13168 ) - ottorei Common contexts for polling ( #13158 ) - murrant Rewrite ISIS Adjacency discovery/polling ( #13155 ) - murrant Oxidized Add sysobjectid and hardware fields into oxidized maps ( #13221 ) - Negatifff Bug Fix mempool unit display ( #13241 ) - murrant Select dynamic fixes ( #13187 ) - murrant Validate schema in utc ( #13182 ) - murrant Fix DB Inconsistent friendly error message ( #13163 ) - murrant Refactor Update configuration docs to use lnms config:set ( #13157 ) - murrant Rename nobulk -> snmp_bulk ( #13098 ) - Jellyfrog Documentation Add security context service ( #13218 ) - deajan Fix numbering in application docs ( #13183 ) - si458 Docs link to webui settings in user's install ( #13176 ) - murrant Misc Increase RestartSec time to a reasonable value ( #13217 ) - deajan Validate APP_KEY ( #13171 ) - murrant 21.8.0 (2021-08-22) A big thank you to the following 40 contributors this last month: PipoCanaja (12) murrant (10) Jellyfrog (8) paulierco (5) mpikzink (5) ottorei (3) fbourqui (2) facuxt (2) geg347 (2) dennypage (2) opalivan (2) keryazmi (2) wkamlun (2) si458 (2) martinberg (2) vakartel (1) SanderBlom (1) SourceDoctor (1) VirTechSystems (1) Talkabout (1) hannut (1) kevinwallace (1) jasoncheng7115 (1) arjitc (1) igorek24 (1) mtoupsUNO (1) Laplacence (1) tcwarn (1) deajan (1) Npeca75 (1) Negatifff (1) adamus1red (1) rhinoau (1) arrmo (1) e-caille (1) Sea-n (1) saschareichert (1) bennetgallein (1) loopodoopo (1) tikitaru (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (37) murrant (28) PipoCanaja (20) SourceDoctor (2) Feature Lnms config:set ability to set os settings ( #13151 ) - murrant Detect sending non-html emails as html ( #13114 ) - murrant Add peak in and out ( #13006 ) - bennetgallein Device Add OSAG new OS ( #13156 ) - paulierco More specific grandstream-ht detection ( #13152 ) - murrant Added voltage, cell states and wireless data for cell interface (GEMDS OS). ( #13142 ) - SanderBlom Opnsense detection ( #13097 ) - mpikzink Added OID for Extreme switch X350-48t ( #13096 ) - tcwarn Add Janitza power consumed ( #13095 ) - mpikzink Added/fixed LLDP discovery ( #13082 ) - Npeca75 Allow stack index other than '1.' for CiscoSB ( #13078 ) - dennypage Add logo for Scientific Linux ( #13075 ) - mpikzink Fix Cisco SLAs garbage entries ( #13068 ) - murrant Cisco ISE version, HW, SW and test-data ( #13062 ) - PipoCanaja Fixed Packetlight EDFA sensors and add test-data ( #13060 ) - opalivan Alcatel-Lucent AOS7 bgp fix2 ( #13059 ) - paulierco Add logo for Linux Mint ( #13055 ) - arrmo Alcatel-Lucent Aos6 ignore second power supply ( #13054 ) - paulierco Alcatel-Lucent Aos7 increase fan threshold ( #13053 ) - paulierco Use non numeric snmpwalk for nxos fan trays ( #13048 ) - e-caille Alcatel-Lucent Aos7 bgp fix ( #13047 ) - paulierco Add number of connected wireless client and number of connected FortiAP ( #13037 ) - wkamlun Update Sensors for ADVA FSP150CC + discovery fix ( #13020 ) - keryazmi Improve dell-compellent detection for newer firmwares ( #13019 ) - saschareichert Poll current connections for F5 ltm ( #12968 ) - martinberg Ericsson 6600 series ( #12931 ) - loopodoopo Fix WUT ThermoHygro with new hardware revisions ( #12913 ) - mpikzink Fix polling current on ICT2000DB-12IRC ( #12529 ) - tikitaru Webui Cleanup Port hover minigraph description when using \"Interface Description Parsing\" ( #13143 ) - fbourqui Dark mode improvements ( #13141 ) - facuxt Improvements to dark theme. ( #13139 ) - facuxt Adjust App String Pi-hole to project name ( #13136 ) - SourceDoctor Sort port selector dropdown ( #13135 ) - VirTechSystems Priority filtering for syslog widget ( #13134 ) - Talkabout Center new service window ( #13115 ) - arjitc Add urlencode for location link in device view ( #13076 ) - Negatifff Add device_group to availability widget hyperlink ( #13061 ) - rhinoau More sensor data on inventory page ( #13057 ) - PipoCanaja Api Adding API route to set bgpPeerDescr field ( #13056 ) - geg347 API mac search ( #12964 ) - mpikzink Alerting Add EU Service Region to PagerDuty transport ( #13154 ) - ottorei Fix HTML encoded characters in Slack ( #13120 ) - geg347 Add SignalWire (Twilio alternative) alert transport support ( #13107 ) - igorek24 Discovery Full Python code fusion / refactor and hardening ( #13094 ) - deajan Extend REGEX filtering option by sensor_class ( #13066 ) - opalivan Oxidized Follow redirects when reloading Oxidized nodes list ( #13051 ) - martinberg Bug Fix issue syslog_xlate containing dots ( #13148 ) - vakartel Enclose IPv6 literal in [brackets] for snmpget and unix-agent ( #13130 ) - kevinwallace Fix lnms scan, nets not detected ( #13129 ) - murrant Documentation Update docs for controlling modules ( #13147 ) - murrant Update docs: Example for optional data on templates ( #13128 ) - ottorei Update FAQs for large groups ( #13110 ) - ottorei Document new optional ups-nut arg1 ( #13072 ) - adamus1red Formatted applications docs for copy/paste ( #13049 ) - si458 Update cleanup config document ( #13026 ) - Sea-n Translation Updated Traditional Chinese Translation ( #13116 ) - jasoncheng7115 Tests Run PHPStan with higher level for new files ( #13108 ) - Jellyfrog Misc Added two indexes to 'syslog' table for performance ( #13105 ) - mtoupsUNO Remove timeouts for passthrough lnms commands ( #13080 ) - murrant Add Laravel task scheduling ( #13074 ) - Jellyfrog Mibs MIB cleaning (misc again) ( #13103 ) - PipoCanaja Added H3C / Comware MIB files ( #13102 ) - Laplacence Update Cisco Small Business (mostly) MIBs ( #13099 ) - dennypage Update NET-SNMP mibs ( #13093 ) - Jellyfrog MIB cleaning for Dell + Gandi ( #13089 ) - PipoCanaja MIB cleaning for Panasonic (1 file) and Avtech (11 files) ( #13088 ) - PipoCanaja MIB cleaning for OS \"Junose\" ( #13087 ) - PipoCanaja MIB cleaning (Misc) ( #13086 ) - PipoCanaja MIB cleaning for Junos ( #13085 ) - PipoCanaja MIB cleaning for HP ( #13084 ) - PipoCanaja MIB cleaning for equallogic ( #13083 ) - PipoCanaja Dependencies Bump super-linter ( #13073 ) - Jellyfrog Bump larastan ( #13071 ) - Jellyfrog 21.7.0 (2021-07-16) A big thank you to the following 27 contributors this last month: murrant (9) rhinoau (8) PipoCanaja (5) mpikzink (4) mathieu-artic (4) martinberg (3) Npeca75 (2) epiecs (2) Sea-n (2) paulierco (2) djamp42 (2) Jellyfrog (1) geg347 (1) ziodona85 (1) keryazmi (1) hanserasmus (1) edgetho007 (1) dagbdagb (1) jbronn (1) adamboutcher (1) VirTechSystems (1) skoobasteeve (1) dependabot (1) si458 (1) kdanev14 (1) cjsoftuk (1) jezekus (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (32) murrant (14) PipoCanaja (13) Feature Support multiple db servers ( #12963 ) - djamp42 Device Inital support for Eltex-MES switches ( #13036 ) - Npeca75 Add support for Ucopia Appliances ( #13031 ) - mathieu-artic Fixing irrelevant values rpm packetloss ( #13010 ) - geg347 Added Vlan discovery on LAG ports, Jetstream OS ( #13007 ) - Npeca75 Add showtime start for OneAccess SDSL routers ( #13005 ) - mathieu-artic Arista_mos-support ( #13003 ) - hanserasmus Add LTE/UMTS support for Oneaccess routers ( #13002 ) - mathieu-artic Add Sonicwall OS 7 ( #12997 ) - edgetho007 Added support for the Rittal LCP DX Chiller ( #12995 ) - epiecs Eaton M2 EMP g2 ( #12994 ) - dagbdagb TP-Link Jetstream DDM and PoE Support ( #12990 ) - jbronn Alcatel-Lucent AOS6 to yaml ( #12982 ) - paulierco Added logo svg for Rocky Linux ( #12977 ) - skoobasteeve Added VRP ICMP SLA (NQA in huawei naming) support ( #12973 ) - PipoCanaja EUROstor RAID ( #12969 ) - mpikzink Add support for Liebert humidity setpoint and UPS powerfactor ( #12965 ) - martinberg Added support to new device Controlbox TH-332B ( #12940 ) - kdanev14 Add OS Support for Siemens Scalance X Switching ( #12938 ) - rhinoau Alcatel-Lucent aos7 LLDP Neighbors ( #12886 ) - paulierco Add HPE-maPDU support ( #12550 ) - jezekus Webui Fix availability widget service backend error ( #13044 ) - rhinoau Fix availability widget device totals ( #13043 ) - rhinoau Don't add %3F=yes to the url ( #13041 ) - murrant Webui - Display app metric if available ( #13023 ) - PipoCanaja Webui - Fix application fault detail display ( #13016 ) - PipoCanaja Two-factor UI config and status display ( #13012 ) - rhinoau Leave it to generate_device_link for sysName/hostName/IP ( #13000 ) - PipoCanaja Filter out NULL lat/lng values from Geographical Map display queries ( #12985 ) - rhinoau Fix ldap/ad group webui settings ( #12967 ) - murrant Create Laravel Sessions Table ( #12962 ) - djamp42 Fix \"Sub-directory Support\" in small steps ( #12951 ) - mpikzink Api Return api error when device doesn't exist ( #12978 ) - VirTechSystems Discovery Fix an issue which led to duplication of BGP peers. ( #12932 ) - cjsoftuk Oxidized Option to filter Oxidized groups ( #12966 ) - martinberg Bug Fix scripts to allow pathname with space ( #13027 ) - Sea-n Wrong statement used for Oxidized ignore_groups ( #13001 ) - martinberg Fix typo in filename ( #12996 ) - Sea-n Make migrating after upgrading MySQL easier. ( #12971 ) - murrant Fix proxmox menu url ( #12970 ) - si458 Refactor Refractor health ( #13022 ) - mpikzink Cleanup PHPStan fixes ( #13038 ) - murrant Documentation Documentation cleanup of sections 4-6 ( #13018 ) - rhinoau Documentation cleanup of General, Install, Getting Started sections ( #13013 ) - rhinoau Update Applications.md for SQUID ( #12987 ) - adamboutcher Misc Aruba 8.8.0 MIBS ( #13042 ) - mpikzink Create HP-SN-AGENT-MIB ( #13009 ) - ziodona85 Update ADVA's MIB file ( #13004 ) - keryazmi Help users that did not upgrade MySQL try two ( #12989 ) - murrant Add renamehost function result handling and exit codes to renamehost.php ( #12980 ) - rhinoau Dependencies Php-cs-fixer 3 prep ( #13039 ) - murrant PHP dependencies update ( #13034 ) - murrant Bump phpmailer/phpmailer from 6.4.1 to 6.5.0 ( #12975 ) - dependabot 21.6.0 (2021-06-17) A big thank you to the following 23 contributors this last month: mpikzink (9) murrant (6) PipoCanaja (5) dust241999 (3) mathieu-artic (2) paulierco (2) paddy01 (2) andrzejmaczka (2) zombah (1) BennyE (1) Sea-n (1) jbronn (1) d-k-7 (1) systemcrash (1) loopodoopo (1) maesbrisa (1) thomseddon (1) cliffalbert (1) Jellyfrog (1) wolfraider (1) rpardim (1) geg347 (1) ottorei (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (31) PipoCanaja (15) murrant (10) tayyabali785 (1) Feature New module add juniper rpm support + reimplementation of cisco-sla module ( #12799 ) - geg347 ISIS-adjacency polling support ( #12461 ) - ottorei Device Add Serialnumber for some Dell ForceTen devices ( #12960 ) - mpikzink 2 more Rittal variants ( #12953 ) - mpikzink Added New-OS: Alcatel-Lucent Enterprise Stellar Wireless ( #12952 ) - BennyE Add SDSL Support for OneAccess routers ( #12948 ) - mathieu-artic Improve TP-Link JetStream Discovery ( #12946 ) - jbronn Alcatel-Lucent aos6 and aos7 fdb fix ( #12945 ) - paulierco Janitza UMG96 ( #12944 ) - mpikzink Imporoved raritan pdu support ( #12937 ) - d-k-7 Alcatel-Lucent Aos7 sensors nobulk ( #12935 ) - paulierco Add Epson Projector as new OS ( #12928 ) - mpikzink Add Barco Clickshare ( #12927 ) - mpikzink Fix nokia(TiMOS) memory ( #12925 ) - paddy01 Device - Vertiv-PDU - Issue 11608 ( #12923 ) - dust241999 Adding basic support for Vertiv PDUs and power graphs ( #12908 ) - dust241999 Ciena 6500 ( #12903 ) - loopodoopo Added support for PowerWalker VFI ( #12891 ) - andrzejmaczka Initial HAProxy ALOHA support ( #12889 ) - Jellyfrog HWG WaterLeak sensor support ( #12865 ) - PipoCanaja Added definition for Riello 204 ( #12861 ) - wolfraider Add support for oneaccess router ( #12850 ) - mathieu-artic Gaia VPN IPSEC discovery ( #12823 ) - rpardim Webui Human readable database inconsistent error ( #12950 ) - murrant Add TopErrors widget based on ifError_rate ( #12926 ) - PipoCanaja Fix \"Sub-directory Support\" in small steps ( #12911 ) - mpikzink Fix \"Sub-directory Support\" in small steps ( #12910 ) - mpikzink Fix \"Sub-directory Support\" in small steps ( #12905 ) - mpikzink FIX Alert rules: Import from Alert Rule ( #12897 ) - andrzejmaczka Fix port down alert toggle ( #12884 ) - murrant Authentication Add number sign to special character handling in ActiveDirectoryAuthorizer ( #12943 ) - paddy01 Applications Fix type error ( #12899 ) - murrant Api Add api call to list OSPF ports ( #12955 ) - zombah Alerting Add Signal CLI transport support ( #12954 ) - mpikzink Update device_component_down_junos macro ( #12898 ) - thomseddon Discovery LLDP - ifAlias should be last checked in function find_port_id ( #12904 ) - PipoCanaja LLDP - Extend discovery lldp code to support different subtypes ( #12901 ) - PipoCanaja Polling Nobulk setting in sensors yaml ( #12833 ) - murrant Rancid Support for fortiswitch in gen_rancid ( #12894 ) - cliffalbert Refactor Filter unwanted data in Routes Ajax reply ( #12847 ) - PipoCanaja Documentation Improve Markdown syntax in Document ( #12949 ) - Sea-n Add info about lnms config:set at top of Configuration page ( #12939 ) - murrant Update docs ( #12919 ) - systemcrash 21.5.0 (2021-05-17) A big thank you to the following 28 contributors this last month: murrant (34) Jellyfrog (14) PipoCanaja (14) dependabot (7) rpardim (3) wolfraider (2) TheGracens (2) si458 (2) mpikzink (2) Sea-n (2) Negatifff (1) backeby (1) SanderBlom (1) paddy01 (1) nightcore500 (1) arrmo (1) bennetgallein (1) Torch09 (1) m4rkov (1) Schultz (1) thegreatecheese (1) paulierco (1) rasssta (1) craig-nokia (1) dethmetaljeff (1) djamp42 (1) martinberg (1) SourceDoctor (1) Thanks to maintainers and others that helped with pull requests this month: murrant (43) Jellyfrog (42) PipoCanaja (8) SourceDoctor (1) martinberg (1) Feature Validate database during the install ( #12867 ) - murrant Collect OUI Database and do OUI lookups ( #12842 ) - PipoCanaja Show OS definition in lnms config:get ( #12819 ) - murrant Security Jquery upgrade ( #12802 ) - murrant Oxidized improvements ( #12773 ) - murrant Device Huawei MA5603T ( #12869 ) - Negatifff Unifi 5.60.1 sysObjectID changed ( #12862 ) - wolfraider Add better Unifi processors, supported on some models ( #12854 ) - murrant Added support for GE MDS devices ( #12834 ) - SanderBlom Tripplite snmp trap handling ( #12832 ) - murrant CyberPower UPS Updates ( #12827 ) - arrmo Fix for Gaia Storage duplicated ( #12824 ) - rpardim Checkpoint Gaia Sensor Count ( #12822 ) - rpardim Gaia SecureXL current status and Management Connected Gateways ( #12821 ) - rpardim Zywall - HW, Version, Serial and Tests ( #12788 ) - PipoCanaja Firebrick sensor rework ( #12783 ) - murrant Updated Nexus (nxos) os information and test data ( #12779 ) - Torch09 FabOS sensor fixes and add SFP dBm ( #12777 ) - murrant Vrp - Collect sticky mac addresses in fdb-table ( #12774 ) - PipoCanaja Pop returned value from snmpwalk_group for lldp on mikrotik routeros ( #12768 ) - thegreatecheese Adjust Alcatel-Lucent aos7 ( #12766 ) - paulierco Corrected Chassis Over Temp oid for state indexes ( #12764 ) - craig-nokia Fix outlet sensor indexes overwriting each other when there's more than one infeed ( #12763 ) - dethmetaljeff Calix (occamos) b6_316 and Calix (calix) 700 ( #12744 ) - PipoCanaja Additional data collection for GAIA ( #12713 ) - martinberg Webui Fix arp-search remote_interface display ( #12871 ) - PipoCanaja Fix empty label in generate_port_link ( #12870 ) - PipoCanaja Fix server stats widget ( #12864 ) - murrant Disable autocomplete for password in login-form ( #12851 ) - backeby Fix top devices widget storage graphs ( #12849 ) - murrant Fixes to Export CSV ( #12830 ) - paddy01 Alert rule delay/interval empty = 0 ( #12804 ) - murrant Webui - Services bootstrap enable + status ( #12736 ) - PipoCanaja Filter Ports out by Interface Type ( #12590 ) - SourceDoctor Graphs Fix graph argument issues ( #12868 ) - murrant RRD Graph optimization ( #12735 ) - murrant Applications Add mysql skip slave ( #12826 ) - si458 Added metric for MySQL Slave Lag (secs) ( #12765 ) - rasssta Api Fixing consistency across api endpoints ( #12795 ) - bennetgallein Alerting Missing columns in select for $alert->serial & $alert->features ( #12771 ) - PipoCanaja Notify if a sensor has been deleted ( #12755 ) - TheGracens Discovery Ignore Wrong Type errors in snpm_get and snmp_get_multi_oid ( #12800 ) - murrant Discovery - Compute num_oid to make os development easier ( #12576 ) - PipoCanaja Polling Fix issue with sensor class case ( #12782 ) - murrant Bug Fix database validations ( #12882 ) - murrant PHP 8 Unit Conversion Fix ( #12857 ) - wolfraider Debug and collect-snmp-data.php fixes ( #12837 ) - murrant Fix allow_unauth_graphs ( #12829 ) - nightcore500 Include variables in default view ( #12818 ) - Jellyfrog Add support for when group doesnt exist ( #12817 ) - Jellyfrog Bump tecnickcom/tcpdf dependency to support php 8 ( #12816 ) - Jellyfrog Prevent error when no alert rules ( #12815 ) - Jellyfrog Small fix in functions.inc.php for PHP8 ( #12793 ) - mpikzink Change printer-supplies rrd name to include the supply_type ( #12792 ) - si458 Revert \"Fix StringBlade errors with a stub file\" ( #12776 ) - Jellyfrog Fix auth and crypto select options ( #12769 ) - Schultz Support X-Forwarded-Proto header ( #12759 ) - Jellyfrog Fix OS sensor array return ( #12694 ) - Jellyfrog Refactor Remove debug globals ( #12811 ) - murrant Make applications work with rrdcached ( #12807 ) - Jellyfrog Make docker app work with rrdcached ( #12746 ) - djamp42 Cleanup Misc cleanup ( #12758 ) - Jellyfrog Documentation Plugins should be called statically ( #12810 ) - mpikzink Fix docs custom graph rrd functions ( #12803 ) - murrant Use GitHub instead of Github ( #12781 ) - Sea-n Smokeping sub site requires fcgiwrap ( #12775 ) - m4rkov Document sub index references ( #12767 ) - murrant Tests Set DBSetupTest timezone to UTC ( #12881 ) - murrant Always test all OS detection. ( #12879 ) - murrant Cache astext in tests to avoid DNS lookup ( #12784 ) - Jellyfrog Enable PHPStan linter ( #12678 ) - Jellyfrog Misc Lnms dev:simulate Snmpsim debug output on failure ( #12880 ) - murrant Enable config:set to set variables inside a nested array of settings ( #12772 ) - murrant Dependencies Bump postcss from 8.2.2 to 8.2.10 ( #12858 ) - dependabot Bump lodash from 4.17.20 to 4.17.21 ( #12848 ) - dependabot Bump url-parse from 1.4.7 to 1.5.1 ( #12844 ) - dependabot Bump phpmailer/phpmailer from 6.4.0 to 6.4.1 ( #12831 ) - dependabot Bump laravel/framework from 8.35.1 to 8.40.0 ( #12814 ) - dependabot Bump composer/composer from 2.0.11 to 2.0.13 ( #12813 ) - dependabot Bump rmccue/requests from 1.7.0 to 1.8.0 ( #12812 ) - dependabot Bump laravel dusk ( #12808 ) - Jellyfrog 21.4.0 (2021-04-17) A big thank you to the following 34 contributors this last month: Jellyfrog (35) murrant (26) PipoCanaja (8) Torch09 (2) si458 (2) TheGracens (2) Cupidazul (2) DaveB91 (1) martinberg (1) craig-nokia (1) codejake (1) tamikkelsen (1) dependabot (1) Schultz (1) opalivan (1) hrtrd (1) zombah (1) casdr (1) Wooboy (1) djamp42 (1) dlangille (1) Erik-Lamers1 (1) WillIrvine (1) mpikzink (1) simmonmt (1) yswery-reconz (1) 0x4c6565 (1) antonio-jose-almeida (1) cjsoftuk (1) shepherdjay (1) imwuwei (1) SourceDoctor (1) filippog (1) bofh80 (1) Thanks to maintainers and others that helped with pull requests this month: murrant (50) Jellyfrog (39) PipoCanaja (11) SourceDoctor (1) frank42hh (1) haydenseitz (1) Feature Cisco AES256 support ( #12717 ) - Schultz Define Port Groups ( #12402 ) - SourceDoctor Service watchdog - add systemd watchdog for resiliency ( #12188 ) - bofh80 Security Escape user editable field ( #12739 ) - murrant Fix SQL injection in rediscover-device ( #12716 ) - Jellyfrog Device Added basic support for BKtel Optical Amplifier ( #12754 ) - Torch09 Added Liebert HPM support ( #12747 ) - martinberg Added basic Delta Orion Controller support ( #12741 ) - craig-nokia Basic support for zyxelac_xmg3927 ( #12740 ) - PipoCanaja Added support Cisco CBS350 ( #12737 ) - PipoCanaja Correct OID for c3GsmSimStatus ( #12724 ) - tamikkelsen Added support for Infinera XTM ( #12710 ) - Torch09 TAIT - Add entity physical support ( #12703 ) - opalivan BDCOM update support ( #12696 ) - hrtrd Update IOS with 4948 variant hardware detection ( #12685 ) - zombah VRP - fix global VRF being NULL and not '' for cbgp, support for NetEngine devices ( #12676 ) - PipoCanaja Added support for Canon printer model TM TX series ( #12667 ) - Wooboy Fortinet per-core cpu ( #12660 ) - murrant Fixed polling and health issues for 9001 and NCS devices, added suppo\u2026 ( #12640 ) - WillIrvine VRP - Fix SSID Client count ( #12629 ) - PipoCanaja Add CPU and Mem for Teldat Devices ( #12619 ) - Cupidazul Better firebrick support ( #12600 ) - cjsoftuk Huawei VRF BGP_Peers update ( #12585 ) - PipoCanaja Add Packet Buffers as memory for PanOS ( #12582 ) - shepherdjay Parse info from H3C branded comware devices ( #12551 ) - imwuwei Webui Fix inventory sensor links when empty ( #12745 ) - murrant Fix mini graphs ( #12738 ) - murrant Fix alert rules display when creating new alert template ( #12731 ) - murrant Fix bug in component table ( #12730 ) - murrant Use native browser lazy load ( #12720 ) - murrant Fix devices latency tab calendar position ( #12684 ) - TheGracens Fix links to non-existent devices ( #12680 ) - murrant Scrollable Dashboard selection menu ( #12656 ) - TheGracens Fix double escaping sysContact on device overview ( #12653 ) - murrant Hide disabled components from overview page CIMC ( #12650 ) - djamp42 Fix progress-bar 0% ( #12648 ) - si458 Add ability to set a custom port on IPMI agents ( #12634 ) - yswery-reconz WebUI - Display interface errors per second instead of accumulated ( #12613 ) - antonio-jose-almeida Add ID to Device Table List and to Device Dependencies Table List + Shorten ifname in Device: Recent Events. ( #12397 ) - Cupidazul Graphs Fix mempools divide by 0 ( #12734 ) - murrant Alerting Add UKFast PSS transport ( #12624 ) - 0x4c6565 Support multiple Alertmanager URLs ( #12346 ) - filippog Discovery Fix service template discovery ( #12662 ) - murrant Polling Allow getting VDSL stats on \"down\" VDSL ports ( #12753 ) - DaveB91 Fix printer state error ( #12681 ) - murrant Translate hex sensor values returned from ipmitool ( #12638 ) - simmonmt Bug Fix globe controller up/down partition bug ( #12757 ) - Jellyfrog Fix scopeIsArchived query ( #12756 ) - Jellyfrog Split port_groups migration to prevent issues ( #12732 ) - murrant Fix ports table when unpolled ports exist ( #12722 ) - murrant JS fixes for IE ( #12721 ) - murrant Correct snmp function usage ( #12714 ) - Jellyfrog Fix adding discrete ipmi sensors by mistake ( #12709 ) - si458 Fix mempool tags ( #12705 ) - murrant Issue with snmpwalk_group string splitting ( #12701 ) - PipoCanaja Use Device object instead of array ( #12699 ) - Jellyfrog Fix alert template variable ping_timestamp ( #12690 ) - Jellyfrog Remove snmp2ipv6 ( #12683 ) - murrant Fix deviceUrl check ( #12682 ) - Jellyfrog Correct globecontroller typo ( #12671 ) - Jellyfrog Fix undefined function in vrp peers ( #12669 ) - murrant Fix Config reference in System validations ( #12668 ) - casdr Fix regression from #12642 ( #12661 ) - Jellyfrog Don't fail on rrd close ( #12659 ) - murrant Change cache table to mediumtext ( #12649 ) - Jellyfrog Fixed VRF name change not updated in DB ( #12644 ) - PipoCanaja Fix a bunch of bugs ( #12643 ) - Jellyfrog Misc cleanup ( #12641 ) - Jellyfrog PHP8 Bug in printChangedStats ( #12639 ) - mpikzink Correct sensor_id variable ( #12633 ) - Jellyfrog Refactor Remove legacy function calls ( #12651 ) - murrant Misc cleanups ( #12642 ) - Jellyfrog Re-implement Printer as a class based module ( #12605 ) - Jellyfrog Cleanup More cleanups ( #12715 ) - Jellyfrog Cleanup ( #12695 ) - Jellyfrog PHPDoc fixes ( #12693 ) - Jellyfrog PHPDoc fixes ( #12687 ) - Jellyfrog Type hint all device model relations ( #12686 ) - Jellyfrog Linting ( #12677 ) - Jellyfrog Fix misc problems ( #12675 ) - Jellyfrog More PHPDoc changes ( #12674 ) - Jellyfrog Type hint model relations ( #12673 ) - Jellyfrog Make moduleobserver type hinting overridable ( #12670 ) - Jellyfrog Fix more PHPDoc ( #12665 ) - Jellyfrog Replace Auth > Illuminate\\Support\\Facades\\Auth ( #12664 ) - Jellyfrog Documentation Fix typos in Dashboards.md ( #12733 ) - codejake Fix doc building ( #12711 ) - Jellyfrog Filter some validation when installed from a package ( #12647 ) - dlangille Add poller_group docs on auto-discovered devices ( #12646 ) - Erik-Lamers1 Tests Add feature to capture a full snmprec ( #12706 ) - Jellyfrog Lint with shellcheck ( #12666 ) - Jellyfrog Enable Black for linter ( #12663 ) - Jellyfrog Add lint GitHub Action ( #12655 ) - murrant Misc Load device relationship from device cache ( #12712 ) - murrant Switch to utf8mb4 ( #12580 ) - Jellyfrog Dependencies Bump phpseclib/phpseclib from 2.0.30 to 3.0.7 ( #12723 ) - dependabot Bump php-amqplib to support PHP8 ( #12698 ) - Jellyfrog Update php dependencies ( #12692 ) - Jellyfrog 21.3.0 (2021-03-20) A big thank you to the following 27 contributors this last month: murrant (14) Jellyfrog (12) PipoCanaja (6) SourceDoctor (4) si458 (2) Cormoran96 (2) miff2000 (2) mpikzink (1) rasssta (1) dependabot (1) Chewie9999 (1) bennet-esyoil (1) rkojedzinszky (1) bofh80 (1) WillIrvine (1) pbaldovi (1) h-barnhart (1) waddles (1) scamp (1) aarchijs (1) yrebrac (1) Serphentas (1) theochita (1) Schouwenburg (1) neg2led (1) bakerds (1) CirnoT (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (28) murrant (17) PipoCanaja (8) SourceDoctor (8) f0o (1) crazy-max (1) yrebrac (1) Feature Developer device simulation ( #12577 ) - murrant Device Add identification for Edgeswitch 8XP ( #12622 ) - si458 Add more printer data ( #12617 ) - Jellyfrog Update hpe-ilo.yaml ( #12612 ) - rasssta Fix AOS 7 sensors ( #12599 ) - murrant Collect BIOS version for IBMC ( #12586 ) - PipoCanaja Added support for siteboss571 + new tests ( #12568 ) - WillIrvine VRP - Huawei Wifi Controllers and routers 3G/4G update ( #12565 ) - PipoCanaja F5 realservers (node_name) display ( #12553 ) - PipoCanaja Add BGP discovery and polling for Dell OS10 devices ( #12549 ) - waddles Update support for ServersCheck ( #12546 ) - Jellyfrog Add support for Edge-Core ECS4100 series devices ( #12530 ) - scamp Adding Cisco ME1200 support ( #12527 ) - aarchijs Cisco enhanced cellular ( #12463 ) - Schouwenburg Support newer SyncServer ( #12423 ) - neg2led Added alarm detection and optical PMs for Waveserver Ai ( #12380 ) - bakerds Webui Fix services availability-map link ( #12632 ) - si458 Add css text center ( #12608 ) - Cormoran96 Sort Type List in Eventlog Pages ( #12572 ) - SourceDoctor Spanning Tree Link in Eventlog ( #12571 ) - SourceDoctor Notifications : display sensor state textual value ( #12554 ) - PipoCanaja GUI - Fix the detailed access point view ( #12543 ) - PipoCanaja Add button to show verbose alert details in the alert, alert-log webui ( #12484 ) - theochita Snmp Traps Fixed typo jnxPowerSupplyOK ( #12556 ) - h-barnhart Applications Add application powermon ( #12500 ) - yrebrac Chrony support ( #12488 ) - Serphentas Docker stats app ( #12358 ) - Cormoran96 Alerting Add Google Chat Transport ( #12558 ) - pbaldovi Discovery DynamicDiscovery - Guess num_oid if not provided in YAML file ( #12570 ) - PipoCanaja Fix location for devices with broken snmp ( #12544 ) - murrant Oxidized Oxidized support airfiber ( #12597 ) - murrant Bug Bugfix for no sockets on Unix Agents ( #12637 ) - mpikzink Fix Service Templates Dynamic ( #12626 ) - murrant Service templates - fix rules ( #12587 ) - bofh80 Fix vminfo invalid power state in migration ( #12567 ) - murrant Add missing Power states ( #12559 ) - Jellyfrog PHP 8 fixes ( #12528 ) - murrant Refactor Remove legacy json format function ( #12583 ) - murrant Documentation Update Agent-Setup.md with systemd instructions on how to restrict on which NIC the agent listens. ( #12601 ) - Chewie9999 Broken link on fast-polling page ( #12595 ) - bennet-esyoil Fix bullet points ( #12574 ) - miff2000 Fix the bullet point rendering ( #12560 ) - miff2000 Tests Location tests more reliable ( #12584 ) - murrant Test both MariaDB and MySQL ( #12547 ) - Jellyfrog Misc Set correct min database version ( #12606 ) - Jellyfrog Simplify process reaping ( #12593 ) - rkojedzinszky Fix broken tests ( #12588 ) - Jellyfrog Add minimum database version check ( #12581 ) - Jellyfrog Global Settings - SNMP Timeout ( #12579 ) - SourceDoctor Improved rrdtool version validation ( #12539 ) - murrant Use DNS Location Record for Location ( #12409 ) - SourceDoctor Dependencies Bump elliptic from 6.5.3 to 6.5.4 ( #12602 ) - dependabot 21.2.0 (2021-02-16) A big thank you to the following 18 contributors this last month: murrant (9) Jellyfrog (8) PipoCanaja (1) hanserasmus (1) nightcore500 (1) simmonmt (1) SourceDoctor (1) dejantep (1) TridTech (1) Showfom (1) jasoncheng7115 (1) nkringle (1) dependabot (1) Negatifff (1) Cupidazul (1) paddy01 (1) Torch09 (1) bofh80 (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (13) murrant (12) SourceDoctor (5) Feature GPS coordinates from device ( #12521 ) - murrant Show Alert Count on Widget ( #12503 ) - SourceDoctor Add Service Templates ( #12107 ) - bofh80 Security Fix url generator XSS ( #12507 ) - Jellyfrog Fix XSS in notifications ( #12504 ) - Jellyfrog Device VRP - Filter invalid temperature data 0x7fffffff ( #12537 ) - PipoCanaja Rittal CMC III low warn limit and CAN bus current ( #12513 ) - nightcore500 Add TrueNAS temperature ( #12506 ) - simmonmt Update deltaups.yaml definition ( #12497 ) - TridTech Fixes incorrect device overlay graph type for poweralert 12 devices ( #12491 ) - nkringle Socomecpdu support ( #12481 ) - Negatifff Add support for SCS KS air-conditioning Devices ( #12360 ) - Torch09 Webui Speedup device list ( #12514 ) - Jellyfrog Authentication Fixes issues with binding and authenticating users in nested groups ( #12398 ) - paddy01 Applications Add poller feature for RRDCached SNMP to query remote agent. ( #12430 ) - Cupidazul Discovery Move sysContact polling to discovery ( #12524 ) - Jellyfrog Bug Better handling of invalid notification dates ( #12523 ) - murrant Fix invalid dates in the database ( #12512 ) - Jellyfrog Fix Fast Ping alerts always running ( #12510 ) - murrant Fix Fast Ping ( #12509 ) - murrant Network map fix Css/img ( #12498 ) - dejantep Correct check for SNMPv3 SHA-192/256 compability ( #12494 ) - Jellyfrog Cleanup Remove perf_times table ( #12517 ) - murrant Documentation Update transports docs ( #12518 ) - hanserasmus Correct rrdcached.sock location on doc ( #12496 ) - Showfom Translation Updated Traditional Chinese Translation ( #12493 ) - jasoncheng7115 Tests \"variant\" is now required for test data ( #12531 ) - Jellyfrog Dependencies Update php packages and fix composer warnings ( #12526 ) - murrant Remove larapoke until they support PHP 8 ( #12522 ) - murrant Bump laravel/framework from 8.22.1 to 8.24.0 ( #12490 ) - dependabot 21.1.0 (2021-02-02) A big thank you to the following 37 contributors this last month: murrant (14) Jellyfrog (8) efelon (4) SourceDoctor (4) paulierco (4) TheMysteriousX (3) dependabot (3) crazy-max (2) djamp42 (2) jezekus (2) martijn-schmidt (2) vitalisator (2) hanserasmus (1) lukoramu (1) deveth0 (1) lazyb0nes (1) mpikzink (1) richardlawley (1) Torch09 (1) rk4an (1) FingerlessGlov3s (1) dlehman83 (1) fablabo (1) zerrac (1) loopodoopo (1) alakiza (1) yrebrac (1) nkringle (1) ottorei (1) Senetus (1) WhippingBoy01 (1) haydenseitz (1) admish (1) kedare (1) ah9828 (1) OahzEgroeg (1) Dmkaz (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (36) murrant (26) SourceDoctor (4) f0o (3) ottorei (1) laf (1) calinrigo (1) Feature Show Device Group on Map ( #12379 ) - SourceDoctor Security Fix js injection issues in device overview ( #12475 ) - murrant CVE-2020-35700 ( #12422 ) - Jellyfrog Device Update enexus for \"SmartPack S\" ( #12465 ) - haydenseitz Added Firepower 4125 ( #12462 ) - WhippingBoy01 Add Alcatel AOS7 bgpdescr & bgpprefix ( #12450 ) - paulierco Panduit PDU ( #12449 ) - Senetus Add sensors for Meinberg Lantime NTP-devices ( #12447 ) - ottorei Adds tripplight snmpwebcard support ( #12445 ) - nkringle Add mempools, cpu and storage to some arbor devices ( #12444 ) - TheMysteriousX Filter Juniper mempools ( #12443 ) - TheMysteriousX Add planet-pdu os device ( #12441 ) - paulierco Add WTI POWER os device ( #12440 ) - jezekus Enumerate sensors under the Outlet for the entity-physical inventory ( #12439 ) - martijn-schmidt Nokia sap graph ( #12432 ) - loopodoopo Apc epdu ( #12428 ) - zerrac Fix for Mikrotik SwOS discovery ( #12426 ) - jezekus New device OS: McafeeWebGateway ( #12418 ) - paulierco Make LibreNMS recognize Schleifenbauer model DPM27/E with existing OS definition ( #12414 ) - martijn-schmidt Update OPNsense version Regex, for _ releases ( #12407 ) - FingerlessGlov3s Change raspberry_pi_sensors state ( #12390 ) - mpikzink Added support for Motorola and Thomson DOCSIS Cable Modems. ( #12386 ) - lukoramu Check Point: Added HA state support ( #12382 ) - lazyb0nes Add Zyxel IES 5206 and 5212 to supported Devices ( #12373 ) - Torch09 Alcatel-Lucent support part2 ( #12369 ) - paulierco Eltek Enexus. Disable some battery sensors if no battery bank is installed at all. ( #12367 ) - vitalisator New device os Raisecom Router OS (ROAP) ( #12361 ) - vitalisator Freenas storage polling fix ( #12275 ) - Dmkaz Webui Fix exception in device overview puppet widget ( #12474 ) - murrant Support new lines in login_message again ( #12469 ) - efelon Fix poller frequency display bug and warn ( #12466 ) - murrant Remove unnecessary horizontal scroll bars in allert widgets ( #12464 ) - efelon Reintroduce word wrapping to the custom login message ( #12460 ) - efelon Add a button to reset port state history ( #12457 ) - TheMysteriousX Improving readability of tables on dark theme dashboards ( #12455 ) - efelon Changed default param max_rows to increase widget count on dashboard ( #12438 ) - alakiza Fix percent bar text location ( #12406 ) - rk4an Don't show gelocation on snmp location string ( #12384 ) - SourceDoctor Copy Dashboard to other User ( #11989 ) - SourceDoctor Output image for graphs with no data ( #11865 ) - murrant Authentication Ldap auth handle no search more gracefully ( #12424 ) - murrant Api Fix oxidized API call when config is missing ( #12476 ) - murrant Allow logs to be filtered by min/max id ( #12471 ) - kedare Bug Fix broken statement on auto discovery ( #12408 ) - djamp42 Remove unused openssl_ver ( #12378 ) - murrant Fix version compare ( #12376 ) - murrant Documentation Update Rancid.md ( #12487 ) - fablabo Creating Documentation page ( #12486 ) - yrebrac Added missing / on internal link ( #12467 ) - admish Lnms link in /usr/bin ( #12446 ) - murrant Update Documentation ( #12411 ) - dlehman83 Document flattened Inventory API function ( #12404 ) - richardlawley Update docs for raspberry.sh ( #12389 ) - deveth0 Update to incorporate new locking mechanisms ( #12388 ) - hanserasmus Update Distributed-Poller.md Discovery using dispatcher service ( #12387 ) - djamp42 Doc - Increase Nginx Timeout ( #12368 ) - SourceDoctor Tests Add test to check if os parameter matches filename ( #12442 ) - Jellyfrog Remove Travis support ( #12416 ) - crazy-max GitHub Actions dev:check ci ( #12392 ) - crazy-max Misc Cast REDIS_TIMEOUT to integer ( #12482 ) - OahzEgroeg Redis - Add scheme to allow TLS ( #12477 ) - ah9828 Dependencies Remove PHP8 blockers in LibreNMS ( #12451 ) - murrant Bump laravel/framework from 8.21.0 to 8.22.1 ( #12448 ) - dependabot Update php dependencies ( #12425 ) - murrant Upgrade to Laravel Mix 6 ( #12421 ) - Jellyfrog Bump axios from 0.19.2 to 0.21.1 ( #12420 ) - dependabot Bump ini from 1.3.5 to 1.3.8 ( #12395 ) - dependabot Old Changelogs","title":"Changelog"},{"location":"General/Changelog/#2420","text":"(2024-02-27) A big thank you to the following 46 contributors this last month: rudybroersma (14) Npeca75 (10) eskyuu (6) electrocret (5) PipoCanaja (5) Jellyfrog (5) vhuk (5) murrant (5) bnerickson (3) fbouynot (3) FlyveHest (2) nickhilliard (2) dependabot (2) richard-ririe (2) laf (2) SourceDoctor (2) VVelox (2) VoipTelCH (1) fabriciotm (1) dirkx (1) swerveshot (1) jmesserli (1) lrizzi (1) Personwho (1) OSIRIS-REx (1) xorrkaz (1) jcostom (1) tevkar (1) descilla (1) arjitc (1) My-Random-Thoughts (1) dlangille (1) blknight88 (1) z0d1ac-RU (1) lferrerfmv (1) gil-obradors (1) gunkaaa (1) TvL2386 (1) santiag0z (1) EinGlasVollKakao (1) kakohegyi (1) i4networks (1) Bierchermuesli (1) mhamzak008 (1) nicklockhart-fullfibre (1) LoveSkylark (1) Thanks to maintainers and others that helped with pull requests this month: PipoCanaja (35) Jellyfrog (30) electrocret (26) laf (21) murrant (11) mpikzink (1) rudybroersma (1) ottorei (1) vhuk (1)","title":"24.2.0"},{"location":"General/Changelog/#feature","text":"Additional custom map features ( #15806 ) - eskyuu Add/Remove devices from static devicegroups ( #15775 ) - richard-ririe Option to ignore device status ( #15697 ) - SourceDoctor Add functionality for custom maps (weathermaps) ( #15633 ) - eskyuu Alert Rule Editor: new notes field & SQL field improove ( #15631 ) - Bierchermuesli NAC - Improve search in WebUI - Keep Historical data ( #15629 ) - PipoCanaja","title":"Feature"},{"location":"General/Changelog/#security","text":"Fix XSS in default example plugin ( #15711 ) - murrant","title":"Security"},{"location":"General/Changelog/#device","text":"Updated SLA poller for Cisco Nexus 9000 ( #15855 ) - FlyveHest Update geist-watchdog.yaml ( #15851 ) - fabriciotm Correctly identify FS Datacenter Switch N8560-48BC ( #15837 ) - rudybroersma Konica printers additional counters ( #15826 ) - Npeca75 Add HSRP state sensors for Cisco IOSXE on L3 switches ( #15823 ) - rudybroersma Add HSRP Sensor support for IOSXR ( #15821 ) - electrocret Add support for Cisco IE1000 ( #15820 ) - rudybroersma Initial support for Eltex mes24xx ( #15816 ) - Npeca75 Add support for Cadant E6000 ( #15813 ) - nickhilliard Add LRT-C / LCM-B / LRS-D / LCM-B modules to Luminato model ( #15812 ) - nickhilliard Add HSRP state sensors for Cisco IOS on L3 switches ( #15809 ) - rudybroersma [rfc1628] Add UPS Test (battery test) status sensor ( #15802 ) - Npeca75 Add build 22631 as Windows 11 23H2 ( #15800 ) - vhuk Zyxel ZynOS PoE Budget sensor support ( #15798 ) - rudybroersma Add Procurve NAC support ( #15794 ) - vhuk Add ArubaOS-CX VSF state sensor support ( #15793 ) - rudybroersma Support for new os/devices, CTS ( #15790 ) - OSIRIS-REx Support for new Lancom devices ( #15779 ) - rudybroersma Add NAC support for Powerconnect ( #15778 ) - vhuk Detect UniFi U7 APs as UniFi AP type ( #15776 ) - jcostom FS.com S5810 Discovery fix ( #15765 ) - rudybroersma Device - webpower smart II snmp UPS card ( #15764 ) - Npeca75 Support for temp sensors - WUT Thermometers - W57605 and W57614 ( #15757 ) - rudybroersma Initial support for Supermicro BMC ( #15750 ) - Npeca75 ArubaOS-CX PSU state sensor support & OS and serial detection ( #15738 ) - rudybroersma Add FortiSwitch PSU state sensor support ( #15735 ) - rudybroersma Added support for Dlink dgs-1250-28x ( #15734 ) - Npeca75 Add FortiGate DHCP Scope usage percentage sensors ( #15727 ) - rudybroersma Added MES 2348B ( #15725 ) - z0d1ac-RU Add FortiGate license status sensors ( #15722 ) - rudybroersma Handle icmpjitter SLA parsing for iosxe ( #15707 ) - FlyveHest Zyxel Wireless Controller OS ( Zyxel NXC series ) ( #15694 ) - kakohegyi Device - fix Counter64 octets value in 32bit column bgpPeerInTotalMessages ( #15621 ) - PipoCanaja Fix tp-link jetstream FDB discovery ( #14321 ) - Npeca75","title":"Device"},{"location":"General/Changelog/#webui","text":"Disable Page Refresh on Oxidized Tools Page ( #15831 ) - electrocret Modify the date selector to use the session timezone ( #15783 ) - eskyuu Switch bill_notes input to textarea ( #15749 ) - arjitc Sort smart app disks by label ( #15686 ) - SourceDoctor","title":"Webui"},{"location":"General/Changelog/#alerting","text":"Add support for Webex max message length. ( #15789 ) - xorrkaz Rename JiraServiceManagement.php to Jiraservicemanagement.php ( #15717 ) - gil-obradors Add JiraServiceManagement Transport ( #15593 ) - mhamzak008 Transport - Jira transport rewrite ( #15561 ) - LoveSkylark","title":"Alerting"},{"location":"General/Changelog/#graphs","text":"Fixed graphs for icmp service showing PL 4 times ( #15856 ) - VoipTelCH Socket Statistic Application cleanup and application page graph fixes. ( #15845 ) - bnerickson","title":"Graphs"},{"location":"General/Changelog/#applications","text":"Deliver output for a specific memcached instance ( #15759 ) - tevkar Update nvidia.inc.php ( #15756 ) - descilla Add BorgBackup monitoring support ( #15591 ) - VVelox Add dhcp-stats tests and update for v3 of the extend ( #15378 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#billing","text":"Updated bill_data table, alter indexes and add new column ( #15751 ) - laf","title":"Billing"},{"location":"General/Changelog/#api","text":"Add API endpoints to update and delete Device Groups ( #15774 ) - richard-ririe Add port description API endpoints and documentation ( #15578 ) - nicklockhart-fullfibre","title":"Api"},{"location":"General/Changelog/#settings","text":"Fix twofactor default value ( #15772 ) - murrant Add isis module to os schema ( #15710 ) - murrant","title":"Settings"},{"location":"General/Changelog/#discovery","text":"Fall back to IPV6-MIB IPv6 address discovery if IP-MIB IPv6 address discovery doesn't return any valid addresses ( #15714 ) - gunkaaa","title":"Discovery"},{"location":"General/Changelog/#oxidized","text":"Add PollerGroup as an option for OxidizedMap ( #15696 ) - electrocret","title":"Oxidized"},{"location":"General/Changelog/#bug","text":"Update Port Real Time Graph error ( #15846 ) - electrocret [bugfix] Fix json-app-tool.php to work with Oid class. ( #15844 ) - bnerickson Fix for linkDown/linkUp ifOperStatus ( #15835 ) - PipoCanaja Fix \"Tempurature\" Typo ( #15811 ) - lrizzi Bug fixes for the custom maps ( #15810 ) - eskyuu Remove dumpRawSql() function in AlertUtil.php ( #15803 ) - Personwho Make all image URLs absolute and fix path for viewer ( #15788 ) - eskyuu Prevent ansi colors in key:generate output ( #15773 ) - Jellyfrog VRP - avoid emptying bgpPeers description at discovery when manually set ( #15713 ) - PipoCanaja OSPF instances and missing mandatory fields fix attempt ( #15712 ) - PipoCanaja Fixed typo in misc/alert_rules.json with regards to \"Space on ...\" alerts ( #15708 ) - TvL2386 Don't escape leaflet tile url in location edit map ( #15695 ) - EinGlasVollKakao Show error if \"Check Type\" field is empty when creating new service template ( #15685 ) - vhuk","title":"Bug"},{"location":"General/Changelog/#refactor","text":"Rewrite ups-nut discovery to SnmpQuery:: ( #15850 ) - Npeca75 Rewrite lmsensors discovery to SnmpQuery:: ( #15833 ) - Npeca75 Rewrite ipv4 address discovery to Eloquent ( #15830 ) - Npeca75","title":"Refactor"},{"location":"General/Changelog/#documentation","text":"Applications.md formatting update for better readability. ( #15849 ) - bnerickson Update Images.md ( #15824 ) - swerveshot More precise OAuth group/role claim information ( #15817 ) - jmesserli Add selinux open directory permission for rrdcached in RRDCached.md ( #15755 ) - fbouynot Missing dir read permission in sepolicy in RRDCached.md ( #15754 ) - fbouynot Update SQL override section after switch to SQL strict mode ( #15736 ) - blknight88 Add CentOS option to SMART dependency install ( #15704 ) - fbouynot","title":"Documentation"},{"location":"General/Changelog/#misc","text":"Add kelvin to celcius conversion ( #15836 ) - dirkx","title":"Misc"},{"location":"General/Changelog/#mibs","text":"Update watchguard MIBs ( #15719 ) - lferrerfmv","title":"Mibs"},{"location":"General/Changelog/#dependencies","text":"Bump composer/composer from 2.6.6 to 2.7.0 ( #15808 ) - dependabot Update PHP dependencies ( #15737 ) - murrant Bump follow-redirects from 1.15.3 to 1.15.4 ( #15724 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2410","text":"(2024-01-07) A big thank you to the following 37 contributors this last month: PipoCanaja (12) murrant (7) laf (5) electrocret (3) peejaychilds (3) Jellyfrog (2) vhuk (2) MittWillson (2) Bierchermuesli (2) netravnen (1) iliessens (1) sarcastic6 (1) SourceDoctor (1) altf4arnold (1) robje (1) rudybroersma (1) mtentilucci (1) tuxgasy (1) craig-nokia (1) brianegge (1) amyjohn000 (1) VirTechSystems (1) atj (1) lhwolfarth (1) bonzo81 (1) Sweeny42 (1) jduke-halls (1) pjordanovic (1) dependabot (1) TheMysteriousX (1) swiftnode-linden (1) cguillaumie (1) luc-ass (1) VVelox (1) Leo-FJ (1) MaxPecc (1) jerji (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (20) murrant (16) PipoCanaja (15) electrocret (12) craig-nokia (1) ottorei (1)","title":"24.1.0"},{"location":"General/Changelog/#device_1","text":"Ignore nameless health sensors for Fortigate ( #15678 ) - iliessens Add support for RoomAlert 32S device ( #15676 ) - sarcastic6 Device - Add Cisco REP Segment state sensor ( #15666 ) - rudybroersma Added better support for some HiveOS Wireless devices ( #15661 ) - laf Fix HPE iLO CPU Status Sensor Description ( #15660 ) - mtentilucci Fix OcNOS detection for recent firmware versions ( #15642 ) - murrant Add support for Fortinet FortiAPs ( #15641 ) - atj Fixing memory scale for datacom-dmos devices ( #15640 ) - lhwolfarth Add support for Forcepoint NGFW 6.10 and older ( #15632 ) - vhuk Add memory readings for Draytek OS ( #15618 ) - Sweeny42 Updated support for HiveOS Wireless newer models ( #15610 ) - laf Add HPE iLO 6 to discovery ( #15607 ) - jduke-halls Incorrect discovery APC Smart-UPS RT 3000 XL 4.1 ( APC Web/SNMP Management Card (AP9619 MB:v4.1.1 PF:v3.9.4) as multi-phase ups ( #15602 ) - pjordanovic Device - McAfee Web Gateway -> SkyHigh Web Gateway ( #15596 ) - PipoCanaja Add and extend support for Hirshmann devices ( #15588 ) - cguillaumie Updated regex for HWG STE2 r2 to better detect hardware and software version ( #15573 ) - luc-ass Update entity-sensor.inc.php for xos' os ( #15552 ) - Leo-FJ Added support of new OS for NTP/PTP systems: Meinberg OS, Safran (Orolia), Oscilloquartz (Adva) ( #15453 ) - MaxPecc Zhone health ( #15276 ) - jerji Fix wrong ASN discovery on non-BGP Devices ( #14948 ) - Bierchermuesli","title":"Device"},{"location":"General/Changelog/#webui_1","text":"Clarify In/Out on Ports table. ( #15680 ) - electrocret WebUI - Filter FDB and ARP tabs in port page if empty ( #15653 ) - PipoCanaja Update Pushover.php ( #15652 ) - brianegge Mark old alert email settings as deprecated ( #15650 ) - murrant Add bad port settings to webui ( #15649 ) - murrant Bug - FDB Table - allow empty searchby as well ( #15626 ) - PipoCanaja Update alertlog query to be more efficient ( #15622 ) - laf Add vendor to searchby rules function ( #15619 ) - bonzo81 Fix grabled characters when oid already UTF-8 ( #15615 ) - MittWillson","title":"Webui"},{"location":"General/Changelog/#graphs_1","text":"Change default graph image to SVG ( #15586 ) - electrocret","title":"Graphs"},{"location":"General/Changelog/#api_1","text":"API add_device: Add ping_ping fallback option ( #15637 ) - murrant More filter options for the BGP peer API endpoint ( #15599 ) - Bierchermuesli","title":"Api"},{"location":"General/Changelog/#discovery_1","text":"Set array before use to stop discovery erroring ( #15604 ) - laf","title":"Discovery"},{"location":"General/Changelog/#authentication","text":"Add support for Okta Group claims to set Roles ( #15592 ) - peejaychilds Output Roles in auth_test script ( #15587 ) - peejaychilds","title":"Authentication"},{"location":"General/Changelog/#bug_1","text":"Fix Rancid error messages ( #15683 ) - vhuk Fix smart application parsing ( #15672 ) - SourceDoctor Fix pagination in alert rules page ( #15659 ) - tuxgasy Bug - \"null\" checks for SAR 7705 release 8.X ( #15657 ) - craig-nokia Bug - missing \"use\" statement in NTP Cisco ( #15656 ) - PipoCanaja Bug - Fix Cisco NTP values ( #15639 ) - PipoCanaja Bug - TPLink - fix null exception for LLDP discovery WIP ( #15628 ) - PipoCanaja Bug - timos MPLS - more poller fixes ( #15624 ) - PipoCanaja Bug - bgp-peers error in Timos -> dbFacile cleanup ( #15620 ) - PipoCanaja Bug - ADSL ifIndex to port error not handled ( #15617 ) - PipoCanaja Bug - XDSL adslAtucCurrOutputPwr exception (Cisco CSCvj53634) ( #15614 ) - PipoCanaja Bug - null checks in Nokia MPLS polling ( #15613 ) - PipoCanaja Bug - Nokia discovery protocols ( #15606 ) - PipoCanaja Make vminfo.vmwVmGuestOS wider ( #15595 ) - TheMysteriousX Fixed state flag causing sql issues in test-template.php ( #15589 ) - laf","title":"Bug"},{"location":"General/Changelog/#documentation_1","text":"Add traceroute to the installed packages doc ( #15645 ) - VirTechSystems Fix documentation formatting ( #15635 ) - Jellyfrog Fix formatting in OAuth-SAML.md ( #15616 ) - peejaychilds Update Debian 12 Installation Instructions. ( #15590 ) - swiftnode-linden Add Debian 12 to install docs ( #15559 ) - VVelox","title":"Documentation"},{"location":"General/Changelog/#misc_1","text":"Updating the logo to higher resolution one ( #15669 ) - altf4arnold Update the type of nummonbssid column in the access_points table ( #15647 ) - amyjohn000 Fix device format missing display field ( #15623 ) - MittWillson Link Model ( #15611 ) - murrant Add space to Oxidized error msg ( #15603 ) - electrocret","title":"Misc"},{"location":"General/Changelog/#internal-features","text":"New utility Number::constrainInteger() ( #15663 ) - murrant","title":"Internal Features"},{"location":"General/Changelog/#mibs_1","text":"Update MIKROTIK-MIB ( #15690 ) - netravnen","title":"Mibs"},{"location":"General/Changelog/#dependencies_1","text":"Update javascript dependencies ( #15651 ) - murrant Bump phpseclib/phpseclib from 3.0.21 to 3.0.34 ( #15600 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2410_1","text":"(2024-01-07) A big thank you to the following 37 contributors this last month: PipoCanaja (12) murrant (7) laf (5) electrocret (3) peejaychilds (3) Jellyfrog (2) vhuk (2) MittWillson (2) Bierchermuesli (2) netravnen (1) iliessens (1) sarcastic6 (1) SourceDoctor (1) altf4arnold (1) robje (1) rudybroersma (1) mtentilucci (1) tuxgasy (1) craig-nokia (1) brianegge (1) amyjohn000 (1) VirTechSystems (1) atj (1) lhwolfarth (1) bonzo81 (1) Sweeny42 (1) jduke-halls (1) pjordanovic (1) dependabot (1) TheMysteriousX (1) swiftnode-linden (1) cguillaumie (1) luc-ass (1) VVelox (1) Leo-FJ (1) MaxPecc (1) jerji (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (20) murrant (16) PipoCanaja (15) electrocret (12) craig-nokia (1) ottorei (1)","title":"24.1.0"},{"location":"General/Changelog/#device_2","text":"Ignore nameless health sensors for Fortigate ( #15678 ) - iliessens Add support for RoomAlert 32S device ( #15676 ) - sarcastic6 Device - Add Cisco REP Segment state sensor ( #15666 ) - rudybroersma Added better support for some HiveOS Wireless devices ( #15661 ) - laf Fix HPE iLO CPU Status Sensor Description ( #15660 ) - mtentilucci Fix OcNOS detection for recent firmware versions ( #15642 ) - murrant Add support for Fortinet FortiAPs ( #15641 ) - atj Fixing memory scale for datacom-dmos devices ( #15640 ) - lhwolfarth Bug - Fix Cisco NTP values ( #15639 ) - PipoCanaja Add support for Forcepoint NGFW 6.10 and older ( #15632 ) - vhuk Bug - timos MPLS - more poller fixes ( #15624 ) - PipoCanaja Add memory readings for Draytek OS ( #15618 ) - Sweeny42 Updated support for HiveOS Wireless newer models ( #15610 ) - laf Add HPE iLO 6 to discovery ( #15607 ) - jduke-halls Incorrect discovery APC Smart-UPS RT 3000 XL 4.1 ( APC Web/SNMP Management Card (AP9619 MB:v4.1.1 PF:v3.9.4) as multi-phase ups ( #15602 ) - pjordanovic Device - McAfee Web Gateway -> SkyHigh Web Gateway ( #15596 ) - PipoCanaja Add and extend support for Hirshmann devices ( #15588 ) - cguillaumie Updated regex for HWG STE2 r2 to better detect hardware and software version ( #15573 ) - luc-ass Update entity-sensor.inc.php for xos' os ( #15552 ) - Leo-FJ Added support of new OS for NTP/PTP systems: Meinberg OS, Safran (Orolia), Oscilloquartz (Adva) ( #15453 ) - MaxPecc Zhone health ( #15276 ) - jerji Fix wrong ASN discovery on non-BGP Devices ( #14948 ) - Bierchermuesli","title":"Device"},{"location":"General/Changelog/#webui_2","text":"Clarify In/Out on Ports table. ( #15680 ) - electrocret WebUI - Filter FDB and ARP tabs in port page if empty ( #15653 ) - PipoCanaja Update Pushover.php ( #15652 ) - brianegge Mark old alert email settings as deprecated ( #15650 ) - murrant Add bad port settings to webui ( #15649 ) - murrant Bug - FDB Table - allow empty searchby as well ( #15626 ) - PipoCanaja Update alertlog query to be more efficient ( #15622 ) - laf Add vendor to searchby rules function ( #15619 ) - bonzo81 Fix grabled characters when oid already UTF-8 ( #15615 ) - MittWillson","title":"Webui"},{"location":"General/Changelog/#graphs_2","text":"Change default graph image to SVG ( #15586 ) - electrocret","title":"Graphs"},{"location":"General/Changelog/#api_2","text":"API add_device: Add ping_ping fallback option ( #15637 ) - murrant More filter options for the BGP peer API endpoint ( #15599 ) - Bierchermuesli","title":"Api"},{"location":"General/Changelog/#discovery_2","text":"Set array before use to stop discovery erroring ( #15604 ) - laf","title":"Discovery"},{"location":"General/Changelog/#authentication_1","text":"Add support for Okta Group claims to set Roles ( #15592 ) - peejaychilds Output Roles in auth_test script ( #15587 ) - peejaychilds","title":"Authentication"},{"location":"General/Changelog/#bug_2","text":"Fix Rancid error messages ( #15683 ) - vhuk Fix smart application parsing ( #15672 ) - SourceDoctor Fix pagination in alert rules page ( #15659 ) - tuxgasy Bug - \"null\" checks for SAR 7705 release 8.X ( #15657 ) - craig-nokia Bug - missing \"use\" statement in NTP Cisco ( #15656 ) - PipoCanaja Bug - TPLink - fix null exception for LLDP discovery WIP ( #15628 ) - PipoCanaja Bug - bgp-peers error in Timos -> dbFacile cleanup ( #15620 ) - PipoCanaja Bug - ADSL ifIndex to port error not handled ( #15617 ) - PipoCanaja Bug - XDSL adslAtucCurrOutputPwr exception (Cisco CSCvj53634) ( #15614 ) - PipoCanaja Bug - null checks in Nokia MPLS polling ( #15613 ) - PipoCanaja Bug - Nokia discovery protocols ( #15606 ) - PipoCanaja Make vminfo.vmwVmGuestOS wider ( #15595 ) - TheMysteriousX Fixed state flag causing sql issues in test-template.php ( #15589 ) - laf","title":"Bug"},{"location":"General/Changelog/#documentation_2","text":"Add traceroute to the installed packages doc ( #15645 ) - VirTechSystems Fix documentation formatting ( #15635 ) - Jellyfrog Fix formatting in OAuth-SAML.md ( #15616 ) - peejaychilds Update Debian 12 Installation Instructions. ( #15590 ) - swiftnode-linden Add Debian 12 to install docs ( #15559 ) - VVelox","title":"Documentation"},{"location":"General/Changelog/#misc_2","text":"Updating the logo to higher resolution one ( #15669 ) - altf4arnold Update the type of nummonbssid column in the access_points table ( #15647 ) - amyjohn000 Fix device format missing display field ( #15623 ) - MittWillson Link Model ( #15611 ) - murrant Add space to Oxidized error msg ( #15603 ) - electrocret","title":"Misc"},{"location":"General/Changelog/#internal-features_1","text":"New utility Number::constrainInteger() ( #15663 ) - murrant","title":"Internal Features"},{"location":"General/Changelog/#mibs_2","text":"Update MIKROTIK-MIB ( #15690 ) - netravnen","title":"Mibs"},{"location":"General/Changelog/#dependencies_2","text":"Update javascript dependencies ( #15651 ) - murrant Bump phpseclib/phpseclib from 3.0.21 to 3.0.34 ( #15600 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#23110","text":"(2023-11-17) A big thank you to the following 37 contributors this last month: murrant (26) PipoCanaja (5) jepke (3) peelman (3) dependabot (2) Galileo77 (2) tim427 (2) ottorei (2) eskyuu (1) arjenz (1) electrocret (1) GramThanos (1) bnerickson (1) peejaychilds (1) laf (1) luttermann (1) helppp (1) slalomsk8er (1) VirTechSystems (1) westerterp (1) cmadamsgit (1) lhwolfarth (1) webtroter (1) fbouynot (1) Wooboy (1) kmodzel (1) jaannnis (1) Fehler12 (1) not-known (1) drykov-ttc (1) tydal-borge (1) iNuc1ear (1) mpikzink (1) WilliamDEdwards (1) RandGH (1) underscoredje (1) Schouwenburg (1) Thanks to maintainers and others that helped with pull requests this month: murrant (40) Jellyfrog (10) electrocret (9) laf (2) ottorei (2) kwangsing3 (1)","title":"23.11.0"},{"location":"General/Changelog/#feature_1","text":"Mail Transport: option to use BCC ( #15554 ) - murrant New command: lnms report:devices ( #15539 ) - murrant","title":"Feature"},{"location":"General/Changelog/#breaking-change","text":"Plugin update (breaking) ( #15498 ) - murrant","title":"Breaking Change"},{"location":"General/Changelog/#security_1","text":"Fix a few XSS vulnerabilities in device group popups ( #15581 ) - murrant Disable GET login by default ( #15558 ) - murrant Use GitHub for vulnerability reporting ( #15555 ) - murrant","title":"Security"},{"location":"General/Changelog/#device_3","text":"[APC sensor] Actual state of alarm contact beside config state ( #15576 ) - jepke Vertiv PDU show power graph in mouesover and device overview ( #15543 ) - Galileo77 Cisco WLC: fetch LWAPP SSIDs for client counts ( #15531 ) - murrant Add sysObjectIDs for other models of PSS shelves ( #15525 ) - peelman Added values from SFP DDM values for awplus switches ( #15522 ) - luttermann Add support for Nokia 1830 PSS Optical gear ( #15516 ) - peelman Add Support for Samlex America PSR-1200-48 Inverters ( #15515 ) - peelman TrueNAS no longer supports zpool space usage ( #15490 ) - murrant Vertiv pdu mg02e4w1 ( #15484 ) - Galileo77 Add FortiGate Environment stats ( #15464 ) - westerterp Add support for FiberStore \"data center\" switches ( #15445 ) - cmadamsgit Adding basic support for Datacom DmOS devices. ( #15436 ) - lhwolfarth Apc ap 7900b ( #15392 ) - webtroter Add definition fujifilmprinter ( #15381 ) - Wooboy Initial support for Moxa EDS-4000 Series switches ( #15293 ) - kmodzel Cisco SB Switch Temp and Fanspeed fix ( #15225 ) - Fehler12 Add support eltex more devices ( #15108 ) - drykov-ttc Add support for Security Radar ( #15053 ) - tydal-borge Add disk sensors for Oceanstor ( #15010 ) - iNuc1ear Fix Fortinet HA-status polling state translations ( #14921 ) - ottorei Add Quantum Scalar I6000 Tape Library ( #14915 ) - mpikzink Add liebert detailsv2 ( #14746 ) - RandGH Zyxel AP wireless client discovery enhancement ( #14704 ) - underscoredje Dantherm hostname ( #14223 ) - Schouwenburg Add Panorama log collection write rate ( #13864 ) - ottorei","title":"Device"},{"location":"General/Changelog/#webui_3","text":"Device links formatting changes ( #15580 ) - eskyuu Only set user roles if they are defined ( #15577 ) - murrant Fix Down/Up time error if device is unpolled ( #15545 ) - murrant Fix health temperature degree display ( #15541 ) - murrant Fixed BGP Remote peer link and graph in Routing Overview, or just static text when not a device in LibreNMS ( #15535 ) - tim427 Added BGP Remote peer link and graph in Routing Overview ( #15532 ) - tim427 Respect web_mouseover setting in popup component ( #15530 ) - murrant Prefetch devices in group to avoid cost of subquery ( #15511 ) - slalomsk8er","title":"Webui"},{"location":"General/Changelog/#alerting_1","text":"Give reason for alert template fallback ( #15583 ) - murrant Add option to disable the send of acknowledgement alerts. ( #15208 ) - not-known","title":"Alerting"},{"location":"General/Changelog/#applications_1","text":"[bugfix] Passing $device into data_update_helper functions instead of declaring it as global. ( #15542 ) - bnerickson","title":"Applications"},{"location":"General/Changelog/#api_3","text":"API Oxidized http source optimization ( #15560 ) - murrant Get poller group ( #15493 ) - VirTechSystems","title":"Api"},{"location":"General/Changelog/#discovery_3","text":"UCD buffers and cache discovered with inverted free/used values ( #15538 ) - murrant","title":"Discovery"},{"location":"General/Changelog/#polling","text":"Prevent non-unicode characters in ifAlias ( #15585 ) - murrant BGP-peers if no data, skip ( #15548 ) - murrant UCD-MIB polling check isset ( #15547 ) - murrant Fix Ciscowlc error when bsnApIfNoOfUsers is not present ( #15529 ) - murrant","title":"Polling"},{"location":"General/Changelog/#authentication_2","text":"Add auth_ldap_cacertfile and auth_ldap_ignorecert options ( #15526 ) - peejaychilds","title":"Authentication"},{"location":"General/Changelog/#bug_3","text":"Bug - Fix API Content-Type Header handling ( #15574 ) - PipoCanaja Huawei Controllers - Exception removed and changed OID for AP Type ( #15564 ) - PipoCanaja Fix graphs device check before auth ( #15551 ) - murrant Prometheus on failure, disable for rest of run ( #15546 ) - murrant Bug - Fix missing device_id in NAC tab view ( #15534 ) - PipoCanaja Bug - string VS array ( #15533 ) - PipoCanaja OSPF tables fix integer types ( #15528 ) - murrant Fixed the wrong field being used for join ( #15524 ) - laf Dark mode fix routing tabs & pages ( #15485 ) - jepke Minor fix and tweak for graylog integration ( #15455 ) - jepke Smokeping menu and title use device displayname ( #15387 ) - fbouynot Increase max package name length to 128 characters ( #14895 ) - WilliamDEdwards","title":"Bug"},{"location":"General/Changelog/#cleanup","text":"Remove api_demo config setting ( #15563 ) - electrocret Wifi module does not exist anymore ( #15549 ) - murrant Misc device column cleanups ( #15518 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_3","text":"Update Docker docs ( #15556 ) - GramThanos Changed log item, source(s_sys) to source(s_src) ( #15521 ) - helppp","title":"Documentation"},{"location":"General/Changelog/#translation","text":"Change spelling disc -> disk ( #15569 ) - arjenz","title":"Translation"},{"location":"General/Changelog/#misc_3","text":"Update renamehost to include more logging if a folder already exists# ( #15280 ) - jaannnis","title":"Misc"},{"location":"General/Changelog/#internal-features_2","text":"Print stack trace in error dumps ( #15514 ) - murrant SnmpQuery runtime cache ( #15512 ) - murrant","title":"Internal Features"},{"location":"General/Changelog/#dependencies_3","text":"Bump axios from 0.25.0 to 1.6.0 ( #15571 ) - dependabot Bump browserify-sign from 4.2.1 to 4.2.2 ( #15510 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#23100","text":"(2023-10-26) A big thank you to the following 30 contributors this last month: murrant (84) SourceDoctor (6) tim427 (4) electrocret (3) dependabot (3) noaheroufus (3) PipoCanaja (3) Galileo77 (2) fbouynot (2) Jellyfrog (2) peejaychilds (1) cwispy (1) qwerin (1) lhwolfarth (1) CTV-2023 (1) barryodonovan (1) MrShunz (1) brointhemix (1) I-FGSD (1) Ac0lyte (1) Jimmy-Cl (1) waddles (1) bnerickson (1) netravnen (1) jepke (1) TheMysteriousX (1) rolfbergheim (1) VVelox (1) davromaniak (1) metrojworthington (1) Thanks to maintainers and others that helped with pull requests this month: murrant (30) Jellyfrog (23) electrocret (21) PipoCanaja (2) RafalNiewinski (1) rcmcronny (1)","title":"23.10.0"},{"location":"General/Changelog/#feature_2","text":"Muteable acknowledged alert notifications ( #15456 ) - SourceDoctor Throttle error reporting ( #15391 ) - murrant Deprecate poller.php ( #15370 ) - murrant","title":"Feature"},{"location":"General/Changelog/#security_2","text":"Fix MAC search sql injection ( #15402 ) - murrant Validate secure cookies ( #15401 ) - murrant Fix xss in device groups overview ( #15399 ) - murrant Update Tnmsne table backend ( #15384 ) - murrant Fix unescaped output in ipv6 search page ( #15327 ) - murrant","title":"Security"},{"location":"General/Changelog/#device_4","text":"Fix websensor temp user_func ( #15492 ) - murrant Discover AEN with sysobjectid instead of sysdescr ( #15482 ) - fbouynot Huawei VRP AP controller fixes ( #15450 ) - murrant Timos MPLS nullables round 2 ( #15448 ) - murrant Fortimail add mail queues message count ( #15444 ) - cwispy Fix timos mpls, add checks ( #15430 ) - murrant Fix VRP polling ( #15428 ) - murrant Updating Datacom logo ( #15427 ) - lhwolfarth Moxa EDS improve discovery ( #15375 ) - murrant Fix Raisecom devices having not increasing OIDs on snmpwalk ( #15365 ) - MrShunz Aviat svg logos ( #15360 ) - murrant Add Fortinet logo ( #15359 ) - murrant Added support for Cambium cnWave60 gear ( #15358 ) - noaheroufus Added support for Cambium cnMatrix switches ( #15351 ) - noaheroufus Update Windows version naming ( #15350 ) - I-FGSD Calix logo update ( #15348 ) - murrant Calix AXOS Sensor Changes ( #15343 ) - noaheroufus Adding Active Power in Watts to APCs ( #15337 ) - Jimmy-Cl Device stulz WIB8000 ( #15271 ) - jepke Added some groups and corrected some references ( #15129 ) - rolfbergheim Add model for Christie Digital projectors ( #15088 ) - davromaniak Vmware vminfo modernize ( #15008 ) - murrant Mcc valere ( #14753 ) - metrojworthington","title":"Device"},{"location":"General/Changelog/#webui_4","text":"Do not update device IP when DNS resolution fails ( #15499 ) - murrant Fix FDB table ip addresses missing ( #15481 ) - murrant Fix bug saving snmpv3 device changes ( #15419 ) - murrant Fix graph errors ( #15407 ) - murrant Calculate downtime from device_outages table ( #15397 ) - murrant Sort services by type and name ( #15367 ) - SourceDoctor Vertically center device icons ( #15361 ) - murrant Fix BGP peer IP missing in Routing page ( #15352 ) - tim427 Fix incorrect pages offset on app ntp page ( #15349 ) - Ac0lyte Show Temperature Graphs on Smart App Overview ( #15342 ) - SourceDoctor Show never polled Information on Widget and in Device itself ( #15341 ) - SourceDoctor Show device group on device overview ( #15338 ) - SourceDoctor FDB Tables improve performance ( #15333 ) - murrant Fix some issues with admin self settings ( #15332 ) - murrant Fix eventlog debug code left in ( #15331 ) - murrant Device NAC page to Laravel Blade ( #15329 ) - PipoCanaja","title":"Webui"},{"location":"General/Changelog/#alerting_2","text":"Send event log when alert rule fails ( #15440 ) - murrant Fix Linemessagingapi class name ( #15356 ) - murrant Fix alerting find owner contacts on old SQL server versions ( #15355 ) - murrant Add alert transport for Grafana Oncall ( #15330 ) - waddles Show which host marked a device as down. ( #15209 ) - TheMysteriousX","title":"Alerting"},{"location":"General/Changelog/#graphs_3","text":"Fix rrd exists check ( #15466 ) - murrant Scale disk spezific SMART Graph from 0 ( #15339 ) - SourceDoctor","title":"Graphs"},{"location":"General/Changelog/#applications_2","text":"Unix Agent and Application fixes ( #15460 ) - murrant Adding Socket Statistics Application Support ( #15307 ) - bnerickson Update docs for osupdate when being used as a script for the agent ( #15099 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#api_4","text":"Fix API get_location by ID ( #15506 ) - murrant Allow add device to set location ( #15469 ) - murrant","title":"Api"},{"location":"General/Changelog/#settings_1","text":"Rearrange AD auth settings ( #15363 ) - murrant","title":"Settings"},{"location":"General/Changelog/#polling_1","text":"IS-IS polling handle missing data ( #15491 ) - murrant Fix polling down retry (and other items) ( #15483 ) - murrant Ports min polled period of 1 ( #15472 ) - murrant Ports module: fix nulls not updating ( #15467 ) - murrant Always create rrd folder on localhost ( #15457 ) - murrant Fix port module wrong null ( #15431 ) - murrant Fix an agent bug if a process ran more than 999 days ( #15411 ) - murrant Type safety check ( #15409 ) - murrant Add rewrites include for legacy modules ( #15405 ) - murrant Fix last polled in wrong column ( #15398 ) - murrant Fix last polled ( #15396 ) - murrant Availability module fixes ( #15369 ) - murrant","title":"Polling"},{"location":"General/Changelog/#bug_4","text":"Add Wrong Type work around to snmp_get function ( #15509 ) - peejaychilds Ospf metrics fix ( #15508 ) - murrant IP::fromHexString handle ascii ( #15504 ) - murrant Fix poller perf graph time ( #15500 ) - murrant Fix auth_ad_url validation ( #15487 ) - murrant Fix regression causing wall of ping latency ( #15486 ) - fbouynot Fix Device ip address mutator ( #15480 ) - murrant Fix Typo in FdbTablesController ( #15477 ) - electrocret Allow inserting null values for sensors ( #15470 ) - Jellyfrog Never set bgp and ports delta fields to unsigned ( #15468 ) - murrant Error when device is not found ( #15459 ) - murrant Restore _delta fields to signed ( #15458 ) - murrant Change port and BGP stats fields to unsigned ( #15449 ) - murrant Fix Top menu search on mobile respo ( #15439 ) - qwerin Packages fixes (+pacman) ( #15415 ) - murrant Fix bug in graphite ( #15393 ) - murrant Fixing Private eBGP visualization, corrected 16bit ASN private range, added 32bit ASN range ( #15357 ) - tim427 Improve \"count\" graphs for F5OS ( #15335 ) - PipoCanaja","title":"Bug"},{"location":"General/Changelog/#refactor_1","text":"Refactor MAC utilities into a single class ( #15379 ) - murrant Refactor discovery-protocols with SnmpQuery ( #15324 ) - PipoCanaja","title":"Refactor"},{"location":"General/Changelog/#cleanup_1","text":"ARP Discovery use MacHelper ( #15479 ) - electrocret Ports ifPhysAddress use MAC helper ( #15478 ) - murrant Module status cleanups ( #15461 ) - murrant Use modern device attrib handling ( #15429 ) - murrant Remove some lightly used or unused dbFacile functions ( #15418 ) - murrant Misc fixes 42 ( #15413 ) - murrant Remove snmp functions that are barely used ( #15377 ) - murrant Remove legacy addhost code ( #15376 ) - murrant Remove unused functions ( #15371 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_4","text":"Redirect old install docs ( #15505 ) - murrant Update supported OS list ( #15426 ) - Jellyfrog Documentation - Smokeping Integration in Centos - Update Smokeping.md ( #15390 ) - CTV-2023 Specify radius attributes for auth roles ( #15374 ) - barryodonovan Add unzip to all install docs dependencies ( #15354 ) - brointhemix Docs security secure session cookie ( #15328 ) - murrant Stable release update clarification ( #15326 ) - murrant Bird2 set timeformat protocols ( #15292 ) - netravnen","title":"Documentation"},{"location":"General/Changelog/#translation_1","text":"German and English typo correction ( #15503 ) - Galileo77 German translation corrected and some visual improvements added. ( #15502 ) - Galileo77 Missing device ip translation ( #15465 ) - murrant","title":"Translation"},{"location":"General/Changelog/#tests","text":"Exclude availability module from default testing ( #15462 ) - murrant","title":"Tests"},{"location":"General/Changelog/#misc_4","text":"Fixes check_dns against localhost when a search-domain is configured ( #15373 ) - tim427 Added extra ASN-range comments, added Priv eBGP on host details, changed color to light-blue instead of red ( #15372 ) - tim427","title":"Misc"},{"location":"General/Changelog/#internal-features_3","text":"Add application metrics model and relationships ( #15417 ) - murrant Error Reporting: Log instead of dump ( #15412 ) - murrant","title":"Internal Features"},{"location":"General/Changelog/#dependencies_4","text":"Bump @babel/traverse from 7.16.10 to 7.23.2 ( #15473 ) - dependabot Bump postcss from 8.4.19 to 8.4.31 ( #15380 ) - dependabot Bump composer/composer from 2.5.8 to 2.6.4 ( #15364 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2390","text":"(2023-09-15) A big thank you to the following 16 contributors this last month: murrant (33) SourceDoctor (3) VVelox (3) eskyuu (2) PipoCanaja (2) MrMoCoDev (1) electrocret (1) Pelt10 (1) LoveSkylark (1) slashdoom (1) jepke (1) hanserasmus (1) adamsweet (1) fbourqui (1) fbouynot (1) Fehler12 (1) Thanks to maintainers and others that helped with pull requests this month: murrant (10) Jellyfrog (9) electrocret (8) PipoCanaja (3) VVelox (1) cltnoc (1) ottorei (1)","title":"23.9.0"},{"location":"General/Changelog/#feature_3","text":"Additional contact options for email transports ( #15266 ) - murrant Implement RBAC (only built in roles) ( #15212 ) - murrant","title":"Feature"},{"location":"General/Changelog/#security_3","text":"Fix injection vulnerability in fdb search page ( #15315 ) - murrant Fix injection vulnerability in ports pages ( #15314 ) - murrant Fix another addcslashes incorrect escape in eventlog ( #15313 ) - murrant Fix another injection in ipv4 search page ( #15312 ) - murrant Fix injection in search pages ipv4, etc ( #15311 ) - murrant Fix improperly escaped output in outages page ( #15310 ) - murrant","title":"Security"},{"location":"General/Changelog/#device_5","text":"Fix smartos-dcp-m.yaml ( #15295 ) - electrocret Use mtxrGaugeTable instead of mtxrHealthGroup ( #15289 ) - murrant Added support for Nutanix VM count, disk state, CPU usage and RAM usage ( #15252 ) - eskyuu Initial support for f5os ( #15241 ) - fbouynot","title":"Device"},{"location":"General/Changelog/#webui_5","text":"Fix login page HTML ( #15321 ) - murrant Fix device display name in top interfaces widget ( #15319 ) - murrant Timezone, fix user set no timezone ( #15296 ) - murrant Availability Map: Show ignored device up when up ( #15283 ) - SourceDoctor Custom ssh,telnet port with oxidized ( #15255 ) - jepke WebUI Services, generate more compact table ( #15243 ) - fbourqui Added empty string check ( #15235 ) - Fehler12 Use full name for vendor_oui ( #15234 ) - PipoCanaja Add global NAC page ( #15228 ) - PipoCanaja","title":"Webui"},{"location":"General/Changelog/#alerting_3","text":"Fix error when mail-contact is missing ( #15305 ) - murrant Hide token, keys and passwords in Transports ( #15274 ) - LoveSkylark","title":"Alerting"},{"location":"General/Changelog/#applications_3","text":"For the applications table set the defaults for app_instance and app_instance to '' ( #15278 ) - VVelox Application Soft Delete ( #15270 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#api_5","text":"Allow port search API to search ifAlias again ( #15320 ) - murrant Fix API availability graph duration ( #15250 ) - murrant","title":"Api"},{"location":"General/Changelog/#settings_2","text":"Add ui description for reporting dump_errors ( #15264 ) - murrant","title":"Settings"},{"location":"General/Changelog/#polling_2","text":"Fix port ifAlias polling ( #15279 ) - murrant Fix ifSpeed override not being applied ( #15237 ) - murrant","title":"Polling"},{"location":"General/Changelog/#authentication_3","text":"ADAuthorizer auth skip count entry ( #15322 ) - murrant Radius enforce roles ( #15294 ) - murrant","title":"Authentication"},{"location":"General/Changelog/#bug_5","text":"FIX TP-Link JetStream 3.0.0 Build 20180511 Rel.36491(s) T1500-28PCT 3.0 ( #15318 ) - MrMoCoDev Fix issue with rrdcached application and bad input ( #15301 ) - murrant Fix .env quoting issue ( #15298 ) - murrant Fix typo in default mibs for SnmpQuery ( #15297 ) - murrant Readd missing key ( #15291 ) - SourceDoctor Fix missing keys for new status ( #15284 ) - SourceDoctor Revert \"Added empty string check\" ( #15249 ) - murrant Fix manual port speed storage ( #15238 ) - murrant Make the service template controller re-evaluate dynamic membership when apply all button is pushed ( #15214 ) - eskyuu","title":"Bug"},{"location":"General/Changelog/#cleanup_2","text":"Return an 5XX error when an exception is raise ( #15285 ) - Pelt10","title":"Cleanup"},{"location":"General/Changelog/#documentation_5","text":"Note the package install command for dhcpd-pools for FreeBSD ( #15247 ) - VVelox Update severity colours in SNMP-Traps.md ( #15244 ) - adamsweet","title":"Documentation"},{"location":"General/Changelog/#misc_5","text":"Another OR statement in GrayLog API ( #15246 ) - hanserasmus Dispatcher option to log output ( #15230 ) - murrant","title":"Misc"},{"location":"General/Changelog/#2380","text":"(2023-08-19) A big thank you to the following 32 contributors this last month: murrant (31) VVelox (5) Jellyfrog (4) electrocret (4) santiag0z (3) laf (3) viptampa (3) arjenz (2) knpo (1) WhiteyDude (1) jacobw (1) jepke (1) sjtarik (1) pjordanovic (1) Schouwenburg (1) eggbeater98 (1) i4networks (1) fbourqui (1) hirose003 (1) richard-ririe (1) robje (1) peejaychilds (1) bonzo81 (1) slashdoom (1) eskyuu (1) j796160836 (1) TheMysteriousX (1) VirTechSystems (1) fufroma (1) zappiehost (1) jgelinas (1) mwobst (1) Thanks to maintainers and others that helped with pull requests this month: murrant (26) Jellyfrog (25) electrocret (23) PipoCanaja (3) laf (2) VVelox (2) ottorei (1) streamthing (1)","title":"23.8.0"},{"location":"General/Changelog/#feature_4","text":"Add FDB table vendor search drop down ( #15072 ) - bonzo81 Port_error_perc macro ( #15016 ) - electrocret","title":"Feature"},{"location":"General/Changelog/#security_4","text":"Fix unsanitized input injection ( #15184 ) - murrant Fix some xss injection for sysLocation and some other fields ( #15183 ) - murrant","title":"Security"},{"location":"General/Changelog/#device_6","text":"Fix version comparison for RouterOS ( #15227 ) - knpo Netscaler, don't use 0 divisor ( #15204 ) - murrant Update Alpine Linux logos to SVG ( #15185 ) - murrant APC new sensors and fix ( #15179 ) - jepke Add SHARP BP series of devices ( #15169 ) - pjordanovic Fix Timos SAR Cellular RSRP and RSSI sensors ( #15163 ) - Schouwenburg Update bgp-peers.inc.php for timos ( #15154 ) - i4networks Fortigate ipv6 ipsec ( #15150 ) - fbourqui Add Calix E7 (EXA) PON port sensors ( #15145 ) - murrant Add os check in discovery for aix/freenas storage and cisco cdp ( #15104 ) - peejaychilds Add VLAN Discovery for arubaos-cx ( #15055 ) - slashdoom Openmanage enterprise modular ( #14408 ) - jgelinas","title":"Device"},{"location":"General/Changelog/#webui_6","text":"Fixed CSS error causing generic image widgets not to do height correctly ( #15220 ) - WhiteyDude Fix error when there is an untranslated sensor type ( #15176 ) - murrant Fix select2 search field focus ( #15171 ) - murrant Update text color in dark.css ( #15155 ) - eggbeater98","title":"Webui"},{"location":"General/Changelog/#alerting_4","text":"Discord Transport user configurable embed fields ( #15068 ) - murrant Implement LINE Messaging API ( #14867 ) - j796160836","title":"Alerting"},{"location":"General/Changelog/#graphs_4","text":"Fix Memmory spelling ( #15231 ) - arjenz Add generic stats graph munging support and make uptime display as days again ( #15097 ) - VVelox","title":"Graphs"},{"location":"General/Changelog/#applications_4","text":"Add the Mojo CAPE Submit app ( #15140 ) - VVelox Logsize monitoring for LibreNMS ( #15137 ) - VVelox Update SMART monitoring to the use JSON ( #15132 ) - VVelox Add a flag for adding app data to tests generated via scripts/json-app-tool.php ( #15080 ) - VVelox Add BIRD2 BGP Peers application support ( #14466 ) - zappiehost","title":"Applications"},{"location":"General/Changelog/#billing_1","text":"Fixed a zero value data insertion for billing ( #15194 ) - laf Updated poll-billing.php to only query for data via snmp when the device and port are both up ( #15164 ) - laf Added basic support for distributing billing ( #15156 ) - laf","title":"Billing"},{"location":"General/Changelog/#api_6","text":"Add API endpoint to get service graphs ( #15138 ) - richard-ririe API get_location ( #14779 ) - VirTechSystems","title":"Api"},{"location":"General/Changelog/#discovery_4","text":"Always mark device last_discovered ( #15218 ) - murrant","title":"Discovery"},{"location":"General/Changelog/#polling_3","text":"Allow dispatcher service master timeout to be set ( #15161 ) - murrant Fix fping 4.0+ prefers IPv6 ( #14825 ) - TheMysteriousX Add module support for wrapper script calls ( #14055 ) - mwobst","title":"Polling"},{"location":"General/Changelog/#authentication_4","text":"Remove user_id cast to int ( #15205 ) - jacobw","title":"Authentication"},{"location":"General/Changelog/#bug_6","text":"Print a useful error if logfile is not writable ( #15233 ) - murrant Make the installer use the schema dump ( #15211 ) - Jellyfrog Change leaflet.default_zoom to Float ( #15207 ) - electrocret Handle empty dbSchema table ( #15198 ) - murrant Fix timezone controller bad return ( #15191 ) - murrant Graylog API properly throw errors ( #15188 ) - murrant Fixing the mac/vendor database download from wireshark, updated file \u2026 ( #15175 ) - sjtarik Fix alert.macros.rule ( #15172 ) - electrocret Miscellaneous fixes ( #15162 ) - murrant Change display query of list_devices to pattern match ( #15147 ) - hirose003 Change rrd_prune find command to exlcude .gitignore ( #15134 ) - robje Apply service templates on a per-device basis ( #15024 ) - eskyuu RFC1628 - Force cast on some values before doing arithmetic ( #14613 ) - fufroma","title":"Bug"},{"location":"General/Changelog/#refactor_2","text":"Fix sensor discovery fetch issue ( #15193 ) - murrant MAC Vendor OUI use scheduler ( #15187 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#cleanup_3","text":"Misc fixes 2 ( #15190 ) - murrant Severity Enum ( #14620 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_6","text":"[DOC] Added social links in footer ( #15195 ) - santiag0z OS discovery clarification ( #15182 ) - murrant [DOC] Remove ~$ from BIND9 code block aka named ( #15181 ) - santiag0z Fix settings titles in dark mode ( #15174 ) - murrant Update Routeros.md ( #15165 ) - viptampa Update Routeros.md ( #15160 ) - viptampa RouterOS Vlan agent script clarification ( #15158 ) - viptampa Fix bad link in Install-LibreNMS.md ( #15152 ) - arjenz","title":"Documentation"},{"location":"General/Changelog/#tests_1","text":"Only dump snmp logs on failure ( #15200 ) - murrant","title":"Tests"},{"location":"General/Changelog/#misc_6","text":"Use Laravel schema migration command directly ( #14039 ) - Jellyfrog","title":"Misc"},{"location":"General/Changelog/#internal-features_4","text":"Set mibs explicitly in SnmpQuery ( #15199 ) - murrant Editor yaml indent fine tuning ( #15189 ) - murrant","title":"Internal Features"},{"location":"General/Changelog/#dependencies_5","text":"Update composer dependencies ( #15167 ) - Jellyfrog Update Ziggy ( #15151 ) - murrant Dependency Updates ( #15149 ) - murrant","title":"Dependencies"},{"location":"General/Changelog/#2370","text":"(2023-07-16) A big thank you to the following 19 contributors this last month: peejaychilds (4) tuxgasy (3) murrant (3) jepke (2) VVelox (2) laf (1) PipoCanaja (1) eggbeater98 (1) illogik (1) elianmanzueta (1) peelman (1) Blinq-SanderBlom (1) vincent5753 (1) electrocret (1) mtentilucci (1) edgesite (1) davromaniak (1) TheMysteriousX (1) sjtarik (1) Thanks to maintainers and others that helped with pull requests this month: murrant (12) electrocret (6) Jellyfrog (6) ottorei (4) laf (3) PipoCanaja (1) FadhliRais (1) VVelox (1) PJGuyTen (1)","title":"23.7.0"},{"location":"General/Changelog/#device_7","text":"Fix MPLS Tab Display for Nokia devices using LDP and not RSVP ( #15128 ) - peelman Change state value for unplugged linecard ( #15126 ) - Blinq-SanderBlom Convert several JunOS sensors to yaml ( #15118 ) - murrant Update Trellix NSP discovery ( #15117 ) - mtentilucci APC new sensors ( #15090 ) - jepke Add regex for Supermicro switches running firmware 2.0 or newer, now called \"SuperSwitch\" ( #15083 ) - davromaniak Add support for PrimeKey Software Appliance ( #15059 ) - TheMysteriousX","title":"Device"},{"location":"General/Changelog/#webui_7","text":"Update Dark theme for readability on availability map ( #15141 ) - eggbeater98 Add Oxidized search clarification ( #15124 ) - electrocret Sort port by interface name while list ports. ( #15093 ) - edgesite","title":"Webui"},{"location":"General/Changelog/#alerting_5","text":"Alert transport slack config fixes ( #15131 ) - illogik Transport Messagebird voice message API ( #15115 ) - jepke","title":"Alerting"},{"location":"General/Changelog/#applications_5","text":"Add Privoxy stats support ( #15114 ) - VVelox Add Suricata Extract submission stats app ( #15105 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#api_7","text":"Adding human readable version of /api/v0/fdb/{mac}/detail ( #15045 ) - sjtarik","title":"Api"},{"location":"General/Changelog/#discovery_5","text":"Fix bogus reply from snmpwalk in ipNetToPhysicalPhysAddress ( #15142 ) - PipoCanaja","title":"Discovery"},{"location":"General/Changelog/#polling_4","text":"Fix for hrStorageIndex agility ( #15028 ) - peejaychilds","title":"Polling"},{"location":"General/Changelog/#bug_7","text":"Skip hostnames which are blank when generating the smokeping config ( #15144 ) - laf Change chunk to chunkById ( #15139 ) - peejaychilds Use lock ports_purge in ports_purge rather than syslog_purge lock ( #15135 ) - peejaychilds Fix validation: memcached required only if it is configured in .env ( #15122 ) - tuxgasy Exit non-zero if composer bin not found ( #15120 ) - tuxgasy","title":"Bug"},{"location":"General/Changelog/#documentation_7","text":"Update openwrt doc following PR #15096 ( #15119 ) - tuxgasy","title":"Documentation"},{"location":"General/Changelog/#translation_2","text":"Fix typo in delhost.inc.php ( #15130 ) - elianmanzueta Added missing zh-tw translation. ( #15125 ) - vincent5753","title":"Translation"},{"location":"General/Changelog/#internal-features_5","text":"Yaml value filling improvements ( #15116 ) - murrant","title":"Internal Features"},{"location":"General/Changelog/#2360","text":"(2023-06-23) A big thank you to the following 14 contributors this last month: VVelox (4) Jellyfrog (4) murrant (2) si458 (1) netravnen (1) tuxgasy (1) jepke (1) ajsiersema (1) wrongecho (1) peejaychilds (1) tim427 (1) kg6uyz (1) d-k-7 (1) electrocret (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (9) murrant (6) electrocret (4) ottorei (2)","title":"23.6.0"},{"location":"General/Changelog/#feature_5","text":"Alert transport cleanup, no_proxy support and other proxy cleanups ( #14763 ) - murrant","title":"Feature"},{"location":"General/Changelog/#device_8","text":"Improve OpenWRT detection ( #15096 ) - tuxgasy TEG-S50ES and TPE-P521ES device detection ( #15052 ) - kg6uyz Add sensor support for cefcModuleOperStatus ( #15026 ) - d-k-7 Extend Avocent Support ( #14914 ) - electrocret","title":"Device"},{"location":"General/Changelog/#alerting_6","text":"Messagebird transport ( #15079 ) - jepke Remove asterisk from recurring input ( #15074 ) - wrongecho Fix syslog transport output format ( #15070 ) - peejaychilds Fixed Markdown/Parse mode for Telegram ( #15066 ) - tim427","title":"Alerting"},{"location":"General/Changelog/#applications_6","text":"Add ZFS L2 support ( #15095 ) - VVelox Add Linux Softnet Stat app ( #15094 ) - VVelox Add Sneck support, making it very trivial to use Nagios style checks in a NRPE like manner ( #13954 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#bug_8","text":"Fixes #14975 Services in Device Groups not displayed correctly in Availability widget ( #15076 ) - ajsiersema Fix Dusk tests after 13626 ( #15057 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#cleanup_4","text":"Add AllowDynamicProperties to DynamicConfigItem ( #15058 ) - Jellyfrog","title":"Cleanup"},{"location":"General/Changelog/#documentation_8","text":"Add archlinux example ( #15113 ) - si458 Fix minor typo in Applications.md ( #15111 ) - VVelox","title":"Documentation"},{"location":"General/Changelog/#mibs_3","text":"Update MIKROTIK-MIB to v7.10 release ( #15110 ) - netravnen","title":"Mibs"},{"location":"General/Changelog/#dependencies_6","text":"Laravel 10.x Shift ( #14995 ) - Jellyfrog","title":"Dependencies"},{"location":"General/Changelog/#2350","text":"(2023-05-19) A big thank you to the following 37 contributors this last month: murrant (29) Jellyfrog (6) mtentilucci (5) peelman (4) electrocret (4) laf (3) cjsoftuk (3) alchemyx (2) Bierchermuesli (2) bakerds (2) mpikzink (2) TheMysteriousX (2) QuadPiece (1) elipsion (1) etiennewan (1) jlo-lirmm (1) dscw (1) fbouynot (1) santiag0z (1) dependabot (1) VoipTelCH (1) otkd (1) ajsiersema (1) JStandiford (1) PipoCanaja (1) arjenz (1) maticomba (1) SourceDoctor (1) pjroehl (1) cjwbath (1) MajesticFalcon (1) bnerickson (1) bestlong (1) Olen (1) mboehn (1) ollb (1) eskyuu (1) Thanks to maintainers and others that helped with pull requests this month: murrant (47) electrocret (18) Jellyfrog (16) ottorei (1) PipoCanaja (1) JohnnyBBravo (1)","title":"23.5.0"},{"location":"General/Changelog/#feature_6","text":"Set focus to Global Search on Ctrl-F ( #14947 ) - Bierchermuesli Add link to hosts mgmt (ipmi) interface ( #14905 ) - mpikzink Implement authentication for Redis/Sentinel ( #14805 ) - TheMysteriousX","title":"Feature"},{"location":"General/Changelog/#security_5","text":"Convert the inventory page to Laravel ( #15004 ) - murrant","title":"Security"},{"location":"General/Changelog/#device_9","text":"Add RoomAlert 12E Switch Sensors, fix Humidity Sensor ( #15049 ) - peelman Fix WISI over graphs ( #15040 ) - peelman Fix inventory display for Calix AXOS devices ( #15039 ) - peelman Map GPS lat and lon to os module ( #15033 ) - QuadPiece Firebrick CPU Monitoring ( #15030 ) - cjsoftuk Fix Firebrick mempool polling ( #15022 ) - cjsoftuk Add support for memory monitoring on Firebrick platform ( #15021 ) - cjsoftuk Fix vsolution discovery yaml ( #14970 ) - murrant Fix tait tnadmin processors ( #14969 ) - murrant Fix Raisecom Processor ( #14968 ) - murrant Fix Raisecom ROS processor collection ( #14966 ) - murrant Add support for Trellix ATD devices ( #14965 ) - mtentilucci Add support for Trellix NSP devices ( #14964 ) - mtentilucci Cisco QFP polling fixes ( #14961 ) - Bierchermuesli Add version, hardware and serial collection ( #14956 ) - JStandiford Add Rubrik Discovery ( #14951 ) - mtentilucci Add Nutanix AOS discovery ( #14950 ) - mtentilucci RouterOS runtime quirk on first discovery ( #14945 ) - murrant Added sensor support for older APC InfraStruXure PDUs ( #14944 ) - bakerds Expand discovery of gigavue os ( #14933 ) - mtentilucci Add discovery of NVT Phybridge FLEX24 ( #14913 ) - pjroehl Add initial OS detection for LoadBalancer.org ( #14902 ) - cjwbath Added graphing of DDoS-protection related OIDs for PAN-OS ( #14847 ) - bakerds Add support for Alpha CXC HP Controller ( #14829 ) - MajesticFalcon Change ESXi port naming to be stable ( #14639 ) - TheMysteriousX Add advantech icr-os for advantech routers ( #14171 ) - mboehn Fix cisco dbm sensors port link on discovery (NCS55A2) ( #13965 ) - ollb","title":"Device"},{"location":"General/Changelog/#webui_8","text":"Ondemand popup graphs ( #15050 ) - murrant Add a global setting for Ctrl-F focus (improve #14947) ( #15023 ) - etiennewan [About] Link to LinkedIn ( #14991 ) - santiag0z Clarify Alert Notify Settings ( #14974 ) - electrocret Fix Legacy vars Processing ( #14967 ) - murrant Correct PowerConsumed SI Units in Overview ( #14425 ) - mpikzink Added support for user timezones and user browser timezone by default (incomplete) ( #13626 ) - eskyuu","title":"Webui"},{"location":"General/Changelog/#alerting_7","text":"Fix undefined array key ( #15025 ) - Jellyfrog","title":"Alerting"},{"location":"General/Changelog/#graphs_5","text":"Php implode arg mismatch ( #15014 ) - jlo-lirmm Fix availability graphs to 100% ( #15013 ) - laf Fix scale_rigid accidentally being set to false ( #14992 ) - murrant Set device ping_perf scale_min to 0 ( #14989 ) - murrant Poller perf: add per device average ( #14940 ) - murrant Stacked graphs on zoom to speed ( #14928 ) - electrocret","title":"Graphs"},{"location":"General/Changelog/#applications_7","text":"Adding linux_config_files application support ( #14776 ) - bnerickson Agent support OS Updates ( #14687 ) - bestlong","title":"Applications"},{"location":"General/Changelog/#api_8","text":"Allow device ignore to be set via API ( #14985 ) - electrocret Enable disabling a device via api ( #14983 ) - VoipTelCH","title":"Api"},{"location":"General/Changelog/#discovery_6","text":"Snmp-scan filter for dns resolved devices ( #14934 ) - SourceDoctor","title":"Discovery"},{"location":"General/Changelog/#polling_5","text":"Fixes #14957 missing IPv6 BGP peers ( #14959 ) - ajsiersema Fix SnmpQuery and max_oid ( #14955 ) - murrant","title":"Polling"},{"location":"General/Changelog/#bug_9","text":"Fix timetaken columns too small ( #15042 ) - murrant Fix some undefined constants ( #14993 ) - murrant Fix routes after Laravel9 ( #14977 ) - Jellyfrog Fix more divide by zero issues ( #14954 ) - murrant Bug - wrong type in ports.inc.php ( #14952 ) - PipoCanaja Solves error in discovering services module ( #14939 ) - maticomba Ensure irc fifo-file is shared between dispatcher and core containers ( #14647 ) - Olen","title":"Bug"},{"location":"General/Changelog/#refactor_3","text":"Add a validation for checking if the scheduler is running ( #14987 ) - Jellyfrog Refactor billing ( #14979 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#cleanup_5","text":"Remove old unused adduser page and script ( #15035 ) - murrant Adopt anonymous migrations ( #15005 ) - Jellyfrog Remove unused port fields ( #14963 ) - murrant Cleanup enable bgp setting ( #14931 ) - electrocret","title":"Cleanup"},{"location":"General/Changelog/#documentation_9","text":"Re-add the Ubuntu Image page and links ( #15041 ) - laf Remove references to VM images ( #15031 ) - murrant Updated WebUI config options in docs to support direct linking to installs ( #15009 ) - laf Fix spelling error in Graylog section ( #15002 ) - dscw Update OAuth-SAML.md to prevent http code 419 error ( #15000 ) - fbouynot Update Smokeping.md with better nginx config instructions ( #14999 ) - alchemyx Update Copyright year to 2023 in README.md ( #14972 ) - otkd Update Install-LibreNMS.md ( #14949 ) - alchemyx","title":"Documentation"},{"location":"General/Changelog/#tests_2","text":"Reduce OS module test noise ( #15046 ) - murrant Test PHP 8.2 and MariaDB 10.11 ( #15007 ) - murrant Slightly better OS module test output ( #15001 ) - murrant Fix a bug when creating test data; if a community contained the strin\u2026 ( #14739 ) - peelman","title":"Tests"},{"location":"General/Changelog/#mibs_4","text":"Bump VMware MIBs ( #15029 ) - elipsion","title":"Mibs"},{"location":"General/Changelog/#dependencies_7","text":"Bump guzzlehttp/psr7 from 2.4.4 to 2.5.0 ( #14986 ) - dependabot Laravel 9.x Shift ( #14504 ) - Jellyfrog","title":"Dependencies"},{"location":"General/Changelog/#2350_1","text":"(2023-05-19) A big thank you to the following 37 contributors this last month: murrant (29) Jellyfrog (6) mtentilucci (5) peelman (4) electrocret (4) laf (3) cjsoftuk (3) alchemyx (2) Bierchermuesli (2) bakerds (2) mpikzink (2) TheMysteriousX (2) QuadPiece (1) elipsion (1) etiennewan (1) jlo-lirmm (1) dscw (1) fbouynot (1) santiag0z (1) dependabot (1) VoipTelCH (1) otkd (1) ajsiersema (1) JStandiford (1) PipoCanaja (1) arjenz (1) maticomba (1) SourceDoctor (1) pjroehl (1) cjwbath (1) MajesticFalcon (1) bnerickson (1) bestlong (1) Olen (1) mboehn (1) ollb (1) eskyuu (1) Thanks to maintainers and others that helped with pull requests this month: murrant (47) electrocret (18) Jellyfrog (16) ottorei (1) PipoCanaja (1) JohnnyBBravo (1)","title":"23.5.0"},{"location":"General/Changelog/#feature_7","text":"Set focus to Global Search on Ctrl-F ( #14947 ) - Bierchermuesli Add link to hosts mgmt (ipmi) interface ( #14905 ) - mpikzink","title":"Feature"},{"location":"General/Changelog/#security_6","text":"Convert the inventory page to Laravel ( #15004 ) - murrant","title":"Security"},{"location":"General/Changelog/#device_10","text":"Add RoomAlert 12E Switch Sensors, fix Humidity Sensor ( #15049 ) - peelman Fix WISI over graphs ( #15040 ) - peelman Fix inventory display for Calix AXOS devices ( #15039 ) - peelman Map GPS lat and lon to os module ( #15033 ) - QuadPiece Fix vsolution discovery yaml ( #14970 ) - murrant Fix tait tnadmin processors ( #14969 ) - murrant Fix Raisecom Processor ( #14968 ) - murrant Fix Raisecom ROS processor collection ( #14966 ) - murrant Add support for Trellix ATD devices ( #14965 ) - mtentilucci Add support for Trellix NSP devices ( #14964 ) - mtentilucci Cisco QFP polling fixes ( #14961 ) - Bierchermuesli Add version, hardware and serial collection ( #14956 ) - JStandiford Add Rubrik Discovery ( #14951 ) - mtentilucci Add Nutanix AOS discovery ( #14950 ) - mtentilucci RouterOS runtime quirk on first discovery ( #14945 ) - murrant Added sensor support for older APC InfraStruXure PDUs ( #14944 ) - bakerds Expand discovery of gigavue os ( #14933 ) - mtentilucci Add discovery of NVT Phybridge FLEX24 ( #14913 ) - pjroehl Add initial OS detection for LoadBalancer.org ( #14902 ) - cjwbath Added graphing of DDoS-protection related OIDs for PAN-OS ( #14847 ) - bakerds Add support for Alpha CXC HP Controller ( #14829 ) - MajesticFalcon Add advantech icr-os for advantech routers ( #14171 ) - mboehn Fix cisco dbm sensors port link on discovery (NCS55A2) ( #13965 ) - ollb","title":"Device"},{"location":"General/Changelog/#webui_9","text":"Ondemand popup graphs ( #15050 ) - murrant Clarify Alert Notify Settings ( #14974 ) - electrocret Fix Legacy vars Processing ( #14967 ) - murrant Correct PowerConsumed SI Units in Overview ( #14425 ) - mpikzink Added support for user timezones and user browser timezone by default (incomplete) ( #13626 ) - eskyuu","title":"Webui"},{"location":"General/Changelog/#alerting_8","text":"Fix undefined array key ( #15025 ) - Jellyfrog","title":"Alerting"},{"location":"General/Changelog/#graphs_6","text":"Php implode arg mismatch ( #15014 ) - jlo-lirmm Fix availability graphs to 100% ( #15013 ) - laf Fix scale_rigid accidentally being set to false ( #14992 ) - murrant Set device ping_perf scale_min to 0 ( #14989 ) - murrant Poller perf: add per device average ( #14940 ) - murrant Stacked graphs on zoom to speed ( #14928 ) - electrocret","title":"Graphs"},{"location":"General/Changelog/#applications_8","text":"Agent support OS Updates ( #14687 ) - bestlong","title":"Applications"},{"location":"General/Changelog/#api_9","text":"Allow device ignore to be set via API ( #14985 ) - electrocret Enable disabling a device via api ( #14983 ) - VoipTelCH","title":"Api"},{"location":"General/Changelog/#discovery_7","text":"Snmp-scan filter for dns resolved devices ( #14934 ) - SourceDoctor","title":"Discovery"},{"location":"General/Changelog/#polling_6","text":"Fixes #14957 missing IPv6 BGP peers ( #14959 ) - ajsiersema Fix SnmpQuery and max_oid ( #14955 ) - murrant","title":"Polling"},{"location":"General/Changelog/#bug_10","text":"Fix timetaken columns too small ( #15042 ) - murrant Fix some undefined constants ( #14993 ) - murrant Fix routes after Laravel9 ( #14977 ) - Jellyfrog Fix more divide by zero issues ( #14954 ) - murrant Bug - wrong type in ports.inc.php ( #14952 ) - PipoCanaja Solves error in discovering services module ( #14939 ) - maticomba","title":"Bug"},{"location":"General/Changelog/#refactor_4","text":"Add a validation for checking if the scheduler is running ( #14987 ) - Jellyfrog Refactor billing ( #14979 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#cleanup_6","text":"Remove old unused adduser page and script ( #15035 ) - murrant Remove unused port fields ( #14963 ) - murrant Cleanup enable bgp setting ( #14931 ) - electrocret","title":"Cleanup"},{"location":"General/Changelog/#documentation_10","text":"Re-add the Ubuntu Image page and links ( #15041 ) - laf Remove references to VM images ( #15031 ) - murrant Updated WebUI config options in docs to support direct linking to installs ( #15009 ) - laf Fix spelling error in Graylog section ( #15002 ) - dscw Update OAuth-SAML.md to prevent http code 419 error ( #15000 ) - fbouynot Update Smokeping.md with better nginx config instructions ( #14999 ) - alchemyx Update Copyright year to 2023 in README.md ( #14972 ) - otkd Update Install-LibreNMS.md ( #14949 ) - alchemyx","title":"Documentation"},{"location":"General/Changelog/#tests_3","text":"Reduce OS module test noise ( #15046 ) - murrant Test PHP 8.2 and MariaDB 10.11 ( #15007 ) - murrant Slightly better OS module test output ( #15001 ) - murrant Fix a bug when creating test data; if a community contained the strin\u2026 ( #14739 ) - peelman","title":"Tests"},{"location":"General/Changelog/#misc_7","text":"Firebrick CPU Monitoring ( #15030 ) - cjsoftuk Add a global setting for Ctrl-F focus (improve #14947) ( #15023 ) - etiennewan Fix Firebrick mempool polling ( #15022 ) - cjsoftuk Add support for memory monitoring on Firebrick platform ( #15021 ) - cjsoftuk Adopt anonymous migrations ( #15005 ) - Jellyfrog [About] Link to LinkedIn ( #14991 ) - santiag0z Implement authentication for Redis/Sentinel ( #14805 ) - TheMysteriousX Adding linux_config_files application support ( #14776 ) - bnerickson Ensure irc fifo-file is shared between dispatcher and core containers ( #14647 ) - Olen Change ESXi port naming to be stable ( #14639 ) - TheMysteriousX Laravel 9.x Shift ( #14504 ) - Jellyfrog","title":"Misc"},{"location":"General/Changelog/#mibs_5","text":"Bump VMware MIBs ( #15029 ) - elipsion","title":"Mibs"},{"location":"General/Changelog/#dependencies_8","text":"Bump guzzlehttp/psr7 from 2.4.4 to 2.5.0 ( #14986 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2340","text":"(2023-04-06) A big thank you to the following 25 contributors this last month: electrocret (8) VVelox (6) Jellyfrog (5) mtentilucci (4) Bierchermuesli (3) murrant (2) GeantRA (2) mwobst (2) dependabot (2) not-known (2) torbeckattsp (1) d-k-7 (1) arjenz (1) kirk444 (1) robje (1) pjroehl (1) peejaychilds (1) lukeofthetauri (1) fbouynot (1) bakerds (1) westerterp (1) peelman (1) jellejans (1) LoveSkylark (1) hvanoch (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (31) murrant (14) ottorei (6) electrocret (3) PipoCanaja (1)","title":"23.4.0"},{"location":"General/Changelog/#feature_8","text":"Indicator on Port Notes tab when Port has notes ( #14923 ) - electrocret Syslog sink over http for logstash (or any json source) ( #14424 ) - Bierchermuesli","title":"Feature"},{"location":"General/Changelog/#device_11","text":"Update hikvision camera detection ( #14943 ) - torbeckattsp APC UPS UIO sensor discovery bug ( #14942 ) - d-k-7 Add additional MOS / 7130 devices ( #14922 ) - kirk444 Add support for WTI console products ( #14920 ) - robje Update junos discovery yaml to reference total memory instead of buff\u2026 ( #14919 ) - GeantRA Add support for Trellix FireEye OS ( #14908 ) - mtentilucci Added cisco FTD 1150 to ftd.yaml ( #14907 ) - pjroehl Add more OIDs for determining hardware and serial attributes correctly ( #14904 ) - mwobst Add Cisco FTD Support for security appliances (x3) ( #14893 ) - mwobst Update test data to account for new vertiv.svg icon ( #14892 ) - mtentilucci Improve Corero CMS support ( #14876 ) - electrocret Add Avocent MergePoint Unity KVM Switch Support ( #14874 ) - mtentilucci Add Fortigate Webfilter stats ( #14873 ) - electrocret Add Cisco Firepower 4112 Support ( #14872 ) - lukeofthetauri Added PoE controller load and status sensors for Junos devices ( #14868 ) - bakerds Add Montclair EDFA Support ( #14852 ) - peelman Device - Add support for Scalance SC646-2C ( #14835 ) - jellejans Add Fortigate packet loss monitoring for Link-Monitor and SD-WAN ( #14828 ) - not-known Refactored Juniper SLA to include support for TWAMP and remove ambigu\u2026 ( #14787 ) - GeantRA Deltanet Lambdatrail LT2-S,HS ( #14661 ) - Bierchermuesli Add support for Battery Recommended Days Remaining ( #14653 ) - Jellyfrog","title":"Device"},{"location":"General/Changelog/#webui_10","text":"Pseudowires refresh ( #14882 ) - Bierchermuesli","title":"Webui"},{"location":"General/Changelog/#alerting_9","text":"Jira transport: use template title ( #14883 ) - not-known Remove Time Elapsed extra space ( #14880 ) - electrocret Fix Alertlog messaging ( #14861 ) - electrocret","title":"Alerting"},{"location":"General/Changelog/#graphs_7","text":"Add graph_stat_percentile_disable config item to disable percentile lines/value printing ( #14887 ) - VVelox Convert NTP freq to use generic_stats ( #14834 ) - VVelox Update fail2ban to have better stat graphs and and fix generic_stats graph.php ( #14818 ) - VVelox Update various device graphs to to have better stats ( #14815 ) - VVelox","title":"Graphs"},{"location":"General/Changelog/#applications_9","text":"Add more docker stats ( #14767 ) - hvanoch","title":"Applications"},{"location":"General/Changelog/#bug_11","text":"SnmpQuery, respect snmp.max_oid ( #14894 ) - murrant Add poller_groups (served) to the poller_cluster table ( #14886 ) - peejaychilds Actually use the stats graph for ntp-server_freq now, which as missed in #14834 ( #14884 ) - VVelox Add type checking to generic_stats.inc.php for $vars['to'] and $vars['from'] ( #14871 ) - VVelox Fix graphs for a search query ( #14864 ) - westerterp Fix interface parse unsets ( #14860 ) - electrocret Fix dbm calculation to return -60 instead of 0 ( #14858 ) - electrocret","title":"Bug"},{"location":"General/Changelog/#cleanup_7","text":"Store empty user_func as null ( #14900 ) - Jellyfrog","title":"Cleanup"},{"location":"General/Changelog/#documentation_11","text":"Fix typo in lnms device:add help ( #14937 ) - arjenz Add Azure example configuration for SAML authentication in documentation ( #14870 ) - fbouynot","title":"Documentation"},{"location":"General/Changelog/#tests_4","text":"Re-throw exceptions if we're in CI ( #14890 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#misc_8","text":"Reorder check_icmp command to follow documented usage ( #14910 ) - mtentilucci Add multi-PR GitHub-apply ( #14875 ) - electrocret Allows GEO lookup with detailed internal Location information wrapped inside parentheses. ( #14799 ) - LoveSkylark","title":"Misc"},{"location":"General/Changelog/#dependencies_9","text":"PHP dependency update ( #14927 ) - murrant Bump phpseclib/phpseclib from 3.0.18 to 3.0.19 ( #14903 ) - dependabot Bump webpack from 5.66.0 to 5.76.1 ( #14901 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2240","text":"(2023-04-06) A big thank you to the following 180 contributors this last month: murrant (230) Jellyfrog (73) electrocret (29) PipoCanaja (25) fbouynot (24) VVelox (21) Npeca75 (17) dependabot (15) bnerickson (11) gs-kamnas (10) bonzo81 (8) santiag0z (8) rhinoau (8) mwobst (7) Martin22 (7) westerterp (6) peelman (6) laf (6) LoveSkylark (5) TheMysteriousX (5) SourceDoctor (5) KayckMatias (5) mtentilucci (4) not-known (4) Bierchermuesli (4) hanserasmus (4) noaheroufus (4) opalivan (4) geg347 (4) ottorei (4) Fehler12 (4) ppasserini (4) tim427 (3) fcqpl (3) kimhaak (3) luc-ass (3) bp0 (3) loopodoopo (3) earendilfr (3) bl3nd3r (3) charlyforot (3) GeantRA (2) systeembeheerder (2) dennypage (2) jasoncheng7115 (2) carbinefreak (2) gdepeyrot (2) bogdanrotariu (2) mabra94 (2) josh-silvas (2) mprins-RAM (2) SirMaple (2) quentinsch (2) Schouwenburg (2) aztec102 (2) wrongecho (2) bennet-esyoil (2) duhow (2) Mar974 (2) QuadPiece (2) kruczek8989 (2) slimey99uk (2) Jimmy-Cl (2) si458 (2) torbeckattsp (1) d-k-7 (1) arjenz (1) kirk444 (1) robje (1) pjroehl (1) peejaychilds (1) lukeofthetauri (1) bakerds (1) guipoletto (1) goebelmeier (1) MarlinMr (1) florisvdk (1) jellejans (1) kylegordon (1) zenbeam (1) gilrim (1) AleksNovak (1) tristanbob (1) da-me (1) fdomain (1) jaannnis (1) knpo (1) trs80 (1) MANT5149 (1) support-capensis (1) zeroservices (1) hvanoch (1) angeletdemon (1) alchemyx (1) rinsekloek (1) gewuerfelt (1) tuxgasy (1) hugalafutro (1) Blinq-SanderBlom (1) nightcore500 (1) mrwold (1) koocotte (1) VoipTelCH (1) cfitzw (1) jaaruizgu (1) pertruccio (1) ianhodgson (1) talkstraightuk (1) fufroma (1) fuzzbawl (1) otkd (1) kiwibrew (1) andrekeller (1) Olen (1) Frazew (1) jgelinas (1) mpikzink (1) squidly (1) daniel-franca (1) sashashura (1) tuomari (1) sembeek (1) huntr-helper (1) ktims (1) VirTechSystems (1) washcroft (1) Laplacence (1) Jarod2801 (1) ciscoqid (1) enferas (1) 00gh (1) PedroChaps (1) ajsiersema (1) prahal (1) paulgear (1) mostdaysarebaddays (1) dagbdagb (1) bile0026 (1) hjcday (1) spyfly (1) Bobdave (1) DaftBrit (1) nox-x (1) SanderBlom (1) thecityofguanyu (1) nsn-amagruder (1) mkuurstra (1) booth-f (1) sajiby3k (1) skandragon (1) glance- (1) twelch24 (1) kevinwallace (1) lfkeitel (1) steffann (1) p4k8 (1) micko (1) cliffalbert (1) HolgerHees (1) frenchie (1) claude191 (1) Cormoran96 (1) WillIrvine (1) lucalo72 (1) ssasso (1) dandare100 (1) ospfbgp (1) MrXermon (1) pandalion98 (1) eskyuu (1) martinberg (1) lpailhas (1) jonathanjdavis (1) IVI053 (1) LTangaF (1) dlangille (1) pfromme25 (1) woidi (1) manonfgoo (1) mzacchi (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (328) murrant (260) PipoCanaja (50) ottorei (36) laf (18) SourceDoctor (7) VVelox (6) electrocret (3) mpikzink (3) santiag0z (2) crazy-max (1) westerterp (1) SeeMyPing (1) fbouynot (1) Cormoran96 (1) bennet-esyoil (1) f0o (1) haxmeadroom (1) bboy8012 (1)","title":"22.4.0"},{"location":"General/Changelog/#feature_9","text":"Indicator on Port Notes tab when Port has notes ( #14923 ) - electrocret Add display query to list_devices function ( #14747 ) - bonzo81 Split out lnms snmp convenience commands ( #14603 ) - murrant Add --forgot-key to key:rotate command ( #14495 ) - murrant Syslog sink over http for logstash (or any json source) ( #14424 ) - Bierchermuesli Improved Modern Modules ( #14315 ) - murrant Add @signedGraphTag() and @signedGraphUrl() blade directives ( #14269 ) - murrant Device settings: attempt to open related tab ( #14250 ) - murrant Error reporting ( #14190 ) - Jellyfrog Prepare for PHP 8.1 ( #14156 ) - Jellyfrog New Poller validations ( #14148 ) - murrant New lnms command to enable and disable plugins ( #14147 ) - murrant Support for SSL/TLS protected connections to MySQL databases ( #14142 ) - gs-kamnas Collect OS distro and LibreNMS version ( #14138 ) - murrant Lnms device:poll better feedback ( #14130 ) - murrant Per-App data storage ( #14087 ) - VVelox SnmpQuery walk multiple oids ( #14015 ) - murrant Add support to REST API for creating Maintenance Schedules for Device Groups ( #13985 ) - thecityofguanyu Automatic fixes for validation failures ( #13930 ) - murrant Allow unordered OIDs (global and per-os) ( #13923 ) - murrant Pre-Install settings ( #13906 ) - murrant Add ISIS discovery and polling for iosxe devices ( #13880 ) - WillIrvine Device_add support display field ( #13846 ) - murrant Add configuration support for IPMIv2 Kg key ( #13845 ) - pandalion98 Display Name in availability map ( #13841 ) - murrant Added --ping-only to snmp-scan.py ( #13810 ) - IVI053 Implement OAuth and SAML2 support ( #13764 ) - Jellyfrog","title":"Feature"},{"location":"General/Changelog/#security_7","text":"Fix Service Template XSS ( #14659 ) - murrant Fix neighbours XSS ( #14658 ) - murrant Fix SNMP trap -> Eventlog XSS ( #14657 ) - murrant Fix XSS in api access ( #14551 ) - murrant XSS sanitize pwrstatd application script inputs ( #14545 ) - bnerickson Block disabled user session auth ( #14473 ) - murrant Fix group delete xss ( #14472 ) - murrant Fix alert rules XSS ( #14471 ) - murrant Fix xss in browser push transport ( #14470 ) - murrant Fix users xss ( #14469 ) - murrant Fix user mass assignment vulnerability ( #14468 ) - murrant Fix billing xss ( #14465 ) - murrant Fix memcached unserialize vulnerability ( #14459 ) - murrant Fix possible RSS XSS ( #14457 ) - murrant GitHub Workflows security hardening ( #14388 ) - sashashura Fix scheduled maintenance xss ( #14360 ) - murrant Add huntr.dev to SECURITY.md ( #14359 ) - huntr-helper Security fixes XSS in oxidized-cfg-check.inc.php and print-customoid.php ( #14126 ) - enferas Bumpver handlebars.js to 4.7.7 to resolve CVE-2021-23369 ( #13990 ) - gs-kamnas Fix services command injection ( #13932 ) - murrant Fix Graylog XSS ( #13931 ) - murrant Bump minimist from 1.2.5 to 1.2.6 ( #13872 ) - dependabot Fix SQL injection in get-host-dependencies ( #13868 ) - Jellyfrog Resolved XSS issue from alert rule list modal ( #13805 ) - laf","title":"Security"},{"location":"General/Changelog/#device_12","text":"Update hikvision camera detection ( #14943 ) - torbeckattsp APC UPS UIO sensor discovery bug ( #14942 ) - d-k-7 Add additional MOS / 7130 devices ( #14922 ) - kirk444 Add support for WTI console products ( #14920 ) - robje Update junos discovery yaml to reference total memory instead of buff\u2026 ( #14919 ) - GeantRA Add support for Trellix FireEye OS ( #14908 ) - mtentilucci Added cisco FTD 1150 to ftd.yaml ( #14907 ) - pjroehl Add more OIDs for determining hardware and serial attributes correctly ( #14904 ) - mwobst Add Cisco FTD Support for security appliances (x3) ( #14893 ) - mwobst Update test data to account for new vertiv.svg icon ( #14892 ) - mtentilucci Improve Corero CMS support ( #14876 ) - electrocret Add Avocent MergePoint Unity KVM Switch Support ( #14874 ) - mtentilucci Add Fortigate Webfilter stats ( #14873 ) - electrocret Add Cisco Firepower 4112 Support ( #14872 ) - lukeofthetauri Added PoE controller load and status sensors for Junos devices ( #14868 ) - bakerds Fortigate IPS Intrusions detected stats ( #14857 ) - electrocret Add support for Vsol v1600d EPON OLT ( #14853 ) - guipoletto Add Montclair EDFA Support ( #14852 ) - peelman Fix discovery for apc ats ( #14837 ) - florisvdk Device - Add support for Scalance SC646-2C ( #14835 ) - jellejans Include Samsung X Series printers ( #14831 ) - kylegordon Add Fortigate packet loss monitoring for Link-Monitor and SD-WAN ( #14828 ) - not-known EdgeOS OLT new sensors and changes ( #14807 ) - noaheroufus Update XDP string to exclude modern Cisco lightweight APs from discovery ( #14803 ) - tristanbob Extend filtering of graphs device_bits on cisco ASA ( #14796 ) - PipoCanaja Changed discovery OID in ets.yaml ( #14795 ) - da-me Added Support for SNS-3615-K9 ( #14792 ) - jaannnis Routeros fix lldp discovery on 7.7+ ( #14791 ) - knpo Refactored Juniper SLA to include support for TWAMP and remove ambigu\u2026 ( #14787 ) - GeantRA Fix cisco-flash ( #14772 ) - electrocret Eaton matrix wattage fix ( #14770 ) - peelman Add Universal Input Output support for APC ( #14766 ) - dennypage Eltek Enexus; Fix SmartpackS divisor and hardware discovery ( #14762 ) - peelman Nokia PMC Microwave Improvements ( #14761 ) - carbinefreak Additional sensors ( #14756 ) - peelman Add AXOS sensor data for PON Transceivers (the only transceivers Cali\u2026 ( #14741 ) - peelman Adding discovery of LSI MegaRAID Device Media Errors, Other Errors, a\u2026 ( #14729 ) - bnerickson Update fs-nmu.inc.php ( #14702 ) - gewuerfelt Stop net-snmp from interpreting the octet-string from rttMonEchoAdmin\u2026 ( #14676 ) - not-known Add state of the Fortigate link monitor health checks ( #14675 ) - not-known Adding support for loop-telecom devices ( #14674 ) - Blinq-SanderBlom Support Huawei SMU02B ( #14673 ) - nightcore500 Use 'counter' RRD type for some TrueNAS sensors ( #14670 ) - TheMysteriousX Device - Add support for \"Smartpack R\" ( #14665 ) - mrwold Deltanet Lambdatrail LT2-S,HS ( #14661 ) - Bierchermuesli Added divisor to SAF Integra-X temp sensors ( #14655 ) - noaheroufus Corrected ICT MPS hardware detection ( #14654 ) - noaheroufus Add support for Battery Recommended Days Remaining ( #14653 ) - Jellyfrog Adjusted PMP to accomodate various other 450 models. ( #14652 ) - noaheroufus Added support for Eltek Micropack 1U ( #14645 ) - fcqpl Added support for Eltek Flatpack S ( #14643 ) - fcqpl Added Moxa switching ifAlias/portName mapping ( #14633 ) - rhinoau Improve VRP power display ( #14624 ) - PipoCanaja Edgeos picked up as generic device ( #14612 ) - ianhodgson Added Moxa EDS-G516E optical sensors ( #14610 ) - rhinoau Fix eNexus total current for Smartpack S ( #14606 ) - murrant Disable SNMP Bulk for Delta UPS devices ( #14599 ) - fufroma Improved AIX os information collection ( #14595 ) - murrant More inclusive Cisco SB os detection ( #14594 ) - murrant IP Infusion OcNOS basic detection ( #14588 ) - murrant Fix APC current divide by zero ( #14578 ) - murrant Extend EfficientIP SolidServer support ( #14549 ) - PipoCanaja TAIT-Infra93 - Fix state + skip_values for Battery ( #14541 ) - opalivan Timos - Improve SAP stats graphing ( #14534 ) - mabra94 McAfee Web Proxy with COUNTER rrd_type on sensors ( #14529 ) - PipoCanaja Fix 'bke.yaml' discovery file ( #14524 ) - PipoCanaja Added support for additional Moxa EDS-P model ( #14523 ) - rhinoau Fix awplus ntp polling bug ( #14521 ) - murrant Add discovery support for Riedo Networks UPDU ( #14496 ) - andrekeller Use correct description oid ( #14489 ) - Jellyfrog Correct upsBypassVoltage oid ( #14488 ) - Jellyfrog Correct variable typo ( #14486 ) - Jellyfrog Hpe ilo: fix filesystem type regex ( #14485 ) - Jellyfrog Added Fortigate SD-WAN Health checks ( #14456 ) - mprins-RAM Dont include empty storage sensor ( #14453 ) - Jellyfrog Remove undefined sensors ( #14449 ) - Jellyfrog Use correct low warn limit variable ( #14447 ) - Jellyfrog Correct aviatModemCurModulationRx oid ( #14446 ) - Jellyfrog Fortinet FortiADC detection and basic statistics ( #14434 ) - westerterp MNI Microwave OS Add ( #14427 ) - carbinefreak Add OS tait-tnadmin for TN9300 ( #14413 ) - opalivan Skip empty drac state sensors ( #14409 ) - jgelinas Added support for additional Moxa EDS-G models ( #14405 ) - rhinoau Device - Add support for Vultan Environmental Monitoring units ( #14401 ) - squidly Issue samsung printer m4080 fx ( #14391 ) - daniel-franca Added status checks for (BWCC) battery status and condition for onboa\u2026 ( #14349 ) - quentinsch Enexus system output current fix ( #14324 ) - loopodoopo UHP VSAT modems ( #14317 ) - loopodoopo Ray2 - Oid repair at ber ( #14302 ) - Martin22 Routeros - Fix displaying distance in charts ( #14300 ) - Martin22 Added support for Ubiquiti UFiber OLT ( #14256 ) - Martin22 Fix ciena-sds inventory bugs ( #14252 ) - murrant F5 partition ram ( #14226 ) - fbouynot Add Cisco Flash storage support ( #14219 ) - fbouynot Fix luminato port poll ( #14217 ) - murrant Teltonika RUT fix ( #14202 ) - loopodoopo Initial support for Moxa AWK Industrial APs ( #14197 ) - rhinoau Mikrotik wifi station mode sensors ( #14193 ) - Npeca75 Update mellanox os image ( #14184 ) - Laplacence Change state_name for Racoms modulation ( #14174 ) - Martin22 Cisco SB/CBS environment sensors ( #14154 ) - Fehler12 Fix Rocky Linux and AlmaLinux icons and logos ( #14150 ) - murrant Add additional sysObjectIDs for variants of the Arista 7130 ( #14144 ) - gs-kamnas Eltex MES 2324p Add ( #14135 ) - aztec102 Solid Optics EDFAMUX support ( #14129 ) - murrant Merge netmanplus and riello and improve device support ( #14125 ) - murrant Device - Basic hatteras dslam integration ( #14115 ) - Bierchermuesli Bats support ( #14108 ) - Schouwenburg Solved aos6 problem where Librenms wasn't identifying all vlans ( #14107 ) - PedroChaps Fix Cisco polling BGP peers in non-default VRF ( #14105 ) - ajsiersema Added support for CheckPoint 1100, 1450 & 1490 models. ( #14074 ) - quentinsch Missing \"s\" in NsBsd.php ( #14067 ) - Mar974 Add full version of Mikrotik logo ( #14063 ) - QuadPiece Ns-bsd updated for SNS LTSB 3.7.19 ( #14060 ) - Mar974 Add apc battery operation time, including display in WebUI ( #14058 ) - mwobst Fix the parsing of the temperature unit value (CMCIII devices) ( #14056 ) - mwobst ZTE ZXA10 Update (Added dBm graphs) ( #14049 ) - aztec102 Update Mikrotik logo ( #14045 ) - QuadPiece Fix use of incorrect variable to retrieve current sensor value ( #14037 ) - dennypage Support Huawei SMU11B ( #14029 ) - murrant Update Teltonika Sensors for FW R_00.07.02 ( #14012 ) - hjcday Procurve hardware description cleanup ( #14007 ) - murrant Racom Ray2 and Ray3 - Modulation states added ( #14001 ) - Martin22 Fix OS Detection for USW-Flex-XG ( #13999 ) - spyfly Add support for Cisco Nexus 3550 series (formerly Exalink Fusion) devices ( #13992 ) - gs-kamnas Improve support for Arista/Metamako MOS devices ( #13988 ) - gs-kamnas Add Cisco Business Wirless to ciscowlc.yaml ( #13984 ) - nsn-amagruder Add Eaton SC200 OS model ( #13978 ) - slimey99uk Fortigate LTE sensor addition ( #13977 ) - slimey99uk Added BKE power supply support. ( #13972 ) - Martin22 Workaround issues with lldp information from GS108Tv1 ( #13971 ) - glance- Add additional OpenBSD PF graphs ( #13963 ) - kevinwallace Don't use bulk-walk for PrimeKey Appliances ( #13958 ) - bl3nd3r Fix avtech12e sensors ( #13943 ) - lfkeitel Support tplink routers ( #13922 ) - si458 Aviat WTM reduce snmp load ( #13918 ) - murrant Fix Hytera error ( #13909 ) - murrant [mikrotik] fixed RouterOS ipv4/ipv6 routes ( #13902 ) - Npeca75 PrimeKey Improvements ( #13901 ) - bl3nd3r Enhancements for Zyxel OS ( #13897 ) - Jimmy-Cl Added support for Dell PowerVault ME4024 ( #13883 ) - laf Add support for Riello NetMan 204 ( #13878 ) - lucalo72 Fix usw flex switch hardware detection ( #13877 ) - Fehler12 Added Polycom Lens SNMP support. ( #13876 ) - Fehler12 Fix for PFSense state table removals field ( #13863 ) - dandare100 Add support for VOSS 8.6 ( #13857 ) - ospfbgp McAfee Proxy Sensor name update ( #13853 ) - PipoCanaja Device - HWG-WLD version 2 support ( #13849 ) - PipoCanaja Fix an issue with the APC current discovery ( #13837 ) - eskyuu Add VS state for Gaia ( #13831 ) - martinberg [new OS] Alpine OptoElectronics TDCM-EDFA support ( #13825 ) - charlyforot Fix db delete on cisco-vrf-lite discovery ( #13823 ) - lpailhas Add rocky linux OS identification ( #13815 ) - hanserasmus Detect truenas scale ( #13812 ) - si458 Add support for PrimeKey Hardware Appliance ( #13806 ) - bl3nd3r [comware] dropped dbfetch from discovery/sensors ( #13796 ) - Npeca75 BGP unnumbered support for Cumulus ( #13785 ) - charlyforot Correct divisor in discovery definition vertiv-pdu.yaml ( #13768 ) - woidi Netscaler new counter metrics ( #13323 ) - mzacchi","title":"Device"},{"location":"General/Changelog/#webui_11","text":"Pseudowires refresh ( #14882 ) - Bierchermuesli Fix port speed setting feedback ( #14743 ) - murrant Fix Cimc on Overview ( #14727 ) - electrocret Search devices also in display ( #14714 ) - gdepeyrot Fix check rrd file exists with remote rrdcached ( #14690 ) - tuxgasy Use displayname instead of hostname for Device Maintenance Modal Title ( #14681 ) - electrocret Remove ungrouped devices panel ( #14664 ) - murrant Custom port view fix ( #14637 ) - SourceDoctor Fix billing graph divide by zero when the period is zero or doesn't exist ( #14623 ) - jaaruizgu Fix port neighbors missing ( #14586 ) - murrant Fix some icons ( #14584 ) - murrant [About] Open Laravel and RRDtool link in new tab ( #14568 ) - santiag0z [About] Open the contributor list link in a new tab ( #14553 ) - santiag0z Fix v2 plugins ( #14506 ) - murrant Check if service_name is empty or equal to service_type ( #14499 ) - luc-ass Show id on device dependencies ( #14497 ) - SourceDoctor Userlist description fix ( #14482 ) - mprins-RAM Sort alert transport by name ( #14464 ) - SourceDoctor Fix missing device_id from device alert logs ( #14460 ) - ottorei Fix about date display ( #14442 ) - murrant Fix pseudowires pages ( #14441 ) - murrant Enhanced Service Overview on Device Overview Page ( #14410 ) - luc-ass Disable plugins that have errors ( #14383 ) - murrant Fix Inventory table for Dark theme ( #14377 ) - electrocret Add initselect2 to locations ports ( #14375 ) - KayckMatias Update devices filter in alert-logs to init_select2 ( #14361 ) - KayckMatias Load device selection dynamically on Ports page ( #14353 ) - KayckMatias Port pages fixes and cleanups ( #14310 ) - murrant Remove Caffeine ( #14277 ) - murrant Updated brother.svg to make it render in Safari ( #14271 ) - luc-ass Fix for Cisco group device health tab ( #14265 ) - fbouynot Fix dashboard widgets becoming unlocked (especially when using a touchscreen) ( #14222 ) - tim427 Migrate xDSL code to module, and add support for VDSL2 MIB ( #14207 ) - PipoCanaja Fix ports display ( #14183 ) - murrant Ports by device group ( #14175 ) - electrocret Empty Outages table ( #14167 ) - Npeca75 View Ports in Portgroups ( #14141 ) - electrocret Fix eventlog filtering ( #14136 ) - murrant Fix device filtering false values ( #14103 ) - murrant [gui] enable permanent vertical scroll ( #14102 ) - Npeca75 Minor visual changes to the apps-overview page ( #14090 ) - bennet-esyoil Improved sorting options for Availability Map ( #14073 ) - mwobst Search device by MAC via URL ( #14072 ) - duhow Add BGP description to eventlog BGP Peers messages ( #14061 ) - mostdaysarebaddays Slightly easier validation page error access ( #14044 ) - murrant Dashboard code cleanup ( #13996 ) - murrant Update dark mode to fix BGP and Peering page ( #13951 ) - Jimmy-Cl Validate base_url and server_name ( #13941 ) - murrant Fix snmp.timeout setting via Web UI ( #13937 ) - murrant Add ISIS-details to alert details ( #13920 ) - ottorei Fix port mini graphs ( #13911 ) - murrant Replaced OpenWRT icon with new logo ( #13891 ) - frenchie Add \"Ping Response\" graph to \"Ping Only\" Device Overview page ( #13886 ) - westerterp Remove fix size for column mac adresse ( #13881 ) - Cormoran96 Fixed the top port errors widget returning bits graphs instead ( #13860 ) - laf Fix class error name prevents to show BER graph ( #13833 ) - charlyforot Fixed displaying hostname in create bill when port is passed ( #13830 ) - laf Fix Oxidized Config tab showing when Device OS or Device Type is disabled ( #13809 ) - westerterp Position the buttons in the center on user preferences page ( #13802 ) - santiag0z Add usage hints for Display Name placeholder usage ( #13801 ) - LTangaF Fix second menu bar in Apps screens ( #13800 ) - westerterp WebUI - Search results for ports ( #13787 ) - PipoCanaja Device Types Widget ( #13670 ) - SourceDoctor","title":"Webui"},{"location":"General/Changelog/#alerting_10","text":"Jira transport: use template title ( #14883 ) - not-known Remove Time Elapsed extra space ( #14880 ) - electrocret Fix Alertlog messaging ( #14861 ) - electrocret Fix MS Teams alert transport, correct HTTP header ( #14843 ) - goebelmeier Add support for topics ( #14804 ) - AleksNovak Adding sample alert for systemd application ( #14711 ) - bnerickson Polling poller debug ( #14691 ) - electrocret Add -I flag to Traceroute cmd ( #14667 ) - electrocret Alert map location fix ( #14380 ) - KayckMatias Populate the alert rule field with the builder json ( #14374 ) - murrant Discord ability to attach graph images ( #14276 ) - murrant Email Transport: embed graphs by default ( #14270 ) - murrant Correct logic for recurring alert rules that span UTC days ( #14145 ) - gs-kamnas Improvements to PagerDuty alert formatting ( #14143 ) - gs-kamnas Example rules for diskspace on / ( #14082 ) - VVelox Add rich (=html) support for messages via Matrix ( #14054 ) - mwobst Add macro.past_20m macro ( #14023 ) - kruczek8989 Allow the use of a custom URL for accessing the PagerDuty API and correct API schema violation ( #14010 ) - gs-kamnas Setting MSteams card summary to alert title ( #13989 ) - DaftBrit More realistic alert test data ( #13969 ) - murrant Use display name when sending alerts to Sensu ( #13967 ) - TheMysteriousX Correct type hint ( #13915 ) - TheMysteriousX Improve alert template saving ( #13910 ) - murrant Added Basic authentication capability to Alertmanager Transport ( #13867 ) - geg347 Newer versions of Jira use HTTP code 201 fore created issues ( #13852 ) - MrXermon Add extra dynamic values alerttransport alertmanager ( #13828 ) - geg347 Add generic PSU status failed alert rule template ( #13821 ) - geg347","title":"Alerting"},{"location":"General/Changelog/#graphs_8","text":"Add graph_stat_percentile_disable config item to disable percentile lines/value printing ( #14887 ) - VVelox Convert NTP freq to use generic_stats ( #14834 ) - VVelox Update fail2ban to have better stat graphs and and fix generic_stats graph.php ( #14818 ) - VVelox Update various device graphs to to have better stats ( #14815 ) - VVelox Update HV::Monitor support to use generic_stats.inc.php ( #14814 ) - VVelox Only show Eth errors when Etherlike is enabled ( #14784 ) - electrocret Fix graph output base64 ( #14701 ) - murrant Fix some graphs not respecting device display name ( #14684 ) - murrant Adding Average into graphs ( #14679 ) - bogdanrotariu Fix device poller modules graph ( #14640 ) - murrant Bug - XDSL module - rrd_def and rrd file definition issue for Actual rate ( #14597 ) - PipoCanaja Fix graph errors wrong content type ( #14574 ) - murrant Improve graph embedded title handling ( #14544 ) - murrant Graphing cleanup ( #14492 ) - murrant Return GraphImage to include more metadata ( #14307 ) - murrant Fix unauth application graphs ( #14216 ) - murrant Allow specifying the background colour in graph images ( #14192 ) - washcroft Ping perf ( #14117 ) - 00gh [RRD] fix IPv6 folder name ( #13945 ) - Npeca75","title":"Graphs"},{"location":"General/Changelog/#snmp-traps","text":"Adds Cisco DHCP Server SNMP MIB and Trap Handlers. ( #14618 ) - josh-silvas Improve LinkUp and LinkDown trap handling incomplete traps ( #14385 ) - tuomari Add Cisco Err-Disable interface event trap handler ( #13855 ) - bonzo81 Add APC SmartAvrReducing trap handlers ( #13839 ) - bonzo81 Add APC upsOnBattery & powerRestored trap handler ( #13836 ) - bonzo81 Add OspfTxRetransmit Trap Handler ( #13824 ) - bonzo81 Cisco Mac address violation trap handler ( #13811 ) - bonzo81","title":"Snmp Traps"},{"location":"General/Changelog/#applications_10","text":"Add a few more graphs for CAPEv2 ( #14813 ) - VVelox CAPEv2 support ( #14801 ) - VVelox Add more docker stats ( #14767 ) - hvanoch Update Nvidia application - values in wrong charts ( #14736 ) - fcqpl Removing max polling restriction for wireguard traffic RRD data ( #14710 ) - bnerickson Alarm Flag on UPS-Nut Application ( #14635 ) - SourceDoctor Adding wireguard app to the apps overview page ( #14629 ) - bnerickson Adding wireguard application support ( #14625 ) - bnerickson Adding systemd service status application ( #14540 ) - bnerickson Memcached application: improve error visibility ( #14536 ) - murrant Fix memcached polling bug ( #14501 ) - murrant Add pwrstatd application ( #14365 ) - bnerickson Add HV Monitor, a generic means for monitoring hypvervisors ( #14218 ) - VVelox Add possibility to monitor redis application through the unix-agent ( #14182 ) - earendilfr Fix error between application module and unix-agent ( #14177 ) - earendilfr Add possibility to monitor the php-fpm service with the unix agent ( #14173 ) - earendilfr Base64 gzip compression support for json_app_get ( #14169 ) - VVelox [apps] Docker only show current containers ( #14152 ) - Npeca75 Fix app docker ( #14080 ) - prahal Add support for Sagan ( #14070 ) - VVelox Add Opensearch\\Elasticsearch monitoring ( #14053 ) - VVelox Add error-state to non-responsive mysql-servers ( #13993 ) - bennet-esyoil Remove alert keys from component for Suricata ( #13959 ) - VVelox Fix a few issues with variable names for Suricata ( #13956 ) - VVelox Scripts/json-app-tool.php JSON generation fix and add -S for SNMP extend name ( #13948 ) - VVelox Add Suricata monitoring ( #13942 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#api_10","text":"Fix for RIPE NCC API Tools ( #14757 ) - LoveSkylark Use Oxidized API client and add support for groups on config get ( #14750 ) - electrocret API list_devices update with sysName, location_id and type ( #14731 ) - bonzo81 Port search API search more than one fields ( #14646 ) - murrant Added disable_notify and location_id ( #14619 ) - pertruccio Add sortorder parameter to list_logs ( #14600 ) - talkstraightuk API restore ability to update purpose and override_sysLocation ( #14596 ) - murrant API graphs, variable whitelist ( #14552 ) - murrant Graph API use new code path ( #14493 ) - murrant Adding device's field in get_alert_rule and list-alert-rules API function (new) ( #14481 ) - geg347 Fix update_device hostname handling #14435 ( #14448 ) - rhinoau Fix port search with slashes ( #14403 ) - murrant Add Columns to search_ports API function ( #14348 ) - electrocret Allow delete location by id ( #14334 ) - bp0 API update_device, make location field work (as does location_id) ( #14325 ) - bp0 Standardize device and device group maintenance API ( #14153 ) - rhinoau Fix maintenance APIs not associating device or group ( #14127 ) - murrant Ensure 'add_device' API returns indexed-array (as per doco) ( #13887 ) - claude191 Adds API call to update port notes on devices. ( #13834 ) - josh-silvas","title":"Api"},{"location":"General/Changelog/#discovery_8","text":"Prevent spurious MAC changes on multi-interface devices ( #14671 ) - TheMysteriousX Fix discovery ignores custom ipmi port ( #14660 ) - VoipTelCH Cisco NAC fix ( #14440 ) - murrant Fix legacy os extends ( #14220 ) - murrant Sensors - Allow changing RRD type in YAML and PHP sensor discovery ( #14208 ) - PipoCanaja Sensors, convert hex to strings ( #14121 ) - murrant Fix printer count sensors when extra garbage is returned ( #14014 ) - murrant Fix polling and discovery of FortiGate cluster sensors ( #13980 ) - mkuurstra","title":"Discovery"},{"location":"General/Changelog/#polling_7","text":"Fix ArubaInstance channel decode issue ( #14732 ) - murrant Don't poll sysDescr, sysObjectID, and sysName so frequently ( #14562 ) - murrant Add connection exception handling to all redis calls ( #14467 ) - Frazew Fix bgp-peers bgpPeerIface bug and update test data ( #14420 ) - murrant Fix ping.php skipped results ( #14368 ) - sembeek Fix for number in sensor string ( #14185 ) - Schouwenburg Increase traceroute timeout ( #14084 ) - murrant Fix STP polling bug ( #13924 ) - murrant Print full error message in poller/discovery output ( #13903 ) - murrant","title":"Polling"},{"location":"General/Changelog/#rancid","text":"Add MRV OptiDriver support in gen_rancid ( #13900 ) - cliffalbert Add support for VyOS on Rancid conf ( #13874 ) - ssasso","title":"Rancid"},{"location":"General/Changelog/#oxidized_1","text":"Show display name in Oxidized config search ( #14800 ) - electrocret Adding Fortigate switches to Oxidized model mapping config ( #14782 ) - LoveSkylark Fix oxidized web requests unclosed connections or responding fast enough ( #14370 ) - fbouynot Oxidized \"allow purpose and notes\" ( #14352 ) - LoveSkylark Syslog-notify-oxidized.php now always notifies Oxidized ( #14011 ) - murrant Fix Oxidized syslog change notifier when the change was made via snmp. ( #14005 ) - kruczek8989 Oxidized API to return groups based on device purpose or notes ( #13976 ) - sajiby3k","title":"Oxidized"},{"location":"General/Changelog/#authentication_5","text":"Update Radius auth to accept permissions attributes ( #14531 ) - kimhaak Rework socialite integration ( #14367 ) - Jellyfrog AD Auth PHP 8.1 fixes ( #14215 ) - murrant Add option STARTTLS for authentication via AD ( #14051 ) - dagbdagb Auth_ldap_skip_group_check when ldap_compare is not supported ( #13926 ) - micko Implement support for usernames coming from reverse proxies ( #13894 ) - HolgerHees Add LDAP bind and userlist filter support to ldap-authorization ( #13788 ) - pfromme25","title":"Authentication"},{"location":"General/Changelog/#bug_12","text":"SnmpQuery, respect snmp.max_oid ( #14894 ) - murrant Add poller_groups (served) to the poller_cluster table ( #14886 ) - peejaychilds Actually use the stats graph for ntp-server_freq now, which as missed in #14834 ( #14884 ) - VVelox Add type checking to generic_stats.inc.php for $vars['to'] and $vars['from'] ( #14871 ) - VVelox Fix graphs for a search query ( #14864 ) - westerterp Fix interface parse unsets ( #14860 ) - electrocret Fix dbm calculation to return -60 instead of 0 ( #14858 ) - electrocret Revert \"Fix entity-state polling/discovery\" ( #14811 ) - murrant Fix entity-state polling/discovery ( #14793 ) - fdomain Update PingCheck.php to remove duplicate \"Device status changed to ... from icmp check.\" event ( #14785 ) - MANT5149 Fix calculated dbm ( #14771 ) - electrocret Handle Division by 0 error for SvcFdbTableSize ( #14672 ) - mabra94 Fix sqlite test ( #14642 ) - murrant Remove extends and hardware detection support ( #14626 ) - murrant Set 0 as integer in loading of graylog. ( #14621 ) - kimhaak Fix GeocodingHelper type-hinting ( #14604 ) - Jellyfrog Bug in Ciscowlc AP graphs definition ( #14585 ) - PipoCanaja SnmpQuery fix mib directory order ( #14580 ) - murrant SnmpQuery Handle empty oids in get more gracefully ( #14577 ) - murrant Fix PTOPO mib in module discovery-protocols ( #14564 ) - PipoCanaja Fix Type error ( #14555 ) - fbouynot Correct variable use in billing ( #14533 ) - Jellyfrog Fix sensor limit linked port rules in collection ( #14520 ) - electrocret EES Rectifier various fixes from MIB + added tests ( #14519 ) - opalivan Fix fetch ifEntry logic ( #14483 ) - Jellyfrog Add a few breaks to avoid connection flooding for the irc-bot ( #14479 ) - Olen Snmpwalk functions: dont include invalid data ( #14438 ) - Jellyfrog Fix VRP duplicate BGP Peers ( #14431 ) - PipoCanaja Version and git helper improvements ( #14412 ) - murrant Cache version data ( #14404 ) - murrant Fix rpi codec state sensor ( #14400 ) - murrant Fix libvirt count() uncountable error ( #14398 ) - murrant Fix Firebrick local ASN ( #14397 ) - murrant Fix ups nut PHP 8 issue ( #14392 ) - murrant Fix cipsec-tunnels ftd bad data causes error ( #14366 ) - murrant Handle null in unix-agent ( #14358 ) - murrant Fix the case of 'Ungrouped' in smokeping integration ( #14351 ) - fbouynot Fix for smokeping integration with ping-only devices ( #14341 ) - fbouynot Match displayname source for graylog ( #14339 ) - fbouynot Check dot1dBasePortIfIndex exists before using it ( #14337 ) - Jellyfrog Prevent errors when hrStorageTable doesn't exist ( #14327 ) - Jellyfrog Revert \"ZTE ZXA10 Update (Added dBm graphs)\" ( #14320 ) - murrant Billing module fix/cleanup ( #14309 ) - electrocret SnmpResponse filterBadLines fix ( #14306 ) - murrant Fix ARP Table on Device overview ( #14304 ) - Npeca75 Disable error reporting when dependencies are outdated ( #14291 ) - murrant Don't send zeros to Graphite for missing metrics ( #14262 ) - ktims Fix removing all port groups ( #14253 ) - murrant Move cronjob time for daily.sh ( #14245 ) - Jellyfrog Firebrick bgp polling was broken ( #14237 ) - murrant Quick fix for cipsec-tunnels Cisco implementation ( #14232 ) - PipoCanaja Fix redeclare of function breaking tests in OS eltex-mes23xx ( #14227 ) - PipoCanaja Autodiscovery fix ( #14213 ) - Npeca75 Fix alert log clearing SQL query ( #14200 ) - Jellyfrog Fix error when ldap_search returns false ( #14199 ) - Jellyfrog Fix unnecessary Updates of DB when values are equal ( #14179 ) - opalivan Fix APP_KEY generation when using fpm ( #14168 ) - Jellyfrog Fix validation error ( #14163 ) - TheMysteriousX IPv6 Debug typo ( #14162 ) - Npeca75 Replace git show --no-patch option with --quiet ( #14160 ) - ciscoqid Fix 500 error in validation when UI containers and poller containers have differing node_ids ( #14146 ) - gs-kamnas Use --no-patch to support old git clients ( #14137 ) - Jellyfrog Prevent duplicate plugin table entries ( #14120 ) - murrant Fix auth_test.php debug ( #14118 ) - murrant Fix config seeder will never run ( #14113 ) - murrant Reset the opcache after install ( #14098 ) - murrant Update config cache on install finalize step ( #14097 ) - murrant Fix more webserver validation issues ( #14096 ) - murrant Revert \"Add apc battery operation time, including display in WebUI\" ( #14068 ) - PipoCanaja Use --no-patch instead ( #14047 ) - Jellyfrog Git version validation improvement ( #14042 ) - murrant Server name validation, handle ports better ( #14041 ) - murrant Fix some broken migrations ( #14040 ) - Jellyfrog Fix rrd version validation check ( #14036 ) - murrant Fix DB timezone validation ( #14035 ) - murrant Regression fix from #13596 ( #14034 ) - Jellyfrog Fix an issue when getting the local version from git ( #14020 ) - murrant Fix migrations failing one time after dashboard cleanup ( #14002 ) - murrant Fix Netscaler VServer database updates during polling ( #13995 ) - Bobdave Fix 500 error in validations when capabilities are not supported or set ( #13991 ) - gs-kamnas Inconsistency in ldap starttls config parameter ( #13987 ) - nox-x Fix version check error ( #13981 ) - murrant Use full sudo path ( #13975 ) - skandragon Fix IPv6 in service check host ( #13939 ) - steffann Validate fixes ( #13935 ) - murrant Lnms device:add handle snmp.community bad format ( #13914 ) - murrant Fix install icons ( #13904 ) - murrant Handle bad uptime input ( #13899 ) - murrant Fix custom error messages ( #13898 ) - murrant Migrate addhost.php to lnms device:add ( #13870 ) - murrant Rewrite agent packages parsing code ( #13840 ) - murrant Fix snmpv3 context when empty SnmpQuery ( #13832 ) - murrant Regression fix from b6a8b602b891d9eb8633f62632c17bdc559cd620 ( #13819 ) - Jellyfrog Fix PHPStan Deprecated test ( #13794 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#refactor_5","text":"Unify time interval formatting ( #14733 ) - murrant Remove Log::event ( #14526 ) - Jellyfrog Cleanup and optimize the availability widget ( #14329 ) - murrant Fix a few Db* to Eloquent requests ( #14278 ) - PipoCanaja Use \"database version\" instead of \"mysql version\" ( #14158 ) - Jellyfrog Improve the efficiency of some queries ( #13974 ) - murrant Move Config loading to a service provider ( #13927 ) - murrant Port Validation Page to Laravel ( #13921 ) - murrant Remove addHost from ModuleTestHelper ( #13847 ) - murrant New device:add code ( #13842 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#cleanup_8","text":"Store empty user_func as null ( #14900 ) - Jellyfrog Consolidate and improve snmptranslate usage ( #14567 ) - murrant Remove graph_min ( #14561 ) - murrant Remove $_GET from graphs ( #14554 ) - murrant Undefined array key fixes ( #14532 ) - Jellyfrog Use Collection instead of collect() ( #14527 ) - Jellyfrog Convert string references to ::class ( #14508 ) - Jellyfrog Miscellaneous cleanup - part 5 ( #14502 ) - Jellyfrog Type API methods and properties ( #14476 ) - fbouynot Miscellaneous cleanup - part 4 ( #14452 ) - Jellyfrog Miscellaneous cleanup - part 3 ( #14450 ) - Jellyfrog Miscellaneous cleanup, mostly undefined variables - part2 ( #14445 ) - Jellyfrog Remove tabs from yaml ( #14437 ) - Jellyfrog Miscellaneous fixes, mostly undefined variables ( #14432 ) - Jellyfrog Trim whitespaces from device data ( #14429 ) - Jellyfrog Fix bgp_peer array_merge error ( #14416 ) - PipoCanaja Defer loading cli option defaults ( #14363 ) - Jellyfrog Remove call to Config from artisan ( #14362 ) - Jellyfrog Mibs - Cleanup names ( #14323 ) - PipoCanaja Enable more checks ( #14318 ) - Jellyfrog Do not include _token in legacy vars ( #14313 ) - murrant Don't include null os when loading defs ( #14312 ) - murrant 2fa not all routes have names ( #14311 ) - murrant Cache astext for 1 day ( #14303 ) - murrant Linux distro images require feature field ( #14301 ) - murrant Silence return type mismatch ( #14298 ) - Jellyfrog Fix more percent calculations ( #14294 ) - murrant Fix rounding null in mempools module ( #14290 ) - murrant Check if polling module exists ( #14289 ) - murrant Fix undefined variable ( #14287 ) - murrant Handle connection timed out errors in unix agent ( #14286 ) - murrant Remove unused function ( #14283 ) - murrant Remove reference to unused variable ( #14280 ) - murrant Cleanup some RunAlerts issues ( #14274 ) - murrant Fix a bunch of \"Since fakerphp/faker 1.14: Accessing property..\" ( #14267 ) - Jellyfrog Fix more error exceptions ( #14266 ) - Jellyfrog Fix hrStorageType being undefined ( #14260 ) - Jellyfrog Misc errors cleanup ( #14257 ) - Jellyfrog Fix ipv6 hexdec error ( #14254 ) - murrant Use empty string instead of null for routes ( #14247 ) - Jellyfrog Sort device types alphabetically ( #14244 ) - VirTechSystems Misc webui code cleanups ( #14242 ) - murrant Fix some ErrorExceptions ( #14241 ) - Jellyfrog Fix os_group unset errors ( #14238 ) - murrant Juniper bgp-peers cleanup ( #14236 ) - murrant Percentage calculation helper ( #14235 ) - murrant Memcached app undefined vars ( #14225 ) - Npeca75 Fix Undefined variable/key warnings ( #14134 ) - murrant Remove mib poller module remnants ( #14077 ) - murrant Remove traceroute6, it is unused ( #14019 ) - murrant Remove DefaultWidgetSeeder ( #14006 ) - murrant Better device:add error output ( #13913 ) - murrant Remove non-working Dell specific alert rules from the collection ( #13706 ) - Fehler12","title":"Cleanup"},{"location":"General/Changelog/#documentation_12","text":"Fix typo in lnms device:add help ( #14937 ) - arjenz Add Azure example configuration for SAML authentication in documentation ( #14870 ) - fbouynot Fix Okta image in docs ( #14848 ) - westerterp Change socialite settings URI ( #14845 ) - fbouynot Fix possible confusion around php-fpm settings ( #14844 ) - hanserasmus Use docker compose v2 ( #14841 ) - MarlinMr Fix typo in Oauth doc ( #14840 ) - fbouynot Add Zenduty Integration info to Transports.md docs ( #14826 ) - zenbeam Update config docs - dump current config ( #14820 ) - hanserasmus Add SELinux instructions for nginx monitoring ( #14812 ) - fbouynot Add SELinux instructions for systemd monitoring ( #14809 ) - fbouynot Add SELinux instructions for systemd monitoring ( #14806 ) - fbouynot Debian 11 Sury DPA provides PHP 8.2 ( #14798 ) - tim427 Update Syslog.md ( #14794 ) - systeembeheerder Update Authentication.md ( #14788 ) - trs80 Fix Doc Link for Canopsis transport ( #14778 ) - support-capensis Update ElasticSearch Index pattern for php 8.1 changes ( #14775 ) - zeroservices Install updates for Rocky8 ( #14722 ) - angeletdemon Updating certificate script documentation ( #14721 ) - bnerickson Update Docker.md with proper path to unzipped files ( #14717 ) - alchemyx Fix typo: purge-port.php file name ( #14712 ) - santiag0z Alert template example uses incorrect variable ( #14683 ) - electrocret Correct squid snmpd.conf proxy host syntax ( #14678 ) - hugalafutro Fix Traceroute debug alert template snippet ( #14668 ) - electrocret Update Dispatcher docs for Debian and for non /opt/librenms installation ( #14663 ) - koocotte Fix Location mapping docs ( #14644 ) - electrocret Update config name for the default device display ( #14641 ) - cfitzw Update Dispatcher-Service.md ( #14632 ) - systeembeheerder Updating postgres application documentation ( #14627 ) - bnerickson Documentation for Observium Migration ( #14601 ) - LoveSkylark Add snmp_flags and tips on string oids to the docs ( #14579 ) - murrant Clarify Dispatcher-Service.md for systemd ( #14575 ) - fuzzbawl Update license section of readme ( #14571 ) - otkd Remove outdated rules videos ( #14505 ) - kiwibrew Docker quick install ( #14475 ) - murrant Updating details of my LibreNMS install ( #14458 ) - SirMaple Fix php7.2 occurence in Performance.md documentation ( #14394 ) - fbouynot Fix documentation for php8.1 and bad package name ( #14393 ) - fbouynot Move list_locations from devices to locations ( #14328 ) - bp0 Cisco-sla module was renamed to slas ( #14288 ) - murrant Update docs around APP_URL ( #14282 ) - murrant Update to mkdocs-material 8.3.9 ( #14189 ) - Jellyfrog SNMP extend / fix mdadm documentation ( #14186 ) - Npeca75 Update index.md ( #14178 ) - Jarod2801 Add instructions for PHP 8.1 and Ubuntu 22.04 ( #14166 ) - Jellyfrog Update php installation instruction for CentOS 8 to reflect the minim\u2026 ( #14159 ) - fbouynot Fix typo in Smokeping SELinux documentation ( #14155 ) - fbouynot Add device_default_display info ( #14151 ) - murrant Change SELinux context for logs ( #14128 ) - fbouynot Small documentation typos ( #14101 ) - wrongecho Documentation typos ( #14099 ) - wrongecho Add SELinux configuration for SNMPd on Centos8 in the documentation ( #14095 ) - fbouynot Add SELinux configuration for LDAP/AD authentication on Centos8 in the documentation ( #14094 ) - fbouynot Add SELinux configuration for Smokeping on Centos8 in the documentation ( #14093 ) - fbouynot Add SELinux configuration for RRDCached on Centos8 in the documentation ( #14092 ) - fbouynot Corrected API devicegroup curl creation examples ( #14081 ) - rhinoau Minor grammar fixes in doc ( #14078 ) - paulgear Add documentation for Chrony application monitoring ( #14066 ) - ottorei Okta saml ( #14038 ) - bile0026 HPE Comware snmp config example ( #13997 ) - murrant Fix typo in dispatcher service doc ( #13979 ) - booth-f Fix a typo in alerting doc ( #13970 ) - twelch24 DOCS, switch to dark or light mode ( #13953 ) - santiag0z Assorted cleanups to alerting docs, primarily to make mdl happier ( #13950 ) - VVelox Update test doc making it more mdl happy and add a section on writing JSON app tests ( #13949 ) - VVelox Docs, fix code block in oxidized group ( #13908 ) - santiag0z [DOC] Fix Code blocks Step 2 Installing Network-WeatherMap ( #13905 ) - santiag0z [DOC] Styling the .env word quote ( #13889 ) - santiag0z Docs, fix Linux SNMP example only listening on ::1 ( #13882 ) - murrant Script that describes how to migrate traffic bills from observium. ( #13757 ) - manonfgoo","title":"Documentation"},{"location":"General/Changelog/#translation_3","text":"Update zh-TW.json ( #14765 ) - jasoncheng7115 Create files with Traditional Chinese translation ( #14764 ) - jasoncheng7115 Fix Typo in Settings ( #14443 ) - electrocret Serbian translation, part3 ( #14205 ) - Npeca75 More Serbian translation ( #14181 ) - Npeca75 Enable translation on Eventlog & Component-status widgets ( #14180 ) - Npeca75 Initial support for Serbian language ( #14165 ) - Npeca75 Enable translation in 3 Alert widget ( #14164 ) - Npeca75 Few more updates to Ita lang ( #14091 ) - ppasserini Italian language update ( #14085 ) - ppasserini Adjustments to german translation ( #14083 ) - mwobst Small Italian lang update ( #13960 ) - ppasserini Ukrainian translation update ( #13933 ) - p4k8 Few more language (ITA) updates ( #13890 ) - ppasserini","title":"Translation"},{"location":"General/Changelog/#tests_5","text":"Re-throw exceptions if we're in CI ( #14890 ) - Jellyfrog Adding certificate application tests ( #14708 ) - bnerickson Mock astext ( #14581 ) - murrant Github tests log improvement ( #14559 ) - murrant Improve trap testing ( #14546 ) - murrant Remove unused phpstan tests ( #14503 ) - Jellyfrog Speed up tests ( #14421 ) - murrant Fix cisco-pw test capture ( #14415 ) - murrant Test supported PHP versions only ( #14389 ) - murrant Run CI on ubuntu 22.04 ( #14379 ) - Jellyfrog Do not allow sysDescr to be fetched in os module yaml ( #14331 ) - murrant Remove PHP version constraint ( #14314 ) - Jellyfrog Lnms dev:simulate check simulated device exists ( #14243 ) - murrant Save-test-data to refresh all variants of an OS ( #14231 ) - PipoCanaja Allow save-test-data.php to run all modules explicitely ( #14212 ) - PipoCanaja Increase OS detection time, sometimes it is not ready by 5s ( #14133 ) - murrant Test PHP 8.1 ( #14109 ) - murrant Fix tests failing when device with IP 127.1.6.1 exists ( #14016 ) - murrant PHP8 phpstan fix ( #13843 ) - murrant Fix tests for MariaDB > 10.5.15 ( #13829 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#misc_9","text":"Reorder check_icmp command to follow documented usage ( #14910 ) - mtentilucci Add multi-PR GitHub-apply ( #14875 ) - electrocret Use Device displayname on VRF page ( #14851 ) - electrocret Fix empty output on validation test ( #14822 ) - hanserasmus Allows GEO lookup with detailed internal Location information wrapped inside parentheses. ( #14799 ) - LoveSkylark Add MAC OUI caching when code updates are disabled ( #14713 ) - gdepeyrot New schema dump ( #14630 ) - Jellyfrog Add check_hetzner_storagebox to includes/services ( #14463 ) - SirMaple Add instance id to error reports ( #14444 ) - murrant Update ports_purge docs and definitions ( #14402 ) - KayckMatias Added Ubuntu and Raspbian to ifAlias script ( #14399 ) - tim427 Defer loading cli option values ( #14354 ) - murrant Allow dumping of errors and warnings ( #14275 ) - murrant Allow reapply yaml config via env ( #14100 ) - murrant Lnms scan respect -q parameter ( #14027 ) - murrant Improve lnms shortcut validation ( #13982 ) - murrant","title":"Misc"},{"location":"General/Changelog/#internal-features_6","text":"Number Casting allow preceding space ( #14699 ) - murrant DeviceCache::get() allow hostname ( #14649 ) - murrant Improve SnmpResponse value() ( #14605 ) - murrant SnmpQuery numeric accept a boolean ( #14565 ) - murrant Support regex in os field replace ( #14563 ) - murrant More Replacement Capabilities for sensor index computation ( #14522 ) - PipoCanaja Ignore CommandNotFoundException from reporting ( #14342 ) - Jellyfrog Allow SnmpQuery to optionally abort walks if one fails ( #14255 ) - murrant","title":"Internal Features"},{"location":"General/Changelog/#mibs_6","text":"Add CISCO-ENTITY-ALARM-MIB file ( #14754 ) - bonzo81 Update Nokia MIBs to release R22.2 ( #14734 ) - peelman More MIB fixing ( #14018 ) - Jellyfrog Update MIBs ( #14017 ) - Jellyfrog Updated existing Siemens MIBs and added trap MIB ( #13986 ) - SanderBlom","title":"Mibs"},{"location":"General/Changelog/#dependencies_10","text":"PHP dependency update ( #14927 ) - murrant Bump phpseclib/phpseclib from 3.0.18 to 3.0.19 ( #14903 ) - dependabot Bump webpack from 5.66.0 to 5.76.1 ( #14901 ) - dependabot Bump symfony/http-kernel from 5.4.16 to 5.4.20 ( #14824 ) - dependabot Bump json5 from 1.0.1 to 1.0.2 ( #14774 ) - dependabot Update PHP dependencies (fix dependencies on PHP 8.2) ( #14759 ) - murrant Bump qs and express ( #14705 ) - dependabot Bump loader-utils from 1.4.0 to 1.4.2 ( #14628 ) - dependabot Increase minimum version to PHP 8.1 ( #14378 ) - murrant Update dependencies ( #14319 ) - murrant Bump php-cs-fixer to 3.4.0 ( #14224 ) - murrant Bump terser from 4.8.0 to 4.8.1 ( #14123 ) - dependabot Bump guzzlehttp/guzzle from 7.4.4 to 7.4.5 ( #14059 ) - dependabot Update Larastan ( #14031 ) - murrant Update PHP dependencies ( #14028 ) - murrant Bump guzzlehttp/guzzle from 7.4.3 to 7.4.4 ( #14025 ) - dependabot Bump guzzlehttp/guzzle from 7.4.1 to 7.4.3 ( #13994 ) - dependabot Bump async from 2.6.3 to 2.6.4 ( #13947 ) - dependabot Bump composer/composer from 2.2.4 to 2.3.5 ( #13944 ) - dependabot Bump guzzlehttp/psr7 from 2.1.0 to 2.2.1 ( #13879 ) - dependabot Bump jpgraph version to 4 ( #13875 ) - ottorei Bump node-forge from 1.2.1 to 1.3.0 ( #13869 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2320","text":"(2023-02-23) A big thank you to the following 20 contributors this last month: electrocret (5) fbouynot (5) hanserasmus (3) VVelox (3) guipoletto (1) westerterp (1) goebelmeier (1) MarlinMr (1) florisvdk (1) kylegordon (1) zenbeam (1) dependabot (1) gilrim (1) murrant (1) noaheroufus (1) AleksNovak (1) tristanbob (1) tim427 (1) PipoCanaja (1) bonzo81 (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (22) murrant (9) ottorei (4) crazy-max (1) VVelox (1) westerterp (1)","title":"23.2.0"},{"location":"General/Changelog/#feature_10","text":"Add display query to list_devices function ( #14747 ) - bonzo81","title":"Feature"},{"location":"General/Changelog/#device_13","text":"Fortigate IPS Intrusions detected stats ( #14857 ) - electrocret Add support for Vsol v1600d EPON OLT ( #14853 ) - guipoletto Fix discovery for apc ats ( #14837 ) - florisvdk Include Samsung X Series printers ( #14831 ) - kylegordon EdgeOS OLT new sensors and changes ( #14807 ) - noaheroufus Update XDP string to exclude modern Cisco lightweight APs from discovery ( #14803 ) - tristanbob Extend filtering of graphs device_bits on cisco ASA ( #14796 ) - PipoCanaja","title":"Device"},{"location":"General/Changelog/#alerting_11","text":"Fix MS Teams alert transport, correct HTTP header ( #14843 ) - goebelmeier Add support for topics ( #14804 ) - AleksNovak","title":"Alerting"},{"location":"General/Changelog/#graphs_9","text":"Update HV::Monitor support to use generic_stats.inc.php ( #14814 ) - VVelox Only show Eth errors when Etherlike is enabled ( #14784 ) - electrocret","title":"Graphs"},{"location":"General/Changelog/#applications_11","text":"Add a few more graphs for CAPEv2 ( #14813 ) - VVelox CAPEv2 support ( #14801 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#api_11","text":"Use Oxidized API client and add support for groups on config get ( #14750 ) - electrocret","title":"Api"},{"location":"General/Changelog/#oxidized_2","text":"Show display name in Oxidized config search ( #14800 ) - electrocret","title":"Oxidized"},{"location":"General/Changelog/#bug_13","text":"Revert \"Fix entity-state polling/discovery\" ( #14811 ) - murrant","title":"Bug"},{"location":"General/Changelog/#documentation_13","text":"Fix Okta image in docs ( #14848 ) - westerterp Change socialite settings URI ( #14845 ) - fbouynot Fix possible confusion around php-fpm settings ( #14844 ) - hanserasmus Use docker compose v2 ( #14841 ) - MarlinMr Fix typo in Oauth doc ( #14840 ) - fbouynot Add Zenduty Integration info to Transports.md docs ( #14826 ) - zenbeam Update config docs - dump current config ( #14820 ) - hanserasmus Add SELinux instructions for nginx monitoring ( #14812 ) - fbouynot Add SELinux instructions for systemd monitoring ( #14809 ) - fbouynot Add SELinux instructions for systemd monitoring ( #14806 ) - fbouynot Debian 11 Sury DPA provides PHP 8.2 ( #14798 ) - tim427","title":"Documentation"},{"location":"General/Changelog/#misc_10","text":"Use Device displayname on VRF page ( #14851 ) - electrocret Fix empty output on validation test ( #14822 ) - hanserasmus","title":"Misc"},{"location":"General/Changelog/#dependencies_11","text":"Bump symfony/http-kernel from 5.4.16 to 5.4.20 ( #14824 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2310","text":"(2023-01-24) A big thank you to the following 19 contributors this last month: electrocret (3) peelman (3) jasoncheng7115 (2) not-known (2) da-me (1) systeembeheerder (1) fdomain (1) jaannnis (1) knpo (1) trs80 (1) MANT5149 (1) LoveSkylark (1) support-capensis (1) zeroservices (1) dependabot (1) dennypage (1) carbinefreak (1) bnerickson (1) Blinq-SanderBlom (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (23) murrant (2) SourceDoctor (1) PipoCanaja (1)","title":"23.1.0"},{"location":"General/Changelog/#device_14","text":"Changed discovery OID in ets.yaml ( #14795 ) - da-me Added Support for SNS-3615-K9 ( #14792 ) - jaannnis Routeros fix lldp discovery on 7.7+ ( #14791 ) - knpo Fix cisco-flash ( #14772 ) - electrocret Eaton matrix wattage fix ( #14770 ) - peelman Add Universal Input Output support for APC ( #14766 ) - dennypage Eltek Enexus; Fix SmartpackS divisor and hardware discovery ( #14762 ) - peelman Nokia PMC Microwave Improvements ( #14761 ) - carbinefreak Add AXOS sensor data for PON Transceivers (the only transceivers Cali\u2026 ( #14741 ) - peelman Adding discovery of LSI MegaRAID Device Media Errors, Other Errors, a\u2026 ( #14729 ) - bnerickson Stop net-snmp from interpreting the octet-string from rttMonEchoAdmin\u2026 ( #14676 ) - not-known Add state of the Fortigate link monitor health checks ( #14675 ) - not-known Adding support for loop-telecom devices ( #14674 ) - Blinq-SanderBlom","title":"Device"},{"location":"General/Changelog/#oxidized_3","text":"Adding Fortigate switches to Oxidized model mapping config ( #14782 ) - LoveSkylark","title":"Oxidized"},{"location":"General/Changelog/#bug_14","text":"Fix entity-state polling/discovery ( #14793 ) - fdomain Update PingCheck.php to remove duplicate \"Device status changed to ... from icmp check.\" event ( #14785 ) - MANT5149 Fix calculated dbm ( #14771 ) - electrocret","title":"Bug"},{"location":"General/Changelog/#documentation_14","text":"Update Syslog.md ( #14794 ) - systeembeheerder Update Authentication.md ( #14788 ) - trs80 Fix Doc Link for Canopsis transport ( #14778 ) - support-capensis Update ElasticSearch Index pattern for php 8.1 changes ( #14775 ) - zeroservices","title":"Documentation"},{"location":"General/Changelog/#translation_4","text":"Update zh-TW.json ( #14765 ) - jasoncheng7115 Create files with Traditional Chinese translation ( #14764 ) - jasoncheng7115","title":"Translation"},{"location":"General/Changelog/#misc_11","text":"Use displayname instead of hostname for Device Maintenance Modal Title ( #14681 ) - electrocret","title":"Misc"},{"location":"General/Changelog/#dependencies_12","text":"Bump json5 from 1.0.1 to 1.0.2 ( #14774 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#22120","text":"(2022-12-28) A big thank you to the following 21 contributors this last month: murrant (10) electrocret (4) bnerickson (4) peelman (2) bonzo81 (2) gdepeyrot (2) bogdanrotariu (2) TheMysteriousX (2) LoveSkylark (1) fcqpl (1) angeletdemon (1) alchemyx (1) rinsekloek (1) SantiagoSilvaZ (1) dependabot (1) gewuerfelt (1) tuxgasy (1) hugalafutro (1) nightcore500 (1) mrwold (1) rhinoau (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (15) murrant (14) PipoCanaja (3) ottorei (3) SeeMyPing (1)","title":"22.12.0"},{"location":"General/Changelog/#feature_11","text":"Pre-Install settings ( #13906 ) - murrant","title":"Feature"},{"location":"General/Changelog/#device_15","text":"Additional sensors ( #14756 ) - peelman Update fs-nmu.inc.php ( #14702 ) - gewuerfelt Support Huawei SMU02B ( #14673 ) - nightcore500 Use 'counter' RRD type for some TrueNAS sensors ( #14670 ) - TheMysteriousX Device - Add support for \"Smartpack R\" ( #14665 ) - mrwold Added Moxa switching ifAlias/portName mapping ( #14633 ) - rhinoau","title":"Device"},{"location":"General/Changelog/#webui_12","text":"Fix port speed setting feedback ( #14743 ) - murrant Fix Cimc on Overview ( #14727 ) - electrocret Search devices also in display ( #14714 ) - gdepeyrot Fix check rrd file exists with remote rrdcached ( #14690 ) - tuxgasy","title":"Webui"},{"location":"General/Changelog/#alerting_12","text":"Adding sample alert for systemd application ( #14711 ) - bnerickson Polling poller debug ( #14691 ) - electrocret Add -I flag to Traceroute cmd ( #14667 ) - electrocret","title":"Alerting"},{"location":"General/Changelog/#graphs_10","text":"Fix graph output base64 ( #14701 ) - murrant Fix some graphs not respecting device display name ( #14684 ) - murrant Adding Average into graphs ( #14679 ) - bogdanrotariu","title":"Graphs"},{"location":"General/Changelog/#applications_12","text":"Update Nvidia application - values in wrong charts ( #14736 ) - fcqpl Removing max polling restriction for wireguard traffic RRD data ( #14710 ) - bnerickson","title":"Applications"},{"location":"General/Changelog/#api_12","text":"Fix for RIPE NCC API Tools ( #14757 ) - LoveSkylark API list_devices update with sysName, location_id and type ( #14731 ) - bonzo81","title":"Api"},{"location":"General/Changelog/#discovery_9","text":"Prevent spurious MAC changes on multi-interface devices ( #14671 ) - TheMysteriousX","title":"Discovery"},{"location":"General/Changelog/#polling_8","text":"Fix ArubaInstance channel decode issue ( #14732 ) - murrant","title":"Polling"},{"location":"General/Changelog/#refactor_6","text":"Unify time interval formatting ( #14733 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#documentation_15","text":"Install updates for Rocky8 ( #14722 ) - angeletdemon Updating certificate script documentation ( #14721 ) - bnerickson Update Docker.md with proper path to unzipped files ( #14717 ) - alchemyx Fix typo: purge-port.php file name ( #14712 ) - SantiagoSilvaZ Alert template example uses incorrect variable ( #14683 ) - electrocret Correct squid snmpd.conf proxy host syntax ( #14678 ) - hugalafutro","title":"Documentation"},{"location":"General/Changelog/#tests_6","text":"Adding certificate application tests ( #14708 ) - bnerickson","title":"Tests"},{"location":"General/Changelog/#misc_12","text":"Add MAC OUI caching when code updates are disabled ( #14713 ) - gdepeyrot","title":"Misc"},{"location":"General/Changelog/#internal-features_7","text":"Number Casting allow preceding space ( #14699 ) - murrant Improve SnmpResponse value() ( #14605 ) - murrant","title":"Internal Features"},{"location":"General/Changelog/#mibs_7","text":"Add CISCO-ENTITY-ALARM-MIB file ( #14754 ) - bonzo81 Update Nokia MIBs to release R22.2 ( #14734 ) - peelman","title":"Mibs"},{"location":"General/Changelog/#dependencies_13","text":"Update PHP dependencies (fix dependencies on PHP 8.2) ( #14759 ) - murrant Bump qs and express ( #14705 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#22110","text":"(2022-11-24) A big thank you to the following 40 contributors this last month: murrant (52) Jellyfrog (23) PipoCanaja (9) bnerickson (5) electrocret (4) SourceDoctor (4) noaheroufus (3) rhinoau (3) mabra94 (2) fcqpl (2) kimhaak (2) SantiagoSilvaZ (2) fbouynot (2) opalivan (2) mprins-RAM (2) VVelox (2) koocotte (1) VoipTelCH (1) cfitzw (1) systeembeheerder (1) dependabot (1) jaaruizgu (1) pertruccio (1) josh-silvas (1) ianhodgson (1) LoveSkylark (1) talkstraightuk (1) fufroma (1) fuzzbawl (1) otkd (1) kiwibrew (1) luc-ass (1) andrekeller (1) geg347 (1) Olen (1) Frazew (1) SirMaple (1) westerterp (1) squidly (1) Bierchermuesli (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (53) murrant (44) PipoCanaja (15) ottorei (1) VVelox (1) SantiagoSilvaZ (1) fbouynot (1)","title":"22.11.0"},{"location":"General/Changelog/#feature_12","text":"Split out lnms snmp convenience commands ( #14603 ) - murrant Add --forgot-key to key:rotate command ( #14495 ) - murrant","title":"Feature"},{"location":"General/Changelog/#security_8","text":"Fix Service Template XSS ( #14659 ) - murrant Fix neighbours XSS ( #14658 ) - murrant Fix SNMP trap -> Eventlog XSS ( #14657 ) - murrant Fix XSS in api access ( #14551 ) - murrant XSS sanitize pwrstatd application script inputs ( #14545 ) - bnerickson","title":"Security"},{"location":"General/Changelog/#device_16","text":"Added divisor to SAF Integra-X temp sensors ( #14655 ) - noaheroufus Corrected ICT MPS hardware detection ( #14654 ) - noaheroufus Adjusted PMP to accomodate various other 450 models. ( #14652 ) - noaheroufus Added support for Eltek Micropack 1U ( #14645 ) - fcqpl Added support for Eltek Flatpack S ( #14643 ) - fcqpl Improve VRP power display ( #14624 ) - PipoCanaja Edgeos picked up as generic device ( #14612 ) - ianhodgson Added Moxa EDS-G516E optical sensors ( #14610 ) - rhinoau Fix eNexus total current for Smartpack S ( #14606 ) - murrant Disable SNMP Bulk for Delta UPS devices ( #14599 ) - fufroma Improved AIX os information collection ( #14595 ) - murrant More inclusive Cisco SB os detection ( #14594 ) - murrant IP Infusion OcNOS basic detection ( #14588 ) - murrant Fix APC current divide by zero ( #14578 ) - murrant Extend EfficientIP SolidServer support ( #14549 ) - PipoCanaja TAIT-Infra93 - Fix state + skip_values for Battery ( #14541 ) - opalivan Timos - Improve SAP stats graphing ( #14534 ) - mabra94 McAfee Web Proxy with COUNTER rrd_type on sensors ( #14529 ) - PipoCanaja Fix 'bke.yaml' discovery file ( #14524 ) - PipoCanaja Added support for additional Moxa EDS-P model ( #14523 ) - rhinoau Fix awplus ntp polling bug ( #14521 ) - murrant Add discovery support for Riedo Networks UPDU ( #14496 ) - andrekeller Use correct description oid ( #14489 ) - Jellyfrog Correct upsBypassVoltage oid ( #14488 ) - Jellyfrog Correct variable typo ( #14486 ) - Jellyfrog Hpe ilo: fix filesystem type regex ( #14485 ) - Jellyfrog Added Fortigate SD-WAN Health checks ( #14456 ) - mprins-RAM Dont include empty storage sensor ( #14453 ) - Jellyfrog Remove undefined sensors ( #14449 ) - Jellyfrog Use correct low warn limit variable ( #14447 ) - Jellyfrog Fortinet FortiADC detection and basic statistics ( #14434 ) - westerterp Device - Add support for Vultan Environmental Monitoring units ( #14401 ) - squidly Device - Basic hatteras dslam integration ( #14115 ) - Bierchermuesli","title":"Device"},{"location":"General/Changelog/#webui_13","text":"Remove ungrouped devices panel ( #14664 ) - murrant Custom port view fix ( #14637 ) - SourceDoctor Fix billing graph divide by zero when the period is zero or doesn't exist ( #14623 ) - jaaruizgu Fix port neighbors missing ( #14586 ) - murrant Fix some icons ( #14584 ) - murrant [About] Open Laravel and RRDtool link in new tab ( #14568 ) - SantiagoSilvaZ [About] Open the contributor list link in a new tab ( #14553 ) - SantiagoSilvaZ Fix v2 plugins ( #14506 ) - murrant Check if service_name is empty or equal to service_type ( #14499 ) - luc-ass Show id on device dependencies ( #14497 ) - SourceDoctor Userlist description fix ( #14482 ) - mprins-RAM Sort alert transport by name ( #14464 ) - SourceDoctor","title":"Webui"},{"location":"General/Changelog/#graphs_11","text":"Fix device poller modules graph ( #14640 ) - murrant Bug - XDSL module - rrd_def and rrd file definition issue for Actual rate ( #14597 ) - PipoCanaja Fix graph errors wrong content type ( #14574 ) - murrant Improve graph embedded title handling ( #14544 ) - murrant Graphing cleanup ( #14492 ) - murrant","title":"Graphs"},{"location":"General/Changelog/#snmp-traps_1","text":"Adds Cisco DHCP Server SNMP MIB and Trap Handlers. ( #14618 ) - josh-silvas","title":"Snmp Traps"},{"location":"General/Changelog/#applications_13","text":"Alarm Flag on UPS-Nut Application ( #14635 ) - SourceDoctor Adding wireguard app to the apps overview page ( #14629 ) - bnerickson Adding wireguard application support ( #14625 ) - bnerickson Adding systemd service status application ( #14540 ) - bnerickson Memcached application: improve error visibility ( #14536 ) - murrant Fix memcached polling bug ( #14501 ) - murrant Add HV Monitor, a generic means for monitoring hypvervisors ( #14218 ) - VVelox Base64 gzip compression support for json_app_get ( #14169 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#api_13","text":"Port search API search more than one fields ( #14646 ) - murrant Added disable_notify and location_id ( #14619 ) - pertruccio Add sortorder parameter to list_logs ( #14600 ) - talkstraightuk API restore ability to update purpose and override_sysLocation ( #14596 ) - murrant API graphs, variable whitelist ( #14552 ) - murrant Graph API use new code path ( #14493 ) - murrant Adding device's field in get_alert_rule and list-alert-rules API function (new) ( #14481 ) - geg347 Fix update_device hostname handling #14435 ( #14448 ) - rhinoau Add Columns to search_ports API function ( #14348 ) - electrocret","title":"Api"},{"location":"General/Changelog/#discovery_10","text":"Fix discovery ignores custom ipmi port ( #14660 ) - VoipTelCH Sensors - Allow changing RRD type in YAML and PHP sensor discovery ( #14208 ) - PipoCanaja","title":"Discovery"},{"location":"General/Changelog/#polling_9","text":"Don't poll sysDescr, sysObjectID, and sysName so frequently ( #14562 ) - murrant Add connection exception handling to all redis calls ( #14467 ) - Frazew","title":"Polling"},{"location":"General/Changelog/#authentication_6","text":"Update Radius auth to accept permissions attributes ( #14531 ) - kimhaak","title":"Authentication"},{"location":"General/Changelog/#bug_15","text":"Handle Division by 0 error for SvcFdbTableSize ( #14672 ) - mabra94 Fix sqlite test ( #14642 ) - murrant Remove extends and hardware detection support ( #14626 ) - murrant Set 0 as integer in loading of graylog. ( #14621 ) - kimhaak Fix GeocodingHelper type-hinting ( #14604 ) - Jellyfrog Bug in Ciscowlc AP graphs definition ( #14585 ) - PipoCanaja SnmpQuery fix mib directory order ( #14580 ) - murrant SnmpQuery Handle empty oids in get more gracefully ( #14577 ) - murrant Fix PTOPO mib in module discovery-protocols ( #14564 ) - PipoCanaja Fix Type error ( #14555 ) - fbouynot Correct variable use in billing ( #14533 ) - Jellyfrog Fix sensor limit linked port rules in collection ( #14520 ) - electrocret EES Rectifier various fixes from MIB + added tests ( #14519 ) - opalivan Fix fetch ifEntry logic ( #14483 ) - Jellyfrog Add a few breaks to avoid connection flooding for the irc-bot ( #14479 ) - Olen","title":"Bug"},{"location":"General/Changelog/#refactor_7","text":"Remove Log::event ( #14526 ) - Jellyfrog","title":"Refactor"},{"location":"General/Changelog/#cleanup_9","text":"Fix snmp_disable type ( #14650 ) - murrant Consolidate and improve snmptranslate usage ( #14567 ) - murrant Remove graph_min ( #14561 ) - murrant Remove $_GET from graphs ( #14554 ) - murrant Undefined array key fixes ( #14532 ) - Jellyfrog Use Collection instead of collect() ( #14527 ) - Jellyfrog Convert string references to ::class ( #14508 ) - Jellyfrog Miscellaneous cleanup - part 5 ( #14502 ) - Jellyfrog Type API methods and properties ( #14476 ) - fbouynot Miscellaneous cleanup - part 4 ( #14452 ) - Jellyfrog Miscellaneous cleanup - part 3 ( #14450 ) - Jellyfrog Miscellaneous cleanup, mostly undefined variables - part2 ( #14445 ) - Jellyfrog","title":"Cleanup"},{"location":"General/Changelog/#documentation_16","text":"Fix Traceroute debug alert template snippet ( #14668 ) - electrocret Update Dispatcher docs for Debian and for non /opt/librenms installation ( #14663 ) - koocotte Fix Location mapping docs ( #14644 ) - electrocret Update config name for the default device display ( #14641 ) - cfitzw Update Dispatcher-Service.md ( #14632 ) - systeembeheerder Updating postgres application documentation ( #14627 ) - bnerickson Documentation for Observium Migration ( #14601 ) - LoveSkylark Add snmp_flags and tips on string oids to the docs ( #14579 ) - murrant Clarify Dispatcher-Service.md for systemd ( #14575 ) - fuzzbawl Update license section of readme ( #14571 ) - otkd Remove outdated rules videos ( #14505 ) - kiwibrew Docker quick install ( #14475 ) - murrant","title":"Documentation"},{"location":"General/Changelog/#tests_7","text":"Mock astext ( #14581 ) - murrant Github tests log improvement ( #14559 ) - murrant Improve trap testing ( #14546 ) - murrant Remove unused phpstan tests ( #14503 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#misc_13","text":"New schema dump ( #14630 ) - Jellyfrog Add check_hetzner_storagebox to includes/services ( #14463 ) - SirMaple Add instance id to error reports ( #14444 ) - murrant","title":"Misc"},{"location":"General/Changelog/#internal-features_8","text":"DeviceCache::get() allow hostname ( #14649 ) - murrant SnmpQuery numeric accept a boolean ( #14565 ) - murrant Support regex in os field replace ( #14563 ) - murrant More Replacement Capabilities for sensor index computation ( #14522 ) - PipoCanaja","title":"Internal Features"},{"location":"General/Changelog/#dependencies_14","text":"Bump loader-utils from 1.4.0 to 1.4.2 ( #14628 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#22100","text":"(2022-10-17) A big thank you to the following 22 contributors this last month: murrant (29) Jellyfrog (8) KayckMatias (4) Martin22 (3) PipoCanaja (3) fbouynot (3) electrocret (2) ottorei (1) SirMaple (1) carbinefreak (1) opalivan (1) luc-ass (1) jgelinas (1) mpikzink (1) rhinoau (1) tim427 (1) daniel-franca (1) sashashura (1) tuomari (1) kimhaak (1) bnerickson (1) loopodoopo (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (20) murrant (16) PipoCanaja (11) ottorei (3) VVelox (2) SantiagoSilvaZ (1)","title":"22.10.0"},{"location":"General/Changelog/#security_9","text":"Block disabled user session auth ( #14473 ) - murrant Fix group delete xss ( #14472 ) - murrant Fix alert rules XSS ( #14471 ) - murrant Fix xss in browser push transport ( #14470 ) - murrant Fix users xss ( #14469 ) - murrant Fix user mass assignment vulnerability ( #14468 ) - murrant Fix billing xss ( #14465 ) - murrant Fix memcached unserialize vulnerability ( #14459 ) - murrant Fix possible RSS XSS ( #14457 ) - murrant GitHub Workflows security hardening ( #14388 ) - sashashura","title":"Security"},{"location":"General/Changelog/#device_17","text":"Correct aviatModemCurModulationRx oid ( #14446 ) - Jellyfrog MNI Microwave OS Add ( #14427 ) - carbinefreak Add OS tait-tnadmin for TN9300 ( #14413 ) - opalivan Skip empty drac state sensors ( #14409 ) - jgelinas Added support for additional Moxa EDS-G models ( #14405 ) - rhinoau Issue samsung printer m4080 fx ( #14391 ) - daniel-franca Enexus system output current fix ( #14324 ) - loopodoopo Routeros - Fix displaying distance in charts ( #14300 ) - Martin22 Added support for Ubiquiti UFiber OLT ( #14256 ) - Martin22","title":"Device"},{"location":"General/Changelog/#webui_14","text":"Fix missing device_id from device alert logs ( #14460 ) - ottorei Fix about date display ( #14442 ) - murrant Fix pseudowires pages ( #14441 ) - murrant Enhanced Service Overview on Device Overview Page ( #14410 ) - luc-ass Disable plugins that have errors ( #14383 ) - murrant Fix Inventory table for Dark theme ( #14377 ) - electrocret Add initselect2 to locations ports ( #14375 ) - KayckMatias Update devices filter in alert-logs to init_select2 ( #14361 ) - KayckMatias","title":"Webui"},{"location":"General/Changelog/#alerting_13","text":"Alert map location fix ( #14380 ) - KayckMatias Populate the alert rule field with the builder json ( #14374 ) - murrant","title":"Alerting"},{"location":"General/Changelog/#snmp-traps_2","text":"Improve LinkUp and LinkDown trap handling incomplete traps ( #14385 ) - tuomari","title":"Snmp Traps"},{"location":"General/Changelog/#applications_14","text":"Add pwrstatd application ( #14365 ) - bnerickson","title":"Applications"},{"location":"General/Changelog/#api_14","text":"Fix port search with slashes ( #14403 ) - murrant","title":"Api"},{"location":"General/Changelog/#discovery_11","text":"Cisco NAC fix ( #14440 ) - murrant","title":"Discovery"},{"location":"General/Changelog/#polling_10","text":"Fix bgp-peers bgpPeerIface bug and update test data ( #14420 ) - murrant","title":"Polling"},{"location":"General/Changelog/#oxidized_4","text":"Fix oxidized web requests unclosed connections or responding fast enough ( #14370 ) - fbouynot","title":"Oxidized"},{"location":"General/Changelog/#authentication_7","text":"Rework socialite integration ( #14367 ) - Jellyfrog","title":"Authentication"},{"location":"General/Changelog/#bug_16","text":"Snmpwalk functions: dont include invalid data ( #14438 ) - Jellyfrog Fix VRP duplicate BGP Peers ( #14431 ) - PipoCanaja Version and git helper improvements ( #14412 ) - murrant Cache version data ( #14404 ) - murrant Fix rpi codec state sensor ( #14400 ) - murrant Fix libvirt count() uncountable error ( #14398 ) - murrant Fix Firebrick local ASN ( #14397 ) - murrant Fix ups nut PHP 8 issue ( #14392 ) - murrant","title":"Bug"},{"location":"General/Changelog/#refactor_8","text":"Fix a few Db* to Eloquent requests ( #14278 ) - PipoCanaja","title":"Refactor"},{"location":"General/Changelog/#cleanup_10","text":"Remove tabs from yaml ( #14437 ) - Jellyfrog Miscellaneous fixes, mostly undefined variables ( #14432 ) - Jellyfrog Trim whitespaces from device data ( #14429 ) - Jellyfrog Fix bgp_peer array_merge error ( #14416 ) - PipoCanaja","title":"Cleanup"},{"location":"General/Changelog/#documentation_17","text":"Updating details of my LibreNMS install ( #14458 ) - SirMaple Fix php7.2 occurence in Performance.md documentation ( #14394 ) - fbouynot Fix documentation for php8.1 and bad package name ( #14393 ) - fbouynot","title":"Documentation"},{"location":"General/Changelog/#translation_5","text":"Fix Typo in Settings ( #14443 ) - electrocret","title":"Translation"},{"location":"General/Changelog/#tests_8","text":"Speed up tests ( #14421 ) - murrant Fix cisco-pw test capture ( #14415 ) - murrant Test supported PHP versions only ( #14389 ) - murrant Run CI on ubuntu 22.04 ( #14379 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#misc_14","text":"Update ports_purge docs and definitions ( #14402 ) - KayckMatias Added Ubuntu and Raspbian to ifAlias script ( #14399 ) - tim427","title":"Misc"},{"location":"General/Changelog/#dependencies_15","text":"Increase minimum version to PHP 8.1 ( #14378 ) - murrant","title":"Dependencies"},{"location":"General/Changelog/#2290","text":"(2022-09-21) A big thank you to the following 19 contributors this last month: murrant (53) Jellyfrog (17) PipoCanaja (7) fbouynot (6) bp0 (3) Npeca75 (2) sembeek (1) huntr-helper (1) KayckMatias (1) LoveSkylark (1) quentinsch (1) loopodoopo (1) electrocret (1) Martin22 (1) luc-ass (1) ktims (1) VirTechSystems (1) tim427 (1) mwobst (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (43) murrant (39) PipoCanaja (9) ottorei (4) SourceDoctor (1)","title":"22.9.0"},{"location":"General/Changelog/#feature_13","text":"Improved Modern Modules ( #14315 ) - murrant Add @signedGraphTag() and @signedGraphUrl() blade directives ( #14269 ) - murrant Device settings: attempt to open related tab ( #14250 ) - murrant Error reporting ( #14190 ) - Jellyfrog","title":"Feature"},{"location":"General/Changelog/#security_10","text":"Fix scheduled maintenance xss ( #14360 ) - murrant Add huntr.dev to SECURITY.md ( #14359 ) - huntr-helper","title":"Security"},{"location":"General/Changelog/#device_18","text":"Added status checks for (BWCC) battery status and condition for onboa\u2026 ( #14349 ) - quentinsch UHP VSAT modems ( #14317 ) - loopodoopo Ray2 - Oid repair at ber ( #14302 ) - Martin22 Fix ciena-sds inventory bugs ( #14252 ) - murrant F5 partition ram ( #14226 ) - fbouynot Add Cisco Flash storage support ( #14219 ) - fbouynot","title":"Device"},{"location":"General/Changelog/#webui_15","text":"Load device selection dynamically on Ports page ( #14353 ) - KayckMatias Port pages fixes and cleanups ( #14310 ) - murrant Remove Caffeine ( #14277 ) - murrant Updated brother.svg to make it render in Safari ( #14271 ) - luc-ass Fix for Cisco group device health tab ( #14265 ) - fbouynot Fix dashboard widgets becoming unlocked (especially when using a touchscreen) ( #14222 ) - tim427 Migrate xDSL code to module, and add support for VDSL2 MIB ( #14207 ) - PipoCanaja Improved sorting options for Availability Map ( #14073 ) - mwobst","title":"Webui"},{"location":"General/Changelog/#alerting_14","text":"Discord ability to attach graph images ( #14276 ) - murrant Email Transport: embed graphs by default ( #14270 ) - murrant","title":"Alerting"},{"location":"General/Changelog/#graphs_12","text":"Return GraphImage to include more metadata ( #14307 ) - murrant","title":"Graphs"},{"location":"General/Changelog/#api_15","text":"Allow delete location by id ( #14334 ) - bp0 API update_device, make location field work (as does location_id) ( #14325 ) - bp0","title":"Api"},{"location":"General/Changelog/#polling_11","text":"Fix ping.php skipped results ( #14368 ) - sembeek","title":"Polling"},{"location":"General/Changelog/#oxidized_5","text":"Oxidized \"allow purpose and notes\" ( #14352 ) - LoveSkylark","title":"Oxidized"},{"location":"General/Changelog/#bug_17","text":"Fix cipsec-tunnels ftd bad data causes error ( #14366 ) - murrant Handle null in unix-agent ( #14358 ) - murrant Fix the case of 'Ungrouped' in smokeping integration ( #14351 ) - fbouynot Fix for smokeping integration with ping-only devices ( #14341 ) - fbouynot Match displayname source for graylog ( #14339 ) - fbouynot Check dot1dBasePortIfIndex exists before using it ( #14337 ) - Jellyfrog Prevent errors when hrStorageTable doesn't exist ( #14327 ) - Jellyfrog Revert \"ZTE ZXA10 Update (Added dBm graphs)\" ( #14320 ) - murrant Billing module fix/cleanup ( #14309 ) - electrocret SnmpResponse filterBadLines fix ( #14306 ) - murrant Fix ARP Table on Device overview ( #14304 ) - Npeca75 Disable error reporting when dependencies are outdated ( #14291 ) - murrant Don't send zeros to Graphite for missing metrics ( #14262 ) - ktims Fix removing all port groups ( #14253 ) - murrant Move cronjob time for daily.sh ( #14245 ) - Jellyfrog Firebrick bgp polling was broken ( #14237 ) - murrant Quick fix for cipsec-tunnels Cisco implementation ( #14232 ) - PipoCanaja Fix redeclare of function breaking tests in OS eltex-mes23xx ( #14227 ) - PipoCanaja","title":"Bug"},{"location":"General/Changelog/#refactor_9","text":"Cleanup and optimize the availability widget ( #14329 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#cleanup_11","text":"Defer loading cli option defaults ( #14363 ) - Jellyfrog Remove call to Config from artisan ( #14362 ) - Jellyfrog Mibs - Cleanup names ( #14323 ) - PipoCanaja Enable more checks ( #14318 ) - Jellyfrog Do not include _token in legacy vars ( #14313 ) - murrant Don't include null os when loading defs ( #14312 ) - murrant 2fa not all routes have names ( #14311 ) - murrant Cache astext for 1 day ( #14303 ) - murrant Linux distro images require feature field ( #14301 ) - murrant Silence return type mismatch ( #14298 ) - Jellyfrog Fix more percent calculations ( #14294 ) - murrant Fix rounding null in mempools module ( #14290 ) - murrant Check if polling module exists ( #14289 ) - murrant Fix undefined variable ( #14287 ) - murrant Handle connection timed out errors in unix agent ( #14286 ) - murrant Remove unused function ( #14283 ) - murrant Remove reference to unused variable ( #14280 ) - murrant Cleanup some RunAlerts issues ( #14274 ) - murrant Fix a bunch of \"Since fakerphp/faker 1.14: Accessing property..\" ( #14267 ) - Jellyfrog Fix more error exceptions ( #14266 ) - Jellyfrog Fix hrStorageType being undefined ( #14260 ) - Jellyfrog Misc errors cleanup ( #14257 ) - Jellyfrog Fix ipv6 hexdec error ( #14254 ) - murrant Use empty string instead of null for routes ( #14247 ) - Jellyfrog Sort device types alphabetically ( #14244 ) - VirTechSystems Misc webui code cleanups ( #14242 ) - murrant Fix some ErrorExceptions ( #14241 ) - Jellyfrog Fix os_group unset errors ( #14238 ) - murrant Juniper bgp-peers cleanup ( #14236 ) - murrant Percentage calculation helper ( #14235 ) - murrant Memcached app undefined vars ( #14225 ) - Npeca75 Fix Undefined variable/key warnings ( #14134 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_18","text":"Move list_locations from devices to locations ( #14328 ) - bp0 Cisco-sla module was renamed to slas ( #14288 ) - murrant Update docs around APP_URL ( #14282 ) - murrant","title":"Documentation"},{"location":"General/Changelog/#tests_9","text":"Do not allow sysDescr to be fetched in os module yaml ( #14331 ) - murrant Remove PHP version constraint ( #14314 ) - Jellyfrog Lnms dev:simulate check simulated device exists ( #14243 ) - murrant Save-test-data to refresh all variants of an OS ( #14231 ) - PipoCanaja","title":"Tests"},{"location":"General/Changelog/#misc_15","text":"Defer loading cli option values ( #14354 ) - murrant Ignore CommandNotFoundException from reporting ( #14342 ) - Jellyfrog Allow dumping of errors and warnings ( #14275 ) - murrant Allow SnmpQuery to optionally abort walks if one fails ( #14255 ) - murrant","title":"Misc"},{"location":"General/Changelog/#dependencies_16","text":"Update dependencies ( #14319 ) - murrant Bump php-cs-fixer to 3.4.0 ( #14224 ) - murrant","title":"Dependencies"},{"location":"General/Changelog/#2280","text":"(2022-08-19) A big thank you to the following 26 contributors this last month: murrant (18) Npeca75 (12) Jellyfrog (9) gs-kamnas (5) earendilfr (3) fbouynot (3) VVelox (3) rhinoau (2) Schouwenburg (2) electrocret (2) aztec102 (2) PipoCanaja (1) loopodoopo (1) washcroft (1) Laplacence (1) opalivan (1) Jarod2801 (1) Martin22 (1) TheMysteriousX (1) ciscoqid (1) Fehler12 (1) PedroChaps (1) ajsiersema (1) quentinsch (1) Mar974 (1) mwobst (1) Thanks to maintainers and others that helped with pull requests this month: murrant (46) Jellyfrog (26) PipoCanaja (2) VVelox (1) Cormoran96 (1) bennet-esyoil (1) ottorei (1)","title":"22.8.0"},{"location":"General/Changelog/#feature_14","text":"Prepare for PHP 8.1 ( #14156 ) - Jellyfrog New Poller validations ( #14148 ) - murrant New lnms command to enable and disable plugins ( #14147 ) - murrant Support for SSL/TLS protected connections to MySQL databases ( #14142 ) - gs-kamnas Collect OS distro and LibreNMS version ( #14138 ) - murrant Lnms device:poll better feedback ( #14130 ) - murrant Per-App data storage ( #14087 ) - VVelox","title":"Feature"},{"location":"General/Changelog/#device_19","text":"Fix luminato port poll ( #14217 ) - murrant Teltonika RUT fix ( #14202 ) - loopodoopo Initial support for Moxa AWK Industrial APs ( #14197 ) - rhinoau Mikrotik wifi station mode sensors ( #14193 ) - Npeca75 Update mellanox os image ( #14184 ) - Laplacence Change state_name for Racoms modulation ( #14174 ) - Martin22 Cisco SB/CBS environment sensors ( #14154 ) - Fehler12 Fix Rocky Linux and AlmaLinux icons and logos ( #14150 ) - murrant Add additional sysObjectIDs for variants of the Arista 7130 ( #14144 ) - gs-kamnas Eltex MES 2324p Add ( #14135 ) - aztec102 Solid Optics EDFAMUX support ( #14129 ) - murrant Merge netmanplus and riello and improve device support ( #14125 ) - murrant Bats support ( #14108 ) - Schouwenburg Solved aos6 problem where Librenms wasn't identifying all vlans ( #14107 ) - PedroChaps Fix Cisco polling BGP peers in non-default VRF ( #14105 ) - ajsiersema Added support for CheckPoint 1100, 1450 & 1490 models. ( #14074 ) - quentinsch Ns-bsd updated for SNS LTSB 3.7.19 ( #14060 ) - Mar974 ZTE ZXA10 Update (Added dBm graphs) ( #14049 ) - aztec102","title":"Device"},{"location":"General/Changelog/#webui_16","text":"Fix ports display ( #14183 ) - murrant Ports by device group ( #14175 ) - electrocret Empty Outages table ( #14167 ) - Npeca75 View Ports in Portgroups ( #14141 ) - electrocret Fix eventlog filtering ( #14136 ) - murrant [gui] enable permanent vertical scroll ( #14102 ) - Npeca75","title":"Webui"},{"location":"General/Changelog/#alerting_15","text":"Correct logic for recurring alert rules that span UTC days ( #14145 ) - gs-kamnas Improvements to PagerDuty alert formatting ( #14143 ) - gs-kamnas Add rich (=html) support for messages via Matrix ( #14054 ) - mwobst","title":"Alerting"},{"location":"General/Changelog/#graphs_13","text":"Fix unauth application graphs ( #14216 ) - murrant Allow specifying the background colour in graph images ( #14192 ) - washcroft","title":"Graphs"},{"location":"General/Changelog/#applications_15","text":"Add possibility to monitor redis application through the unix-agent ( #14182 ) - earendilfr Fix error between application module and unix-agent ( #14177 ) - earendilfr Add possibility to monitor the php-fpm service with the unix agent ( #14173 ) - earendilfr [apps] Docker only show current containers ( #14152 ) - Npeca75 Add support for Sagan ( #14070 ) - VVelox Add Opensearch\\Elasticsearch monitoring ( #14053 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#api_16","text":"Standardize device and device group maintenance API ( #14153 ) - rhinoau Fix maintenance APIs not associating device or group ( #14127 ) - murrant","title":"Api"},{"location":"General/Changelog/#discovery_12","text":"Fix legacy os extends ( #14220 ) - murrant Sensors, convert hex to strings ( #14121 ) - murrant","title":"Discovery"},{"location":"General/Changelog/#polling_12","text":"Fix for number in sensor string ( #14185 ) - Schouwenburg","title":"Polling"},{"location":"General/Changelog/#authentication_8","text":"AD Auth PHP 8.1 fixes ( #14215 ) - murrant","title":"Authentication"},{"location":"General/Changelog/#bug_18","text":"Autodiscovery fix ( #14213 ) - Npeca75 Fix alert log clearing SQL query ( #14200 ) - Jellyfrog Fix error when ldap_search returns false ( #14199 ) - Jellyfrog Fix unnecessary Updates of DB when values are equal ( #14179 ) - opalivan Fix APP_KEY generation when using fpm ( #14168 ) - Jellyfrog Fix validation error ( #14163 ) - TheMysteriousX IPv6 Debug typo ( #14162 ) - Npeca75 Replace git show --no-patch option with --quiet ( #14160 ) - ciscoqid Fix 500 error in validation when UI containers and poller containers have differing node_ids ( #14146 ) - gs-kamnas Use --no-patch to support old git clients ( #14137 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#refactor_10","text":"Use \"database version\" instead of \"mysql version\" ( #14158 ) - Jellyfrog","title":"Refactor"},{"location":"General/Changelog/#documentation_19","text":"Update to mkdocs-material 8.3.9 ( #14189 ) - Jellyfrog SNMP extend / fix mdadm documentation ( #14186 ) - Npeca75 Update index.md ( #14178 ) - Jarod2801 Add instructions for PHP 8.1 and Ubuntu 22.04 ( #14166 ) - Jellyfrog Update php installation instruction for CentOS 8 to reflect the minim\u2026 ( #14159 ) - fbouynot Fix typo in Smokeping SELinux documentation ( #14155 ) - fbouynot Add device_default_display info ( #14151 ) - murrant Change SELinux context for logs ( #14128 ) - fbouynot","title":"Documentation"},{"location":"General/Changelog/#translation_6","text":"Serbian translation, part3 ( #14205 ) - Npeca75 More Serbian translation ( #14181 ) - Npeca75 Enable translation on Eventlog & Component-status widgets ( #14180 ) - Npeca75 Initial support for Serbian language ( #14165 ) - Npeca75 Enable translation in 3 Alert widget ( #14164 ) - Npeca75","title":"Translation"},{"location":"General/Changelog/#tests_10","text":"Allow save-test-data.php to run all modules explicitely ( #14212 ) - PipoCanaja Increase OS detection time, sometimes it is not ready by 5s ( #14133 ) - murrant","title":"Tests"},{"location":"General/Changelog/#2270","text":"(2022-07-20) A big thank you to the following 21 contributors this last month: murrant (12) fbouynot (4) mwobst (3) dependabot (2) wrongecho (2) ppasserini (2) QuadPiece (2) Jellyfrog (2) enferas (1) 00gh (1) bennet-esyoil (1) VVelox (1) rhinoau (1) prahal (1) paulgear (1) duhow (1) PipoCanaja (1) Mar974 (1) ottorei (1) mostdaysarebaddays (1) dagbdagb (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (19) murrant (14) ottorei (2) PipoCanaja (2) mpikzink (1) VVelox (1)","title":"22.7.0"},{"location":"General/Changelog/#security_11","text":"Security fixes XSS in oxidized-cfg-check.inc.php and print-customoid.php ( #14126 ) - enferas","title":"Security"},{"location":"General/Changelog/#device_20","text":"Missing \"s\" in NsBsd.php ( #14067 ) - Mar974 Add full version of Mikrotik logo ( #14063 ) - QuadPiece Add apc battery operation time, including display in WebUI ( #14058 ) - mwobst Fix the parsing of the temperature unit value (CMCIII devices) ( #14056 ) - mwobst Update Mikrotik logo ( #14045 ) - QuadPiece Aviat WTM reduce snmp load ( #13918 ) - murrant","title":"Device"},{"location":"General/Changelog/#webui_17","text":"Fix device filtering false values ( #14103 ) - murrant Minor visual changes to the apps-overview page ( #14090 ) - bennet-esyoil Search device by MAC via URL ( #14072 ) - duhow Add BGP description to eventlog BGP Peers messages ( #14061 ) - mostdaysarebaddays","title":"Webui"},{"location":"General/Changelog/#alerting_16","text":"Example rules for diskspace on / ( #14082 ) - VVelox","title":"Alerting"},{"location":"General/Changelog/#graphs_14","text":"Ping perf ( #14117 ) - 00gh","title":"Graphs"},{"location":"General/Changelog/#applications_16","text":"Fix app docker ( #14080 ) - prahal","title":"Applications"},{"location":"General/Changelog/#polling_13","text":"Increase traceroute timeout ( #14084 ) - murrant","title":"Polling"},{"location":"General/Changelog/#authentication_9","text":"Add option STARTTLS for authentication via AD ( #14051 ) - dagbdagb","title":"Authentication"},{"location":"General/Changelog/#bug_19","text":"Prevent duplicate plugin table entries ( #14120 ) - murrant Fix auth_test.php debug ( #14118 ) - murrant Fix config seeder will never run ( #14113 ) - murrant Reset the opcache after install ( #14098 ) - murrant Update config cache on install finalize step ( #14097 ) - murrant Fix more webserver validation issues ( #14096 ) - murrant Revert \"Add apc battery operation time, including display in WebUI\" ( #14068 ) - PipoCanaja Use --no-patch instead ( #14047 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#cleanup_12","text":"Remove mib poller module remnants ( #14077 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_20","text":"Small documentation typos ( #14101 ) - wrongecho Documentation typos ( #14099 ) - wrongecho Add SELinux configuration for SNMPd on Centos8 in the documentation ( #14095 ) - fbouynot Add SELinux configuration for LDAP/AD authentication on Centos8 in the documentation ( #14094 ) - fbouynot Add SELinux configuration for Smokeping on Centos8 in the documentation ( #14093 ) - fbouynot Add SELinux configuration for RRDCached on Centos8 in the documentation ( #14092 ) - fbouynot Corrected API devicegroup curl creation examples ( #14081 ) - rhinoau Minor grammar fixes in doc ( #14078 ) - paulgear Add documentation for Chrony application monitoring ( #14066 ) - ottorei","title":"Documentation"},{"location":"General/Changelog/#translation_7","text":"Few more updates to Ita lang ( #14091 ) - ppasserini Italian language update ( #14085 ) - ppasserini Adjustments to german translation ( #14083 ) - mwobst","title":"Translation"},{"location":"General/Changelog/#tests_11","text":"Test PHP 8.1 ( #14109 ) - murrant","title":"Tests"},{"location":"General/Changelog/#misc_16","text":"Allow reapply yaml config via env ( #14100 ) - murrant","title":"Misc"},{"location":"General/Changelog/#mibs_8","text":"More MIB fixing ( #14018 ) - Jellyfrog","title":"Mibs"},{"location":"General/Changelog/#dependencies_17","text":"Bump terser from 4.8.0 to 4.8.1 ( #14123 ) - dependabot Bump guzzlehttp/guzzle from 7.4.4 to 7.4.5 ( #14059 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2260","text":"(2022-06-14) A big thank you to the following 22 contributors this last month: murrant (22) gs-kamnas (5) Jellyfrog (4) dependabot (2) kruczek8989 (2) bile0026 (1) dennypage (1) hjcday (1) Martin22 (1) spyfly (1) Bobdave (1) bennet-esyoil (1) DaftBrit (1) SanderBlom (1) thecityofguanyu (1) glance- (1) duhow (1) TheMysteriousX (1) kevinwallace (1) HolgerHees (1) charlyforot (1) SourceDoctor (1) Thanks to maintainers and others that helped with pull requests this month: murrant (21) Jellyfrog (14) ottorei (5) PipoCanaja (2) mpikzink (1) f0o (1)","title":"22.6.0"},{"location":"General/Changelog/#feature_15","text":"SnmpQuery walk multiple oids ( #14015 ) - murrant Add support to REST API for creating Maintenance Schedules for Device Groups ( #13985 ) - thecityofguanyu Automatic fixes for validation failures ( #13930 ) - murrant","title":"Feature"},{"location":"General/Changelog/#security_12","text":"Bumpver handlebars.js to 4.7.7 to resolve CVE-2021-23369 ( #13990 ) - gs-kamnas","title":"Security"},{"location":"General/Changelog/#device_21","text":"Fix use of incorrect variable to retrieve current sensor value ( #14037 ) - dennypage Support Huawei SMU11B ( #14029 ) - murrant Update Teltonika Sensors for FW R_00.07.02 ( #14012 ) - hjcday Procurve hardware description cleanup ( #14007 ) - murrant Racom Ray2 and Ray3 - Modulation states added ( #14001 ) - Martin22 Fix OS Detection for USW-Flex-XG ( #13999 ) - spyfly Add support for Cisco Nexus 3550 series (formerly Exalink Fusion) devices ( #13992 ) - gs-kamnas Improve support for Arista/Metamako MOS devices ( #13988 ) - gs-kamnas Workaround issues with lldp information from GS108Tv1 ( #13971 ) - glance- Add additional OpenBSD PF graphs ( #13963 ) - kevinwallace BGP unnumbered support for Cumulus ( #13785 ) - charlyforot","title":"Device"},{"location":"General/Changelog/#webui_18","text":"Dashboard code cleanup ( #13996 ) - murrant Device Types Widget ( #13670 ) - SourceDoctor","title":"Webui"},{"location":"General/Changelog/#alerting_17","text":"Add macro.past_20m macro ( #14023 ) - kruczek8989 Allow the use of a custom URL for accessing the PagerDuty API and correct API schema violation ( #14010 ) - gs-kamnas Setting MSteams card summary to alert title ( #13989 ) - DaftBrit Use display name when sending alerts to Sensu ( #13967 ) - TheMysteriousX","title":"Alerting"},{"location":"General/Changelog/#applications_17","text":"Add error-state to non-responsive mysql-servers ( #13993 ) - bennet-esyoil","title":"Applications"},{"location":"General/Changelog/#discovery_13","text":"Fix printer count sensors when extra garbage is returned ( #14014 ) - murrant","title":"Discovery"},{"location":"General/Changelog/#oxidized_6","text":"Syslog-notify-oxidized.php now always notifies Oxidized ( #14011 ) - murrant Fix Oxidized syslog change notifier when the change was made via snmp. ( #14005 ) - kruczek8989","title":"Oxidized"},{"location":"General/Changelog/#authentication_10","text":"Implement support for usernames coming from reverse proxies ( #13894 ) - HolgerHees","title":"Authentication"},{"location":"General/Changelog/#bug_20","text":"Git version validation improvement ( #14042 ) - murrant Server name validation, handle ports better ( #14041 ) - murrant Fix some broken migrations ( #14040 ) - Jellyfrog Fix rrd version validation check ( #14036 ) - murrant Fix DB timezone validation ( #14035 ) - murrant Regression fix from #13596 ( #14034 ) - Jellyfrog Fix an issue when getting the local version from git ( #14020 ) - murrant Fix migrations failing one time after dashboard cleanup ( #14002 ) - murrant Fix Netscaler VServer database updates during polling ( #13995 ) - Bobdave Fix 500 error in validations when capabilities are not supported or set ( #13991 ) - gs-kamnas","title":"Bug"},{"location":"General/Changelog/#cleanup_13","text":"Remove traceroute6, it is unused ( #14019 ) - murrant Remove DefaultWidgetSeeder ( #14006 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_21","text":"Okta saml ( #14038 ) - bile0026 HPE Comware snmp config example ( #13997 ) - murrant","title":"Documentation"},{"location":"General/Changelog/#tests_12","text":"Fix tests failing when device with IP 127.1.6.1 exists ( #14016 ) - murrant","title":"Tests"},{"location":"General/Changelog/#misc_17","text":"Slightly easier validation page error access ( #14044 ) - murrant Lnms scan respect -q parameter ( #14027 ) - murrant Custom OID processing of numeric strings with filters ( #13968 ) - duhow Validate base_url and server_name ( #13941 ) - murrant","title":"Misc"},{"location":"General/Changelog/#mibs_9","text":"Update MIBs ( #14017 ) - Jellyfrog Updated existing Siemens MIBs and added trap MIB ( #13986 ) - SanderBlom","title":"Mibs"},{"location":"General/Changelog/#dependencies_18","text":"Update Larastan ( #14031 ) - murrant Update PHP dependencies ( #14028 ) - murrant Bump guzzlehttp/guzzle from 7.4.3 to 7.4.4 ( #14025 ) - dependabot Bump guzzlehttp/guzzle from 7.4.1 to 7.4.3 ( #13994 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2250","text":"(2022-05-21) A big thank you to the following 23 contributors this last month: murrant (7) VVelox (6) slimey99uk (2) dependabot (2) Npeca75 (2) nox-x (1) nsn-amagruder (1) mkuurstra (1) booth-f (1) sajiby3k (1) skandragon (1) Martin22 (1) twelch24 (1) ppasserini (1) bl3nd3r (1) SantiagoSilvaZ (1) Jimmy-Cl (1) lfkeitel (1) steffann (1) micko (1) IVI053 (1) pfromme25 (1) mzacchi (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (19) murrant (16) ottorei (3) mpikzink (1)","title":"22.5.0"},{"location":"General/Changelog/#feature_16","text":"Allow unordered OIDs (global and per-os) ( #13923 ) - murrant Added --ping-only to snmp-scan.py ( #13810 ) - IVI053","title":"Feature"},{"location":"General/Changelog/#device_22","text":"Add Cisco Business Wirless to ciscowlc.yaml ( #13984 ) - nsn-amagruder Add Eaton SC200 OS model ( #13978 ) - slimey99uk Fortigate LTE sensor addition ( #13977 ) - slimey99uk Added BKE power supply support. ( #13972 ) - Martin22 Don't use bulk-walk for PrimeKey Appliances ( #13958 ) - bl3nd3r Fix avtech12e sensors ( #13943 ) - lfkeitel [mikrotik] fixed RouterOS ipv4/ipv6 routes ( #13902 ) - Npeca75 Netscaler new counter metrics ( #13323 ) - mzacchi","title":"Device"},{"location":"General/Changelog/#webui_19","text":"Update dark mode to fix BGP and Peering page ( #13951 ) - Jimmy-Cl Fix snmp.timeout setting via Web UI ( #13937 ) - murrant","title":"Webui"},{"location":"General/Changelog/#alerting_18","text":"More realistic alert test data ( #13969 ) - murrant","title":"Alerting"},{"location":"General/Changelog/#graphs_15","text":"[RRD] fix IPv6 folder name ( #13945 ) - Npeca75","title":"Graphs"},{"location":"General/Changelog/#applications_18","text":"Remove alert keys from component for Suricata ( #13959 ) - VVelox Fix a few issues with variable names for Suricata ( #13956 ) - VVelox Scripts/json-app-tool.php JSON generation fix and add -S for SNMP extend name ( #13948 ) - VVelox Add Suricata monitoring ( #13942 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#discovery_14","text":"Fix polling and discovery of FortiGate cluster sensors ( #13980 ) - mkuurstra","title":"Discovery"},{"location":"General/Changelog/#oxidized_7","text":"Oxidized API to return groups based on device purpose or notes ( #13976 ) - sajiby3k","title":"Oxidized"},{"location":"General/Changelog/#authentication_11","text":"Auth_ldap_skip_group_check when ldap_compare is not supported ( #13926 ) - micko Add LDAP bind and userlist filter support to ldap-authorization ( #13788 ) - pfromme25","title":"Authentication"},{"location":"General/Changelog/#bug_21","text":"Inconsistency in ldap starttls config parameter ( #13987 ) - nox-x Fix version check error ( #13981 ) - murrant Use full sudo path ( #13975 ) - skandragon Fix IPv6 in service check host ( #13939 ) - steffann","title":"Bug"},{"location":"General/Changelog/#refactor_11","text":"Improve the efficiency of some queries ( #13974 ) - murrant Move Config loading to a service provider ( #13927 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#documentation_22","text":"Fix typo in dispatcher service doc ( #13979 ) - booth-f Fix a typo in alerting doc ( #13970 ) - twelch24 DOCS, switch to dark or light mode ( #13953 ) - SantiagoSilvaZ Assorted cleanups to alerting docs, primarily to make mdl happier ( #13950 ) - VVelox Update test doc making it more mdl happy and add a section on writing JSON app tests ( #13949 ) - VVelox","title":"Documentation"},{"location":"General/Changelog/#translation_8","text":"Small Italian lang update ( #13960 ) - ppasserini","title":"Translation"},{"location":"General/Changelog/#misc_18","text":"Improve lnms shortcut validation ( #13982 ) - murrant","title":"Misc"},{"location":"General/Changelog/#dependencies_19","text":"Bump async from 2.6.3 to 2.6.4 ( #13947 ) - dependabot Bump composer/composer from 2.2.4 to 2.3.5 ( #13944 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2240_1","text":"(2022-04-21) A big thank you to the following 27 contributors this last month: murrant (18) SantiagoSilvaZ (3) laf (3) dependabot (3) Fehler12 (3) ottorei (2) bl3nd3r (2) p4k8 (1) si458 (1) TheMysteriousX (1) cliffalbert (1) Jimmy-Cl (1) frenchie (1) ppasserini (1) claude191 (1) westerterp (1) Cormoran96 (1) WillIrvine (1) lucalo72 (1) ssasso (1) Jellyfrog (1) geg347 (1) dandare100 (1) bonzo81 (1) PipoCanaja (1) jonathanjdavis (1) manonfgoo (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (25) murrant (16) laf (10) ottorei (3) PipoCanaja (3) SourceDoctor (2) haxmeadroom (1)","title":"22.4.0"},{"location":"General/Changelog/#feature_17","text":"Add ISIS discovery and polling for iosxe devices ( #13880 ) - WillIrvine","title":"Feature"},{"location":"General/Changelog/#security_13","text":"Fix services command injection ( #13932 ) - murrant Fix Graylog XSS ( #13931 ) - murrant Bump minimist from 1.2.5 to 1.2.6 ( #13872 ) - dependabot Fix SQL injection in get-host-dependencies ( #13868 ) - Jellyfrog","title":"Security"},{"location":"General/Changelog/#device_23","text":"Support tplink routers ( #13922 ) - si458 Fix Hytera error ( #13909 ) - murrant PrimeKey Improvements ( #13901 ) - bl3nd3r Enhancements for Zyxel OS ( #13897 ) - Jimmy-Cl Added support for Dell PowerVault ME4024 ( #13883 ) - laf Add support for Riello NetMan 204 ( #13878 ) - lucalo72 Fix usw flex switch hardware detection ( #13877 ) - Fehler12 Added Polycom Lens SNMP support. ( #13876 ) - Fehler12 Fix for PFSense state table removals field ( #13863 ) - dandare100 McAfee Proxy Sensor name update ( #13853 ) - PipoCanaja Add support for PrimeKey Hardware Appliance ( #13806 ) - bl3nd3r","title":"Device"},{"location":"General/Changelog/#webui_20","text":"Add ISIS-details to alert details ( #13920 ) - ottorei Fix port mini graphs ( #13911 ) - murrant Replaced OpenWRT icon with new logo ( #13891 ) - frenchie Add \"Ping Response\" graph to \"Ping Only\" Device Overview page ( #13886 ) - westerterp Remove fix size for column mac adresse ( #13881 ) - Cormoran96 Fixed the top port errors widget returning bits graphs instead ( #13860 ) - laf","title":"Webui"},{"location":"General/Changelog/#alerting_19","text":"Correct type hint ( #13915 ) - TheMysteriousX Improve alert template saving ( #13910 ) - murrant Added Basic authentication capability to Alertmanager Transport ( #13867 ) - geg347","title":"Alerting"},{"location":"General/Changelog/#snmp-traps_3","text":"Add Cisco Err-Disable interface event trap handler ( #13855 ) - bonzo81","title":"Snmp Traps"},{"location":"General/Changelog/#api_17","text":"Ensure 'add_device' API returns indexed-array (as per doco) ( #13887 ) - claude191","title":"Api"},{"location":"General/Changelog/#polling_14","text":"Fix STP polling bug ( #13924 ) - murrant Print full error message in poller/discovery output ( #13903 ) - murrant","title":"Polling"},{"location":"General/Changelog/#rancid_1","text":"Add MRV OptiDriver support in gen_rancid ( #13900 ) - cliffalbert Add support for VyOS on Rancid conf ( #13874 ) - ssasso","title":"Rancid"},{"location":"General/Changelog/#bug_22","text":"Validate fixes ( #13935 ) - murrant Lnms device:add handle snmp.community bad format ( #13914 ) - murrant Fix install icons ( #13904 ) - murrant Handle bad uptime input ( #13899 ) - murrant Fix custom error messages ( #13898 ) - murrant Migrate addhost.php to lnms device:add ( #13870 ) - murrant","title":"Bug"},{"location":"General/Changelog/#refactor_12","text":"Port Validation Page to Laravel ( #13921 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#cleanup_14","text":"Better device:add error output ( #13913 ) - murrant Remove non-working Dell specific alert rules from the collection ( #13706 ) - Fehler12","title":"Cleanup"},{"location":"General/Changelog/#documentation_23","text":"Docs, fix code block in oxidized group ( #13908 ) - SantiagoSilvaZ [DOC] Fix Code blocks Step 2 Installing Network-WeatherMap ( #13905 ) - SantiagoSilvaZ [DOC] Styling the .env word quote ( #13889 ) - SantiagoSilvaZ Docs, fix Linux SNMP example only listening on ::1 ( #13882 ) - murrant Script that describes how to migrate traffic bills from observium. ( #13757 ) - manonfgoo","title":"Documentation"},{"location":"General/Changelog/#translation_9","text":"Ukrainian translation update ( #13933 ) - p4k8 Few more language (ITA) updates ( #13890 ) - ppasserini","title":"Translation"},{"location":"General/Changelog/#dependencies_20","text":"Bump guzzlehttp/psr7 from 2.1.0 to 2.2.1 ( #13879 ) - dependabot Bump jpgraph version to 4 ( #13875 ) - ottorei Bump node-forge from 1.2.1 to 1.3.0 ( #13869 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2230","text":"(2022-03-17) A big thank you to the following 22 contributors this last month: murrant (7) Jellyfrog (5) bonzo81 (4) laf (3) PipoCanaja (2) charlyforot (2) geg347 (2) westerterp (2) ospfbgp (1) MrXermon (1) pandalion98 (1) eskyuu (1) josh-silvas (1) martinberg (1) lpailhas (1) hanserasmus (1) si458 (1) SantiagoSilvaZ (1) LTangaF (1) dlangille (1) Npeca75 (1) woidi (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (19) murrant (10) laf (8) SourceDoctor (3) ottorei (1) bboy8012 (1) PipoCanaja (1)","title":"22.3.0"},{"location":"General/Changelog/#feature_18","text":"Device_add support display field ( #13846 ) - murrant Display Name in availability map ( #13841 ) - murrant Implement OAuth and SAML2 support ( #13764 ) - Jellyfrog","title":"Feature"},{"location":"General/Changelog/#security_14","text":"Resolved XSS issue from alert rule list modal ( #13805 ) - laf","title":"Security"},{"location":"General/Changelog/#device_24","text":"Add support for VOSS 8.6 ( #13857 ) - ospfbgp Device - HWG-WLD version 2 support ( #13849 ) - PipoCanaja Fix an issue with the APC current discovery ( #13837 ) - eskyuu Add VS state for Gaia ( #13831 ) - martinberg [new OS] Alpine OptoElectronics TDCM-EDFA support ( #13825 ) - charlyforot Fix db delete on cisco-vrf-lite discovery ( #13823 ) - lpailhas Add rocky linux OS identification ( #13815 ) - hanserasmus Detect truenas scale ( #13812 ) - si458 [comware] dropped dbfetch from discovery/sensors ( #13796 ) - Npeca75 Correct divisor in discovery definition vertiv-pdu.yaml ( #13768 ) - woidi","title":"Device"},{"location":"General/Changelog/#webui_21","text":"Fixed displaying hostname in create bill when port is passed ( #13830 ) - laf Fix Oxidized Config tab showing when Device OS or Device Type is disabled ( #13809 ) - westerterp Position the buttons in the center on user preferences page ( #13802 ) - SantiagoSilvaZ Add usage hints for Display Name placeholder usage ( #13801 ) - LTangaF Fix second menu bar in Apps screens ( #13800 ) - westerterp WebUI - Search results for ports ( #13787 ) - PipoCanaja","title":"Webui"},{"location":"General/Changelog/#alerting_20","text":"Newer versions of Jira use HTTP code 201 fore created issues ( #13852 ) - MrXermon Add extra dynamic values alerttransport alertmanager ( #13828 ) - geg347","title":"Alerting"},{"location":"General/Changelog/#snmp-traps_4","text":"Add APC SmartAvrReducing trap handlers ( #13839 ) - bonzo81 Add APC upsOnBattery & powerRestored trap handler ( #13836 ) - bonzo81 Add OspfTxRetransmit Trap Handler ( #13824 ) - bonzo81 Cisco Mac address violation trap handler ( #13811 ) - bonzo81","title":"Snmp Traps"},{"location":"General/Changelog/#api_18","text":"Adds API call to update port notes on devices. ( #13834 ) - josh-silvas","title":"Api"},{"location":"General/Changelog/#bug_23","text":"Rewrite agent packages parsing code ( #13840 ) - murrant Fix snmpv3 context when empty SnmpQuery ( #13832 ) - murrant Regression fix from b6a8b602b891d9eb8633f62632c17bdc559cd620 ( #13819 ) - Jellyfrog Fix PHPStan Deprecated test ( #13794 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#refactor_13","text":"Remove addHost from ModuleTestHelper ( #13847 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#tests_13","text":"PHP8 phpstan fix ( #13843 ) - murrant Fix tests for MariaDB > 10.5.15 ( #13829 ) - Jellyfrog Add MIB to OS helper to tests ( #13795 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#misc_19","text":"Add configuration support for IPMIv2 Kg key ( #13845 ) - pandalion98 New device:add code ( #13842 ) - murrant Fix class error name prevents to show BER graph ( #13833 ) - charlyforot Add generic PSU status failed alert rule template ( #13821 ) - geg347 Bump version to 22.2.1 ( #13798 ) - dlangille","title":"Misc"},{"location":"General/Changelog/#2220","text":"(2022-02-16) A big thank you to the following 22 contributors this last month: Jellyfrog (22) murrant (11) PipoCanaja (7) Npeca75 (7) ilGino (6) SantiagoSilvaZ (4) laf (3) h-barnhart (2) aztec102 (2) Fehler12 (1) JKJameson (1) jepke (1) sGoico (1) dorkmatt (1) SourceDoctor (1) si458 (1) dfitton (1) Martin22 (1) fsmeets (1) dependabot (1) knpo (1) guipoletto (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (35) murrant (16) laf (14) PipoCanaja (10) ottorei (6) SourceDoctor (5) kkrumm1 (1)","title":"22.2.0"},{"location":"General/Changelog/#feature_19","text":"Implement system for user packages in composer ( #13718 ) - Jellyfrog","title":"Feature"},{"location":"General/Changelog/#security_15","text":"Hide community and make it XSS safer ( #13783 ) - PipoCanaja Moved some pages to be within admin route ( #13782 ) - laf XSS fix ( #13780 ),( #13778 ),( #13776 ),( #13775 ) - PipoCanaja Bump follow-redirects package from 1.14.7 to 1.14.8 ( #13774 ) - dependabot","title":"Security"},{"location":"General/Changelog/#device_25","text":"Support for Terra sdi410c / sdi480 devices ( #13759 ) - Npeca75 Added BER to Racom Ray and Ray3 ( #13758 ) - Martin22 Added system temperature support including state for Extreme VSP 4900 devices ( #13743 ) - laf Added ipv6 route discovery for Mikrotik devices ( #13737 ) - Npeca75 Fixed airos temp in 8.7.7 for ubnt devices ( #13731 ) - murrant Added sensors to ZXA OS ( #13724 ) - aztec102 Added support for Volius OS ( #13723 ) - aztec102 Updated DDM MIBs for Jetstream OS ( #13715 ) - Npeca75 Added support for Ubiquiti Airfiber60 devices ( #13680 ) - jepke Fixed Temperature Sensor for AirOS 8.7.4+ ( #13655 ) - JKJameson Added support for Lenovo think station devices ( #13617 ) - Fehler12 Added sensors for huawei vrp devices ( #13352 ) - guipoletto","title":"Device"},{"location":"General/Changelog/#webui_22","text":"Rewrite includes/html/pages/device/health.inc.php ( #13777 ) - Npeca75 Various fixes for STP ( #13773 ) - PipoCanaja Added missing icons for progressive web app ( #13771 ) - murrant Show selected selection option on graphs page in Mono theme ( #13765 ) - SantiagoSilvaZ Show selected option of devices-graphs-select in Mono theme ( #13752 ) - SantiagoSilvaZ Upgrade to font awesome 6 ( #13760 ) - Jellyfrog Upgrade to font awesome 5 ( #13754 ) - Jellyfrog Update dark.css to improve visibility ( #13749 ) - dfitton Removing colon symbol from multiple dialogs ( #13742 ) - ilGino Added the word Actions in the header of the oxidized-nodes table ( #13741 ) - SantiagoSilvaZ Updated icons of links pointing to Health pages ( #13729 ) - ilGino Updated to a more consistent Fontawesome icon for the Export to PDF ( #13713 ) - ilGino Removing the colon symbol to the right of a control labels ( #13704 ),( #13705 ) - ilGino Update to tailwind 3 ( #13695 ) - Jellyfrog","title":"Webui"},{"location":"General/Changelog/#alerting_21","text":"Added better default sensor alert template ( #13703 ) - Jellyfrog","title":"Alerting"},{"location":"General/Changelog/#snmp-traps_5","text":"Added SNMP Traps for Brocade login traps ( #13770 ) - h-barnhart Added SNMP Traps for APC Overload Traps ( #13726 ) - h-barnhart","title":"Snmp Traps"},{"location":"General/Changelog/#discovery_15","text":"Check for empty SLA tags so we skip bad entries ( #13679 ) - laf","title":"Discovery"},{"location":"General/Changelog/#bug_24","text":"Only try contexts in STP for Cisco devices ( #13767 ) - murrant Fix settings array initial value ( #13755 ) - Jellyfrog Use better filesystem functions to delete host rrd dir ( #13735 ) - Jellyfrog Device:poll log poll complete ( #13733 ) - murrant Fixed \\< 0 exception in ports poller ( #13732 ) - murrant Fixed ups-nut check ( #13722 ) - Jellyfrog Changed fping hardcoded binary to user defined fping ( #13720 ) - sGoico","title":"Bug"},{"location":"General/Changelog/#refactor_14","text":"Oxidized reload called on Device update and remove ( #13730 ) - murrant Stp module rewrite ( #13570 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#cleanup_15","text":"Dropped dbfetch from discovery/sensors for pbn devices ( #13789 ) - Npeca75 Dropped dbfetch from discovery/sensors for junos devices ( #13784 ) - Npeca75 Removed contrib directory ( #13727 ) - murrant Removed old vendor fix ( #13717 ) - Jellyfrog Replace Requests library with HTTP Client ( #13689 ) - Jellyfrog Use built in method to render a string with Blade ( #13688 ) - Jellyfrog","title":"Cleanup"},{"location":"General/Changelog/#documentation_24","text":"Simple docs tweaking ( #13792 ) - Jellyfrog Update Switching API doc to fix link ( #13786 ) - knpo Rename DHCP Stats to ISC DHCP Stats ( #13756 ) - SourceDoctor Update Install-LibreNMS.md to include pip3 install ( #13746 ) - si458 validate-config-icon better positioning in the text ( #13744 ) - SantiagoSilvaZ Updated Debian install docs to include pip3 install ( #13721 ) - dorkmatt Full rework of documentation for better nav, cleanup and fixes ( #13709 ) - Jellyfrog","title":"Documentation"},{"location":"General/Changelog/#tests_14","text":"Bump test timeout to 2 hours ( #13769 ) - Jellyfrog Speed up tests by reducing snmp timeout ( #13725 ) - murrant Lnms dev:check add --os-modules-only option ( #13700 ) - murrant","title":"Tests"},{"location":"General/Changelog/#misc_20","text":"Set default DB_TEST_PORT in database config ( #13793 ) - Jellyfrog Fixed links to connected devices in old style maps ( #13762 ) - fsmeets Updated Top Devices widget to include filtering on ifOperStatus ( #13748 ) - Npeca75 Correct prefix for \"kilo\" should be small k, not capital K ( #13714 ) - ilGino Remove old composer preinstall script ( #13712 ) - Jellyfrog Improve Proxy::shouldBeUsed ( #13702 ) - Jellyfrog Use commit date to compare pull requestes ( #13701 ) - Jellyfrog","title":"Misc"},{"location":"General/Changelog/#dependencies_21","text":"Update JS deps ( #13694 ) - Jellyfrog Update dependencies ( #13684 ) - Jellyfrog","title":"Dependencies"},{"location":"General/Changelog/#2210","text":"(2022-01-23) A big thank you to the following 26 contributors this last month: murrant (9) Npeca75 (4) loopodoopo (3) ilGino (2) Jellyfrog (2) SourceDoctor (2) laf (2) aztec102 (2) twelch24 (1) tkjaer (1) ssasso (1) TechieDylan (1) hvanoch (1) h-barnhart (1) gdepeyrot (1) k0079898 (1) efelon (1) westerterp (1) avermeer-tc (1) Fehler12 (1) bonzo81 (1) glance- (1) VirTechSystems (1) iopsthecloud (1) blubecks (1) thford89 (1) Thanks to maintainers and others that helped with pull requests this month: murrant (22) Jellyfrog (13) laf (10) PipoCanaja (6) ottorei (2) SourceDoctor (2)","title":"22.1.0"},{"location":"General/Changelog/#feature_20","text":"Add Sla jitter packet loss percent graph ( #13600 ) - bonzo81 Add API-routes for listing MPLS SAPs and services ( #13561 ) - blubecks","title":"Feature"},{"location":"General/Changelog/#device_26","text":"Merge enviromux-micro in existing NTI ( #13696 ) - Npeca75 Change the variable to detect version for mikrotik ups runtime device divisor ( #13678 ) - TechieDylan VRP BGP fixes ( #13675 ) - murrant Added new sensors to mes23xx ( #13671 ) - Npeca75 Added initial detection MES2324F or MES2324FB ( #13669 ) - aztec102 New OS: Adva XG 304 ( #13668 ) - h-barnhart Basic ZTE ZXA10 detection ( #13658 ) - murrant Added CET Power T2S TSI ( #13645 ) - aztec102 Eltek ospf poller disable ( #13635 ) - loopodoopo Smartoptics dcp m 40 zr ( #13634 ) - avermeer-tc Updated XOS (Extreme) processor data to use correct OID ( #13633 ) - laf Initial Support for Fujitsu RX300 with iRMC4 ( #13631 ) - Fehler12 Teleste Luminato ports & qam/asi output sensors & yaml ( #13616 ) - Npeca75 Workaround linksys always mapping to g1 ( #13595 ) - glance- Equallogic fix typo on os name in the storage module ( #13580 ) - iopsthecloud","title":"Device"},{"location":"General/Changelog/#webui_23","text":"[WebUI] Removing the colon symbol to the right of a control label ( #13698 ) - ilGino Remove unneccessary Section Description ( #13677 ) - SourceDoctor Device tracepath using wrong variables to check for traceroute output ( #13674 ) - laf Allow filter by display name in device list ( #13665 ) - gdepeyrot Sort Vlan Ports by ifName, ifDescr ( #13657 ) - SourceDoctor Fix horizontal scrollbar in device list always visible ( #13653 ) - efelon","title":"Webui"},{"location":"General/Changelog/#alerting_22","text":"Use display name in alerts ( #13650 ) - murrant","title":"Alerting"},{"location":"General/Changelog/#graphs_16","text":"Timos sap dot1q graphing fix ( #13654 ) - loopodoopo","title":"Graphs"},{"location":"General/Changelog/#applications_19","text":"Add supervisord application ( #13673 ) - hvanoch","title":"Applications"},{"location":"General/Changelog/#api_19","text":"API detect if new location should be fixed by default ( #13637 ) - murrant Set fixed_coordinates via api ( #13593 ) - VirTechSystems","title":"Api"},{"location":"General/Changelog/#polling_15","text":"Added oids.no_bulk os setting ( #13666 ) - Npeca75 Add consistent output of name and app_id to Poller for all Applications (fixes #13641) ( #13648 ) - westerterp Fix SnmpQuery bulk boolean backwards ( #13636 ) - murrant","title":"Polling"},{"location":"General/Changelog/#rancid_2","text":"Gen RANCID host also for FS.com devices ( #13682 ) - ssasso","title":"Rancid"},{"location":"General/Changelog/#bug_25","text":"Use PHP_BINARY directly instead of trying to build path to PHP binary ( #13690 ) - Jellyfrog Small text change for misspelled Virtual ( #13686 ) - ilGino Snmp timeout is a float, allow in config ( #13676 ) - murrant Fix NULL device alert caused by services ( #13663 ) - k0079898 Disable VRP VLANs test, seems to be a bug in snmpsim snmpbulkwalk ( #13649 ) - murrant Remove extra rows with duplicate keys in SyncsModels trait ( #13632 ) - murrant","title":"Bug"},{"location":"General/Changelog/#documentation_25","text":"Update rrdcached link ( #13692 ) - twelch24 Add missing python3-pip installation dependency for debian11 ( #13691 ) - tkjaer","title":"Documentation"},{"location":"General/Changelog/#translation_10","text":"Fix settings language file to include Distributed Poller labels. ( #13511 ) - thford89","title":"Translation"},{"location":"General/Changelog/#dependencies_22","text":"Update recommended PHP version to 8.0 ( #13687 ) - Jellyfrog","title":"Dependencies"},{"location":"General/Changelog/#21120","text":"(2021-12-21) A big thank you to the following 30 contributors this last month: murrant (38) Npeca75 (6) Jellyfrog (3) twelch24 (3) johnstruse (2) nightcore500 (2) Martin22 (2) wkamlun (2) martinberg (1) mathieu-artic (1) dependabot (1) carranzamarioagustin (1) SourceDoctor (1) si458 (1) Cormoran96 (1) claude191 (1) ottorei (1) banachtarski-91 (1) RockyVod (1) enferas (1) jepke (1) duhow (1) Nocturr (1) hjcday (1) djamp42 (1) PipoCanaja (1) amanualgoldstein (1) pepperoni-pi (1) paulierco (1) TheGreatDoc (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (42) murrant (20) SourceDoctor (3) ottorei (3) bakerds (2) jaypo82 (1) mpikzink (1) troublestarter (1) PipoCanaja (1)","title":"21.12.0"},{"location":"General/Changelog/#feature_21","text":"Catch all module errors ( #13542 ) - murrant Lnms snmp:fetch query multiple devices ( #13538 ) - murrant Configurable device display name ( #13528 ) - murrant RRD Allow specifying a source file and ds to fill data ( #13480 ) - murrant","title":"Feature"},{"location":"General/Changelog/#security_16","text":"Fix unescaped strings XSS issues ( #13554 ) - enferas","title":"Security"},{"location":"General/Changelog/#device_27","text":"Fix EdgeOS hardware detection ( #13629 ) - johnstruse Add additional ICX 7150 devices ( #13627 ) - johnstruse Fix axiscam serial format ( #13620 ) - murrant Fix Cisco WLC AP cleanup ( #13615 ) - murrant CPU, HW type, HW ver, Fan state discovery ( #13608 ) - Npeca75 Initial Eltex-mes IPv6 address discovery ( #13594 ) - Npeca75 Add better support for Eaton UPS ( #13588 ) - mathieu-artic SmartAX supports IF-MIB, skip custom polling and fix polling GPON ports ( #13579 ) - carranzamarioagustin Add back Areca secondary hardware OID ( #13562 ) - murrant Ray3 - Added memory chart ( #13557 ) - Martin22 Add all Aviat WTM4k family devices ( #13556 ) - RockyVod Fix discovery and pooling Racom Ray2 ( #13553 ) - Martin22 Add version for ironware ( #13551 ) - wkamlun Add ICX 7150 description ( #13550 ) - wkamlun Add discovery for APC EPDU1132M ( #13545 ) - duhow Split Eltex-mes OS to mes21xx / mes23xx. + few improvements ( #13544 ) - Npeca75 Add Initial Support for VMware SD-WAN / Velocloud ( #13536 ) - Nocturr Arista EOS, use sysObjectID for detection (to include vEOS) ( #13534 ) - murrant RUTX fix sensor limits ( #13526 ) - hjcday Added support for Himoinsa gensets status state sensors ( #13456 ) - TheGreatDoc","title":"Device"},{"location":"General/Changelog/#webui_24","text":"VLANs sort in GUI ( #13628 ) - Npeca75 Fix broken links ( #13625 ) - murrant Fix the displayed unit for frequency and distance in the wireless section ( #13614 ) - nightcore500 Add more device fields to oxidized map configuration ( #13604 ) - martinberg Correct graph row component responsive layout for linked graphs ( #13587 ) - murrant Global search: search device display ( #13583 ) - murrant Availibility Map - show Display Name if set ( #13574 ) - SourceDoctor Do not show location in device overview if location is not found ( #13572 ) - murrant Don't use @lang() it doesn't escape the string ( #13566 ) - murrant Allow LegacyPlugin Pages to receive all parameters ( #13519 ) - PipoCanaja","title":"Webui"},{"location":"General/Changelog/#alerting_23","text":"Use http for proxy urls via guzzle ( #13601 ) - Jellyfrog Twilio change text to show alert termplate msg ( #13521 ) - djamp42","title":"Alerting"},{"location":"General/Changelog/#graphs_17","text":"Fix nototal graph option ( #13589 ) - nightcore500 Add additional type tag for Bind metrics ( #13581 ) - murrant","title":"Graphs"},{"location":"General/Changelog/#snmp-traps_6","text":"Veeam SNMP traps fix and extend ( #13549 ) - jepke Add Alcatel Omniswitch Traps Handlers ( #13492 ) - paulierco","title":"Snmp Traps"},{"location":"General/Changelog/#applications_20","text":"PHP8 compatibility for ntp-server polling app ( #13513 ) - amanualgoldstein","title":"Applications"},{"location":"General/Changelog/#billing_2","text":"Billing fix a couple divide by zero errors ( #13517 ) - murrant","title":"Billing"},{"location":"General/Changelog/#api_20","text":"API 'list_parents_of_host' - mostly doco, but one small code enhancement ( #13567 ) - claude191","title":"Api"},{"location":"General/Changelog/#discovery_16","text":"Q-bridge-mib, discover missing VLANs, v2 ( #13569 ) - Npeca75","title":"Discovery"},{"location":"General/Changelog/#polling_16","text":"Ios-fdb-table-fix -- Fixed misnamed dictionary keys for dot1dTpFdbPor\u2026 ( #13559 ) - banachtarski-91 OSPF issue when devices don't support OSPF-MIB::ospfIfTable ( #13530 ) - murrant Poller command rewrite ( #13414 ) - murrant","title":"Polling"},{"location":"General/Changelog/#bug_26","text":"Escape net-snmp unformatted strings, try 2 ( #13584 ) - murrant Workaround don't poll WLC on IOSXE ( #13563 ) - murrant Fix Ciscowlc AP-polling ( #13560 ) - ottorei Mark OID not increasing as invalid ( #13548 ) - murrant Skip invalid OSPF data ( #13547 ) - murrant Remove color markers when logging to files ( #13541 ) - murrant Fix plugin_active check when plugin is not found ( #13531 ) - murrant Remove unused buggy arp_discovery code ( #13529 ) - murrant Pseudowire cpwVcID can exceed database max value ( #13510 ) - pepperoni-pi","title":"Bug"},{"location":"General/Changelog/#refactor_15","text":"Ipv6 discovery switch to new DB syntax ( #13591 ) - Npeca75 OSPF port module ( #13498 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#cleanup_16","text":"Fix bad snmp context option ( #13497 ) - murrant Polling cleanup, fix PHP warnings ( #13460 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_26","text":"Clarify docker app setup on debian/ubuntu ( #13573 ) - si458 Update winbox launcher doc (again) ( #13558 ) - twelch24 Add more detailed instructions to winbox launcher ( #13552 ) - twelch24 Link for can't check Python dependencies validation ( #13520 ) - murrant Elaborate on feeding Oxidized ( #13514 ) - murrant","title":"Documentation"},{"location":"General/Changelog/#tests_15","text":"Tests dont include empty tables ( #13619 ) - murrant Collect-snmp-data.php can now capture snmp context test data ( #13596 ) - murrant Snmp.unescape setting ( #13590 ) - murrant Use phpstan-deprecation-rules instead ( #13582 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#mibs_10","text":"Update netapp mib ( #13571 ) - Cormoran96","title":"Mibs"},{"location":"General/Changelog/#dependencies_23","text":"Bump symfony/http-kernel from 5.3.9 to 5.4.0 ( #13585 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#21110","text":"(2021-11-12) A big thank you to the following 49 contributors this last month: murrant (39) Jellyfrog (6) arrmo (4) Nocturr (4) PipoCanaja (3) TheGreatDoc (3) martinberg (3) robje (2) loopodoopo (2) Npeca75 (2) drshawnkwang (2) jul13579 (2) bakerds (2) SourceDoctor (2) deajan (2) jonathansm (1) lfkeitel (1) Deltawings (1) fcuello-gc (1) drommc (1) techladsjamie (1) duhow (1) hjcday (1) DanielMuller-TN (1) blagh (1) cenjui (1) TheGracens (1) eskyuu (1) nq5 (1) mjbnz (1) roycruse (1) ottorei (1) si458 (1) nmanzi (1) apokryphal (1) thford89 (1) arjitc (1) tuxgasy (1) kterobinson (1) bl3nd3r (1) hanserasmus (1) mpikzink (1) dagbdagb (1) sthen (1) ahmedsajid (1) dorkmatt (1) evheros (1) nightcore500 (1) CirnoT (1) Thanks to maintainers and others that helped with pull requests this month: murrant (53) Jellyfrog (47) PipoCanaja (7) SourceDoctor (5) ottorei (5) mpikzink (2) arjitc (1) salmayno (1) yoeunes (1) Aeet (1) oussama-aitmi (1) nightcore500 (1) drshawnkwang (1)","title":"21.11.0"},{"location":"General/Changelog/#feature_22","text":"Discovery on Reboot ( #13422 ) - SourceDoctor","title":"Feature"},{"location":"General/Changelog/#security_17","text":"Fix widget title injection vulnerability ( #13452 ) - murrant Kick other sessions when changing password ( #13194 ) - murrant","title":"Security"},{"location":"General/Changelog/#device_28","text":"APC Load, wrong low precision oid ( #13506 ) - jonathansm Nokia SAR HMC ( #13503 ) - loopodoopo Ciena 2 ( #13491 ) - loopodoopo Added initial IPv6 Address discovery for TP-LINK Jetstream ( #13484 ) - Npeca75 Update Windows Versions ( #13474 ) - arrmo Support for PDUMNV30HVLX with PADM 20 ( #13473 ) - drommc Opengear improvement, don't needlessly fetch ogEmdTemperatureTable ( #13471 ) - drshawnkwang RouterOS now returns the correct runtime ( #13461 ) - murrant Fix latitude having an extra - in the middle after the decimal point ( #13454 ) - techladsjamie Fix Sophos-XG OID for number of active tunnels ( #13444 ) - Nocturr Fix hwg poseidon state sensors ( #13438 ) - TheGreatDoc UniFi/EdgeSwitch OS support for fw 5.x ( #13434 ) - Nocturr Added support for Extreme SLX-OS switches ( #13431 ) - bakerds Mikrotik vlans discovery, v2 ( #13427 ) - Npeca75 Added sensor discovery for APC NetworkAIR FM and InfraStruXure ATS ( #13426 ) - bakerds Add Sophos-XG OID for monitoring HA, IPSec and license state ( #13423 ) - Nocturr Add more discovery components for Dell PowerConnect 28xx ( #13420 ) - duhow Added Wireless Sensors for Teltonika RUTX Routers ( #13419 ) - hjcday Add APC PowerChute sysObjectID ( #13406 ) - cenjui Fix APC high precision divisor ( #13405 ) - TheGracens Luminato device doesn't support alternative uptimes ( #13399 ) - eskyuu Update ports module to accept VDSL2 ifType in xDSL polling ( #13393 ) - roycruse Fix windows fanspeed ( #13376 ) - si458 Add support for Teltonika RUT360 ( #13375 ) - martinberg Add support for NTI Enviromux ( #13373 ) - martinberg Update Himoinsa Genset discovery ( #13356 ) - TheGreatDoc Improve Poweralert based devices support ( #13340 ) - arjitc Add iDrac physical disk state ( #13264 ) - tuxgasy Add opengear humidity to sensors ( #13226 ) - drshawnkwang IOS/IOSXE PoE stats ( #13213 ) - martinberg Poll SPU memory from Juniper SRX devices ( #13191 ) - bl3nd3r Extend support for Endrun Sonoma Meridian II devices. ( #13069 ) - hanserasmus Bintec be.IP plus support ( #12993 ) - jul13579 Eaton Network MS xups sensors ( #12992 ) - dagbdagb Don't hardcode index for Mikrotik LTE wireless statistics ( #12976 ) - sthen OS support for West Mountain 4005i DC PDU ( #12885 ) - dorkmatt FabOS remove disabled dbm sensors ( #12877 ) - evheros Raspberry Pi: Add SNMP extend to monitor IO pins or sensor modules connected to the GPIO header ( #12749 ) - nightcore500 Use high precision OIDs for APC UPS sensors ( #12594 ) - CirnoT","title":"Device"},{"location":"General/Changelog/#webui_25","text":"Increase default session lifetime to one month ( #13505 ) - murrant Fix maintenance mode button in Firefox ( #13500 ) - lfkeitel Only call htmlentities on port ifAlias,ifName, and ifDescr ( #13489 ) - murrant Merchandise shop link in about ( #13485 ) - murrant Tweak new notification appearance ( #13477 ) - murrant Add missing \\ ( #13459 ) - robje Fix syslog widget priority filtering ( #13411 ) - murrant PHP-Flasher for toast messages ( #13401 ) - murrant Update alertlog-widget to allow filtering by device group ( #13380 ) - ottorei","title":"Webui"},{"location":"General/Changelog/#alerting_24","text":"Fix slack errors when variables are not set ( #13476 ) - murrant Fix api transport mult-line parsing ( #13469 ) - murrant Drop PDConnect Install links ( #13407 ) - blagh Port Speed degraded alert rule ( #13371 ) - murrant Added Unpolled Devices rule to collection ( #12896 ) - ahmedsajid","title":"Alerting"},{"location":"General/Changelog/#graphs_18","text":"Add missing graph definition for pf_matches (pfSense firewall) ( #13507 ) - robje","title":"Graphs"},{"location":"General/Changelog/#snmp-traps_7","text":"SNMP Trap handler: UpsTrapOnBattery ( #13482 ) - TheGreatDoc","title":"Snmp Traps"},{"location":"General/Changelog/#applications_21","text":"Doc - MySQL Application ( #13495 ) - Deltawings","title":"Applications"},{"location":"General/Changelog/#api_21","text":"Add get_ports_by_group API function ( #13361 ) - nmanzi","title":"Api"},{"location":"General/Changelog/#discovery_17","text":"Fix Dispatcher service not discovering poller groups ( #13377 ) - murrant Modified SQL delete statement for vrf is null ( #13199 ) - kterobinson","title":"Discovery"},{"location":"General/Changelog/#polling_17","text":"Added TOS support for fping ( #13496 ) - PipoCanaja Fix SnmpQuery mibdir from os group ( #13475 ) - murrant Fix application and storage query errors ( #13417 ) - murrant Fix uptime polling event ( #13388 ) - murrant Keep stats for snmptranslate ( #13379 ) - murrant Rewrite netstats polling ( #13368 ) - murrant Run Alert Rules on Service status change. ( #13348 ) - thford89","title":"Polling"},{"location":"General/Changelog/#rancid_3","text":"Show single quotes correcting for device configs ( #13360 ) - apokryphal","title":"Rancid"},{"location":"General/Changelog/#oxidized_8","text":"Syslog hook examples and documentation for Procurve devices ( #13397 ) - nq5","title":"Oxidized"},{"location":"General/Changelog/#bug_27","text":"Fix PyMySQL upstream dependency bug ( #13508 ) - murrant Fix net-snmp unformatted strings ( #13486 ) - murrant [bug] Fix & extend MAC OUI table updates ( #13479 ) - PipoCanaja Attempt to fix dispatcher stats thread exception ( #13478 ) - murrant PHP8, correct multiplication in packages application ( #13462 ) - arrmo Don't use proxy for localhost (Oxidized and Prometheus) ( #13450 ) - murrant Better handling of some alerting errors ( #13446 ) - murrant Fix PHP8 error in sensor unit conversion ( #13433 ) - arrmo PHP8 Unit Conversion, ups-nut ( #13432 ) - arrmo Services and ping not polling default groups ( #13403 ) - murrant Increase length of devices_attribs.attrib_type column ( #13395 ) - mjbnz Bug - Fix missing uptime in fillable (Device Model) ( #13387 ) - PipoCanaja Fix regression from #12998 ( #13385 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#refactor_16","text":"Change how options are handled for SnmpQuery ( #13488 ) - murrant Rename concrete SnmpQuery class to avoid confusion ( #13412 ) - murrant Fully convert core to a modern module ( #13347 ) - murrant New plugin system based on Laravel Package Development ( #12998 ) - mpikzink","title":"Refactor"},{"location":"General/Changelog/#cleanup_17","text":"Fixes for misc unset variables ( #13421 ) - murrant Remove unused snom files ( #13369 ) - murrant Fix config fetch disrupted by stderr ( #13362 ) - deajan Use PHPStan level 6 ( #13308 ) - Jellyfrog","title":"Cleanup"},{"location":"General/Changelog/#documentation_27","text":"Fix typo in filepath for unit-tests to work ( #13440 ) - Nocturr Debian 11 Install Docs ( #13430 ) - SourceDoctor Don't suggest running validate.php as root ( #13378 ) - murrant","title":"Documentation"},{"location":"General/Changelog/#tests_16","text":"Fix IPV6 test ( #13468 ) - Jellyfrog Ability to save cipsec-tunnels test data ( #13463 ) - murrant Run phpstan locally with lnms dev:check lint ( #13458 ) - murrant Dusk: improve speed and safety ( #13370 ) - murrant","title":"Tests"},{"location":"General/Changelog/#dependencies_24","text":"Bump psutil=>5.6.0 to satifsy command_runner ( #13501 ) - Jellyfrog Update to Larastan 1.0 ( #13466 ) - Jellyfrog Update PHP dependencies ( #13396 ) - murrant Install new python dependencies during daily maintenance ( #13186 ) - deajan","title":"Dependencies"},{"location":"General/Changelog/#21100","text":"(2021-10-16) A big thank you to the following 21 contributors this last month: murrant (40) SourceDoctor (9) Jellyfrog (5) loopodoopo (3) Cupidazul (3) maxnz (3) mpikzink (3) ottorei (2) gs-kamnas (2) topranks (2) mctaguma (1) DanielMuller-TN (1) hjcday (1) dependabot (1) calvinthefreak (1) si458 (1) Laplacence (1) peelman (1) noaheroufus (1) deajan (1) lutfisan (1) Thanks to maintainers and others that helped with pull requests this month: murrant (36) Jellyfrog (29) SourceDoctor (7) ottorei (1) PipoCanaja (1)","title":"21.10.0"},{"location":"General/Changelog/#feature_23","text":"New SNMP code and lnms snmp:fetch command ( #13303 ) - murrant Add eventlog on_create device version 2 w/deps ( #13302 ) - Cupidazul Push Notifications (Mobile and PC) ( #13277 ) - murrant Modified Prometheus extension to support adding a prefix to metric names ( #13272 ) - topranks Config seeder ( #13259 ) - murrant Infer character encoding for ifAlias and sysLocation ( #13248 ) - murrant Log count of logged in users in database from HOST-RESOURCES-MIB ( #13137 ) - SourceDoctor","title":"Feature"},{"location":"General/Changelog/#security_18","text":"Use the same error message for different kind of authentiction errors ( #13306 ) - Jellyfrog","title":"Security"},{"location":"General/Changelog/#device_29","text":"Added support for Teltonika RUTX series routers ( #13350 ) - hjcday Ericsson TN - Wireless MSE ( #13328 ) - loopodoopo Ciena 6500 Optics sensors ( #13324 ) - loopodoopo Ericsson Traffic Node support ( #13299 ) - loopodoopo Procurve E model prefix fix ( #13261 ) - maxnz Fix axis cam discovery ( #13258 ) - maxnz Wireless and GSM Basic Monitoring ( #13255 ) - Cupidazul Added SAF Integra-X OS Support ( #13236 ) - noaheroufus Arubaos cx hardware ( #13045 ) - maxnz MegaRaid controller in Linux (Broadcom/LSI) ( #12999 ) - mpikzink Add Ericsson IPOS router support ( #12625 ) - lutfisan","title":"Device"},{"location":"General/Changelog/#webui_26","text":"Alert detail display fix ( #13335 ) - SourceDoctor Show Detail by default Option on Alert Widget ( #13309 ) - SourceDoctor Fix various port links ( #13296 ) - murrant Add ORDER BY to the ports query when showing the ports list on device\u2026 ( #13276 ) - peelman Use local timezone for outages pages ( #13274 ) - ottorei Remove device dark mode detection ( #13273 ) - murrant Linkable graph component ( #13263 ) - murrant Improve tailwind dark theme colors ( #13262 ) - murrant Workaround for dashboard widgets showing over popups. ( #13257 ) - murrant","title":"Webui"},{"location":"General/Changelog/#alerting_25","text":"Fix alert transport api with POST method ( #13288 ) - Laplacence","title":"Alerting"},{"location":"General/Changelog/#graphs_19","text":"Fix graphs showing bps instead of pps ( #13266 ) - Cupidazul","title":"Graphs"},{"location":"General/Changelog/#snmp-traps_8","text":"HP Fault Traps ( #13254 ) - mpikzink Veeam backup SNMP Traps ( #13170 ) - mpikzink","title":"Snmp Traps"},{"location":"General/Changelog/#api_22","text":"Added conditional check for rules parameter on add_device_group ( #13353 ) - DanielMuller-TN API add_device: respond with more device array ( #13251 ) - SourceDoctor API Call to assign/remove a Portgroup to Ports ( #13245 ) - SourceDoctor API Call to set instant Maintenance mode ( #13237 ) - SourceDoctor API port search by arbitrary field ( #13231 ) - SourceDoctor","title":"Api"},{"location":"General/Changelog/#settings_3","text":"Automatically set rrdtool_version once ( #13327 ) - murrant","title":"Settings"},{"location":"General/Changelog/#discovery_18","text":"Quick fix for route discovery on PHP8 ( #13284 ) - murrant","title":"Discovery"},{"location":"General/Changelog/#polling_18","text":"Dispatcher bugfix queues not being disabled properly ( #13364 ) - murrant Fix for cimc polling on PHP8 ( #13357 ) - murrant Dispatch Service: Don't stop dispatching if master moves to a node with a queue disabled ( #13355 ) - murrant Fix device query when last_polled_timetaken is null ( #13331 ) - murrant Restore accidentally removed code ( #13330 ) - murrant Allow non-snmp modules to run when snmp disabled ( #13321 ) - murrant Fix python config fetch disrupted by stderr output ( #13295 ) - murrant Fix poller wrapper error ( #13290 ) - murrant","title":"Polling"},{"location":"General/Changelog/#oxidized_9","text":"Added OneOS map for Oxidized ( #13313 ) - calvinthefreak","title":"Oxidized"},{"location":"General/Changelog/#authentication_12","text":"Improvements to SSO Authorization and logout handling ( #13311 ) - gs-kamnas","title":"Authentication"},{"location":"General/Changelog/#bug_28","text":"Fix poller groups reverting when setting via the Web UI. ( #13363 ) - murrant Rename config var auth_redirect_handler -> auth_logout_handler ( #13329 ) - gs-kamnas HrSystem Columns have to be optional ( #13316 ) - SourceDoctor Hrsystem write fix ( #13314 ) - SourceDoctor Check if vlan->port exists ( #13305 ) - Jellyfrog Fix html.device.links validation ( #13269 ) - murrant Fix lnms some commands throwing errors ( #13265 ) - murrant","title":"Bug"},{"location":"General/Changelog/#refactor_17","text":"SnmpQuery updates and more tests ( #13359 ) - murrant Remove load_os and load_discovery functions ( #13345 ) - murrant Rename NetSnmp to SnmpQuery ( #13344 ) - murrant Use Measurements for all statistic collection ( #13333 ) - murrant Use built in trusted proxy functionality ( #13318 ) - murrant Connectivity Helper to check and record device reachability ( #13315 ) - murrant Cleanup config.php.default ( #13297 ) - murrant SNMP Capabilities ( #13289 ) - murrant Cleanup device type override code ( #13256 ) - murrant Full Python code fusion / refactor and hardening 2nd edition ( #13188 ) - deajan Convert all ports backend to Laravel style ajax table ( #13184 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#documentation_28","text":"Change \"move\" to \"migrate\" to make it easier to find ( #13365 ) - murrant Updated link to Dan Brown's migration scripts ( #13354 ) - mctaguma Edit existing install url ( #13342 ) - murrant Oxidized doc update, links and ignore groups ( #13341 ) - murrant Update docs: Update Dispatcher service documentation ( #13339 ) - ottorei Send security researchers to Discord ( #13319 ) - murrant Fix to puppet snmp extend formatting ( #13312 ) - si458 Update formatting of Prometheus extension doc ( #13291 ) - topranks","title":"Documentation"},{"location":"General/Changelog/#tests_17","text":"Disallow usage of deprecated functions ( #13267 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#dependencies_25","text":"Bump composer/composer from 2.1.8 to 2.1.9 ( #13336 ) - dependabot Update dependencies ( #13310 ) - Jellyfrog","title":"Dependencies"},{"location":"General/Changelog/#2190","text":"(2021-09-16) A big thank you to the following 20 contributors this last month: murrant (29) Jellyfrog (5) ottorei (3) SourceDoctor (3) Galileo77 (2) paulierco (2) Fehler12 (2) Negatifff (2) deajan (2) mpikzink (2) vakartel (2) efelon (1) pimvanpelt (1) kimhaak (1) kevinwallace (1) noaheroufus (1) si458 (1) mzacchi (1) niddey (1) PipoCanaja (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (21) murrant (19) ottorei (3) SourceDoctor (2) PipoCanaja (2) mpikzink (1)","title":"21.9.0"},{"location":"General/Changelog/#feature_24","text":"API alert transport can include Options variables in the Body for POST requests ( #13167 ) - mzacchi Show port speed on port graphs, optionally set scale ( #11858 ) - murrant","title":"Feature"},{"location":"General/Changelog/#device_30","text":"Fix Dell server sensors ( #13247 ) - murrant Add mouseover mini graphs that makes sense for Liebert PDU ( #13246 ) - Galileo77 Add ifName to osag os ( #13243 ) - paulierco IfName to mcafeewebgateway ( #13242 ) - paulierco Add VPP logo ( #13230 ) - pimvanpelt Add Support for USW-Flex ( #13229 ) - Fehler12 Added Cisco CBS 250 Support ( #13228 ) - Fehler12 Update geist-watchdog.yaml ( #13223 ) - Galileo77 Add skip_values to Liebert capacity sensor definitions ( #13200 ) - kevinwallace Procurve add SysDescr Regex ( #13196 ) - mpikzink Updated OS Support: Dragonwave Horizon ( #13193 ) - noaheroufus ZTE ZXR10 define discovery for mempool and processor ( #13192 ) - vakartel Dell Network Virtual Link Trunk Status ( #13162 ) - mpikzink","title":"Device"},{"location":"General/Changelog/#webui_27","text":"Update to fix table row color and hover color for dark.css ( #13244 ) - efelon Fix port minigraph layout ( #13240 ) - murrant Sort dashboard entries alphabetically ( #13238 ) - ottorei Fix graph row columns ( #13232 ) - murrant Changed map functionality in device overview ( #13225 ) - kimhaak New Blade Components: x-device-link, x-port-link, x-graph-row, x-popup ( #13197 ) - murrant Add serial search in ajax search process ( #13185 ) - Negatifff Allow device actions to appear in device list and improve docs ( #13177 ) - murrant Show count of Ports in PortGroup display ( #13164 ) - SourceDoctor Change automatic widget updates to use bootgrid when possible ( #13159 ) - niddey","title":"Webui"},{"location":"General/Changelog/#alerting_26","text":"Fix PagerDuty transport's group field ( #13235 ) - ottorei Format port speed changes in the event log ( #13174 ) - murrant","title":"Alerting"},{"location":"General/Changelog/#graphs_20","text":"Change default graph view to zoom in on traffic. ( #13173 ) - murrant","title":"Graphs"},{"location":"General/Changelog/#settings_4","text":"Dynamic Select setting ( #13179 ) - murrant Increase config value length limit ( #13178 ) - murrant Default port group in Settings ( #13175 ) - SourceDoctor Default port_group for new ports ( #13166 ) - SourceDoctor Add support for description texts in Settings page ( #13104 ) - Jellyfrog","title":"Settings"},{"location":"General/Changelog/#discovery_19","text":"Mark snmp disabled devices as skipped ( #13202 ) - murrant Allow more compatibility in STP port discovery/polling ( #13109 ) - PipoCanaja","title":"Discovery"},{"location":"General/Changelog/#polling_19","text":"Fix snmp_bulk setting not being applied ( #13209 ) - murrant Do not poll passive ISIS-circuits ( #13168 ) - ottorei Common contexts for polling ( #13158 ) - murrant Rewrite ISIS Adjacency discovery/polling ( #13155 ) - murrant","title":"Polling"},{"location":"General/Changelog/#oxidized_10","text":"Add sysobjectid and hardware fields into oxidized maps ( #13221 ) - Negatifff","title":"Oxidized"},{"location":"General/Changelog/#bug_29","text":"Fix mempool unit display ( #13241 ) - murrant Select dynamic fixes ( #13187 ) - murrant Validate schema in utc ( #13182 ) - murrant Fix DB Inconsistent friendly error message ( #13163 ) - murrant","title":"Bug"},{"location":"General/Changelog/#refactor_18","text":"Update configuration docs to use lnms config:set ( #13157 ) - murrant Rename nobulk -> snmp_bulk ( #13098 ) - Jellyfrog","title":"Refactor"},{"location":"General/Changelog/#documentation_29","text":"Add security context service ( #13218 ) - deajan Fix numbering in application docs ( #13183 ) - si458 Docs link to webui settings in user's install ( #13176 ) - murrant","title":"Documentation"},{"location":"General/Changelog/#misc_21","text":"Increase RestartSec time to a reasonable value ( #13217 ) - deajan Validate APP_KEY ( #13171 ) - murrant","title":"Misc"},{"location":"General/Changelog/#2180","text":"(2021-08-22) A big thank you to the following 40 contributors this last month: PipoCanaja (12) murrant (10) Jellyfrog (8) paulierco (5) mpikzink (5) ottorei (3) fbourqui (2) facuxt (2) geg347 (2) dennypage (2) opalivan (2) keryazmi (2) wkamlun (2) si458 (2) martinberg (2) vakartel (1) SanderBlom (1) SourceDoctor (1) VirTechSystems (1) Talkabout (1) hannut (1) kevinwallace (1) jasoncheng7115 (1) arjitc (1) igorek24 (1) mtoupsUNO (1) Laplacence (1) tcwarn (1) deajan (1) Npeca75 (1) Negatifff (1) adamus1red (1) rhinoau (1) arrmo (1) e-caille (1) Sea-n (1) saschareichert (1) bennetgallein (1) loopodoopo (1) tikitaru (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (37) murrant (28) PipoCanaja (20) SourceDoctor (2)","title":"21.8.0"},{"location":"General/Changelog/#feature_25","text":"Lnms config:set ability to set os settings ( #13151 ) - murrant Detect sending non-html emails as html ( #13114 ) - murrant Add peak in and out ( #13006 ) - bennetgallein","title":"Feature"},{"location":"General/Changelog/#device_31","text":"Add OSAG new OS ( #13156 ) - paulierco More specific grandstream-ht detection ( #13152 ) - murrant Added voltage, cell states and wireless data for cell interface (GEMDS OS). ( #13142 ) - SanderBlom Opnsense detection ( #13097 ) - mpikzink Added OID for Extreme switch X350-48t ( #13096 ) - tcwarn Add Janitza power consumed ( #13095 ) - mpikzink Added/fixed LLDP discovery ( #13082 ) - Npeca75 Allow stack index other than '1.' for CiscoSB ( #13078 ) - dennypage Add logo for Scientific Linux ( #13075 ) - mpikzink Fix Cisco SLAs garbage entries ( #13068 ) - murrant Cisco ISE version, HW, SW and test-data ( #13062 ) - PipoCanaja Fixed Packetlight EDFA sensors and add test-data ( #13060 ) - opalivan Alcatel-Lucent AOS7 bgp fix2 ( #13059 ) - paulierco Add logo for Linux Mint ( #13055 ) - arrmo Alcatel-Lucent Aos6 ignore second power supply ( #13054 ) - paulierco Alcatel-Lucent Aos7 increase fan threshold ( #13053 ) - paulierco Use non numeric snmpwalk for nxos fan trays ( #13048 ) - e-caille Alcatel-Lucent Aos7 bgp fix ( #13047 ) - paulierco Add number of connected wireless client and number of connected FortiAP ( #13037 ) - wkamlun Update Sensors for ADVA FSP150CC + discovery fix ( #13020 ) - keryazmi Improve dell-compellent detection for newer firmwares ( #13019 ) - saschareichert Poll current connections for F5 ltm ( #12968 ) - martinberg Ericsson 6600 series ( #12931 ) - loopodoopo Fix WUT ThermoHygro with new hardware revisions ( #12913 ) - mpikzink Fix polling current on ICT2000DB-12IRC ( #12529 ) - tikitaru","title":"Device"},{"location":"General/Changelog/#webui_28","text":"Cleanup Port hover minigraph description when using \"Interface Description Parsing\" ( #13143 ) - fbourqui Dark mode improvements ( #13141 ) - facuxt Improvements to dark theme. ( #13139 ) - facuxt Adjust App String Pi-hole to project name ( #13136 ) - SourceDoctor Sort port selector dropdown ( #13135 ) - VirTechSystems Priority filtering for syslog widget ( #13134 ) - Talkabout Center new service window ( #13115 ) - arjitc Add urlencode for location link in device view ( #13076 ) - Negatifff Add device_group to availability widget hyperlink ( #13061 ) - rhinoau More sensor data on inventory page ( #13057 ) - PipoCanaja","title":"Webui"},{"location":"General/Changelog/#api_23","text":"Adding API route to set bgpPeerDescr field ( #13056 ) - geg347 API mac search ( #12964 ) - mpikzink","title":"Api"},{"location":"General/Changelog/#alerting_27","text":"Add EU Service Region to PagerDuty transport ( #13154 ) - ottorei Fix HTML encoded characters in Slack ( #13120 ) - geg347 Add SignalWire (Twilio alternative) alert transport support ( #13107 ) - igorek24","title":"Alerting"},{"location":"General/Changelog/#discovery_20","text":"Full Python code fusion / refactor and hardening ( #13094 ) - deajan Extend REGEX filtering option by sensor_class ( #13066 ) - opalivan","title":"Discovery"},{"location":"General/Changelog/#oxidized_11","text":"Follow redirects when reloading Oxidized nodes list ( #13051 ) - martinberg","title":"Oxidized"},{"location":"General/Changelog/#bug_30","text":"Fix issue syslog_xlate containing dots ( #13148 ) - vakartel Enclose IPv6 literal in [brackets] for snmpget and unix-agent ( #13130 ) - kevinwallace Fix lnms scan, nets not detected ( #13129 ) - murrant","title":"Bug"},{"location":"General/Changelog/#documentation_30","text":"Update docs for controlling modules ( #13147 ) - murrant Update docs: Example for optional data on templates ( #13128 ) - ottorei Update FAQs for large groups ( #13110 ) - ottorei Document new optional ups-nut arg1 ( #13072 ) - adamus1red Formatted applications docs for copy/paste ( #13049 ) - si458 Update cleanup config document ( #13026 ) - Sea-n","title":"Documentation"},{"location":"General/Changelog/#translation_11","text":"Updated Traditional Chinese Translation ( #13116 ) - jasoncheng7115","title":"Translation"},{"location":"General/Changelog/#tests_18","text":"Run PHPStan with higher level for new files ( #13108 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#misc_22","text":"Added two indexes to 'syslog' table for performance ( #13105 ) - mtoupsUNO Remove timeouts for passthrough lnms commands ( #13080 ) - murrant Add Laravel task scheduling ( #13074 ) - Jellyfrog","title":"Misc"},{"location":"General/Changelog/#mibs_11","text":"MIB cleaning (misc again) ( #13103 ) - PipoCanaja Added H3C / Comware MIB files ( #13102 ) - Laplacence Update Cisco Small Business (mostly) MIBs ( #13099 ) - dennypage Update NET-SNMP mibs ( #13093 ) - Jellyfrog MIB cleaning for Dell + Gandi ( #13089 ) - PipoCanaja MIB cleaning for Panasonic (1 file) and Avtech (11 files) ( #13088 ) - PipoCanaja MIB cleaning for OS \"Junose\" ( #13087 ) - PipoCanaja MIB cleaning (Misc) ( #13086 ) - PipoCanaja MIB cleaning for Junos ( #13085 ) - PipoCanaja MIB cleaning for HP ( #13084 ) - PipoCanaja MIB cleaning for equallogic ( #13083 ) - PipoCanaja","title":"Mibs"},{"location":"General/Changelog/#dependencies_26","text":"Bump super-linter ( #13073 ) - Jellyfrog Bump larastan ( #13071 ) - Jellyfrog","title":"Dependencies"},{"location":"General/Changelog/#2170","text":"(2021-07-16) A big thank you to the following 27 contributors this last month: murrant (9) rhinoau (8) PipoCanaja (5) mpikzink (4) mathieu-artic (4) martinberg (3) Npeca75 (2) epiecs (2) Sea-n (2) paulierco (2) djamp42 (2) Jellyfrog (1) geg347 (1) ziodona85 (1) keryazmi (1) hanserasmus (1) edgetho007 (1) dagbdagb (1) jbronn (1) adamboutcher (1) VirTechSystems (1) skoobasteeve (1) dependabot (1) si458 (1) kdanev14 (1) cjsoftuk (1) jezekus (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (32) murrant (14) PipoCanaja (13)","title":"21.7.0"},{"location":"General/Changelog/#feature_26","text":"Support multiple db servers ( #12963 ) - djamp42","title":"Feature"},{"location":"General/Changelog/#device_32","text":"Inital support for Eltex-MES switches ( #13036 ) - Npeca75 Add support for Ucopia Appliances ( #13031 ) - mathieu-artic Fixing irrelevant values rpm packetloss ( #13010 ) - geg347 Added Vlan discovery on LAG ports, Jetstream OS ( #13007 ) - Npeca75 Add showtime start for OneAccess SDSL routers ( #13005 ) - mathieu-artic Arista_mos-support ( #13003 ) - hanserasmus Add LTE/UMTS support for Oneaccess routers ( #13002 ) - mathieu-artic Add Sonicwall OS 7 ( #12997 ) - edgetho007 Added support for the Rittal LCP DX Chiller ( #12995 ) - epiecs Eaton M2 EMP g2 ( #12994 ) - dagbdagb TP-Link Jetstream DDM and PoE Support ( #12990 ) - jbronn Alcatel-Lucent AOS6 to yaml ( #12982 ) - paulierco Added logo svg for Rocky Linux ( #12977 ) - skoobasteeve Added VRP ICMP SLA (NQA in huawei naming) support ( #12973 ) - PipoCanaja EUROstor RAID ( #12969 ) - mpikzink Add support for Liebert humidity setpoint and UPS powerfactor ( #12965 ) - martinberg Added support to new device Controlbox TH-332B ( #12940 ) - kdanev14 Add OS Support for Siemens Scalance X Switching ( #12938 ) - rhinoau Alcatel-Lucent aos7 LLDP Neighbors ( #12886 ) - paulierco Add HPE-maPDU support ( #12550 ) - jezekus","title":"Device"},{"location":"General/Changelog/#webui_29","text":"Fix availability widget service backend error ( #13044 ) - rhinoau Fix availability widget device totals ( #13043 ) - rhinoau Don't add %3F=yes to the url ( #13041 ) - murrant Webui - Display app metric if available ( #13023 ) - PipoCanaja Webui - Fix application fault detail display ( #13016 ) - PipoCanaja Two-factor UI config and status display ( #13012 ) - rhinoau Leave it to generate_device_link for sysName/hostName/IP ( #13000 ) - PipoCanaja Filter out NULL lat/lng values from Geographical Map display queries ( #12985 ) - rhinoau Fix ldap/ad group webui settings ( #12967 ) - murrant Create Laravel Sessions Table ( #12962 ) - djamp42 Fix \"Sub-directory Support\" in small steps ( #12951 ) - mpikzink","title":"Webui"},{"location":"General/Changelog/#api_24","text":"Return api error when device doesn't exist ( #12978 ) - VirTechSystems","title":"Api"},{"location":"General/Changelog/#discovery_21","text":"Fix an issue which led to duplication of BGP peers. ( #12932 ) - cjsoftuk","title":"Discovery"},{"location":"General/Changelog/#oxidized_12","text":"Option to filter Oxidized groups ( #12966 ) - martinberg","title":"Oxidized"},{"location":"General/Changelog/#bug_31","text":"Fix scripts to allow pathname with space ( #13027 ) - Sea-n Wrong statement used for Oxidized ignore_groups ( #13001 ) - martinberg Fix typo in filename ( #12996 ) - Sea-n Make migrating after upgrading MySQL easier. ( #12971 ) - murrant Fix proxmox menu url ( #12970 ) - si458","title":"Bug"},{"location":"General/Changelog/#refactor_19","text":"Refractor health ( #13022 ) - mpikzink","title":"Refactor"},{"location":"General/Changelog/#cleanup_18","text":"PHPStan fixes ( #13038 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_31","text":"Documentation cleanup of sections 4-6 ( #13018 ) - rhinoau Documentation cleanup of General, Install, Getting Started sections ( #13013 ) - rhinoau Update Applications.md for SQUID ( #12987 ) - adamboutcher","title":"Documentation"},{"location":"General/Changelog/#misc_23","text":"Aruba 8.8.0 MIBS ( #13042 ) - mpikzink Create HP-SN-AGENT-MIB ( #13009 ) - ziodona85 Update ADVA's MIB file ( #13004 ) - keryazmi Help users that did not upgrade MySQL try two ( #12989 ) - murrant Add renamehost function result handling and exit codes to renamehost.php ( #12980 ) - rhinoau","title":"Misc"},{"location":"General/Changelog/#dependencies_27","text":"Php-cs-fixer 3 prep ( #13039 ) - murrant PHP dependencies update ( #13034 ) - murrant Bump phpmailer/phpmailer from 6.4.1 to 6.5.0 ( #12975 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2160","text":"(2021-06-17) A big thank you to the following 23 contributors this last month: mpikzink (9) murrant (6) PipoCanaja (5) dust241999 (3) mathieu-artic (2) paulierco (2) paddy01 (2) andrzejmaczka (2) zombah (1) BennyE (1) Sea-n (1) jbronn (1) d-k-7 (1) systemcrash (1) loopodoopo (1) maesbrisa (1) thomseddon (1) cliffalbert (1) Jellyfrog (1) wolfraider (1) rpardim (1) geg347 (1) ottorei (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (31) PipoCanaja (15) murrant (10) tayyabali785 (1)","title":"21.6.0"},{"location":"General/Changelog/#feature_27","text":"New module add juniper rpm support + reimplementation of cisco-sla module ( #12799 ) - geg347 ISIS-adjacency polling support ( #12461 ) - ottorei","title":"Feature"},{"location":"General/Changelog/#device_33","text":"Add Serialnumber for some Dell ForceTen devices ( #12960 ) - mpikzink 2 more Rittal variants ( #12953 ) - mpikzink Added New-OS: Alcatel-Lucent Enterprise Stellar Wireless ( #12952 ) - BennyE Add SDSL Support for OneAccess routers ( #12948 ) - mathieu-artic Improve TP-Link JetStream Discovery ( #12946 ) - jbronn Alcatel-Lucent aos6 and aos7 fdb fix ( #12945 ) - paulierco Janitza UMG96 ( #12944 ) - mpikzink Imporoved raritan pdu support ( #12937 ) - d-k-7 Alcatel-Lucent Aos7 sensors nobulk ( #12935 ) - paulierco Add Epson Projector as new OS ( #12928 ) - mpikzink Add Barco Clickshare ( #12927 ) - mpikzink Fix nokia(TiMOS) memory ( #12925 ) - paddy01 Device - Vertiv-PDU - Issue 11608 ( #12923 ) - dust241999 Adding basic support for Vertiv PDUs and power graphs ( #12908 ) - dust241999 Ciena 6500 ( #12903 ) - loopodoopo Added support for PowerWalker VFI ( #12891 ) - andrzejmaczka Initial HAProxy ALOHA support ( #12889 ) - Jellyfrog HWG WaterLeak sensor support ( #12865 ) - PipoCanaja Added definition for Riello 204 ( #12861 ) - wolfraider Add support for oneaccess router ( #12850 ) - mathieu-artic Gaia VPN IPSEC discovery ( #12823 ) - rpardim","title":"Device"},{"location":"General/Changelog/#webui_30","text":"Human readable database inconsistent error ( #12950 ) - murrant Add TopErrors widget based on ifError_rate ( #12926 ) - PipoCanaja Fix \"Sub-directory Support\" in small steps ( #12911 ) - mpikzink Fix \"Sub-directory Support\" in small steps ( #12910 ) - mpikzink Fix \"Sub-directory Support\" in small steps ( #12905 ) - mpikzink FIX Alert rules: Import from Alert Rule ( #12897 ) - andrzejmaczka Fix port down alert toggle ( #12884 ) - murrant","title":"Webui"},{"location":"General/Changelog/#authentication_13","text":"Add number sign to special character handling in ActiveDirectoryAuthorizer ( #12943 ) - paddy01","title":"Authentication"},{"location":"General/Changelog/#applications_22","text":"Fix type error ( #12899 ) - murrant","title":"Applications"},{"location":"General/Changelog/#api_25","text":"Add api call to list OSPF ports ( #12955 ) - zombah","title":"Api"},{"location":"General/Changelog/#alerting_28","text":"Add Signal CLI transport support ( #12954 ) - mpikzink Update device_component_down_junos macro ( #12898 ) - thomseddon","title":"Alerting"},{"location":"General/Changelog/#discovery_22","text":"LLDP - ifAlias should be last checked in function find_port_id ( #12904 ) - PipoCanaja LLDP - Extend discovery lldp code to support different subtypes ( #12901 ) - PipoCanaja","title":"Discovery"},{"location":"General/Changelog/#polling_20","text":"Nobulk setting in sensors yaml ( #12833 ) - murrant","title":"Polling"},{"location":"General/Changelog/#rancid_4","text":"Support for fortiswitch in gen_rancid ( #12894 ) - cliffalbert","title":"Rancid"},{"location":"General/Changelog/#refactor_20","text":"Filter unwanted data in Routes Ajax reply ( #12847 ) - PipoCanaja","title":"Refactor"},{"location":"General/Changelog/#documentation_32","text":"Improve Markdown syntax in Document ( #12949 ) - Sea-n Add info about lnms config:set at top of Configuration page ( #12939 ) - murrant Update docs ( #12919 ) - systemcrash","title":"Documentation"},{"location":"General/Changelog/#2150","text":"(2021-05-17) A big thank you to the following 28 contributors this last month: murrant (34) Jellyfrog (14) PipoCanaja (14) dependabot (7) rpardim (3) wolfraider (2) TheGracens (2) si458 (2) mpikzink (2) Sea-n (2) Negatifff (1) backeby (1) SanderBlom (1) paddy01 (1) nightcore500 (1) arrmo (1) bennetgallein (1) Torch09 (1) m4rkov (1) Schultz (1) thegreatecheese (1) paulierco (1) rasssta (1) craig-nokia (1) dethmetaljeff (1) djamp42 (1) martinberg (1) SourceDoctor (1) Thanks to maintainers and others that helped with pull requests this month: murrant (43) Jellyfrog (42) PipoCanaja (8) SourceDoctor (1) martinberg (1)","title":"21.5.0"},{"location":"General/Changelog/#feature_28","text":"Validate database during the install ( #12867 ) - murrant Collect OUI Database and do OUI lookups ( #12842 ) - PipoCanaja Show OS definition in lnms config:get ( #12819 ) - murrant","title":"Feature"},{"location":"General/Changelog/#security_19","text":"Jquery upgrade ( #12802 ) - murrant Oxidized improvements ( #12773 ) - murrant","title":"Security"},{"location":"General/Changelog/#device_34","text":"Huawei MA5603T ( #12869 ) - Negatifff Unifi 5.60.1 sysObjectID changed ( #12862 ) - wolfraider Add better Unifi processors, supported on some models ( #12854 ) - murrant Added support for GE MDS devices ( #12834 ) - SanderBlom Tripplite snmp trap handling ( #12832 ) - murrant CyberPower UPS Updates ( #12827 ) - arrmo Fix for Gaia Storage duplicated ( #12824 ) - rpardim Checkpoint Gaia Sensor Count ( #12822 ) - rpardim Gaia SecureXL current status and Management Connected Gateways ( #12821 ) - rpardim Zywall - HW, Version, Serial and Tests ( #12788 ) - PipoCanaja Firebrick sensor rework ( #12783 ) - murrant Updated Nexus (nxos) os information and test data ( #12779 ) - Torch09 FabOS sensor fixes and add SFP dBm ( #12777 ) - murrant Vrp - Collect sticky mac addresses in fdb-table ( #12774 ) - PipoCanaja Pop returned value from snmpwalk_group for lldp on mikrotik routeros ( #12768 ) - thegreatecheese Adjust Alcatel-Lucent aos7 ( #12766 ) - paulierco Corrected Chassis Over Temp oid for state indexes ( #12764 ) - craig-nokia Fix outlet sensor indexes overwriting each other when there's more than one infeed ( #12763 ) - dethmetaljeff Calix (occamos) b6_316 and Calix (calix) 700 ( #12744 ) - PipoCanaja Additional data collection for GAIA ( #12713 ) - martinberg","title":"Device"},{"location":"General/Changelog/#webui_31","text":"Fix arp-search remote_interface display ( #12871 ) - PipoCanaja Fix empty label in generate_port_link ( #12870 ) - PipoCanaja Fix server stats widget ( #12864 ) - murrant Disable autocomplete for password in login-form ( #12851 ) - backeby Fix top devices widget storage graphs ( #12849 ) - murrant Fixes to Export CSV ( #12830 ) - paddy01 Alert rule delay/interval empty = 0 ( #12804 ) - murrant Webui - Services bootstrap enable + status ( #12736 ) - PipoCanaja Filter Ports out by Interface Type ( #12590 ) - SourceDoctor","title":"Webui"},{"location":"General/Changelog/#graphs_21","text":"Fix graph argument issues ( #12868 ) - murrant RRD Graph optimization ( #12735 ) - murrant","title":"Graphs"},{"location":"General/Changelog/#applications_23","text":"Add mysql skip slave ( #12826 ) - si458 Added metric for MySQL Slave Lag (secs) ( #12765 ) - rasssta","title":"Applications"},{"location":"General/Changelog/#api_26","text":"Fixing consistency across api endpoints ( #12795 ) - bennetgallein","title":"Api"},{"location":"General/Changelog/#alerting_29","text":"Missing columns in select for $alert->serial & $alert->features ( #12771 ) - PipoCanaja Notify if a sensor has been deleted ( #12755 ) - TheGracens","title":"Alerting"},{"location":"General/Changelog/#discovery_23","text":"Ignore Wrong Type errors in snpm_get and snmp_get_multi_oid ( #12800 ) - murrant Discovery - Compute num_oid to make os development easier ( #12576 ) - PipoCanaja","title":"Discovery"},{"location":"General/Changelog/#polling_21","text":"Fix issue with sensor class case ( #12782 ) - murrant","title":"Polling"},{"location":"General/Changelog/#bug_32","text":"Fix database validations ( #12882 ) - murrant PHP 8 Unit Conversion Fix ( #12857 ) - wolfraider Debug and collect-snmp-data.php fixes ( #12837 ) - murrant Fix allow_unauth_graphs ( #12829 ) - nightcore500 Include variables in default view ( #12818 ) - Jellyfrog Add support for when group doesnt exist ( #12817 ) - Jellyfrog Bump tecnickcom/tcpdf dependency to support php 8 ( #12816 ) - Jellyfrog Prevent error when no alert rules ( #12815 ) - Jellyfrog Small fix in functions.inc.php for PHP8 ( #12793 ) - mpikzink Change printer-supplies rrd name to include the supply_type ( #12792 ) - si458 Revert \"Fix StringBlade errors with a stub file\" ( #12776 ) - Jellyfrog Fix auth and crypto select options ( #12769 ) - Schultz Support X-Forwarded-Proto header ( #12759 ) - Jellyfrog Fix OS sensor array return ( #12694 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#refactor_21","text":"Remove debug globals ( #12811 ) - murrant Make applications work with rrdcached ( #12807 ) - Jellyfrog Make docker app work with rrdcached ( #12746 ) - djamp42","title":"Refactor"},{"location":"General/Changelog/#cleanup_19","text":"Misc cleanup ( #12758 ) - Jellyfrog","title":"Cleanup"},{"location":"General/Changelog/#documentation_33","text":"Plugins should be called statically ( #12810 ) - mpikzink Fix docs custom graph rrd functions ( #12803 ) - murrant Use GitHub instead of Github ( #12781 ) - Sea-n Smokeping sub site requires fcgiwrap ( #12775 ) - m4rkov Document sub index references ( #12767 ) - murrant","title":"Documentation"},{"location":"General/Changelog/#tests_19","text":"Set DBSetupTest timezone to UTC ( #12881 ) - murrant Always test all OS detection. ( #12879 ) - murrant Cache astext in tests to avoid DNS lookup ( #12784 ) - Jellyfrog Enable PHPStan linter ( #12678 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#misc_24","text":"Lnms dev:simulate Snmpsim debug output on failure ( #12880 ) - murrant Enable config:set to set variables inside a nested array of settings ( #12772 ) - murrant","title":"Misc"},{"location":"General/Changelog/#dependencies_28","text":"Bump postcss from 8.2.2 to 8.2.10 ( #12858 ) - dependabot Bump lodash from 4.17.20 to 4.17.21 ( #12848 ) - dependabot Bump url-parse from 1.4.7 to 1.5.1 ( #12844 ) - dependabot Bump phpmailer/phpmailer from 6.4.0 to 6.4.1 ( #12831 ) - dependabot Bump laravel/framework from 8.35.1 to 8.40.0 ( #12814 ) - dependabot Bump composer/composer from 2.0.11 to 2.0.13 ( #12813 ) - dependabot Bump rmccue/requests from 1.7.0 to 1.8.0 ( #12812 ) - dependabot Bump laravel dusk ( #12808 ) - Jellyfrog","title":"Dependencies"},{"location":"General/Changelog/#2140","text":"(2021-04-17) A big thank you to the following 34 contributors this last month: Jellyfrog (35) murrant (26) PipoCanaja (8) Torch09 (2) si458 (2) TheGracens (2) Cupidazul (2) DaveB91 (1) martinberg (1) craig-nokia (1) codejake (1) tamikkelsen (1) dependabot (1) Schultz (1) opalivan (1) hrtrd (1) zombah (1) casdr (1) Wooboy (1) djamp42 (1) dlangille (1) Erik-Lamers1 (1) WillIrvine (1) mpikzink (1) simmonmt (1) yswery-reconz (1) 0x4c6565 (1) antonio-jose-almeida (1) cjsoftuk (1) shepherdjay (1) imwuwei (1) SourceDoctor (1) filippog (1) bofh80 (1) Thanks to maintainers and others that helped with pull requests this month: murrant (50) Jellyfrog (39) PipoCanaja (11) SourceDoctor (1) frank42hh (1) haydenseitz (1)","title":"21.4.0"},{"location":"General/Changelog/#feature_29","text":"Cisco AES256 support ( #12717 ) - Schultz Define Port Groups ( #12402 ) - SourceDoctor Service watchdog - add systemd watchdog for resiliency ( #12188 ) - bofh80","title":"Feature"},{"location":"General/Changelog/#security_20","text":"Escape user editable field ( #12739 ) - murrant Fix SQL injection in rediscover-device ( #12716 ) - Jellyfrog","title":"Security"},{"location":"General/Changelog/#device_35","text":"Added basic support for BKtel Optical Amplifier ( #12754 ) - Torch09 Added Liebert HPM support ( #12747 ) - martinberg Added basic Delta Orion Controller support ( #12741 ) - craig-nokia Basic support for zyxelac_xmg3927 ( #12740 ) - PipoCanaja Added support Cisco CBS350 ( #12737 ) - PipoCanaja Correct OID for c3GsmSimStatus ( #12724 ) - tamikkelsen Added support for Infinera XTM ( #12710 ) - Torch09 TAIT - Add entity physical support ( #12703 ) - opalivan BDCOM update support ( #12696 ) - hrtrd Update IOS with 4948 variant hardware detection ( #12685 ) - zombah VRP - fix global VRF being NULL and not '' for cbgp, support for NetEngine devices ( #12676 ) - PipoCanaja Added support for Canon printer model TM TX series ( #12667 ) - Wooboy Fortinet per-core cpu ( #12660 ) - murrant Fixed polling and health issues for 9001 and NCS devices, added suppo\u2026 ( #12640 ) - WillIrvine VRP - Fix SSID Client count ( #12629 ) - PipoCanaja Add CPU and Mem for Teldat Devices ( #12619 ) - Cupidazul Better firebrick support ( #12600 ) - cjsoftuk Huawei VRF BGP_Peers update ( #12585 ) - PipoCanaja Add Packet Buffers as memory for PanOS ( #12582 ) - shepherdjay Parse info from H3C branded comware devices ( #12551 ) - imwuwei","title":"Device"},{"location":"General/Changelog/#webui_32","text":"Fix inventory sensor links when empty ( #12745 ) - murrant Fix mini graphs ( #12738 ) - murrant Fix alert rules display when creating new alert template ( #12731 ) - murrant Fix bug in component table ( #12730 ) - murrant Use native browser lazy load ( #12720 ) - murrant Fix devices latency tab calendar position ( #12684 ) - TheGracens Fix links to non-existent devices ( #12680 ) - murrant Scrollable Dashboard selection menu ( #12656 ) - TheGracens Fix double escaping sysContact on device overview ( #12653 ) - murrant Hide disabled components from overview page CIMC ( #12650 ) - djamp42 Fix progress-bar 0% ( #12648 ) - si458 Add ability to set a custom port on IPMI agents ( #12634 ) - yswery-reconz WebUI - Display interface errors per second instead of accumulated ( #12613 ) - antonio-jose-almeida Add ID to Device Table List and to Device Dependencies Table List + Shorten ifname in Device: Recent Events. ( #12397 ) - Cupidazul","title":"Webui"},{"location":"General/Changelog/#graphs_22","text":"Fix mempools divide by 0 ( #12734 ) - murrant","title":"Graphs"},{"location":"General/Changelog/#alerting_30","text":"Add UKFast PSS transport ( #12624 ) - 0x4c6565 Support multiple Alertmanager URLs ( #12346 ) - filippog","title":"Alerting"},{"location":"General/Changelog/#discovery_24","text":"Fix service template discovery ( #12662 ) - murrant","title":"Discovery"},{"location":"General/Changelog/#polling_22","text":"Allow getting VDSL stats on \"down\" VDSL ports ( #12753 ) - DaveB91 Fix printer state error ( #12681 ) - murrant Translate hex sensor values returned from ipmitool ( #12638 ) - simmonmt","title":"Polling"},{"location":"General/Changelog/#bug_33","text":"Fix globe controller up/down partition bug ( #12757 ) - Jellyfrog Fix scopeIsArchived query ( #12756 ) - Jellyfrog Split port_groups migration to prevent issues ( #12732 ) - murrant Fix ports table when unpolled ports exist ( #12722 ) - murrant JS fixes for IE ( #12721 ) - murrant Correct snmp function usage ( #12714 ) - Jellyfrog Fix adding discrete ipmi sensors by mistake ( #12709 ) - si458 Fix mempool tags ( #12705 ) - murrant Issue with snmpwalk_group string splitting ( #12701 ) - PipoCanaja Use Device object instead of array ( #12699 ) - Jellyfrog Fix alert template variable ping_timestamp ( #12690 ) - Jellyfrog Remove snmp2ipv6 ( #12683 ) - murrant Fix deviceUrl check ( #12682 ) - Jellyfrog Correct globecontroller typo ( #12671 ) - Jellyfrog Fix undefined function in vrp peers ( #12669 ) - murrant Fix Config reference in System validations ( #12668 ) - casdr Fix regression from #12642 ( #12661 ) - Jellyfrog Don't fail on rrd close ( #12659 ) - murrant Change cache table to mediumtext ( #12649 ) - Jellyfrog Fixed VRF name change not updated in DB ( #12644 ) - PipoCanaja Fix a bunch of bugs ( #12643 ) - Jellyfrog Misc cleanup ( #12641 ) - Jellyfrog PHP8 Bug in printChangedStats ( #12639 ) - mpikzink Correct sensor_id variable ( #12633 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#refactor_22","text":"Remove legacy function calls ( #12651 ) - murrant Misc cleanups ( #12642 ) - Jellyfrog Re-implement Printer as a class based module ( #12605 ) - Jellyfrog","title":"Refactor"},{"location":"General/Changelog/#cleanup_20","text":"More cleanups ( #12715 ) - Jellyfrog Cleanup ( #12695 ) - Jellyfrog PHPDoc fixes ( #12693 ) - Jellyfrog PHPDoc fixes ( #12687 ) - Jellyfrog Type hint all device model relations ( #12686 ) - Jellyfrog Linting ( #12677 ) - Jellyfrog Fix misc problems ( #12675 ) - Jellyfrog More PHPDoc changes ( #12674 ) - Jellyfrog Type hint model relations ( #12673 ) - Jellyfrog Make moduleobserver type hinting overridable ( #12670 ) - Jellyfrog Fix more PHPDoc ( #12665 ) - Jellyfrog Replace Auth > Illuminate\\Support\\Facades\\Auth ( #12664 ) - Jellyfrog","title":"Cleanup"},{"location":"General/Changelog/#documentation_34","text":"Fix typos in Dashboards.md ( #12733 ) - codejake Fix doc building ( #12711 ) - Jellyfrog Filter some validation when installed from a package ( #12647 ) - dlangille Add poller_group docs on auto-discovered devices ( #12646 ) - Erik-Lamers1","title":"Documentation"},{"location":"General/Changelog/#tests_20","text":"Add feature to capture a full snmprec ( #12706 ) - Jellyfrog Lint with shellcheck ( #12666 ) - Jellyfrog Enable Black for linter ( #12663 ) - Jellyfrog Add lint GitHub Action ( #12655 ) - murrant","title":"Tests"},{"location":"General/Changelog/#misc_25","text":"Load device relationship from device cache ( #12712 ) - murrant Switch to utf8mb4 ( #12580 ) - Jellyfrog","title":"Misc"},{"location":"General/Changelog/#dependencies_29","text":"Bump phpseclib/phpseclib from 2.0.30 to 3.0.7 ( #12723 ) - dependabot Bump php-amqplib to support PHP8 ( #12698 ) - Jellyfrog Update php dependencies ( #12692 ) - Jellyfrog","title":"Dependencies"},{"location":"General/Changelog/#2130","text":"(2021-03-20) A big thank you to the following 27 contributors this last month: murrant (14) Jellyfrog (12) PipoCanaja (6) SourceDoctor (4) si458 (2) Cormoran96 (2) miff2000 (2) mpikzink (1) rasssta (1) dependabot (1) Chewie9999 (1) bennet-esyoil (1) rkojedzinszky (1) bofh80 (1) WillIrvine (1) pbaldovi (1) h-barnhart (1) waddles (1) scamp (1) aarchijs (1) yrebrac (1) Serphentas (1) theochita (1) Schouwenburg (1) neg2led (1) bakerds (1) CirnoT (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (28) murrant (17) PipoCanaja (8) SourceDoctor (8) f0o (1) crazy-max (1) yrebrac (1)","title":"21.3.0"},{"location":"General/Changelog/#feature_30","text":"Developer device simulation ( #12577 ) - murrant","title":"Feature"},{"location":"General/Changelog/#device_36","text":"Add identification for Edgeswitch 8XP ( #12622 ) - si458 Add more printer data ( #12617 ) - Jellyfrog Update hpe-ilo.yaml ( #12612 ) - rasssta Fix AOS 7 sensors ( #12599 ) - murrant Collect BIOS version for IBMC ( #12586 ) - PipoCanaja Added support for siteboss571 + new tests ( #12568 ) - WillIrvine VRP - Huawei Wifi Controllers and routers 3G/4G update ( #12565 ) - PipoCanaja F5 realservers (node_name) display ( #12553 ) - PipoCanaja Add BGP discovery and polling for Dell OS10 devices ( #12549 ) - waddles Update support for ServersCheck ( #12546 ) - Jellyfrog Add support for Edge-Core ECS4100 series devices ( #12530 ) - scamp Adding Cisco ME1200 support ( #12527 ) - aarchijs Cisco enhanced cellular ( #12463 ) - Schouwenburg Support newer SyncServer ( #12423 ) - neg2led Added alarm detection and optical PMs for Waveserver Ai ( #12380 ) - bakerds","title":"Device"},{"location":"General/Changelog/#webui_33","text":"Fix services availability-map link ( #12632 ) - si458 Add css text center ( #12608 ) - Cormoran96 Sort Type List in Eventlog Pages ( #12572 ) - SourceDoctor Spanning Tree Link in Eventlog ( #12571 ) - SourceDoctor Notifications : display sensor state textual value ( #12554 ) - PipoCanaja GUI - Fix the detailed access point view ( #12543 ) - PipoCanaja Add button to show verbose alert details in the alert, alert-log webui ( #12484 ) - theochita","title":"Webui"},{"location":"General/Changelog/#snmp-traps_9","text":"Fixed typo jnxPowerSupplyOK ( #12556 ) - h-barnhart","title":"Snmp Traps"},{"location":"General/Changelog/#applications_24","text":"Add application powermon ( #12500 ) - yrebrac Chrony support ( #12488 ) - Serphentas Docker stats app ( #12358 ) - Cormoran96","title":"Applications"},{"location":"General/Changelog/#alerting_31","text":"Add Google Chat Transport ( #12558 ) - pbaldovi","title":"Alerting"},{"location":"General/Changelog/#discovery_25","text":"DynamicDiscovery - Guess num_oid if not provided in YAML file ( #12570 ) - PipoCanaja Fix location for devices with broken snmp ( #12544 ) - murrant","title":"Discovery"},{"location":"General/Changelog/#oxidized_13","text":"Oxidized support airfiber ( #12597 ) - murrant","title":"Oxidized"},{"location":"General/Changelog/#bug_34","text":"Bugfix for no sockets on Unix Agents ( #12637 ) - mpikzink Fix Service Templates Dynamic ( #12626 ) - murrant Service templates - fix rules ( #12587 ) - bofh80 Fix vminfo invalid power state in migration ( #12567 ) - murrant Add missing Power states ( #12559 ) - Jellyfrog PHP 8 fixes ( #12528 ) - murrant","title":"Bug"},{"location":"General/Changelog/#refactor_23","text":"Remove legacy json format function ( #12583 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#documentation_35","text":"Update Agent-Setup.md with systemd instructions on how to restrict on which NIC the agent listens. ( #12601 ) - Chewie9999 Broken link on fast-polling page ( #12595 ) - bennet-esyoil Fix bullet points ( #12574 ) - miff2000 Fix the bullet point rendering ( #12560 ) - miff2000","title":"Documentation"},{"location":"General/Changelog/#tests_21","text":"Location tests more reliable ( #12584 ) - murrant Test both MariaDB and MySQL ( #12547 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#misc_26","text":"Set correct min database version ( #12606 ) - Jellyfrog Simplify process reaping ( #12593 ) - rkojedzinszky Fix broken tests ( #12588 ) - Jellyfrog Add minimum database version check ( #12581 ) - Jellyfrog Global Settings - SNMP Timeout ( #12579 ) - SourceDoctor Improved rrdtool version validation ( #12539 ) - murrant Use DNS Location Record for Location ( #12409 ) - SourceDoctor","title":"Misc"},{"location":"General/Changelog/#dependencies_30","text":"Bump elliptic from 6.5.3 to 6.5.4 ( #12602 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2120","text":"(2021-02-16) A big thank you to the following 18 contributors this last month: murrant (9) Jellyfrog (8) PipoCanaja (1) hanserasmus (1) nightcore500 (1) simmonmt (1) SourceDoctor (1) dejantep (1) TridTech (1) Showfom (1) jasoncheng7115 (1) nkringle (1) dependabot (1) Negatifff (1) Cupidazul (1) paddy01 (1) Torch09 (1) bofh80 (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (13) murrant (12) SourceDoctor (5)","title":"21.2.0"},{"location":"General/Changelog/#feature_31","text":"GPS coordinates from device ( #12521 ) - murrant Show Alert Count on Widget ( #12503 ) - SourceDoctor Add Service Templates ( #12107 ) - bofh80","title":"Feature"},{"location":"General/Changelog/#security_21","text":"Fix url generator XSS ( #12507 ) - Jellyfrog Fix XSS in notifications ( #12504 ) - Jellyfrog","title":"Security"},{"location":"General/Changelog/#device_37","text":"VRP - Filter invalid temperature data 0x7fffffff ( #12537 ) - PipoCanaja Rittal CMC III low warn limit and CAN bus current ( #12513 ) - nightcore500 Add TrueNAS temperature ( #12506 ) - simmonmt Update deltaups.yaml definition ( #12497 ) - TridTech Fixes incorrect device overlay graph type for poweralert 12 devices ( #12491 ) - nkringle Socomecpdu support ( #12481 ) - Negatifff Add support for SCS KS air-conditioning Devices ( #12360 ) - Torch09","title":"Device"},{"location":"General/Changelog/#webui_34","text":"Speedup device list ( #12514 ) - Jellyfrog","title":"Webui"},{"location":"General/Changelog/#authentication_14","text":"Fixes issues with binding and authenticating users in nested groups ( #12398 ) - paddy01","title":"Authentication"},{"location":"General/Changelog/#applications_25","text":"Add poller feature for RRDCached SNMP to query remote agent. ( #12430 ) - Cupidazul","title":"Applications"},{"location":"General/Changelog/#discovery_26","text":"Move sysContact polling to discovery ( #12524 ) - Jellyfrog","title":"Discovery"},{"location":"General/Changelog/#bug_35","text":"Better handling of invalid notification dates ( #12523 ) - murrant Fix invalid dates in the database ( #12512 ) - Jellyfrog Fix Fast Ping alerts always running ( #12510 ) - murrant Fix Fast Ping ( #12509 ) - murrant Network map fix Css/img ( #12498 ) - dejantep Correct check for SNMPv3 SHA-192/256 compability ( #12494 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#cleanup_21","text":"Remove perf_times table ( #12517 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_36","text":"Update transports docs ( #12518 ) - hanserasmus Correct rrdcached.sock location on doc ( #12496 ) - Showfom","title":"Documentation"},{"location":"General/Changelog/#translation_12","text":"Updated Traditional Chinese Translation ( #12493 ) - jasoncheng7115","title":"Translation"},{"location":"General/Changelog/#tests_22","text":"\"variant\" is now required for test data ( #12531 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#dependencies_31","text":"Update php packages and fix composer warnings ( #12526 ) - murrant Remove larapoke until they support PHP 8 ( #12522 ) - murrant Bump laravel/framework from 8.22.1 to 8.24.0 ( #12490 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2110","text":"(2021-02-02) A big thank you to the following 37 contributors this last month: murrant (14) Jellyfrog (8) efelon (4) SourceDoctor (4) paulierco (4) TheMysteriousX (3) dependabot (3) crazy-max (2) djamp42 (2) jezekus (2) martijn-schmidt (2) vitalisator (2) hanserasmus (1) lukoramu (1) deveth0 (1) lazyb0nes (1) mpikzink (1) richardlawley (1) Torch09 (1) rk4an (1) FingerlessGlov3s (1) dlehman83 (1) fablabo (1) zerrac (1) loopodoopo (1) alakiza (1) yrebrac (1) nkringle (1) ottorei (1) Senetus (1) WhippingBoy01 (1) haydenseitz (1) admish (1) kedare (1) ah9828 (1) OahzEgroeg (1) Dmkaz (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (36) murrant (26) SourceDoctor (4) f0o (3) ottorei (1) laf (1) calinrigo (1)","title":"21.1.0"},{"location":"General/Changelog/#feature_32","text":"Show Device Group on Map ( #12379 ) - SourceDoctor","title":"Feature"},{"location":"General/Changelog/#security_22","text":"Fix js injection issues in device overview ( #12475 ) - murrant CVE-2020-35700 ( #12422 ) - Jellyfrog","title":"Security"},{"location":"General/Changelog/#device_38","text":"Update enexus for \"SmartPack S\" ( #12465 ) - haydenseitz Added Firepower 4125 ( #12462 ) - WhippingBoy01 Add Alcatel AOS7 bgpdescr & bgpprefix ( #12450 ) - paulierco Panduit PDU ( #12449 ) - Senetus Add sensors for Meinberg Lantime NTP-devices ( #12447 ) - ottorei Adds tripplight snmpwebcard support ( #12445 ) - nkringle Add mempools, cpu and storage to some arbor devices ( #12444 ) - TheMysteriousX Filter Juniper mempools ( #12443 ) - TheMysteriousX Add planet-pdu os device ( #12441 ) - paulierco Add WTI POWER os device ( #12440 ) - jezekus Enumerate sensors under the Outlet for the entity-physical inventory ( #12439 ) - martijn-schmidt Nokia sap graph ( #12432 ) - loopodoopo Apc epdu ( #12428 ) - zerrac Fix for Mikrotik SwOS discovery ( #12426 ) - jezekus New device OS: McafeeWebGateway ( #12418 ) - paulierco Make LibreNMS recognize Schleifenbauer model DPM27/E with existing OS definition ( #12414 ) - martijn-schmidt Update OPNsense version Regex, for _ releases ( #12407 ) - FingerlessGlov3s Change raspberry_pi_sensors state ( #12390 ) - mpikzink Added support for Motorola and Thomson DOCSIS Cable Modems. ( #12386 ) - lukoramu Check Point: Added HA state support ( #12382 ) - lazyb0nes Add Zyxel IES 5206 and 5212 to supported Devices ( #12373 ) - Torch09 Alcatel-Lucent support part2 ( #12369 ) - paulierco Eltek Enexus. Disable some battery sensors if no battery bank is installed at all. ( #12367 ) - vitalisator New device os Raisecom Router OS (ROAP) ( #12361 ) - vitalisator Freenas storage polling fix ( #12275 ) - Dmkaz","title":"Device"},{"location":"General/Changelog/#webui_35","text":"Fix exception in device overview puppet widget ( #12474 ) - murrant Support new lines in login_message again ( #12469 ) - efelon Fix poller frequency display bug and warn ( #12466 ) - murrant Remove unnecessary horizontal scroll bars in allert widgets ( #12464 ) - efelon Reintroduce word wrapping to the custom login message ( #12460 ) - efelon Add a button to reset port state history ( #12457 ) - TheMysteriousX Improving readability of tables on dark theme dashboards ( #12455 ) - efelon Changed default param max_rows to increase widget count on dashboard ( #12438 ) - alakiza Fix percent bar text location ( #12406 ) - rk4an Don't show gelocation on snmp location string ( #12384 ) - SourceDoctor Copy Dashboard to other User ( #11989 ) - SourceDoctor Output image for graphs with no data ( #11865 ) - murrant","title":"Webui"},{"location":"General/Changelog/#authentication_15","text":"Ldap auth handle no search more gracefully ( #12424 ) - murrant","title":"Authentication"},{"location":"General/Changelog/#api_27","text":"Fix oxidized API call when config is missing ( #12476 ) - murrant Allow logs to be filtered by min/max id ( #12471 ) - kedare","title":"Api"},{"location":"General/Changelog/#bug_36","text":"Fix broken statement on auto discovery ( #12408 ) - djamp42 Remove unused openssl_ver ( #12378 ) - murrant Fix version compare ( #12376 ) - murrant","title":"Bug"},{"location":"General/Changelog/#documentation_37","text":"Update Rancid.md ( #12487 ) - fablabo Creating Documentation page ( #12486 ) - yrebrac Added missing / on internal link ( #12467 ) - admish Lnms link in /usr/bin ( #12446 ) - murrant Update Documentation ( #12411 ) - dlehman83 Document flattened Inventory API function ( #12404 ) - richardlawley Update docs for raspberry.sh ( #12389 ) - deveth0 Update to incorporate new locking mechanisms ( #12388 ) - hanserasmus Update Distributed-Poller.md Discovery using dispatcher service ( #12387 ) - djamp42 Doc - Increase Nginx Timeout ( #12368 ) - SourceDoctor","title":"Documentation"},{"location":"General/Changelog/#tests_23","text":"Add test to check if os parameter matches filename ( #12442 ) - Jellyfrog Remove Travis support ( #12416 ) - crazy-max GitHub Actions dev:check ci ( #12392 ) - crazy-max","title":"Tests"},{"location":"General/Changelog/#misc_27","text":"Cast REDIS_TIMEOUT to integer ( #12482 ) - OahzEgroeg Redis - Add scheme to allow TLS ( #12477 ) - ah9828","title":"Misc"},{"location":"General/Changelog/#dependencies_32","text":"Remove PHP8 blockers in LibreNMS ( #12451 ) - murrant Bump laravel/framework from 8.21.0 to 8.22.1 ( #12448 ) - dependabot Update php dependencies ( #12425 ) - murrant Upgrade to Laravel Mix 6 ( #12421 ) - Jellyfrog Bump axios from 0.19.2 to 0.21.1 ( #12420 ) - dependabot Bump ini from 1.3.5 to 1.3.8 ( #12395 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#old-changelogs","text":"","title":"Old Changelogs"},{"location":"General/Releases/","text":"Choosing a release We try to ensure that breaking changes aren't introduced by utilising various automated code testing, syntax testing and unit testing along with manual code review. However bugs can and do get introduced as well as major refactoring to improve the quality of the code base. We have two branches available for you to use. The default is the master branch. Development branch Our master branch is our dev branch, this is actively commited to and it's not uncommon for multiple commits to be merged in daily. As such sometimes changes will be introduced which will cause unintended issues. If this happens we are usually quick to fix or revert those changes. We appreciate everyone that runs this branch as you are in essence secondary testers to the automation and manually testing that is done during the merge stages. You can configure your install (this is the default) to use this branch by setting lnms config:set update_channel master and ensuring you switch to the master branch with: cd /opt/librenms && git checkout master Stable branch With this in mind, we provide a monthly stable release which is released on or around the last Sunday of the month. Code pull requests (aside from Bug fixes) are stopped days leading up to the release to ensure that we have a clean working branch at that point. The changelog is also updated and will reference the release number and date so you can see what changes have been made since the last release. To switch to using stable branches you can set lnms config:set update_channel release This will pause updates until the next stable release, at that time LibreNMS will update to the stable release and continue to only update to stable releases. Downgrading is not supported on LibreNMS and will likely cause bugs.","title":"Choosing a release"},{"location":"General/Releases/#choosing-a-release","text":"We try to ensure that breaking changes aren't introduced by utilising various automated code testing, syntax testing and unit testing along with manual code review. However bugs can and do get introduced as well as major refactoring to improve the quality of the code base. We have two branches available for you to use. The default is the master branch.","title":"Choosing a release"},{"location":"General/Releases/#development-branch","text":"Our master branch is our dev branch, this is actively commited to and it's not uncommon for multiple commits to be merged in daily. As such sometimes changes will be introduced which will cause unintended issues. If this happens we are usually quick to fix or revert those changes. We appreciate everyone that runs this branch as you are in essence secondary testers to the automation and manually testing that is done during the merge stages. You can configure your install (this is the default) to use this branch by setting lnms config:set update_channel master and ensuring you switch to the master branch with: cd /opt/librenms && git checkout master","title":"Development branch"},{"location":"General/Releases/#stable-branch","text":"With this in mind, we provide a monthly stable release which is released on or around the last Sunday of the month. Code pull requests (aside from Bug fixes) are stopped days leading up to the release to ensure that we have a clean working branch at that point. The changelog is also updated and will reference the release number and date so you can see what changes have been made since the last release. To switch to using stable branches you can set lnms config:set update_channel release This will pause updates until the next stable release, at that time LibreNMS will update to the stable release and continue to only update to stable releases. Downgrading is not supported on LibreNMS and will likely cause bugs.","title":"Stable branch"},{"location":"General/Security/","text":"General Like any good software we take security seriously. However, bugs do make it into the software along with the history of the code base we inherited. It's how we deal with identified vulnerabilities that should show that we take things seriously. Securing your install As with any system of this nature, we highly recommend that you restrict access to the install via a firewall or VPN. Please ensure you keep your install up to date . Enable HTTPS It is also highly recommended that the Web interface is protected with an SSL certificate such as ones provided by LetsEncrypt . Secure Session Cookies Once you have enabled HTTPS for your install, you should set SESSION_SECURE_COOKIE=true in your .env file. This will require cookies to be transferred by secure protocol and prevent any MiM attacks against it. Trusted Proxies When using a reverse proxy, you may restrict the hosts allowed to forward headers to LibreNMS. By default this allows all proxies, due to legacy reasons. Set APP_TRUSTED_PROXIES in your .env to an empty string or the urls to the proxies allowed to forward. Reporting vulnerabilities Like anyone, we appreciate the work people put in to find flaws in software and welcome anyone to do so with LibreNMS, this will lead to better quality and more secure software for everyone. If you think you've found a vulnerability and want to discuss it with some of the core team then you can contact us on Discord and we will endeavour to get back to as quick as we can, this is usually within 24 hours. We are happy to attribute credit to the findings, but we ask that we're given a chance to patch any vulnerability before public disclosure so that our users can update as soon as a fix is available.","title":"Security information"},{"location":"General/Security/#general","text":"Like any good software we take security seriously. However, bugs do make it into the software along with the history of the code base we inherited. It's how we deal with identified vulnerabilities that should show that we take things seriously.","title":"General"},{"location":"General/Security/#securing-your-install","text":"As with any system of this nature, we highly recommend that you restrict access to the install via a firewall or VPN. Please ensure you keep your install up to date .","title":"Securing your install"},{"location":"General/Security/#enable-https","text":"It is also highly recommended that the Web interface is protected with an SSL certificate such as ones provided by LetsEncrypt .","title":"Enable HTTPS"},{"location":"General/Security/#secure-session-cookies","text":"Once you have enabled HTTPS for your install, you should set SESSION_SECURE_COOKIE=true in your .env file. This will require cookies to be transferred by secure protocol and prevent any MiM attacks against it.","title":"Secure Session Cookies"},{"location":"General/Security/#trusted-proxies","text":"When using a reverse proxy, you may restrict the hosts allowed to forward headers to LibreNMS. By default this allows all proxies, due to legacy reasons. Set APP_TRUSTED_PROXIES in your .env to an empty string or the urls to the proxies allowed to forward.","title":"Trusted Proxies"},{"location":"General/Security/#reporting-vulnerabilities","text":"Like anyone, we appreciate the work people put in to find flaws in software and welcome anyone to do so with LibreNMS, this will lead to better quality and more secure software for everyone. If you think you've found a vulnerability and want to discuss it with some of the core team then you can contact us on Discord and we will endeavour to get back to as quick as we can, this is usually within 24 hours. We are happy to attribute credit to the findings, but we ask that we're given a chance to patch any vulnerability before public disclosure so that our users can update as soon as a fix is available.","title":"Reporting vulnerabilities"},{"location":"General/Updating/","text":"Updating an Install By default, LibreNMS is set to automatically update. If you have disabled this feature then you can perform a manual update. Manual update If you would like to perform a manual update then you can do this by running the following command as the librenms user: ./daily.sh This will update both the core LibreNMS files but also update the database structure if updates are available. Advanced users If you absolutely must update manually without using ./daily.sh then you can do so by running the following commands: cd /opt/librenms git pull ./scripts/composer_wrapper.php install --no-dev ./lnms migrate ./validate.php Disabling automatic updates LibreNMS by default performs updates on a daily basis. This can be disabled in the WebUI Global Settings under System -> Updates, or using lnms Warning You should never remove daily.sh from the cronjob! This does database cleanup and other processes in addition to updating. settings/system/updates lnms config:set update false","title":"Updating"},{"location":"General/Updating/#updating-an-install","text":"By default, LibreNMS is set to automatically update. If you have disabled this feature then you can perform a manual update.","title":"Updating an Install"},{"location":"General/Updating/#manual-update","text":"If you would like to perform a manual update then you can do this by running the following command as the librenms user: ./daily.sh This will update both the core LibreNMS files but also update the database structure if updates are available.","title":"Manual update"},{"location":"General/Updating/#advanced-users","text":"If you absolutely must update manually without using ./daily.sh then you can do so by running the following commands: cd /opt/librenms git pull ./scripts/composer_wrapper.php install --no-dev ./lnms migrate ./validate.php","title":"Advanced users"},{"location":"General/Updating/#disabling-automatic-updates","text":"LibreNMS by default performs updates on a daily basis. This can be disabled in the WebUI Global Settings under System -> Updates, or using lnms Warning You should never remove daily.sh from the cronjob! This does database cleanup and other processes in addition to updating. settings/system/updates lnms config:set update false","title":"Disabling automatic updates"},{"location":"General/Welcome-to-Observium-users/","text":"LibreNMS is a fork of Observium. The reason for the fork has nothing to do with Observium's move to community vs. paid versions . It is simply that we have different priorities and values to the Observium development team. We decided to fork (reluctantly) because we like using Observium, but we want to collaborate on a community-based project with like-minded IT professionals. See README.md and the references there for more information about the kind of community we're trying to promote. LibreNMS was forked from the last GPL-licensed version of Observium . Thanks to one of our users, Dan Brown, who has written a migration script , you can easily move your Observium install over to LibreNMS. This also takes care of moving from one CPU architecture to another. Give it a try :) How LibreNMS will be different from Observium: We will have an inclusive community, where it's OK to ask stupid questions, and OK to ask for things that aren't on the roadmap. If you'd like to see something added, add or comment on the relevant issue in our Community forum . Development decisions will be community-driven. We want to make software that fulfills its users' needs. There are no plans for a paid version, and we don't anticipate this ever changing. There are no current plans for paid support, but this may be added later if there is sufficient demand. We use git for version control and GitHub for hosting to make it as easy and painless as possible to create forked or private versions. Reasons why you might want to use Observium instead of LibreNMS: You have a financial investment in Observium and aren't concerned about community contributions. You don't like the GNU General Public License, version 3 or the philosophy of Free Software/copyleft in general. Reasons why you might want to use LibreNMS instead of Observium: You want to work with others on the project, knowing that your investment of time and effort will not be wasted . You want to add and experiment with features that are not a priority for the Observium developers. See CONTRIBUTING for more details. You want to make use of the additional features LibreNMS can offer.","title":"Welcome to Observium users"},{"location":"Installation/Docker/","text":"Docker An official LibreNMS docker image based on Alpine Linux and Nginx is available on DockerHub . Documentation Full install and configuration documentation can be found on the GitHub repository . Quick install Install docker: https://docs.docker.com/engine/install/ Download and unzip composer files: mkdir librenms cd librenms wget https://github.com/librenms/docker/archive/refs/heads/master.zip unzip master.zip cd docker-master/examples/compose Set a new mysql password in .env and inspect compose.yml Bring up the docker containers sudo docker compose -f compose.yml up -d Open webui to finish configuration. http://localhost:8000 (use the correct ip or name instead of localhost)","title":"Docker"},{"location":"Installation/Docker/#docker","text":"An official LibreNMS docker image based on Alpine Linux and Nginx is available on DockerHub .","title":"Docker"},{"location":"Installation/Docker/#documentation","text":"Full install and configuration documentation can be found on the GitHub repository .","title":"Documentation"},{"location":"Installation/Docker/#quick-install","text":"Install docker: https://docs.docker.com/engine/install/ Download and unzip composer files: mkdir librenms cd librenms wget https://github.com/librenms/docker/archive/refs/heads/master.zip unzip master.zip cd docker-master/examples/compose Set a new mysql password in .env and inspect compose.yml Bring up the docker containers sudo docker compose -f compose.yml up -d Open webui to finish configuration. http://localhost:8000 (use the correct ip or name instead of localhost)","title":"Quick install"},{"location":"Installation/Images/","text":"LibreNMS VMs NOTE: We highly advise that you change all passwords on this image when you deploy it!! NOTE: These images ship with a vagrant user, please remove this user account when you deploy it!! NOTE: Read the above note again! We have available for download a pre-built image based on Ubuntu 22.04. These images are built using packer.io . Details of the image and it's setup are: At present we provide the following builds: OVA Built with VirtualBox. OVA Built for VMWare ESXi. Vagrant Box file. Any issues and or help with these images should be reported via Community Forum or our Discord server Setup US Keyboard Etc/UTC Timezone 4 Poller Wrapper threads Software PHP 8.1 MariaDB Syslog-ng Features Oxidized installed but not configured Weathermap plugin enabled Billing enabled RRDCached enabled Service checks enabled Syslog enabled Download All images can be downloaded from GitHub . The tags follow the main LibreNMS repo. When a new LibreNMS release is available we will push new images out running that version. Please do note that if you download an older release with a view to running that specific version, you will need to disable updates lnms config:set update false . Access/Credentials If you are using the VirtualBox image then to access your newly imported VM, these ports are forwarded from your machine to the VM: 8080 for WebUI and 2023 for SSH. Remember to edit/remove them if you change (and you should) the VM network configuration. WebUI (http://localhost) username: librenms password: D32fwefwef SSH (change the password ssh://localhost:2023) username: librenms password: CDne3fwdfds SSH (remove this account) username: vagrant password; vagrant MySQL/MariaDB username: librenms password: D42nf23rewD Contributing If you would like to help with these images whether it's add additional features or default software / settings then you can do so on GitHub .","title":"Virtual machines"},{"location":"Installation/Images/#librenms-vms","text":"NOTE: We highly advise that you change all passwords on this image when you deploy it!! NOTE: These images ship with a vagrant user, please remove this user account when you deploy it!! NOTE: Read the above note again! We have available for download a pre-built image based on Ubuntu 22.04. These images are built using packer.io . Details of the image and it's setup are: At present we provide the following builds: OVA Built with VirtualBox. OVA Built for VMWare ESXi. Vagrant Box file. Any issues and or help with these images should be reported via Community Forum or our Discord server","title":"LibreNMS VMs"},{"location":"Installation/Images/#setup","text":"US Keyboard Etc/UTC Timezone 4 Poller Wrapper threads","title":"Setup"},{"location":"Installation/Images/#software","text":"PHP 8.1 MariaDB Syslog-ng","title":"Software"},{"location":"Installation/Images/#features","text":"Oxidized installed but not configured Weathermap plugin enabled Billing enabled RRDCached enabled Service checks enabled Syslog enabled","title":"Features"},{"location":"Installation/Images/#download","text":"All images can be downloaded from GitHub . The tags follow the main LibreNMS repo. When a new LibreNMS release is available we will push new images out running that version. Please do note that if you download an older release with a view to running that specific version, you will need to disable updates lnms config:set update false .","title":"Download"},{"location":"Installation/Images/#accesscredentials","text":"If you are using the VirtualBox image then to access your newly imported VM, these ports are forwarded from your machine to the VM: 8080 for WebUI and 2023 for SSH. Remember to edit/remove them if you change (and you should) the VM network configuration. WebUI (http://localhost) username: librenms password: D32fwefwef SSH (change the password ssh://localhost:2023) username: librenms password: CDne3fwdfds SSH (remove this account) username: vagrant password; vagrant MySQL/MariaDB username: librenms password: D42nf23rewD","title":"Access/Credentials"},{"location":"Installation/Images/#contributing","text":"If you would like to help with these images whether it's add additional features or default software / settings then you can do so on GitHub .","title":"Contributing"},{"location":"Installation/Install-LibreNMS/","text":"Install LibreNMS Prepare Linux Server You should have an installed Linux server running one of the supported OS. Make sure you select your server's OS in the tabbed options below. Choice of web server is your preference, NGINX is recommended. Connect to the server command line and follow the instructions below. Note These instructions assume you are the root user. If you are not, prepend sudo to the shell commands (the ones that aren't at mysql> prompts) or temporarily become a user with root privileges with sudo -s or sudo -i . Please note the minimum supported PHP version is 8.1 Install Required Packages Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 NGINX apt install acl curl fping git graphviz imagemagick mariadb-client mariadb-server mtr-tiny nginx-full nmap php-cli php-curl php-fpm php-gd php-gmp php-json php-mbstring php-mysql php-snmp php-xml php-zip rrdtool snmp snmpd unzip python3-pymysql python3-dotenv python3-redis python3-setuptools python3-systemd python3-pip whois traceroute NGINX Apache apt install software-properties-common add-apt-repository universe add-apt-repository ppa:ondrej/php apt update apt install acl curl fping git graphviz imagemagick mariadb-client mariadb-server mtr-tiny nginx-full nmap php-cli php-curl php-fpm php-gd php-gmp php-json php-mbstring php-mysql php-snmp php-xml php-zip rrdtool snmp snmpd unzip python3-pymysql python3-dotenv python3-redis python3-setuptools python3-systemd python3-pip whois traceroute apt install software-properties-common add-apt-repository universe add-apt-repository ppa:ondrej/php apt update apt install acl curl apache2 fping git graphviz imagemagick libapache2-mod-fcgid mariadb-client mariadb-server mtr-tiny nmap php-cli php-curl php-fpm php-gd php-gmp php-json php-mbstring php-mysql php-snmp php-xml php-zip rrdtool snmp snmpd whois python3-pymysql python3-dotenv python3-redis python3-setuptools python3-systemd python3-pip unzip traceroute NGINX Apache dnf -y install epel-release dnf -y install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-8.rpm dnf module reset php dnf module enable php:8.1 dnf install bash-completion cronie fping git ImageMagick mariadb-server mtr net-snmp net-snmp-utils nginx nmap php-fpm php-cli php-common php-curl php-gd php-gmp php-json php-mbstring php-process php-snmp php-xml php-zip php-mysqlnd python3 python3-PyMySQL python3-redis python3-memcached python3-pip python3-systemd rrdtool unzip dnf -y install epel-release dnf -y install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-8.rpm dnf module reset php dnf module enable php:remi-8.1 dnf install bash-completion cronie fping gcc git httpd ImageMagick mariadb-server mtr net-snmp net-snmp-utils nmap php-fpm php-cli php-common php-curl php-gd php-gmp php-json php-mbstring php-process php-snmp php-xml php-zip php-mysqlnd python3 python3-devel python3-PyMySQL python3-redis python3-memcached python3-pip python3-systemd rrdtool unzip NGINX apt install apt-transport-https lsb-release ca-certificates wget acl curl fping git graphviz imagemagick mariadb-client mariadb-server mtr-tiny nginx-full nmap php8.2-cli php8.2-curl php8.2-fpm php8.2-gd php8.2-gmp php8.2-mbstring php8.2-mysql php8.2-snmp php8.2-xml php8.2-zip python3-dotenv python3-pymysql python3-redis python3-setuptools python3-systemd python3-pip rrdtool snmp snmpd unzip whois Add librenms user useradd librenms -d /opt/librenms -M -r -s \"$(which bash)\" Download LibreNMS cd /opt git clone https://github.com/librenms/librenms.git Set permissions chown -R librenms:librenms /opt/librenms chmod 771 /opt/librenms setfacl -d -m g::rwx /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache/ /opt/librenms/storage/ setfacl -R -m g::rwx /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache/ /opt/librenms/storage/ Install PHP dependencies su - librenms ./scripts/composer_wrapper.php install --no-dev exit Sometimes when there is a proxy used to gain internet access, the above script may fail. The workaround is to install the composer package manually. For a global installation: wget https://getcomposer.org/composer-stable.phar mv composer-stable.phar /usr/bin/composer chmod +x /usr/bin/composer Set timezone See https://php.net/manual/en/timezones.php for a list of supported timezones. Valid examples are: \"America/New_York\", \"Australia/Brisbane\", \"Etc/UTC\". Ensure date.timezone is set in php.ini to your preferred time zone. Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 vi /etc/php/8.1/fpm/php.ini vi /etc/php/8.1/cli/php.ini vi /etc/php/8.1/fpm/php.ini vi /etc/php/8.1/cli/php.ini vi /etc/php.ini vi /etc/php/8.2/fpm/php.ini vi /etc/php/8.2/cli/php.ini Remember to set the system timezone as well. timedatectl set-timezone Etc/UTC Configure MariaDB Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 vi /etc/mysql/mariadb.conf.d/50-server.cnf vi /etc/mysql/mariadb.conf.d/50-server.cnf vi /etc/my.cnf.d/mariadb-server.cnf vi /etc/mysql/mariadb.conf.d/50-server.cnf Within the [mysqld] section add: innodb_file_per_table=1 lower_case_table_names=0 Then restart MariaDB systemctl enable mariadb systemctl restart mariadb Start MariaDB client mysql -u root NOTE: Change the 'password' below to something secure. CREATE DATABASE librenms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ; CREATE USER 'librenms' @ 'localhost' IDENTIFIED BY 'password' ; GRANT ALL PRIVILEGES ON librenms . * TO 'librenms' @ 'localhost' ; exit Configure PHP-FPM Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/librenms.conf vi /etc/php/8.1/fpm/pool.d/librenms.conf cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/librenms.conf vi /etc/php/8.1/fpm/pool.d/librenms.conf cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/librenms.conf vi /etc/php-fpm.d/librenms.conf cp /etc/php/8.2/fpm/pool.d/www.conf /etc/php/8.2/fpm/pool.d/librenms.conf vi /etc/php/8.2/fpm/pool.d/librenms.conf Change [www] to [librenms] : [librenms] Change user and group to \"librenms\": user = librenms group = librenms Change listen to a unique path that must match your webserver's config ( fastcgi_pass for NGINX and SetHandler for Apache) : listen = /run/php-fpm-librenms.sock If there are no other PHP web applications on this server, you may remove www.conf to save some resources. Feel free to tune the performance settings in librenms.conf to meet your needs. Configure Web Server Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 NGINX vi /etc/nginx/conf.d/librenms.conf Add the following config, edit server_name as required: server { listen 80 ; server_name librenms.example.com ; root /opt/librenms/html ; index index.php ; charset utf-8 ; gzip on ; gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon ; location / { try_files $uri $uri/ /index.php? $query_string ; } location ~ [^/]\\.php(/|$) { fastcgi_pass unix:/run/php-fpm-librenms.sock ; fastcgi_split_path_info ^(.+\\.php)(/.+) $ ; include fastcgi.conf ; } location ~ /\\.(?!well-known).* { deny all ; } } rm /etc/nginx/sites-enabled/default systemctl restart nginx systemctl restart php8.1-fpm NGINX Apache vi /etc/nginx/conf.d/librenms.conf Add the following config, edit server_name as required: server { listen 80 ; server_name librenms.example.com ; root /opt/librenms/html ; index index.php ; charset utf-8 ; gzip on ; gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon ; location / { try_files $uri $uri/ /index.php? $query_string ; } location ~ [^/]\\.php(/|$) { fastcgi_pass unix:/run/php-fpm-librenms.sock ; fastcgi_split_path_info ^(.+\\.php)(/.+) $ ; include fastcgi.conf ; } location ~ /\\.(?!well-known).* { deny all ; } } rm /etc/nginx/sites-enabled/default systemctl restart nginx systemctl restart php8.1-fpm vi /etc/apache2/sites-available/librenms.conf Add the following config, edit ServerName as required: DocumentRoot /opt/librenms/html/ ServerName librenms.example.com AllowEncodedSlashes NoDecode Require all granted AllowOverride All Options FollowSymLinks MultiViews # Enable http authorization headers SetEnvIfNoCase ^Authorization$ \"(.+)\" HTTP_AUTHORIZATION=$1 SetHandler \"proxy:unix:/run/php-fpm-librenms.sock|fcgi://localhost\" a2dissite 000 -default a2enmod proxy_fcgi setenvif rewrite a2ensite librenms.conf systemctl restart apache2 systemctl restart php8.1-fpm NGINX Apache vi /etc/nginx/conf.d/librenms.conf Add the following config, edit server_name as required: server { listen 80 ; server_name librenms.example.com ; root /opt/librenms/html ; index index.php ; charset utf-8 ; gzip on ; gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon ; location / { try_files $uri $uri/ /index.php? $query_string ; } location ~ [^/]\\.php(/|$) { fastcgi_pass unix:/run/php-fpm-librenms.sock ; fastcgi_split_path_info ^(.+\\.php)(/.+) $ ; include fastcgi.conf ; } location ~ /\\.(?!well-known).* { deny all ; } } NOTE: If this is the only site you are hosting on this server (it should be :)) then you will need to disable the default site. Delete the server section from /etc/nginx/nginx.conf systemctl enable --now nginx systemctl enable --now php-fpm Create the librenms.conf: vi /etc/httpd/conf.d/librenms.conf Add the following config, edit ServerName as required: DocumentRoot /opt/librenms/html/ ServerName librenms.example.com AllowEncodedSlashes NoDecode Require all granted AllowOverride All Options FollowSymLinks MultiViews # Enable http authorization headers SetEnvIfNoCase ^Authorization$ \"(.+)\" HTTP_AUTHORIZATION=$1 SetHandler \"proxy:unix:/run/php-fpm-librenms.sock|fcgi://localhost\" NOTE: If this is the only site you are hosting on this server (it should be :)) then you will need to disable the default site. rm -f /etc/httpd/conf.d/welcome.conf systemctl enable --now httpd systemctl enable --now php-fpm NGINX vi /etc/nginx/sites-enabled/librenms.vhost Add the following config, edit server_name as required: server { listen 80 ; server_name librenms.example.com ; root /opt/librenms/html ; index index.php ; charset utf-8 ; gzip on ; gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon ; location / { try_files $uri $uri/ /index.php? $query_string ; } location ~ [^/]\\.php(/|$) { fastcgi_pass unix:/run/php-fpm-librenms.sock ; fastcgi_split_path_info ^(.+\\.php)(/.+) $ ; include fastcgi.conf ; } location ~ /\\.(?!well-known).* { deny all ; } } rm /etc/nginx/sites-enabled/default systemctl reload nginx systemctl restart php8.2-fpm SELinux Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 SELinux not enabled by default SELinux not enabled by default Install the policy tool for SELinux: dnf install policycoreutils-python-utils Configure the contexts needed by LibreNMS semanage fcontext -a -t httpd_sys_content_t '/opt/librenms/html(/.*)?' semanage fcontext -a -t httpd_sys_rw_content_t '/opt/librenms/(rrd|storage)(/.*)?' semanage fcontext -a -t httpd_log_t \"/opt/librenms/logs(/.*)?\" semanage fcontext -a -t bin_t '/opt/librenms/librenms-service.py' restorecon -RFvv /opt/librenms setsebool -P httpd_can_sendmail=1 setsebool -P httpd_execmem 1 chcon -t httpd_sys_rw_content_t /opt/librenms/.env Allow fping Create the file http_fping.tt with the following contents. You can create this file anywhere, as it is a throw-away file. The last step in this install procedure will install the module in the proper location. module http_fping 1.0; require { type httpd_t; class capability net_raw; class rawip_socket { getopt create setopt write read }; } #============= httpd_t ============== allow httpd_t self:capability net_raw; allow httpd_t self:rawip_socket { getopt create setopt write read }; Then run these commands checkmodule -M -m -o http_fping.mod http_fping.tt semodule_package -o http_fping.pp -m http_fping.mod semodule -i http_fping.pp Additional SELinux problems may be found by executing the following command audit2why < /var/log/audit/audit.log SELinux not enabled by default Allow access through firewall Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 Firewall not enabled by default Firewall not enabled by default firewall-cmd --zone public --add-service http --add-service https firewall-cmd --permanent --zone public --add-service http --add-service https Firewall not enabled by default Enable lnms command completion This feature grants you the opportunity to use tab for completion on lnms commands as you would for normal linux commands. ln -s /opt/librenms/lnms /usr/bin/lnms cp /opt/librenms/misc/lnms-completion.bash /etc/bash_completion.d/ Configure snmpd cp /opt/librenms/snmpd.conf.example /etc/snmp/snmpd.conf vi /etc/snmp/snmpd.conf Edit the text which says RANDOMSTRINGGOESHERE and set your own community string. curl -o /usr/bin/distro https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/distro chmod +x /usr/bin/distro systemctl enable snmpd systemctl restart snmpd Cron job cp /opt/librenms/dist/librenms.cron /etc/cron.d/librenms NOTE: Keep in mind that cron, by default, only uses a very limited set of environment variables. You may need to configure proxy variables for the cron invocation. Alternatively adding the proxy settings in config.php is possible too. The config.php file will be created in the upcoming steps. Review the following URL after you finished librenms install steps: https://docs.librenms.org//Support/Configuration/#proxy-support Enable the scheduler cp /opt/librenms/dist/librenms-scheduler.service /opt/librenms/dist/librenms-scheduler.timer /etc/systemd/system/ systemctl enable librenms-scheduler.timer systemctl start librenms-scheduler.timer Copy logrotate config LibreNMS keeps logs in /opt/librenms/logs . Over time these can become large and be rotated out. To rotate out the old logs you can use the provided logrotate config file: cp /opt/librenms/misc/librenms.logrotate /etc/logrotate.d/librenms Web installer Now head to the web installer and follow the on-screen instructions. http://librenms.example.com/install The web installer might prompt you to create a config.php file in your librenms install location manually, copying the content displayed on-screen to the file. If you have to do this, please remember to set the permissions on config.php after you copied the on-screen contents to the file. Run: chown librenms:librenms /opt/librenms/config.php Final steps That's it! You now should be able to log in to http://librenms.example.com/ . Please note that we have not covered HTTPS setup in this example, so your LibreNMS install is not secure by default. Please do not expose it to the public Internet unless you have configured HTTPS and taken appropriate web server hardening steps. Add the first device We now suggest that you add localhost as your first device from within the WebUI. Troubleshooting If you ever have issues with your install, run validate.php: sudo su - librenms ./validate.php There are various options for getting help listed on the LibreNMS web site: https://www.librenms.org/#support What next? Now that you've installed LibreNMS, we'd suggest that you have a read of a few other docs to get you going: Performance tuning Alerting Device Groups Auto discovery Closing We hope you enjoy using LibreNMS. If you do, it would be great if you would consider opting into the stats system we have, please see this page on what it is and how to enable it. If you would like to help make LibreNMS better there are many ways to help . You can also back LibreNMS on Open Collective .","title":"Installing LibreNMS"},{"location":"Installation/Install-LibreNMS/#install-librenms","text":"","title":"Install LibreNMS"},{"location":"Installation/Install-LibreNMS/#prepare-linux-server","text":"You should have an installed Linux server running one of the supported OS. Make sure you select your server's OS in the tabbed options below. Choice of web server is your preference, NGINX is recommended. Connect to the server command line and follow the instructions below. Note These instructions assume you are the root user. If you are not, prepend sudo to the shell commands (the ones that aren't at mysql> prompts) or temporarily become a user with root privileges with sudo -s or sudo -i . Please note the minimum supported PHP version is 8.1","title":"Prepare Linux Server"},{"location":"Installation/Install-LibreNMS/#install-required-packages","text":"Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 NGINX apt install acl curl fping git graphviz imagemagick mariadb-client mariadb-server mtr-tiny nginx-full nmap php-cli php-curl php-fpm php-gd php-gmp php-json php-mbstring php-mysql php-snmp php-xml php-zip rrdtool snmp snmpd unzip python3-pymysql python3-dotenv python3-redis python3-setuptools python3-systemd python3-pip whois traceroute NGINX Apache apt install software-properties-common add-apt-repository universe add-apt-repository ppa:ondrej/php apt update apt install acl curl fping git graphviz imagemagick mariadb-client mariadb-server mtr-tiny nginx-full nmap php-cli php-curl php-fpm php-gd php-gmp php-json php-mbstring php-mysql php-snmp php-xml php-zip rrdtool snmp snmpd unzip python3-pymysql python3-dotenv python3-redis python3-setuptools python3-systemd python3-pip whois traceroute apt install software-properties-common add-apt-repository universe add-apt-repository ppa:ondrej/php apt update apt install acl curl apache2 fping git graphviz imagemagick libapache2-mod-fcgid mariadb-client mariadb-server mtr-tiny nmap php-cli php-curl php-fpm php-gd php-gmp php-json php-mbstring php-mysql php-snmp php-xml php-zip rrdtool snmp snmpd whois python3-pymysql python3-dotenv python3-redis python3-setuptools python3-systemd python3-pip unzip traceroute NGINX Apache dnf -y install epel-release dnf -y install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-8.rpm dnf module reset php dnf module enable php:8.1 dnf install bash-completion cronie fping git ImageMagick mariadb-server mtr net-snmp net-snmp-utils nginx nmap php-fpm php-cli php-common php-curl php-gd php-gmp php-json php-mbstring php-process php-snmp php-xml php-zip php-mysqlnd python3 python3-PyMySQL python3-redis python3-memcached python3-pip python3-systemd rrdtool unzip dnf -y install epel-release dnf -y install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-8.rpm dnf module reset php dnf module enable php:remi-8.1 dnf install bash-completion cronie fping gcc git httpd ImageMagick mariadb-server mtr net-snmp net-snmp-utils nmap php-fpm php-cli php-common php-curl php-gd php-gmp php-json php-mbstring php-process php-snmp php-xml php-zip php-mysqlnd python3 python3-devel python3-PyMySQL python3-redis python3-memcached python3-pip python3-systemd rrdtool unzip NGINX apt install apt-transport-https lsb-release ca-certificates wget acl curl fping git graphviz imagemagick mariadb-client mariadb-server mtr-tiny nginx-full nmap php8.2-cli php8.2-curl php8.2-fpm php8.2-gd php8.2-gmp php8.2-mbstring php8.2-mysql php8.2-snmp php8.2-xml php8.2-zip python3-dotenv python3-pymysql python3-redis python3-setuptools python3-systemd python3-pip rrdtool snmp snmpd unzip whois","title":"Install Required Packages"},{"location":"Installation/Install-LibreNMS/#add-librenms-user","text":"useradd librenms -d /opt/librenms -M -r -s \"$(which bash)\"","title":"Add librenms user"},{"location":"Installation/Install-LibreNMS/#download-librenms","text":"cd /opt git clone https://github.com/librenms/librenms.git","title":"Download LibreNMS"},{"location":"Installation/Install-LibreNMS/#set-permissions","text":"chown -R librenms:librenms /opt/librenms chmod 771 /opt/librenms setfacl -d -m g::rwx /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache/ /opt/librenms/storage/ setfacl -R -m g::rwx /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache/ /opt/librenms/storage/","title":"Set permissions"},{"location":"Installation/Install-LibreNMS/#install-php-dependencies","text":"su - librenms ./scripts/composer_wrapper.php install --no-dev exit Sometimes when there is a proxy used to gain internet access, the above script may fail. The workaround is to install the composer package manually. For a global installation: wget https://getcomposer.org/composer-stable.phar mv composer-stable.phar /usr/bin/composer chmod +x /usr/bin/composer","title":"Install PHP dependencies"},{"location":"Installation/Install-LibreNMS/#set-timezone","text":"See https://php.net/manual/en/timezones.php for a list of supported timezones. Valid examples are: \"America/New_York\", \"Australia/Brisbane\", \"Etc/UTC\". Ensure date.timezone is set in php.ini to your preferred time zone. Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 vi /etc/php/8.1/fpm/php.ini vi /etc/php/8.1/cli/php.ini vi /etc/php/8.1/fpm/php.ini vi /etc/php/8.1/cli/php.ini vi /etc/php.ini vi /etc/php/8.2/fpm/php.ini vi /etc/php/8.2/cli/php.ini Remember to set the system timezone as well. timedatectl set-timezone Etc/UTC","title":"Set timezone"},{"location":"Installation/Install-LibreNMS/#configure-mariadb","text":"Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 vi /etc/mysql/mariadb.conf.d/50-server.cnf vi /etc/mysql/mariadb.conf.d/50-server.cnf vi /etc/my.cnf.d/mariadb-server.cnf vi /etc/mysql/mariadb.conf.d/50-server.cnf Within the [mysqld] section add: innodb_file_per_table=1 lower_case_table_names=0 Then restart MariaDB systemctl enable mariadb systemctl restart mariadb Start MariaDB client mysql -u root NOTE: Change the 'password' below to something secure. CREATE DATABASE librenms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ; CREATE USER 'librenms' @ 'localhost' IDENTIFIED BY 'password' ; GRANT ALL PRIVILEGES ON librenms . * TO 'librenms' @ 'localhost' ; exit","title":"Configure MariaDB"},{"location":"Installation/Install-LibreNMS/#configure-php-fpm","text":"Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/librenms.conf vi /etc/php/8.1/fpm/pool.d/librenms.conf cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/librenms.conf vi /etc/php/8.1/fpm/pool.d/librenms.conf cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/librenms.conf vi /etc/php-fpm.d/librenms.conf cp /etc/php/8.2/fpm/pool.d/www.conf /etc/php/8.2/fpm/pool.d/librenms.conf vi /etc/php/8.2/fpm/pool.d/librenms.conf Change [www] to [librenms] : [librenms] Change user and group to \"librenms\": user = librenms group = librenms Change listen to a unique path that must match your webserver's config ( fastcgi_pass for NGINX and SetHandler for Apache) : listen = /run/php-fpm-librenms.sock If there are no other PHP web applications on this server, you may remove www.conf to save some resources. Feel free to tune the performance settings in librenms.conf to meet your needs.","title":"Configure PHP-FPM"},{"location":"Installation/Install-LibreNMS/#configure-web-server","text":"Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 NGINX vi /etc/nginx/conf.d/librenms.conf Add the following config, edit server_name as required: server { listen 80 ; server_name librenms.example.com ; root /opt/librenms/html ; index index.php ; charset utf-8 ; gzip on ; gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon ; location / { try_files $uri $uri/ /index.php? $query_string ; } location ~ [^/]\\.php(/|$) { fastcgi_pass unix:/run/php-fpm-librenms.sock ; fastcgi_split_path_info ^(.+\\.php)(/.+) $ ; include fastcgi.conf ; } location ~ /\\.(?!well-known).* { deny all ; } } rm /etc/nginx/sites-enabled/default systemctl restart nginx systemctl restart php8.1-fpm NGINX Apache vi /etc/nginx/conf.d/librenms.conf Add the following config, edit server_name as required: server { listen 80 ; server_name librenms.example.com ; root /opt/librenms/html ; index index.php ; charset utf-8 ; gzip on ; gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon ; location / { try_files $uri $uri/ /index.php? $query_string ; } location ~ [^/]\\.php(/|$) { fastcgi_pass unix:/run/php-fpm-librenms.sock ; fastcgi_split_path_info ^(.+\\.php)(/.+) $ ; include fastcgi.conf ; } location ~ /\\.(?!well-known).* { deny all ; } } rm /etc/nginx/sites-enabled/default systemctl restart nginx systemctl restart php8.1-fpm vi /etc/apache2/sites-available/librenms.conf Add the following config, edit ServerName as required: DocumentRoot /opt/librenms/html/ ServerName librenms.example.com AllowEncodedSlashes NoDecode Require all granted AllowOverride All Options FollowSymLinks MultiViews # Enable http authorization headers SetEnvIfNoCase ^Authorization$ \"(.+)\" HTTP_AUTHORIZATION=$1 SetHandler \"proxy:unix:/run/php-fpm-librenms.sock|fcgi://localhost\" a2dissite 000 -default a2enmod proxy_fcgi setenvif rewrite a2ensite librenms.conf systemctl restart apache2 systemctl restart php8.1-fpm NGINX Apache vi /etc/nginx/conf.d/librenms.conf Add the following config, edit server_name as required: server { listen 80 ; server_name librenms.example.com ; root /opt/librenms/html ; index index.php ; charset utf-8 ; gzip on ; gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon ; location / { try_files $uri $uri/ /index.php? $query_string ; } location ~ [^/]\\.php(/|$) { fastcgi_pass unix:/run/php-fpm-librenms.sock ; fastcgi_split_path_info ^(.+\\.php)(/.+) $ ; include fastcgi.conf ; } location ~ /\\.(?!well-known).* { deny all ; } } NOTE: If this is the only site you are hosting on this server (it should be :)) then you will need to disable the default site. Delete the server section from /etc/nginx/nginx.conf systemctl enable --now nginx systemctl enable --now php-fpm Create the librenms.conf: vi /etc/httpd/conf.d/librenms.conf Add the following config, edit ServerName as required: DocumentRoot /opt/librenms/html/ ServerName librenms.example.com AllowEncodedSlashes NoDecode Require all granted AllowOverride All Options FollowSymLinks MultiViews # Enable http authorization headers SetEnvIfNoCase ^Authorization$ \"(.+)\" HTTP_AUTHORIZATION=$1 SetHandler \"proxy:unix:/run/php-fpm-librenms.sock|fcgi://localhost\" NOTE: If this is the only site you are hosting on this server (it should be :)) then you will need to disable the default site. rm -f /etc/httpd/conf.d/welcome.conf systemctl enable --now httpd systemctl enable --now php-fpm NGINX vi /etc/nginx/sites-enabled/librenms.vhost Add the following config, edit server_name as required: server { listen 80 ; server_name librenms.example.com ; root /opt/librenms/html ; index index.php ; charset utf-8 ; gzip on ; gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon ; location / { try_files $uri $uri/ /index.php? $query_string ; } location ~ [^/]\\.php(/|$) { fastcgi_pass unix:/run/php-fpm-librenms.sock ; fastcgi_split_path_info ^(.+\\.php)(/.+) $ ; include fastcgi.conf ; } location ~ /\\.(?!well-known).* { deny all ; } } rm /etc/nginx/sites-enabled/default systemctl reload nginx systemctl restart php8.2-fpm","title":"Configure Web Server"},{"location":"Installation/Install-LibreNMS/#selinux","text":"Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 SELinux not enabled by default SELinux not enabled by default Install the policy tool for SELinux: dnf install policycoreutils-python-utils","title":"SELinux"},{"location":"Installation/Install-LibreNMS/#allow-access-through-firewall","text":"Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 Firewall not enabled by default Firewall not enabled by default firewall-cmd --zone public --add-service http --add-service https firewall-cmd --permanent --zone public --add-service http --add-service https Firewall not enabled by default","title":"Allow access through firewall"},{"location":"Installation/Install-LibreNMS/#enable-lnms-command-completion","text":"This feature grants you the opportunity to use tab for completion on lnms commands as you would for normal linux commands. ln -s /opt/librenms/lnms /usr/bin/lnms cp /opt/librenms/misc/lnms-completion.bash /etc/bash_completion.d/","title":"Enable lnms command completion"},{"location":"Installation/Install-LibreNMS/#configure-snmpd","text":"cp /opt/librenms/snmpd.conf.example /etc/snmp/snmpd.conf vi /etc/snmp/snmpd.conf Edit the text which says RANDOMSTRINGGOESHERE and set your own community string. curl -o /usr/bin/distro https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/distro chmod +x /usr/bin/distro systemctl enable snmpd systemctl restart snmpd","title":"Configure snmpd"},{"location":"Installation/Install-LibreNMS/#cron-job","text":"cp /opt/librenms/dist/librenms.cron /etc/cron.d/librenms NOTE: Keep in mind that cron, by default, only uses a very limited set of environment variables. You may need to configure proxy variables for the cron invocation. Alternatively adding the proxy settings in config.php is possible too. The config.php file will be created in the upcoming steps. Review the following URL after you finished librenms install steps: https://docs.librenms.org//Support/Configuration/#proxy-support","title":"Cron job"},{"location":"Installation/Install-LibreNMS/#enable-the-scheduler","text":"cp /opt/librenms/dist/librenms-scheduler.service /opt/librenms/dist/librenms-scheduler.timer /etc/systemd/system/ systemctl enable librenms-scheduler.timer systemctl start librenms-scheduler.timer","title":"Enable the scheduler"},{"location":"Installation/Install-LibreNMS/#copy-logrotate-config","text":"LibreNMS keeps logs in /opt/librenms/logs . Over time these can become large and be rotated out. To rotate out the old logs you can use the provided logrotate config file: cp /opt/librenms/misc/librenms.logrotate /etc/logrotate.d/librenms","title":"Copy logrotate config"},{"location":"Installation/Install-LibreNMS/#web-installer","text":"Now head to the web installer and follow the on-screen instructions. http://librenms.example.com/install The web installer might prompt you to create a config.php file in your librenms install location manually, copying the content displayed on-screen to the file. If you have to do this, please remember to set the permissions on config.php after you copied the on-screen contents to the file. Run: chown librenms:librenms /opt/librenms/config.php","title":"Web installer"},{"location":"Installation/Install-LibreNMS/#final-steps","text":"That's it! You now should be able to log in to http://librenms.example.com/ . Please note that we have not covered HTTPS setup in this example, so your LibreNMS install is not secure by default. Please do not expose it to the public Internet unless you have configured HTTPS and taken appropriate web server hardening steps.","title":"Final steps"},{"location":"Installation/Install-LibreNMS/#add-the-first-device","text":"We now suggest that you add localhost as your first device from within the WebUI.","title":"Add the first device"},{"location":"Installation/Install-LibreNMS/#troubleshooting","text":"If you ever have issues with your install, run validate.php: sudo su - librenms ./validate.php There are various options for getting help listed on the LibreNMS web site: https://www.librenms.org/#support","title":"Troubleshooting"},{"location":"Installation/Install-LibreNMS/#what-next","text":"Now that you've installed LibreNMS, we'd suggest that you have a read of a few other docs to get you going: Performance tuning Alerting Device Groups Auto discovery","title":"What next?"},{"location":"Installation/Install-LibreNMS/#closing","text":"We hope you enjoy using LibreNMS. If you do, it would be great if you would consider opting into the stats system we have, please see this page on what it is and how to enable it. If you would like to help make LibreNMS better there are many ways to help . You can also back LibreNMS on Open Collective .","title":"Closing"},{"location":"Installation/Migrating-from-Observium/","text":"A LibreNMS user, Dan , has kindly provided full details and scripts to be able to migrate from Observium to LibreNMS. We have mirrored the scripts he's provided with consent, these are available in the scripts\\Migration folder of your installation.. Setup: First I had to lay out my script requirements: Build the RRD directories on LibreNMS Convert the RRD files on Observium to XML (x86 to x64 move) Copy the RRD/XML files to LibreNMS Convert the XML files back to RRD files Add the device to LibreNMS Script: There are two versions of the scripts available for you to download: - One converts the RRDs to XML and then back to RRD files when they hit the destination. This is a requirement if you are moving from x86 to x64. - Assuming you\u2019re moving servers that are on the same architecture, we can skip that step and just SCP the original RRD files. For everything to work as originally intended, you\u2019ll need four files. Put all four files on both servers, the scripts default to /tmp/ : nodelist.txt \u2013 this file contains the list of hosts you would like to move. This must match exactly to the hostname Observium uses mkdir.sh \u2013 this script creates the necessary directories on your LibreNMS server destwork.sh \u2013 depending on the version you choose, this script will add the device to LibreNMS and possibly convert from XML to RRD convert.sh \u2013 convert is the main script we\u2019ll be calling. All of the magic happens here. Feel free to crack open the scripts and modify them to suit you. Each file has a handful of variables you\u2019ll need to set for your conversion. They should be self-explanatory, but please leave a comment if you have trouble. Conversion: This section assumes the following: Root access is available on both servers You have SSH access to both servers All four files have been placed in the tmp directory of both servers I would strongly suggest you start with just one or two hosts and see how things work. For me, 10 standard sized devices took about 20 minutes with the RRD to XML conversion. Every environment will be different, so start slow and work your way up to full automation. SSH Keys First thing we will want to do is exchange SSH keys so that we can automate the login process used by the scripts. Perform these steps on your Observium server: ssh-keygen -t rsa Accept the defaults and enter a passphrase if you wish. Then: ssh-copy-id librenms Where librenms is the hostname or IP of your destination server. Nodelist.txt The nodelist.txt file contains a list of hosts we want to migrate from Observium. These names must match the name of the RRD folder on Observium. You can get those names by running the following \u2013 ls /opt/observium/rrd/ Also important, the nodelist.txt file must be on both your Observium and LibreNMS server . Once you have your list, edit nodelist.txt with nano: nano /tmp/nodelist.txt And replace the dummy data with the hosts you are converting. CTRL+X and then Y to save your modifications. Make the same changes on the LibreNMS server. Script Variables Now that we have nodelist.txt setup correctly, it is time to set the variables in all three shell scripts. We are going to start with convert.sh. Edit it with nano: nano /tmp/convert.sh and change the variables to suit your environment. Here is a quick list of them: DEST \u2013 This should be the IP or hostname of your LibreNMS server L_RRDPATH \u2013 This signifies the location of the LibreNMS RRD directory. The default value is the default install location O_RRDPATH \u2013 Location of the Observium RRD directory. The default value is the default install location MKDIR \u2013 Location of the mkdir.sh script DESTSCRIPT \u2013 Location of the destwork.sh script NODELIST \u2013 Location of the nodelist.txt file Next, edit the destwork.sh script: nano /tmp/destwork.sh","title":"Migrating from Observium"},{"location":"Installation/Migrating-from-Observium/#setup","text":"First I had to lay out my script requirements: Build the RRD directories on LibreNMS Convert the RRD files on Observium to XML (x86 to x64 move) Copy the RRD/XML files to LibreNMS Convert the XML files back to RRD files Add the device to LibreNMS","title":"Setup:"},{"location":"Installation/Migrating-from-Observium/#script","text":"There are two versions of the scripts available for you to download: - One converts the RRDs to XML and then back to RRD files when they hit the destination. This is a requirement if you are moving from x86 to x64. - Assuming you\u2019re moving servers that are on the same architecture, we can skip that step and just SCP the original RRD files. For everything to work as originally intended, you\u2019ll need four files. Put all four files on both servers, the scripts default to /tmp/ : nodelist.txt \u2013 this file contains the list of hosts you would like to move. This must match exactly to the hostname Observium uses mkdir.sh \u2013 this script creates the necessary directories on your LibreNMS server destwork.sh \u2013 depending on the version you choose, this script will add the device to LibreNMS and possibly convert from XML to RRD convert.sh \u2013 convert is the main script we\u2019ll be calling. All of the magic happens here. Feel free to crack open the scripts and modify them to suit you. Each file has a handful of variables you\u2019ll need to set for your conversion. They should be self-explanatory, but please leave a comment if you have trouble.","title":"Script:"},{"location":"Installation/Migrating-from-Observium/#conversion","text":"This section assumes the following: Root access is available on both servers You have SSH access to both servers All four files have been placed in the tmp directory of both servers I would strongly suggest you start with just one or two hosts and see how things work. For me, 10 standard sized devices took about 20 minutes with the RRD to XML conversion. Every environment will be different, so start slow and work your way up to full automation.","title":"Conversion:"},{"location":"Installation/Migrating-from-Observium/#ssh-keys","text":"First thing we will want to do is exchange SSH keys so that we can automate the login process used by the scripts. Perform these steps on your Observium server: ssh-keygen -t rsa Accept the defaults and enter a passphrase if you wish. Then: ssh-copy-id librenms Where librenms is the hostname or IP of your destination server.","title":"SSH Keys"},{"location":"Installation/Migrating-from-Observium/#nodelisttxt","text":"The nodelist.txt file contains a list of hosts we want to migrate from Observium. These names must match the name of the RRD folder on Observium. You can get those names by running the following \u2013 ls /opt/observium/rrd/ Also important, the nodelist.txt file must be on both your Observium and LibreNMS server . Once you have your list, edit nodelist.txt with nano: nano /tmp/nodelist.txt And replace the dummy data with the hosts you are converting. CTRL+X and then Y to save your modifications. Make the same changes on the LibreNMS server.","title":"Nodelist.txt"},{"location":"Installation/Migrating-from-Observium/#script-variables","text":"Now that we have nodelist.txt setup correctly, it is time to set the variables in all three shell scripts. We are going to start with convert.sh. Edit it with nano: nano /tmp/convert.sh and change the variables to suit your environment. Here is a quick list of them: DEST \u2013 This should be the IP or hostname of your LibreNMS server L_RRDPATH \u2013 This signifies the location of the LibreNMS RRD directory. The default value is the default install location O_RRDPATH \u2013 Location of the Observium RRD directory. The default value is the default install location MKDIR \u2013 Location of the mkdir.sh script DESTSCRIPT \u2013 Location of the destwork.sh script NODELIST \u2013 Location of the nodelist.txt file Next, edit the destwork.sh script: nano /tmp/destwork.sh","title":"Script Variables"},{"location":"Support/","text":"How to get Help Browse through the navigation on the left Search in the upper right Check the frequently asked questions Additional Support We have a few methods for you to get in touch to ask for help. Community Forum Ask for Help Feature Requests Discord Active chat and discussion Bug Reports","title":"How to get help"},{"location":"Support/#how-to-get-help","text":"Browse through the navigation on the left Search in the upper right Check the frequently asked questions","title":"How to get Help"},{"location":"Support/#additional-support","text":"We have a few methods for you to get in touch to ask for help. Community Forum Ask for Help Feature Requests Discord Active chat and discussion Bug Reports","title":"Additional Support"},{"location":"Support/1-Minute-Polling/","text":"1-Minute Polling We now have support for polling data at intervals to fit your needs. Please be aware of the following: If you just want faster up/down alerts, Fast Ping is a much easier path to that goal. You must also change your cron entry for poller-wrapper.py for this to work (if you change from the default 300 seconds). Your polling MUST complete in the time you configure for the heartbeat step value. See /poller in your WebUI for your current value. This will only affect RRD files created from the moment you change your settings. This change will affect all data storage mechanisms such as MySQL, RRD and InfluxDB. If you decrease the values then please be aware of the increase in space use for MySQL and InfluxDB. It's highly recommended to configure some performance optimizations . Keep in mind that all your devices will write all graphs every minute to the disk and that every device has many graphs. The most important thing is probably the RRDCached configuration that can save a lot of write IOPS. To make the changes, please navigate to /settings/poller/rrdtool/ within your WebUI. Select RRDTool Setup and then update the two values for step and heartbeat intervals: Step is how often you want to insert data, so if you change to 1 minute polling then this should be 60. Heartbeat is how long to wait for data before registering a null value, i.e 120 seconds. Converting existing RRD files We provide a basic script to convert the default rrd files we generate to utilise your configured step and heartbeat values. Please do ensure that you backup your RRD files before running this just in case. The script runs on a per device basis or all devices at once. The rrd files must be accessible from the server you run this script from. ./scripts/rrdstep.php This will provide the help information. To run it for localhost just run: ./scripts/rrdstep.php -h localhost","title":"1 Minute Polling"},{"location":"Support/1-Minute-Polling/#1-minute-polling","text":"We now have support for polling data at intervals to fit your needs. Please be aware of the following: If you just want faster up/down alerts, Fast Ping is a much easier path to that goal. You must also change your cron entry for poller-wrapper.py for this to work (if you change from the default 300 seconds). Your polling MUST complete in the time you configure for the heartbeat step value. See /poller in your WebUI for your current value. This will only affect RRD files created from the moment you change your settings. This change will affect all data storage mechanisms such as MySQL, RRD and InfluxDB. If you decrease the values then please be aware of the increase in space use for MySQL and InfluxDB. It's highly recommended to configure some performance optimizations . Keep in mind that all your devices will write all graphs every minute to the disk and that every device has many graphs. The most important thing is probably the RRDCached configuration that can save a lot of write IOPS. To make the changes, please navigate to /settings/poller/rrdtool/ within your WebUI. Select RRDTool Setup and then update the two values for step and heartbeat intervals: Step is how often you want to insert data, so if you change to 1 minute polling then this should be 60. Heartbeat is how long to wait for data before registering a null value, i.e 120 seconds.","title":"1-Minute Polling"},{"location":"Support/1-Minute-Polling/#converting-existing-rrd-files","text":"We provide a basic script to convert the default rrd files we generate to utilise your configured step and heartbeat values. Please do ensure that you backup your RRD files before running this just in case. The script runs on a per device basis or all devices at once. The rrd files must be accessible from the server you run this script from. ./scripts/rrdstep.php This will provide the help information. To run it for localhost just run: ./scripts/rrdstep.php -h localhost","title":"Converting existing RRD files"},{"location":"Support/Adding-a-Device/","text":"Adding Device You have two options for adding a new device into LibreNMS. You can add a device via the cli or by using the WebUI . Via WebUI Using the web interface, go to Devices and click Add Device. Enter the details required for the device that you want to add and then click 'Add Host'. As an example, if your device is configured to use the community my_company using snmp v2c then you would enter: SNMP Port defaults to 161. By default Hostname will be used for polling data. If you want to get polling Device data via a specific IP-Address (e.g. Management IP) fill out the optional field Overwrite IP with it's IP-Address. Via CLI Using the command line via ssh you can add a new device by changing to the directory of your LibreNMS install and typing (be sure to put the correct details). ./lnms device:add yourhostname [ --v1 | --v2c ] [ -c yourSNMPcommunity ] You can use ./lnms device:add --help for a list of available options and defaults. As an example, if your device with the name mydevice.example.com is configured to use the community my_company using snmp v2c then you would enter: ./lnms device:add --v2c -c my_company mydevice.example.com Please note that if the community contains special characters such as $ then you will need to wrap it in ' . I.e: 'Pa$$w0rd' . Ping Only Device You can add ping only devices into LibreNMS through the WebUI or CLI. When adding the device switch the SNMP button to \"off\". Device will be added into LibreNMS as Ping Only Device and will show ICMP Response Graph. Hostname: IP address or DNS name. Hardware: Optional you can type in whatever you like. OS: Optional this will add the Device's OS Icon. Via CLI this is done with ./lnms device:add [-P|--ping-only] yourhostname A How-to video can be found here: How to add ping only devices Automatic Discovery and API If you would like to add devices automatically then you will probably want to read the Auto-discovery Setup guide. You may also want to add devices programmatically, if so, take a look at our API documentation","title":"Adding a device"},{"location":"Support/Adding-a-Device/#adding-device","text":"You have two options for adding a new device into LibreNMS. You can add a device via the cli or by using the WebUI .","title":"Adding Device"},{"location":"Support/Adding-a-Device/#via-webui","text":"Using the web interface, go to Devices and click Add Device. Enter the details required for the device that you want to add and then click 'Add Host'. As an example, if your device is configured to use the community my_company using snmp v2c then you would enter: SNMP Port defaults to 161. By default Hostname will be used for polling data. If you want to get polling Device data via a specific IP-Address (e.g. Management IP) fill out the optional field Overwrite IP with it's IP-Address.","title":"Via WebUI"},{"location":"Support/Adding-a-Device/#via-cli","text":"Using the command line via ssh you can add a new device by changing to the directory of your LibreNMS install and typing (be sure to put the correct details). ./lnms device:add yourhostname [ --v1 | --v2c ] [ -c yourSNMPcommunity ] You can use ./lnms device:add --help for a list of available options and defaults. As an example, if your device with the name mydevice.example.com is configured to use the community my_company using snmp v2c then you would enter: ./lnms device:add --v2c -c my_company mydevice.example.com Please note that if the community contains special characters such as $ then you will need to wrap it in ' . I.e: 'Pa$$w0rd' .","title":"Via CLI"},{"location":"Support/Adding-a-Device/#ping-only-device","text":"You can add ping only devices into LibreNMS through the WebUI or CLI. When adding the device switch the SNMP button to \"off\". Device will be added into LibreNMS as Ping Only Device and will show ICMP Response Graph. Hostname: IP address or DNS name. Hardware: Optional you can type in whatever you like. OS: Optional this will add the Device's OS Icon. Via CLI this is done with ./lnms device:add [-P|--ping-only] yourhostname A How-to video can be found here: How to add ping only devices","title":"Ping Only Device"},{"location":"Support/Adding-a-Device/#automatic-discovery-and-api","text":"If you would like to add devices automatically then you will probably want to read the Auto-discovery Setup guide. You may also want to add devices programmatically, if so, take a look at our API documentation","title":"Automatic Discovery and API"},{"location":"Support/Bare-Dashboard/","text":"Bare Dashboard Settings to assist with wall/monitor displays. Hide Menubar To hide Menubar e.g. for Monitoring TV Screens attach ?bare=yes on URL No Search Fields in Dashboard Widgets To hide Search Field in Dashboard Widgets take a look into Widget Settings.","title":"Bare Dashboard"},{"location":"Support/Bare-Dashboard/#bare-dashboard","text":"Settings to assist with wall/monitor displays.","title":"Bare Dashboard"},{"location":"Support/Bare-Dashboard/#hide-menubar","text":"To hide Menubar e.g. for Monitoring TV Screens attach ?bare=yes on URL","title":"Hide Menubar"},{"location":"Support/Bare-Dashboard/#no-search-fields-in-dashboard-widgets","text":"To hide Search Field in Dashboard Widgets take a look into Widget Settings.","title":"No Search Fields in Dashboard Widgets"},{"location":"Support/CLI-Tools/","text":"Command line tools Here's a brief list of command line tools, some might be missing. If you think something is missing, feel free to ask us or send a pull request :-) purge-ports.php This script provides CLI access to the \"delete port\" function of the WebUI. This might come in handy when trying to clean up old ports after large changes within the network or when hacking on the poller/discovery functions. LibreNMS Port purge tool -p port_id Purge single port by it's port-id -f file Purge a list of ports, read port-ids from _file_, one on each line A filename of - means reading from STDIN. Querying port IDs from the database One simple way to obtain port IDs is by querying the SQL database. If you wanted to query all deleted ports from the database, you could to this with the following query: echo 'SELECT port_id, hostname, ifDescr FROM ports, devices WHERE devices.device_id = ports.device_id AND deleted = 1' | mysql -h your_DB_server -u your_DB_user -p --skip-column-names your_DB_name When you are sure that the list of ports is correct and you want to delete all of them, you can write the list into a file and call purge-ports.php with that file as input: echo 'SELECT port_id FROM ports, devices WHERE devices.device_id = ports.device_id AND deleted = 1' | mysql -h your_DB_server -u your_DB_user -p --skip-column-names your_DB_name > ports_to_delete ./purge-port.php -f ports_to_delete","title":"CLI Scripts"},{"location":"Support/CLI-Tools/#command-line-tools","text":"Here's a brief list of command line tools, some might be missing. If you think something is missing, feel free to ask us or send a pull request :-)","title":"Command line tools"},{"location":"Support/CLI-Tools/#purge-portsphp","text":"This script provides CLI access to the \"delete port\" function of the WebUI. This might come in handy when trying to clean up old ports after large changes within the network or when hacking on the poller/discovery functions. LibreNMS Port purge tool -p port_id Purge single port by it's port-id -f file Purge a list of ports, read port-ids from _file_, one on each line A filename of - means reading from STDIN.","title":"purge-ports.php"},{"location":"Support/CLI-Tools/#querying-port-ids-from-the-database","text":"One simple way to obtain port IDs is by querying the SQL database. If you wanted to query all deleted ports from the database, you could to this with the following query: echo 'SELECT port_id, hostname, ifDescr FROM ports, devices WHERE devices.device_id = ports.device_id AND deleted = 1' | mysql -h your_DB_server -u your_DB_user -p --skip-column-names your_DB_name When you are sure that the list of ports is correct and you want to delete all of them, you can write the list into a file and call purge-ports.php with that file as input: echo 'SELECT port_id FROM ports, devices WHERE devices.device_id = ports.device_id AND deleted = 1' | mysql -h your_DB_server -u your_DB_user -p --skip-column-names your_DB_name > ports_to_delete ./purge-port.php -f ports_to_delete","title":"Querying port IDs from the database"},{"location":"Support/Cleanup-options/","text":"Cleanup Options As the number of devices starts to grow in your LibreNMS install, so will things such as the RRD files, MySQL database containing eventlogs, Syslogs and performance data etc. Your LibreNMS install could become quite large so it becomes necessary to clean up those entries. With Cleanup Options, you can stay in control. These options rely on daily.sh running from cron as per the installation instructions. system/cleanup lnms config:set eventlog_purge 30 lnms config:set syslog_purge 30 lnms config:set route_purge 10 lnms config:set alert_log_purge 365 lnms config:set authlog_purge 30 lnms config:set ports_fdb_purge 10 lnms config:set ports_nac_purge 10 lnms config:set device_perf_purge 7 lnms config:set rrd_purge 0 lnms config:set ports_purge true These options will ensure data within LibreNMS over X days old is automatically purged. You can alter these individually, values are in days. NOTE : Please be aware that rrd_purge is NOT set by default. This option will remove any RRD files that have not been updated for the set amount of days automatically - only enable this if you are comfortable with that happening. (All active RRD files are updated every polling period.) Ports Purge Over time as you add devices some interfaces will need to be purged as they are set to be ignored or bad interfaces or marked as deleted. You can purge all deleted ports from the WebUI (see below) or by setting lnms config:set ports_purge true . In the Web UI Under the Ports Tab in the Nav Bar, Click on \"Deleted\" then click on \"Purge all deleted\". This will purge all the ports.","title":"Cleanup Options"},{"location":"Support/Cleanup-options/#cleanup-options","text":"As the number of devices starts to grow in your LibreNMS install, so will things such as the RRD files, MySQL database containing eventlogs, Syslogs and performance data etc. Your LibreNMS install could become quite large so it becomes necessary to clean up those entries. With Cleanup Options, you can stay in control. These options rely on daily.sh running from cron as per the installation instructions. system/cleanup lnms config:set eventlog_purge 30 lnms config:set syslog_purge 30 lnms config:set route_purge 10 lnms config:set alert_log_purge 365 lnms config:set authlog_purge 30 lnms config:set ports_fdb_purge 10 lnms config:set ports_nac_purge 10 lnms config:set device_perf_purge 7 lnms config:set rrd_purge 0 lnms config:set ports_purge true These options will ensure data within LibreNMS over X days old is automatically purged. You can alter these individually, values are in days. NOTE : Please be aware that rrd_purge is NOT set by default. This option will remove any RRD files that have not been updated for the set amount of days automatically - only enable this if you are comfortable with that happening. (All active RRD files are updated every polling period.)","title":"Cleanup Options"},{"location":"Support/Cleanup-options/#ports-purge","text":"Over time as you add devices some interfaces will need to be purged as they are set to be ignored or bad interfaces or marked as deleted. You can purge all deleted ports from the WebUI (see below) or by setting lnms config:set ports_purge true . In the Web UI Under the Ports Tab in the Nav Bar, Click on \"Deleted\" then click on \"Purge all deleted\". This will purge all the ports.","title":"Ports Purge"},{"location":"Support/Configuration/","text":"Configuration Docs LibreNMS configuration is a set of key values. The config is stored in two places: Database: This applies to all pollers and can be set with either lnms config:set or in the Web UI. Database config takes precedence over config.php. config.php: This applies to the local poller only. Configs set here will be disabled in the Web UI to prevent unexpected behaviour. The LibreNMS uses dot notation for config items: Database config.php snmp.community $config['snmp']['community'] snmp.community.+ $config['snmp']['community'][] snmp.v3.0.authalgo $config['snmp']['v3'][0]['authalgo'] The documentation has not been updated to reflect using lnms config:set to set config items, but it will work for all settings. Not all settings have been defined in LibreNMS, but they can still be set with the --ignore-checks option. Without that option input is checked for correctness, that does not mean it is not possible to set bad values. Please report missing settings. CLI lnms config:get will fetch the current config settings (composite of database, config.php, and defaults). lnms config:set will set the config setting in the database. Calling lnms config:set on a setting with no value will reset it to the default value. If you set up bash completion, you can use tab completion to find config settings. Getting a list of all current values To get a complete list of all the current values, you can use the command lnms config:get --dump . The output may not be desirable, so you can use the jq package to pretty print it. Then it would be lnms config:get --dump | jq . Example output: librenms@librenms:~$ lnms config:get --dump | jq { \"install_dir\": \"/opt/librenms\", \"active_directory\": { \"users_purge\": 0 }, \"addhost_alwayscheckip\": false, \"alert\": { \"ack_until_clear\": false, \"admins\": true, \"default_copy\": true, \"default_if_none\": false, \"default_mail\": false, \"default_only\": true, \"disable\": false, \"fixed-contacts\": true, \"globals\": true, \"syscontact\": true, \"transports\": { \"mail\": 5 }, \"tolerance_window\": 5, \"users\": false, ... Examples lnms config:get snmp.community [ \"public\" ] lnms config:set snmp.community.+ testing lnms config:get snmp.community [ \"public\" , \"testing\" ] lnms config:set snmp.community.0 private lnms config:get snmp.community [ \"private\" , \"testing\" ] lnms config:set snmp.community test Invalid format lnms config:set snmp.community '[\"test\", \"othercommunity\"]' lnms config:get snmp.community [ \"test\" , \"othercommunity\" ] lnms config:set snmp.community Reset snmp.community to the default? ( yes/no ) [ no ] : > yes lnms config:get snmp.community [ \"public\" ] Pre-load configuration This feature is primarily for docker images and other automation. When installing LibreNMS for the first time with a new database you can place yaml key value files in database/seeders/config to pre-populate the config database. Example snmp.yaml snmp.community : - public - private snmp.max_repeaters : 30 Directories lnms config:set temp_dir /tmp The temporary directory is where images and other temporary files are created on your filesystem. lnms config:set log_dir /opt/librenms/logs Log files created by LibreNMS will be stored within this directory. Database config Set these variables either in .env (/opt/librenms/.env by default) or in the environment. DB_HOST=127.0.0.1 DB_DATABASE=librenms DB_USERNAME=DBUSER DB_PASSWORD=\"DBPASS\" Use non-standard port: DB_PORT=3306 Use a unix socket: DB_SOCKET=/run/mysqld/mysqld.sock Core PHP Settings You can change the memory limits for php within config.php . The value is in Megabytes and should just be an int value: lnms config:set php_memory_limit 128 Programs A lot of these are self explanatory so no further information may be provided. Any extensions that have dedicated documentation page will be linked to rather than having the config provided. RRDTool You can configure these options within the WebUI now, please avoid setting these options within config.php Settings -> External Settings -> RRDTool Setup external/binaries lnms config:set rrdtool /usr/bin/rrdtool Please see 1 Minute polling for information on configuring your install to record data more frequently. fping external/binaries lnms config:set fping /usr/bin/fping lnms config:set fping6 fping6 poller/ping lnms config:set fping_options.timeout 500 lnms config:set fping_options.count 3 lnms config:set fping_options.interval 500 lnms config:set fping_options.tos 184 fping configuration options: timeout ( fping parameter -t ): Amount of time that fping waits for a response to its first request (in milliseconds). See note below count ( fping parameter -c ): Number of request packets to send to each target. interval ( fping parameter -p ): Time in milliseconds that fping waits between successive packets to an individual target. tos ( fping parameter -O ): Set the type of service flag (TOS). Value can be either decimal or hexadecimal (0xh) format. Can be used to ensure that ping packets are queued in following QOS mecanisms in the network. Table is accessible in the TOS Wikipedia page . NOTE: Setting a higher timeout value than the interval value can lead to slowing down poller. Example: timeout: 3000 count: 3 interval: 500 In this example, interval will be overwritten by the timeout value of 3000 which is 3 seconds. As we send three icmp packets (count: 3), each one is delayed by 3 seconds which will result in fping taking > 6 seconds to return results. You can disable the fping / icmp check that is done for a device to be determined to be up on a global or per device basis. We don't advise disabling the fping / icmp check unless you know the impact, at worst if you have a large number of devices down then it's possible that the poller would no longer complete in 5 minutes due to waiting for snmp to timeout. Globally disable fping / icmp check: lnms config:set icmp_check false If you would like to do this on a per device basis then you can do so under Device -> Edit -> Misc -> Disable ICMP Test? On traceroute LibreNMS uses traceroute to record debug information when a device is down due to icmp AND you have lnms config:set debug.run_trace true set. external/binaries lnms config:set traceroute /usr/bin/traceroute SNMP SNMP program locations. external/binaries lnms config:set snmpwalk /usr/bin/snmpwalk lnms config:set snmpget /usr/bin/snmpget lnms config:set snmpbulkwalk /usr/bin/snmpbulkwalk lnms config:set snmpgetnext /usr/bin/snmpgetnext lnms config:set snmptranslate /usr/bin/snmptranslate Misc binaries external/binaries lnms config:set whois /usr/bin/whois lnms config:set ping /bin/ping lnms config:set mtr /usr/bin/mtr lnms config:set nmap /usr/bin/nmap lnms config:set nagios_plugins /usr/lib/nagios/plugins lnms config:set ipmitool /usr/bin/ipmitool lnms config:set virsh /usr/bin/virsh lnms config:set dot /usr/bin/dot lnms config:set sfdp /usr/bin/sfdp Authentication Generic Authentication settings. Password minimum length for auth that allows user creation lnms config:set password.min_length 8 Proxy support For alerting and the callback functionality, we support the use of a http proxy setting. These can be any one of the following: system/proxy lnms config:set callback_proxy proxy.domain.com lnms config:set http_proxy proxy.domain.com We can also make use of one of these environment variables which can be set in /etc/environment : http_proxy = proxy.domain.com https_proxy = proxy.domain.com RRDCached Please refer to RRDCached WebUI Settings lnms config:set base_url http://demo.librenms.org LibreNMS will attempt to detect the URL you are using but you can override that here. webui/style lnms config:set site_style light Currently we have a number of styles which can be set which will alter the navigation bar look. dark, light and mono with light being the default. lnms config:set webui.custom_css.+ css/custom/styles.css You can override a large number of visual elements by creating your own css stylesheet and referencing it here, place any custom css files into html/css/custom so they will be ignored by auto updates. You can specify as many css files as you like, the order they are within your config will be the order they are loaded in the browser. webui/style lnms config:set title_image images/custom/yourlogo.png You can override the default logo with yours, place any custom images files into html/images/custom so they will be ignored by auto updates. lnms config:set page_refresh 300 Set how often pages are refreshed in seconds. The default is every 5 minutes. Some pages don't refresh at all by design. lnms config:set front_page default You can create your own front page by adding a blade file in resources/views/overview/custom/ and setting front_page to it's name. For example, if you create resources/views/overview/custom/foobar.blade.php , set front_page to foobar . webui/dashboard lnms config:set webui.default_dashboard_id 0 Allows the specification of a global default dashboard page for any user who has not set one in their user preferences. Should be set to dashboard_id of an existing dashboard that is shared or shared(read). Otherwise, the system will automatically create each user an empty dashboard called Default on their first login. lnms config:set login_message \"Unauthorised access or use shall render the user liable to criminal and/or civil prosecution.\" This is the default message on the login page displayed to users. lnms config:set public_status true If this is set to true then an overview will be shown on the login page of devices and the status. lnms config:set show_locations true # Enable Locations on menu lnms config:set show_locations_dropdown true # Enable Locations dropdown on menu lnms config:set show_services false # Disable Services on menu lnms config:set int_customers true # Enable Customer Port Parsing lnms config:set summary_errors false # Show Errored ports in summary boxes on the dashboard lnms config:set customers_descr '[\"cust\"]' # The description to look for in ifDescr. Can have multiple '[\"cust\",\"cid\"]' lnms config:set transit_descr '[\"transit\"]' # Add custom transit descriptions (array) lnms config:set peering_descr '[\"peering\"]' # Add custom peering descriptions (array) lnms config:set core_descr '[\"core\"]' # Add custom core descriptions (array) lnms config:set custom_descr '[\"This is Custom\"]' # Add custom interface descriptions (array) lnms config:set int_transit true # Enable Transit Types lnms config:set int_peering true # Enable Peering Types lnms config:set int_core true # Enable Core Port Types lnms config:set int_l2tp false # Disable L2TP Port Types Enable / disable certain menus from being shown in the WebUI. You are able to adjust the number and time frames of the quick select time options for graphs and the mini graphs shown per row. Quick select: lnms config:set graphs.mini.normal '{ \"day\": \"24 Hours\", \"week\": \"One Week\", \"month\": \"One Month\", \"year\": \"One Year\" }' lnms config:set graphs.mini.widescreen '{ \"sixhour\": \"6 Hours\", \"day\": \"24 Hours\", \"twoday\": \"48 Hours\", \"week\": \"One Week\", \"twoweek\": \"Two Weeks\", \"month\": \"One Month\", \"twomonth\": \"Two Months\", \"year\": \"One Year\", \"twoyear\": \"Two Years\" }' Mini graphs: lnms config:set graphs.row.normal '{ \"sixhour\": \"6 Hours\", \"day\": \"24 Hours\", \"twoday\": \"48 Hours\", \"week\": \"One Week\", \"twoweek\": \"Two Weeks\", \"month\": \"One Month\", \"twomonth\": \"Two Months\", \"year\": \"One Year\", \"twoyear\": \"Two Years\" }' lnms config:set web_mouseover true You can disable the mouseover popover for mini graphs by setting this to false. lnms config:set enable_lazy_load true You can disable image lazy loading by setting this to false. lnms config:set overview_show_sysDescr true Enable or disable the sysDescr output for a device. webui/device lnms config:set device_display_default '{{ $hostname }}' This is a simple template to control the display of device names by default. You can override this setting per-device. You may enter any free-form text including one or more of the following template replacements: Template Replacement {{ $hostname }} The hostname or IP of the device that was set when added *default {{ $sysName_fallback }} The hostname or sysName if hostname is an IP {{ $sysName }} The SNMP sysName of the device, falls back to hostname/IP if missing {{ $ip }} The actual polled IP of the device, will not display a hostname For example, {{ $sysName_fallback }} ({{ $ip }}) will display something like server (192.168.1.1) lnms config:set device_traffic_iftype.+ '/loopback/' Interface types that aren't graphed in the WebUI. The default array contains more items, please see misc/config_definitions.json for the full list. lnms config:set enable_clear_discovery true Administrators are able to clear the last discovered time of a device which will force a full discovery run within the configured 5 minute cron window. lnms config:set enable_footer true Disable the footer of the WebUI by setting enable_footer to 0. You can enable the old style network map (only available for individual devices with links discovered via xDP) by setting: lnms config:set gui.network-map.style old lnms config:set percentile_value 90 Show the X th percentile in the graph instead of the default 95th percentile. webui/graph lnms config:set shorthost_target_length 15 The target maximum hostname length when applying the shorthost() function. You can increase this if you want to try and fit more of the hostname in graph titles. The default value is 12 However, this can possibly break graph generation if this is very long. You can enable dynamic graphs within the WebUI under Global Settings -> Webui Settings -> Graph Settings. Graphs will be movable/scalable without reloading the page: Stacked Graphs You can enable stacked graphs instead of the default inverted graphs. Enabling them is possible via webui Global Settings -> Webui Settings -> Graph settings -> Use stacked graphs Add host settings The following setting controls how hosts are added. If a host is added as an ip address it is checked to ensure the ip is not already present. If the ip is present the host is not added. If host is added by hostname this check is not performed. If the setting is true hostnames are resolved and the check is also performed. This helps prevents accidental duplicate hosts. lnms config:set addhost_alwayscheckip false # true - check for duplicate ips even when adding host by name. # false- only check when adding host by ip. By default we allow hosts to be added with duplicate sysName's, you can disable this with the following config: discovery/general lnms config:set allow_duplicate_sysName false Global poller and discovery modules Enable or disable discovery or poller modules. This setting has an order of precedence Device > OS > Global. So if the module is set at a more specific level, it will override the less specific settings. Global: lnms config:set discovery_modules.arp-table false lnms config:set discovery_modules.entity-state true lnms config:set poller_modules.entity-state true Per OS: lnms config:set os.ios.discovery_modules.arp-table false lnms config:set os.ios.discovery_modules.entity-state true lnms config:set os.ios.poller_modules.entity-state true SNMP Settings Default SNMP options including retry and timeout settings and also default version and port. poller/snmp lnms config:set snmp.timeout 1 # timeout in seconds lnms config:set snmp.retries 5 # how many times to retry the query lnms config:set snmp.transports '[\"udp\", \"udp6\", \"tcp\", \"tcp6\"]' # Transports to use lnms config:set snmp.version '[\"v2c\", \"v3\", \"v1\"]' # Default versions to use lnms config:set snmp.port 161 # Default port lnms config:set snmp.exec_timeout 1200 # execution time limit in seconds NOTE: timeout is the time to wait for an answer and exec_timeout is the max time to run a query. The default v1/v2c snmp community to use, you can expand this array with [1] , [2] , [3] , etc. poller/snmp lnms config:set snmp.community.0 public NOTE: This list of SNMP communities is used for auto discovery, and as a default set for any manually added device. The default v3 snmp details to use, you can expand this array with [1] , [2] , [3] , etc. poller/snmp lnms config:set snmp.v3.0 '{ authlevel: \"noAuthNoPriv\", authname: \"root\", authpass: \"\", authalgo: \"MD5\", cryptopass: \"\", cryptoalgo: \"AES\" }' authlevel noAuthNoPriv | authNoPriv | authPriv authname User Name (required even for noAuthNoPriv) authpass Auth Passphrase authalgo MD5 | SHA | SHA-224 | SHA-256 | SHA-384 | SHA-512 cryptopass Privacy (Encryption) Passphrase cryptoalgo AES | AES-192 | AES-256 | AES-256-C | DES Auto discovery settings Please refer to Auto-Discovery Email configuration You can configure these options within the WebUI now, please avoid setting these options within config.php alerting/email lnms config:set email_backend mail lnms config:set email_from librenms@yourdomain.local lnms config:set email_user ` lnms config:get project_id ` lnms config:set email_sendmail_path /usr/sbin/sendmail lnms config:set email_smtp_host localhost lnms config:set email_smtp_port 25 lnms config:set email_smtp_timeout 10 lnms config:set email_smtp_secure tls lnms config:set email_smtp_auth false lnms config:set email_smtp_username NULL lnms config:set email_smtp_password NULL What type of mail transport to use for delivering emails. Valid options for email_backend are mail, sendmail or smtp. The varying options after that are to support the different transports. Alerting Please refer to Alerting Billing Please refer to Billing Global module support lnms config:set enable_syslog false # Enable Syslog lnms config:set enable_inventory true # Enable Inventory lnms config:set enable_pseudowires true # Enable Pseudowires lnms config:set enable_vrfs true # Enable VRFs Port extensions Please refer to Port-Description-Parser lnms config:set enable_ports_etherlike false lnms config:set enable_ports_junoseatmvp false lnms config:set enable_ports_poe false Enable / disable additional port statistics. Port Group Assign a new discovered Port automatically to Port Group with this Port Group ID (0 means no Port Group assignment) discovery/networks lnms config:set default_port_group 0 External integration Rancid lnms config:set rancid_configs.+ /var/lib/rancid/network/configs/ lnms config:set rancid_repo_type svn lnms config:set rancid_ignorecomments false Rancid configuration, rancid_configs is an array containing all of the locations of your rancid files. Setting rancid_ignorecomments will disable showing lines that start with # Oxidized Please refer to Oxidized CollectD lnms config:set collectd_dir /var/lib/collectd/rrd Specify the location of the collectd rrd files. Note that the location in config.php should be consistent with the location set in /etc/collectd.conf and etc/collectd.d/rrdtool.conf DataDir \"/var/lib/collectd/rrd\" CreateFilesAsync false CacheTimeout 120 CacheFlush 900 WritesPerSecond 50 /etc/collectd.conf LoadPlugin rrdtool DataDir \"/var/lib/collectd/rrd\" CacheTimeout 120 CacheFlush 900 /etc/collectd.d/rrdtool.conf lnms config:set collectd_sock unix:///var/run/collectd.sock Specify the location of the collectd unix socket. Using a socket allows the collectd graphs to be flushed to disk before being drawn. Be sure that your web server has permissions to write to this socket. Smokeping Please refer to Smokeping NFSen Please refer to NFSen Location parsing LibreNMS can interpret sysLocation information and map the device loction based on GeoCoordinates or GeoCoding information. Info-keywords [] contains optional Latitude and Longitude information if manual GeoCoordinate positioning is desired. () contains optional information that is ignored during GeoCoding lookups. GeoCoordinates If device sysLocation information contains [lat, lng] (note the comma and square brackets), that is used to determin the GeoCoordinates. Example: name_that_can_not_be_looked_up [ 40 .424521, -86.912755 ] GeoCoding Next it will attempt to look up the sysLocation with a map engine provided you have configured one under $config['geoloc']['engine']. The information has to be accurate or no result is returned, when it does it will ignore any information inside parentheses, allowing you to add details that would otherwise interfeeer with the lookup. Example: 1100 Congress Ave, Austin, TX 78701 ( 3rd floor ) Geocoding lookup is: 1100 Congress Ave, Austin, TX 78701 Overrides You can overwrite each device sysLocation information in the webGUI under \"Device settings\". You can overwrite the location coordinates n in the webGUI under Device>GEO Locations Location mapping If you just want to set GPS coordinates on a location, you should visit Devices > Geo Locations > All Locations and edit the coordinates there. Exact Matching: lnms config:set location_map '{\"Under the Sink\": \"Under The Sink, The Office, London, UK\"}' Regex Matching: lnms config:set location_map_regex '{\"/Sink/\": \"Under The Sink, The Office, London, UK\"}' Regex Match Substitution: lnms config:set location_map_regex_sub '{\"/Sink/\": \"Under The Sink, The Office, London, UK [lat, long]\"}' If you have an SNMP SysLocation of \"Rack10,Rm-314,Sink\", Regex Match Substition yields \"Rack10,Rm-314,Under The Sink, The Office, London, UK [lat, long]\". This allows you to keep the SysLocation string short and keeps Rack/Room/Building information intact after the substitution. The above are examples, these will rewrite device snmp locations so you don't need to configure full location within snmp. Interfaces to be ignored Interfaces can be automatically ignored during discovery by modifying bad_if* entries in a default array, unsetting a default array and customizing it, or creating an OS specific array. The preferred method for ignoring interfaces is to use an OS specific array. The default arrays can be found in misc/config_definitions.json. OS specific definitions (includes/definitions/_specific_os_.yaml) can contain bad_if* arrays, but should only be modified via pull-request as manipulation of the definition files will block updating: Examples: Add entries to default arrays lnms config:set bad_if.+ voip-null lnms config:set bad_iftype.+ voiceEncap lnms config:set bad_if_regexp.+ '/^lo[0-9].*/' # loopback Override default bad_if values lnms config:set bad_if '[\"voip-null\", \"voiceEncap\", \"voiceFXO\"]' Create an OS specific array lnms config:set os.iosxe.bad_iftype.+ macSecControlledIF lnms config:set os.iosxe.bad_iftype.+ macSecUncontrolledIF Various bad_if* selection options available bad_if is matched against the ifDescr value. bad_iftype is matched against the ifType value. bad_if_regexp is matched against the ifDescr value as a regular expression. bad_ifname_regexp is matched against the ifName value as a regular expression. bad_ifalias_regexp is matched against the ifAlias value as a regular expression. Interfaces that shouldn't be ignored Examples: lnms config:set good_if.+ FastEthernet lnms config:set os.ios.good_if.+ FastEthernet good_if is matched against ifDescr value. This can be a bad_if value as well which would stop that port from being ignored. i.e. if bad_if and good_if both contained FastEthernet then ports with this value in the ifDescr will be valid. Interfaces to be rewritten lnms config:set rewrite_if '{\"cpu\": \"Management Interface\"}' lnms config:set rewrite_if_regexp '{\"/cpu /\": \"Management \"}' Entries defined in rewrite_if are being replaced completely. Entries defined in rewrite_if_regexp only replace the match. Matches are compared case-insensitive. Entity sensors to be ignored Some devices register bogus sensors as they are returned via SNMP but either don't exist or just don't return data. This allows you to ignore those based on the descr field in the database. You can either ignore globally or on a per os basis. lnms config:set bad_entity_sensor_regex.+ '/Physical id [0-9]+/' lnms config:set os.ios.bad_entity_sensor_regex '[\"/Physical id [0-9]+/\"]' Entity sensors limit values Vendors may give some limit values (or thresholds) for the discovered sensors. By default, when no such value is given, both high and low limit values are guessed, based on the value measured during the initial discovery. When it is preferred to have no high and/or low limit values at all if these are not provided by the vendor, the guess method can be disabled: lnms config:set sensors.guess_limits false Ignoring Health Sensors It is possible to filter some sensors from the configuration: Ignore all temperature sensors lnms config:set disabled_sensors.current true Filter all sensors matching regexp '/PEM Iout/' . lnms config:set disabled_sensors_regex.+ '/PEM Iout/' Filter all 'current' sensors for Operating System 'vrp'. lnms config:set os.vrp.disabled_sensors.current true Filter all sensors matching regexp '/PEM Iout/' for Operating System iosxe. lnms config:set os.iosxe.disabled_sensors_regex '/PEM Iout/' Storage configuration Mounted storage / mount points to ignore in discovery and polling. discovery/storage ```bash lnms config:set ignore_mount_removable true lnms config:set ignore_mount_network true lnms config:set ignore_mount_optical true lnms config:set ignore_mount.+ /kern lnms config:set ignore_mount.+ /mnt/cdrom lnms config:set ignore_mount.+ /proc lnms config:set ignore_mount.+ /dev lnms config:set ignore_mount_string.+ packages lnms config:set ignore_mount_string.+ devfs lnms config:set ignore_mount_string.+ procfs lnms config:set ignore_mount_string.+ UMA lnms config:set ignore_mount_string.+ MALLOC lnms config:set ignore_mount_regexp.+ '/on: \\/packages/' lnms config:set ignore_mount_regexp.+ '/on: \\/dev/' lnms config:set ignore_mount_regexp.+ '/on: \\/proc/' lnms config:set ignore_mount_regexp.+ '/on: \\/junos^/' lnms config:set ignore_mount_regexp.+ '/on: \\/junos\\/dev/' lnms config:set ignore_mount_regexp.+ '/on: \\/jail\\/dev/' lnms config:set ignore_mount_regexp.+ '/^(dev|proc)fs/' lnms config:set ignore_mount_regexp.+ '/^\\/dev\\/md0/' lnms config:set ignore_mount_regexp.+ '/^\\/var\\/dhcpd\\/dev,/' lnms config:set ignore_mount_regexp.+ '/UMA/' ``` Custom storage warning percentage lnms config:set storage_perc_warn 60 IRC Bot Please refer to IRC Bot Authentication Please refer to Authentication Cleanup options Please refer to Cleanup Options Syslog options Please refer to Syslog Virtualization lnms config:set enable_libvirt true lnms config:set libvirt_protocols '[\"qemu+ssh\",\"xen+ssh\"]' lnms config:set libvirt_username root Enable this to switch on support for libvirt along with libvirt_protocols to indicate how you connect to libvirt. You also need to: Generate a non-password-protected ssh key for use by LibreNMS, as the user which runs polling & discovery (usually librenms ). On each VM host you wish to monitor: Configure public key authentication from your LibreNMS server/poller by adding the librenms public key to ~root/.ssh/authorized_keys . (xen+ssh only) Enable libvirtd to gather data from xend by setting (xend-unix-server yes) in /etc/xen/xend-config.sxp and restarting xend and libvirtd. To test your setup, run virsh -c qemu+ssh://vmhost/system list or virsh -c xen+ssh://vmhost list as your librenms polling user. BGP Support lnms config:set astext.65332 \"Cymru FullBogon Feed\" You can use this array to rewrite the description of ASes that you have discovered. Auto updates Please refer to Updating IPMI Setup the types of IPMI protocols to test a host for and in what order. Don't forget to install ipmitool on the monitoring host. lnms config:set ipmi.type '[\"lanplus\", \"lan\", \"imb\", \"open\"]' Distributed poller settings Please refer to Distributed Poller API Settings CORS Support https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS CORS support for the API is disabled by default. Below you will find the standard options, all of which you can configure. lnms config:set api.cors.enabled false lnms config:set api.cors.origin '[\"*\"]' lnms config:set api.cors.maxage '86400' lnms config:set api.cors.allowmethods '[\"POST\", \"GET\", \"PUT\", \"DELETE\", \"PATCH\"]' lnms config:set api.cors.allowheaders '[\"Origin\", \"X-Requested-With\", \"Content-Type\", \"Accept\", \"X-Auth-Token\"]' lnms config:set api.cors.exposeheaders '[\"Cache-Control\", \"Content-Language\", \"Content-Type\", \"Expires\", \"Last-Modified\", \"Pragma\"]' lnms config:set api.cors.allowmethods '[\"POST\", \"GET\", \"PUT\", \"DELETE\", \"PATCH\"]' lnms config:set api.cors.allowheaders '[\"Origin\", \"X-Requested-With\", \"Content-Type\", \"Accept\", \"X-Auth-Token\"]' lnms config:set api.cors.exposeheaders '[\"Cache-Control\", \"Content-Language\", \"Content-Type\", \"Expires\", \"Last-Modified\", \"Pragma\"]' lnms config:set api.cors.allowcredentials false","title":"Configuration Docs"},{"location":"Support/Configuration/#configuration-docs","text":"LibreNMS configuration is a set of key values. The config is stored in two places: Database: This applies to all pollers and can be set with either lnms config:set or in the Web UI. Database config takes precedence over config.php. config.php: This applies to the local poller only. Configs set here will be disabled in the Web UI to prevent unexpected behaviour. The LibreNMS uses dot notation for config items: Database config.php snmp.community $config['snmp']['community'] snmp.community.+ $config['snmp']['community'][] snmp.v3.0.authalgo $config['snmp']['v3'][0]['authalgo'] The documentation has not been updated to reflect using lnms config:set to set config items, but it will work for all settings. Not all settings have been defined in LibreNMS, but they can still be set with the --ignore-checks option. Without that option input is checked for correctness, that does not mean it is not possible to set bad values. Please report missing settings.","title":"Configuration Docs"},{"location":"Support/Configuration/#cli","text":"lnms config:get will fetch the current config settings (composite of database, config.php, and defaults). lnms config:set will set the config setting in the database. Calling lnms config:set on a setting with no value will reset it to the default value. If you set up bash completion, you can use tab completion to find config settings.","title":"CLI"},{"location":"Support/Configuration/#getting-a-list-of-all-current-values","text":"To get a complete list of all the current values, you can use the command lnms config:get --dump . The output may not be desirable, so you can use the jq package to pretty print it. Then it would be lnms config:get --dump | jq . Example output: librenms@librenms:~$ lnms config:get --dump | jq { \"install_dir\": \"/opt/librenms\", \"active_directory\": { \"users_purge\": 0 }, \"addhost_alwayscheckip\": false, \"alert\": { \"ack_until_clear\": false, \"admins\": true, \"default_copy\": true, \"default_if_none\": false, \"default_mail\": false, \"default_only\": true, \"disable\": false, \"fixed-contacts\": true, \"globals\": true, \"syscontact\": true, \"transports\": { \"mail\": 5 }, \"tolerance_window\": 5, \"users\": false, ...","title":"Getting a list of all current values"},{"location":"Support/Configuration/#examples","text":"lnms config:get snmp.community [ \"public\" ] lnms config:set snmp.community.+ testing lnms config:get snmp.community [ \"public\" , \"testing\" ] lnms config:set snmp.community.0 private lnms config:get snmp.community [ \"private\" , \"testing\" ] lnms config:set snmp.community test Invalid format lnms config:set snmp.community '[\"test\", \"othercommunity\"]' lnms config:get snmp.community [ \"test\" , \"othercommunity\" ] lnms config:set snmp.community Reset snmp.community to the default? ( yes/no ) [ no ] : > yes lnms config:get snmp.community [ \"public\" ]","title":"Examples"},{"location":"Support/Configuration/#pre-load-configuration","text":"This feature is primarily for docker images and other automation. When installing LibreNMS for the first time with a new database you can place yaml key value files in database/seeders/config to pre-populate the config database. Example snmp.yaml snmp.community : - public - private snmp.max_repeaters : 30","title":"Pre-load configuration"},{"location":"Support/Configuration/#directories","text":"lnms config:set temp_dir /tmp The temporary directory is where images and other temporary files are created on your filesystem. lnms config:set log_dir /opt/librenms/logs Log files created by LibreNMS will be stored within this directory.","title":"Directories"},{"location":"Support/Configuration/#database-config","text":"Set these variables either in .env (/opt/librenms/.env by default) or in the environment. DB_HOST=127.0.0.1 DB_DATABASE=librenms DB_USERNAME=DBUSER DB_PASSWORD=\"DBPASS\" Use non-standard port: DB_PORT=3306 Use a unix socket: DB_SOCKET=/run/mysqld/mysqld.sock","title":"Database config"},{"location":"Support/Configuration/#core","text":"","title":"Core"},{"location":"Support/Configuration/#php-settings","text":"You can change the memory limits for php within config.php . The value is in Megabytes and should just be an int value: lnms config:set php_memory_limit 128","title":"PHP Settings"},{"location":"Support/Configuration/#programs","text":"A lot of these are self explanatory so no further information may be provided. Any extensions that have dedicated documentation page will be linked to rather than having the config provided.","title":"Programs"},{"location":"Support/Configuration/#rrdtool","text":"You can configure these options within the WebUI now, please avoid setting these options within config.php Settings -> External Settings -> RRDTool Setup external/binaries lnms config:set rrdtool /usr/bin/rrdtool Please see 1 Minute polling for information on configuring your install to record data more frequently.","title":"RRDTool"},{"location":"Support/Configuration/#fping","text":"external/binaries lnms config:set fping /usr/bin/fping lnms config:set fping6 fping6 poller/ping lnms config:set fping_options.timeout 500 lnms config:set fping_options.count 3 lnms config:set fping_options.interval 500 lnms config:set fping_options.tos 184 fping configuration options: timeout ( fping parameter -t ): Amount of time that fping waits for a response to its first request (in milliseconds). See note below count ( fping parameter -c ): Number of request packets to send to each target. interval ( fping parameter -p ): Time in milliseconds that fping waits between successive packets to an individual target. tos ( fping parameter -O ): Set the type of service flag (TOS). Value can be either decimal or hexadecimal (0xh) format. Can be used to ensure that ping packets are queued in following QOS mecanisms in the network. Table is accessible in the TOS Wikipedia page . NOTE: Setting a higher timeout value than the interval value can lead to slowing down poller. Example: timeout: 3000 count: 3 interval: 500 In this example, interval will be overwritten by the timeout value of 3000 which is 3 seconds. As we send three icmp packets (count: 3), each one is delayed by 3 seconds which will result in fping taking > 6 seconds to return results. You can disable the fping / icmp check that is done for a device to be determined to be up on a global or per device basis. We don't advise disabling the fping / icmp check unless you know the impact, at worst if you have a large number of devices down then it's possible that the poller would no longer complete in 5 minutes due to waiting for snmp to timeout. Globally disable fping / icmp check: lnms config:set icmp_check false If you would like to do this on a per device basis then you can do so under Device -> Edit -> Misc -> Disable ICMP Test? On","title":"fping"},{"location":"Support/Configuration/#traceroute","text":"LibreNMS uses traceroute to record debug information when a device is down due to icmp AND you have lnms config:set debug.run_trace true set. external/binaries lnms config:set traceroute /usr/bin/traceroute","title":"traceroute"},{"location":"Support/Configuration/#snmp","text":"SNMP program locations. external/binaries lnms config:set snmpwalk /usr/bin/snmpwalk lnms config:set snmpget /usr/bin/snmpget lnms config:set snmpbulkwalk /usr/bin/snmpbulkwalk lnms config:set snmpgetnext /usr/bin/snmpgetnext lnms config:set snmptranslate /usr/bin/snmptranslate","title":"SNMP"},{"location":"Support/Configuration/#misc-binaries","text":"external/binaries lnms config:set whois /usr/bin/whois lnms config:set ping /bin/ping lnms config:set mtr /usr/bin/mtr lnms config:set nmap /usr/bin/nmap lnms config:set nagios_plugins /usr/lib/nagios/plugins lnms config:set ipmitool /usr/bin/ipmitool lnms config:set virsh /usr/bin/virsh lnms config:set dot /usr/bin/dot lnms config:set sfdp /usr/bin/sfdp","title":"Misc binaries"},{"location":"Support/Configuration/#authentication","text":"Generic Authentication settings. Password minimum length for auth that allows user creation lnms config:set password.min_length 8","title":"Authentication"},{"location":"Support/Configuration/#proxy-support","text":"For alerting and the callback functionality, we support the use of a http proxy setting. These can be any one of the following: system/proxy lnms config:set callback_proxy proxy.domain.com lnms config:set http_proxy proxy.domain.com We can also make use of one of these environment variables which can be set in /etc/environment : http_proxy = proxy.domain.com https_proxy = proxy.domain.com","title":"Proxy support"},{"location":"Support/Configuration/#rrdcached","text":"Please refer to RRDCached","title":"RRDCached"},{"location":"Support/Configuration/#webui-settings","text":"lnms config:set base_url http://demo.librenms.org LibreNMS will attempt to detect the URL you are using but you can override that here. webui/style lnms config:set site_style light Currently we have a number of styles which can be set which will alter the navigation bar look. dark, light and mono with light being the default. lnms config:set webui.custom_css.+ css/custom/styles.css You can override a large number of visual elements by creating your own css stylesheet and referencing it here, place any custom css files into html/css/custom so they will be ignored by auto updates. You can specify as many css files as you like, the order they are within your config will be the order they are loaded in the browser. webui/style lnms config:set title_image images/custom/yourlogo.png You can override the default logo with yours, place any custom images files into html/images/custom so they will be ignored by auto updates. lnms config:set page_refresh 300 Set how often pages are refreshed in seconds. The default is every 5 minutes. Some pages don't refresh at all by design. lnms config:set front_page default You can create your own front page by adding a blade file in resources/views/overview/custom/ and setting front_page to it's name. For example, if you create resources/views/overview/custom/foobar.blade.php , set front_page to foobar . webui/dashboard lnms config:set webui.default_dashboard_id 0 Allows the specification of a global default dashboard page for any user who has not set one in their user preferences. Should be set to dashboard_id of an existing dashboard that is shared or shared(read). Otherwise, the system will automatically create each user an empty dashboard called Default on their first login. lnms config:set login_message \"Unauthorised access or use shall render the user liable to criminal and/or civil prosecution.\" This is the default message on the login page displayed to users. lnms config:set public_status true If this is set to true then an overview will be shown on the login page of devices and the status. lnms config:set show_locations true # Enable Locations on menu lnms config:set show_locations_dropdown true # Enable Locations dropdown on menu lnms config:set show_services false # Disable Services on menu lnms config:set int_customers true # Enable Customer Port Parsing lnms config:set summary_errors false # Show Errored ports in summary boxes on the dashboard lnms config:set customers_descr '[\"cust\"]' # The description to look for in ifDescr. Can have multiple '[\"cust\",\"cid\"]' lnms config:set transit_descr '[\"transit\"]' # Add custom transit descriptions (array) lnms config:set peering_descr '[\"peering\"]' # Add custom peering descriptions (array) lnms config:set core_descr '[\"core\"]' # Add custom core descriptions (array) lnms config:set custom_descr '[\"This is Custom\"]' # Add custom interface descriptions (array) lnms config:set int_transit true # Enable Transit Types lnms config:set int_peering true # Enable Peering Types lnms config:set int_core true # Enable Core Port Types lnms config:set int_l2tp false # Disable L2TP Port Types Enable / disable certain menus from being shown in the WebUI. You are able to adjust the number and time frames of the quick select time options for graphs and the mini graphs shown per row. Quick select: lnms config:set graphs.mini.normal '{ \"day\": \"24 Hours\", \"week\": \"One Week\", \"month\": \"One Month\", \"year\": \"One Year\" }' lnms config:set graphs.mini.widescreen '{ \"sixhour\": \"6 Hours\", \"day\": \"24 Hours\", \"twoday\": \"48 Hours\", \"week\": \"One Week\", \"twoweek\": \"Two Weeks\", \"month\": \"One Month\", \"twomonth\": \"Two Months\", \"year\": \"One Year\", \"twoyear\": \"Two Years\" }' Mini graphs: lnms config:set graphs.row.normal '{ \"sixhour\": \"6 Hours\", \"day\": \"24 Hours\", \"twoday\": \"48 Hours\", \"week\": \"One Week\", \"twoweek\": \"Two Weeks\", \"month\": \"One Month\", \"twomonth\": \"Two Months\", \"year\": \"One Year\", \"twoyear\": \"Two Years\" }' lnms config:set web_mouseover true You can disable the mouseover popover for mini graphs by setting this to false. lnms config:set enable_lazy_load true You can disable image lazy loading by setting this to false. lnms config:set overview_show_sysDescr true Enable or disable the sysDescr output for a device. webui/device lnms config:set device_display_default '{{ $hostname }}' This is a simple template to control the display of device names by default. You can override this setting per-device. You may enter any free-form text including one or more of the following template replacements: Template Replacement {{ $hostname }} The hostname or IP of the device that was set when added *default {{ $sysName_fallback }} The hostname or sysName if hostname is an IP {{ $sysName }} The SNMP sysName of the device, falls back to hostname/IP if missing {{ $ip }} The actual polled IP of the device, will not display a hostname For example, {{ $sysName_fallback }} ({{ $ip }}) will display something like server (192.168.1.1) lnms config:set device_traffic_iftype.+ '/loopback/' Interface types that aren't graphed in the WebUI. The default array contains more items, please see misc/config_definitions.json for the full list. lnms config:set enable_clear_discovery true Administrators are able to clear the last discovered time of a device which will force a full discovery run within the configured 5 minute cron window. lnms config:set enable_footer true Disable the footer of the WebUI by setting enable_footer to 0. You can enable the old style network map (only available for individual devices with links discovered via xDP) by setting: lnms config:set gui.network-map.style old lnms config:set percentile_value 90 Show the X th percentile in the graph instead of the default 95th percentile. webui/graph lnms config:set shorthost_target_length 15 The target maximum hostname length when applying the shorthost() function. You can increase this if you want to try and fit more of the hostname in graph titles. The default value is 12 However, this can possibly break graph generation if this is very long. You can enable dynamic graphs within the WebUI under Global Settings -> Webui Settings -> Graph Settings. Graphs will be movable/scalable without reloading the page:","title":"WebUI Settings"},{"location":"Support/Configuration/#stacked-graphs","text":"You can enable stacked graphs instead of the default inverted graphs. Enabling them is possible via webui Global Settings -> Webui Settings -> Graph settings -> Use stacked graphs","title":"Stacked Graphs"},{"location":"Support/Configuration/#add-host-settings","text":"The following setting controls how hosts are added. If a host is added as an ip address it is checked to ensure the ip is not already present. If the ip is present the host is not added. If host is added by hostname this check is not performed. If the setting is true hostnames are resolved and the check is also performed. This helps prevents accidental duplicate hosts. lnms config:set addhost_alwayscheckip false # true - check for duplicate ips even when adding host by name. # false- only check when adding host by ip. By default we allow hosts to be added with duplicate sysName's, you can disable this with the following config: discovery/general lnms config:set allow_duplicate_sysName false","title":"Add host settings"},{"location":"Support/Configuration/#global-poller-and-discovery-modules","text":"Enable or disable discovery or poller modules. This setting has an order of precedence Device > OS > Global. So if the module is set at a more specific level, it will override the less specific settings. Global: lnms config:set discovery_modules.arp-table false lnms config:set discovery_modules.entity-state true lnms config:set poller_modules.entity-state true Per OS: lnms config:set os.ios.discovery_modules.arp-table false lnms config:set os.ios.discovery_modules.entity-state true lnms config:set os.ios.poller_modules.entity-state true","title":"Global poller and discovery modules"},{"location":"Support/Configuration/#snmp-settings","text":"Default SNMP options including retry and timeout settings and also default version and port. poller/snmp lnms config:set snmp.timeout 1 # timeout in seconds lnms config:set snmp.retries 5 # how many times to retry the query lnms config:set snmp.transports '[\"udp\", \"udp6\", \"tcp\", \"tcp6\"]' # Transports to use lnms config:set snmp.version '[\"v2c\", \"v3\", \"v1\"]' # Default versions to use lnms config:set snmp.port 161 # Default port lnms config:set snmp.exec_timeout 1200 # execution time limit in seconds NOTE: timeout is the time to wait for an answer and exec_timeout is the max time to run a query. The default v1/v2c snmp community to use, you can expand this array with [1] , [2] , [3] , etc. poller/snmp lnms config:set snmp.community.0 public NOTE: This list of SNMP communities is used for auto discovery, and as a default set for any manually added device. The default v3 snmp details to use, you can expand this array with [1] , [2] , [3] , etc. poller/snmp lnms config:set snmp.v3.0 '{ authlevel: \"noAuthNoPriv\", authname: \"root\", authpass: \"\", authalgo: \"MD5\", cryptopass: \"\", cryptoalgo: \"AES\" }' authlevel noAuthNoPriv | authNoPriv | authPriv authname User Name (required even for noAuthNoPriv) authpass Auth Passphrase authalgo MD5 | SHA | SHA-224 | SHA-256 | SHA-384 | SHA-512 cryptopass Privacy (Encryption) Passphrase cryptoalgo AES | AES-192 | AES-256 | AES-256-C | DES","title":"SNMP Settings"},{"location":"Support/Configuration/#auto-discovery-settings","text":"Please refer to Auto-Discovery","title":"Auto discovery settings"},{"location":"Support/Configuration/#email-configuration","text":"You can configure these options within the WebUI now, please avoid setting these options within config.php alerting/email lnms config:set email_backend mail lnms config:set email_from librenms@yourdomain.local lnms config:set email_user ` lnms config:get project_id ` lnms config:set email_sendmail_path /usr/sbin/sendmail lnms config:set email_smtp_host localhost lnms config:set email_smtp_port 25 lnms config:set email_smtp_timeout 10 lnms config:set email_smtp_secure tls lnms config:set email_smtp_auth false lnms config:set email_smtp_username NULL lnms config:set email_smtp_password NULL What type of mail transport to use for delivering emails. Valid options for email_backend are mail, sendmail or smtp. The varying options after that are to support the different transports.","title":"Email configuration"},{"location":"Support/Configuration/#alerting","text":"Please refer to Alerting","title":"Alerting"},{"location":"Support/Configuration/#billing","text":"Please refer to Billing","title":"Billing"},{"location":"Support/Configuration/#global-module-support","text":"lnms config:set enable_syslog false # Enable Syslog lnms config:set enable_inventory true # Enable Inventory lnms config:set enable_pseudowires true # Enable Pseudowires lnms config:set enable_vrfs true # Enable VRFs","title":"Global module support"},{"location":"Support/Configuration/#port-extensions","text":"Please refer to Port-Description-Parser lnms config:set enable_ports_etherlike false lnms config:set enable_ports_junoseatmvp false lnms config:set enable_ports_poe false Enable / disable additional port statistics.","title":"Port extensions"},{"location":"Support/Configuration/#port-group","text":"Assign a new discovered Port automatically to Port Group with this Port Group ID (0 means no Port Group assignment) discovery/networks lnms config:set default_port_group 0","title":"Port Group"},{"location":"Support/Configuration/#external-integration","text":"","title":"External integration"},{"location":"Support/Configuration/#rancid","text":"lnms config:set rancid_configs.+ /var/lib/rancid/network/configs/ lnms config:set rancid_repo_type svn lnms config:set rancid_ignorecomments false Rancid configuration, rancid_configs is an array containing all of the locations of your rancid files. Setting rancid_ignorecomments will disable showing lines that start with #","title":"Rancid"},{"location":"Support/Configuration/#oxidized","text":"Please refer to Oxidized","title":"Oxidized"},{"location":"Support/Configuration/#collectd","text":"lnms config:set collectd_dir /var/lib/collectd/rrd Specify the location of the collectd rrd files. Note that the location in config.php should be consistent with the location set in /etc/collectd.conf and etc/collectd.d/rrdtool.conf DataDir \"/var/lib/collectd/rrd\" CreateFilesAsync false CacheTimeout 120 CacheFlush 900 WritesPerSecond 50 /etc/collectd.conf LoadPlugin rrdtool DataDir \"/var/lib/collectd/rrd\" CacheTimeout 120 CacheFlush 900 /etc/collectd.d/rrdtool.conf lnms config:set collectd_sock unix:///var/run/collectd.sock Specify the location of the collectd unix socket. Using a socket allows the collectd graphs to be flushed to disk before being drawn. Be sure that your web server has permissions to write to this socket.","title":"CollectD"},{"location":"Support/Configuration/#smokeping","text":"Please refer to Smokeping","title":"Smokeping"},{"location":"Support/Configuration/#nfsen","text":"Please refer to NFSen","title":"NFSen"},{"location":"Support/Configuration/#location-parsing","text":"LibreNMS can interpret sysLocation information and map the device loction based on GeoCoordinates or GeoCoding information. Info-keywords [] contains optional Latitude and Longitude information if manual GeoCoordinate positioning is desired. () contains optional information that is ignored during GeoCoding lookups.","title":"Location parsing"},{"location":"Support/Configuration/#geocoordinates","text":"If device sysLocation information contains [lat, lng] (note the comma and square brackets), that is used to determin the GeoCoordinates. Example: name_that_can_not_be_looked_up [ 40 .424521, -86.912755 ]","title":"GeoCoordinates"},{"location":"Support/Configuration/#geocoding","text":"Next it will attempt to look up the sysLocation with a map engine provided you have configured one under $config['geoloc']['engine']. The information has to be accurate or no result is returned, when it does it will ignore any information inside parentheses, allowing you to add details that would otherwise interfeeer with the lookup. Example: 1100 Congress Ave, Austin, TX 78701 ( 3rd floor ) Geocoding lookup is: 1100 Congress Ave, Austin, TX 78701","title":"GeoCoding"},{"location":"Support/Configuration/#overrides","text":"You can overwrite each device sysLocation information in the webGUI under \"Device settings\". You can overwrite the location coordinates n in the webGUI under Device>GEO Locations","title":"Overrides"},{"location":"Support/Configuration/#location-mapping","text":"If you just want to set GPS coordinates on a location, you should visit Devices > Geo Locations > All Locations and edit the coordinates there. Exact Matching: lnms config:set location_map '{\"Under the Sink\": \"Under The Sink, The Office, London, UK\"}' Regex Matching: lnms config:set location_map_regex '{\"/Sink/\": \"Under The Sink, The Office, London, UK\"}' Regex Match Substitution: lnms config:set location_map_regex_sub '{\"/Sink/\": \"Under The Sink, The Office, London, UK [lat, long]\"}' If you have an SNMP SysLocation of \"Rack10,Rm-314,Sink\", Regex Match Substition yields \"Rack10,Rm-314,Under The Sink, The Office, London, UK [lat, long]\". This allows you to keep the SysLocation string short and keeps Rack/Room/Building information intact after the substitution. The above are examples, these will rewrite device snmp locations so you don't need to configure full location within snmp.","title":"Location mapping"},{"location":"Support/Configuration/#interfaces-to-be-ignored","text":"Interfaces can be automatically ignored during discovery by modifying bad_if* entries in a default array, unsetting a default array and customizing it, or creating an OS specific array. The preferred method for ignoring interfaces is to use an OS specific array. The default arrays can be found in misc/config_definitions.json. OS specific definitions (includes/definitions/_specific_os_.yaml) can contain bad_if* arrays, but should only be modified via pull-request as manipulation of the definition files will block updating: Examples: Add entries to default arrays lnms config:set bad_if.+ voip-null lnms config:set bad_iftype.+ voiceEncap lnms config:set bad_if_regexp.+ '/^lo[0-9].*/' # loopback Override default bad_if values lnms config:set bad_if '[\"voip-null\", \"voiceEncap\", \"voiceFXO\"]' Create an OS specific array lnms config:set os.iosxe.bad_iftype.+ macSecControlledIF lnms config:set os.iosxe.bad_iftype.+ macSecUncontrolledIF Various bad_if* selection options available bad_if is matched against the ifDescr value. bad_iftype is matched against the ifType value. bad_if_regexp is matched against the ifDescr value as a regular expression. bad_ifname_regexp is matched against the ifName value as a regular expression. bad_ifalias_regexp is matched against the ifAlias value as a regular expression.","title":"Interfaces to be ignored"},{"location":"Support/Configuration/#interfaces-that-shouldnt-be-ignored","text":"Examples: lnms config:set good_if.+ FastEthernet lnms config:set os.ios.good_if.+ FastEthernet good_if is matched against ifDescr value. This can be a bad_if value as well which would stop that port from being ignored. i.e. if bad_if and good_if both contained FastEthernet then ports with this value in the ifDescr will be valid.","title":"Interfaces that shouldn't be ignored"},{"location":"Support/Configuration/#interfaces-to-be-rewritten","text":"lnms config:set rewrite_if '{\"cpu\": \"Management Interface\"}' lnms config:set rewrite_if_regexp '{\"/cpu /\": \"Management \"}' Entries defined in rewrite_if are being replaced completely. Entries defined in rewrite_if_regexp only replace the match. Matches are compared case-insensitive.","title":"Interfaces to be rewritten"},{"location":"Support/Configuration/#entity-sensors-to-be-ignored","text":"Some devices register bogus sensors as they are returned via SNMP but either don't exist or just don't return data. This allows you to ignore those based on the descr field in the database. You can either ignore globally or on a per os basis. lnms config:set bad_entity_sensor_regex.+ '/Physical id [0-9]+/' lnms config:set os.ios.bad_entity_sensor_regex '[\"/Physical id [0-9]+/\"]'","title":"Entity sensors to be ignored"},{"location":"Support/Configuration/#entity-sensors-limit-values","text":"Vendors may give some limit values (or thresholds) for the discovered sensors. By default, when no such value is given, both high and low limit values are guessed, based on the value measured during the initial discovery. When it is preferred to have no high and/or low limit values at all if these are not provided by the vendor, the guess method can be disabled: lnms config:set sensors.guess_limits false","title":"Entity sensors limit values"},{"location":"Support/Configuration/#ignoring-health-sensors","text":"It is possible to filter some sensors from the configuration: Ignore all temperature sensors lnms config:set disabled_sensors.current true Filter all sensors matching regexp '/PEM Iout/' . lnms config:set disabled_sensors_regex.+ '/PEM Iout/' Filter all 'current' sensors for Operating System 'vrp'. lnms config:set os.vrp.disabled_sensors.current true Filter all sensors matching regexp '/PEM Iout/' for Operating System iosxe. lnms config:set os.iosxe.disabled_sensors_regex '/PEM Iout/'","title":"Ignoring Health Sensors"},{"location":"Support/Configuration/#storage-configuration","text":"Mounted storage / mount points to ignore in discovery and polling. discovery/storage ```bash lnms config:set ignore_mount_removable true lnms config:set ignore_mount_network true lnms config:set ignore_mount_optical true lnms config:set ignore_mount.+ /kern lnms config:set ignore_mount.+ /mnt/cdrom lnms config:set ignore_mount.+ /proc lnms config:set ignore_mount.+ /dev lnms config:set ignore_mount_string.+ packages lnms config:set ignore_mount_string.+ devfs lnms config:set ignore_mount_string.+ procfs lnms config:set ignore_mount_string.+ UMA lnms config:set ignore_mount_string.+ MALLOC lnms config:set ignore_mount_regexp.+ '/on: \\/packages/' lnms config:set ignore_mount_regexp.+ '/on: \\/dev/' lnms config:set ignore_mount_regexp.+ '/on: \\/proc/' lnms config:set ignore_mount_regexp.+ '/on: \\/junos^/' lnms config:set ignore_mount_regexp.+ '/on: \\/junos\\/dev/' lnms config:set ignore_mount_regexp.+ '/on: \\/jail\\/dev/' lnms config:set ignore_mount_regexp.+ '/^(dev|proc)fs/' lnms config:set ignore_mount_regexp.+ '/^\\/dev\\/md0/' lnms config:set ignore_mount_regexp.+ '/^\\/var\\/dhcpd\\/dev,/' lnms config:set ignore_mount_regexp.+ '/UMA/' ``` Custom storage warning percentage lnms config:set storage_perc_warn 60","title":"Storage configuration"},{"location":"Support/Configuration/#irc-bot","text":"Please refer to IRC Bot","title":"IRC Bot"},{"location":"Support/Configuration/#authentication_1","text":"Please refer to Authentication","title":"Authentication"},{"location":"Support/Configuration/#cleanup-options","text":"Please refer to Cleanup Options","title":"Cleanup options"},{"location":"Support/Configuration/#syslog-options","text":"Please refer to Syslog","title":"Syslog options"},{"location":"Support/Configuration/#virtualization","text":"lnms config:set enable_libvirt true lnms config:set libvirt_protocols '[\"qemu+ssh\",\"xen+ssh\"]' lnms config:set libvirt_username root Enable this to switch on support for libvirt along with libvirt_protocols to indicate how you connect to libvirt. You also need to: Generate a non-password-protected ssh key for use by LibreNMS, as the user which runs polling & discovery (usually librenms ). On each VM host you wish to monitor: Configure public key authentication from your LibreNMS server/poller by adding the librenms public key to ~root/.ssh/authorized_keys . (xen+ssh only) Enable libvirtd to gather data from xend by setting (xend-unix-server yes) in /etc/xen/xend-config.sxp and restarting xend and libvirtd. To test your setup, run virsh -c qemu+ssh://vmhost/system list or virsh -c xen+ssh://vmhost list as your librenms polling user.","title":"Virtualization"},{"location":"Support/Configuration/#bgp-support","text":"lnms config:set astext.65332 \"Cymru FullBogon Feed\" You can use this array to rewrite the description of ASes that you have discovered.","title":"BGP Support"},{"location":"Support/Configuration/#auto-updates","text":"Please refer to Updating","title":"Auto updates"},{"location":"Support/Configuration/#ipmi","text":"Setup the types of IPMI protocols to test a host for and in what order. Don't forget to install ipmitool on the monitoring host. lnms config:set ipmi.type '[\"lanplus\", \"lan\", \"imb\", \"open\"]'","title":"IPMI"},{"location":"Support/Configuration/#distributed-poller-settings","text":"Please refer to Distributed Poller","title":"Distributed poller settings"},{"location":"Support/Configuration/#api-settings","text":"","title":"API Settings"},{"location":"Support/Configuration/#cors-support","text":"https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS CORS support for the API is disabled by default. Below you will find the standard options, all of which you can configure. lnms config:set api.cors.enabled false lnms config:set api.cors.origin '[\"*\"]' lnms config:set api.cors.maxage '86400' lnms config:set api.cors.allowmethods '[\"POST\", \"GET\", \"PUT\", \"DELETE\", \"PATCH\"]' lnms config:set api.cors.allowheaders '[\"Origin\", \"X-Requested-With\", \"Content-Type\", \"Accept\", \"X-Auth-Token\"]' lnms config:set api.cors.exposeheaders '[\"Cache-Control\", \"Content-Language\", \"Content-Type\", \"Expires\", \"Last-Modified\", \"Pragma\"]' lnms config:set api.cors.allowmethods '[\"POST\", \"GET\", \"PUT\", \"DELETE\", \"PATCH\"]' lnms config:set api.cors.allowheaders '[\"Origin\", \"X-Requested-With\", \"Content-Type\", \"Accept\", \"X-Auth-Token\"]' lnms config:set api.cors.exposeheaders '[\"Cache-Control\", \"Content-Language\", \"Content-Type\", \"Expires\", \"Last-Modified\", \"Pragma\"]' lnms config:set api.cors.allowcredentials false","title":"CORS Support"},{"location":"Support/Device-Sensors/","text":"Device Sensors LibreNMS has a standard for device sensors they are split into categories. This doc is to help users understand device sensors in general, if you need help with developing sensors for a device please see the Contributing + Developing section. Health Sensors The High and Low values of these sensors can be edited in Web UI by going to the device settings -> Health. There you can set your own custom High and Low values. List of these sensors can be found here Link Note Some values are defined by the manufactures and others are auto calculated when you add the device into librenms. Keep in mind every environment is different and may require user input. Wireless Sensors Some Wireless have High and Low values of these sensors can be edited in Web UI by going to the device settings -> Wireless Sensors There you can set your own custom High and Low values. List of these sensors can be found here Link Note Some values are defined by the manufactures and others are auto calculated when you add the device into librenms. Keep in mind every environment is different and may require user input. State Sensors Return states of device entries sensors states. For example. Drive Status, Memory Status, Power Supply Status. 0 = OK 1 = Warning 2 = Critical 3 = Unknown Alerting Sensors These alert rules can be found inside the Alert Rules Collection. The alert rules below are the default alert rules, there are more device-specific alert rules in the alerts collection. Sensor Over Limit Alert Rule: Will alert on any sensor value that is over the limit. Sensor Under Limit Alert Rule: Will alert on any sensor value that is under the limit. Remember you can set these limits inside device settings in the Web UI. State Sensor Critical: Will alert on any state that returns critical = 2 State Sensor Warning: Will alert on any state that returns warning = 1 Wireless Sensor Over Limit Alert Rule: Will Alert on sensors that listed in device settings under Wireless. Wireless Sensor Under Limit Alert Rule: Will Alert on sensors that listed in device settings under Wireless.","title":"Device Sensors"},{"location":"Support/Device-Sensors/#device-sensors","text":"LibreNMS has a standard for device sensors they are split into categories. This doc is to help users understand device sensors in general, if you need help with developing sensors for a device please see the Contributing + Developing section.","title":"Device Sensors"},{"location":"Support/Device-Sensors/#health-sensors","text":"The High and Low values of these sensors can be edited in Web UI by going to the device settings -> Health. There you can set your own custom High and Low values. List of these sensors can be found here Link Note Some values are defined by the manufactures and others are auto calculated when you add the device into librenms. Keep in mind every environment is different and may require user input.","title":"Health Sensors"},{"location":"Support/Device-Sensors/#wireless-sensors","text":"Some Wireless have High and Low values of these sensors can be edited in Web UI by going to the device settings -> Wireless Sensors There you can set your own custom High and Low values. List of these sensors can be found here Link Note Some values are defined by the manufactures and others are auto calculated when you add the device into librenms. Keep in mind every environment is different and may require user input.","title":"Wireless Sensors"},{"location":"Support/Device-Sensors/#state-sensors","text":"Return states of device entries sensors states. For example. Drive Status, Memory Status, Power Supply Status. 0 = OK 1 = Warning 2 = Critical 3 = Unknown","title":"State Sensors"},{"location":"Support/Device-Sensors/#alerting-sensors","text":"These alert rules can be found inside the Alert Rules Collection. The alert rules below are the default alert rules, there are more device-specific alert rules in the alerts collection. Sensor Over Limit Alert Rule: Will alert on any sensor value that is over the limit. Sensor Under Limit Alert Rule: Will alert on any sensor value that is under the limit. Remember you can set these limits inside device settings in the Web UI. State Sensor Critical: Will alert on any state that returns critical = 2 State Sensor Warning: Will alert on any state that returns warning = 1 Wireless Sensor Over Limit Alert Rule: Will Alert on sensors that listed in device settings under Wireless. Wireless Sensor Under Limit Alert Rule: Will Alert on sensors that listed in device settings under Wireless.","title":"Alerting Sensors"},{"location":"Support/Device-Troubleshooting/","text":"Capture Debug Information You can use this feature to run Debug on Discovery, Poller, SNMP, Alerts. This output information could be helpful for you in troubleshooting a device or when requesting help. This feature can be found by going to the device that you are troubleshooting in the webui, clicking on the settings icon menu on far right and selecting Capture. Discovery Discovery will run and output debug information. Poller Poller will run and output debug information. SNMP SNMP will run SNMP Bulk Walk on the device and output the information. Alerts Alerts Capture is handy when you are creating alerts and need to see if your alert rule matches.","title":"Device Troubleshooting"},{"location":"Support/Device-Troubleshooting/#capture-debug-information","text":"You can use this feature to run Debug on Discovery, Poller, SNMP, Alerts. This output information could be helpful for you in troubleshooting a device or when requesting help. This feature can be found by going to the device that you are troubleshooting in the webui, clicking on the settings icon menu on far right and selecting Capture.","title":"Capture Debug Information"},{"location":"Support/Device-Troubleshooting/#discovery","text":"Discovery will run and output debug information.","title":"Discovery"},{"location":"Support/Device-Troubleshooting/#poller","text":"Poller will run and output debug information.","title":"Poller"},{"location":"Support/Device-Troubleshooting/#snmp","text":"SNMP will run SNMP Bulk Walk on the device and output the information.","title":"SNMP"},{"location":"Support/Device-Troubleshooting/#alerts","text":"Alerts Capture is handy when you are creating alerts and need to see if your alert rule matches.","title":"Alerts"},{"location":"Support/Discovery%20Support/","text":"discovery.php This document will explain how to use discovery.php to debug issues or manually running to process data. Command options -h | Poll single device -h odd Poll odd numbered devices ( same as -i 2 -n 0 ) -h even Poll even numbered devices ( same as -i 2 -n 1 ) -h all Poll all devices -h new Poll all devices that have not had a discovery run before --os Poll devices only with specified operating system --type Poll devices only with specified type -i -n Poll as instance of Instances start at 0 . 0 -3 for -n 4 Debugging and testing options: -d Enable debugging output -v Enable verbose debugging output -m Specify module ( s ) to be run. Comma separate modules, submodules may be added with / -h Use this to specify a device via either id or hostname (including wildcard using *). You can also specify odd and even. all will run discovery against all devices whilst new will poll only those devices that have recently been added or have been selected for rediscovery. -i This can be used to stagger the discovery process. -d Enables debugging output (verbose output but with most sensitive data masked) so that you can see what is happening during a discovery run. This includes things like rrd updates, SQL queries and response from snmp. -v Enables verbose debugging output with all data in tact. -m This enables you to specify the module you want to run for discovery. Discovery wrapper We have a discovery-wrapper.py script which is based on poller-wrapper.py by Job Snijders . This script is currently the default. If you need to debug the output of discovery-wrapper.py then you can add -d to the end of the command - it is NOT recommended to do this in cron. You also may use -m to pass a list of comma-separated modules. Please refer to Command options of discovery.php. Example: /opt/librenms/discovery-wrapper.py 1 -m bgp-peers If you want to switch back to discovery.php then you can replace: 33 */6 * * * librenms /opt/librenms/discovery-wrapper.py 1 >> /dev/null 2>&1 With: 33 */6 * * * librenms /opt/librenms/discovery.php -h all >> /dev/null 2>&1 Discovery config These are the default discovery config items. You can globally disable a module by setting it to 0. If you just want to disable it for one device then you can do this within the WebUI -> Device -> Settings -> Modules. discovery/discovery_modules lnms config:set discovery_modules.os true lnms config:set discovery_modules.ports true lnms config:set discovery_modules.ports-stack true lnms config:set discovery_modules.entity-physical true lnms config:set discovery_modules.entity-state false lnms config:set discovery_modules.processors true lnms config:set discovery_modules.mempools true lnms config:set discovery_modules.cisco-vrf-lite true lnms config:set discovery_modules.cisco-mac-accounting false lnms config:set discovery_modules.cisco-pw false lnms config:set discovery_modules.vrf false lnms config:set discovery_modules.cisco-cef false lnms config:set discovery_modules.slas false lnms config:set discovery_modules.cisco-cbqos false lnms config:set discovery_modules.cisco-otv false lnms config:set discovery_modules.ipv4-addresses true lnms config:set discovery_modules.ipv6-addresses true lnms config:set discovery_modules.route false lnms config:set discovery_modules.sensors true lnms config:set discovery_modules.storage true lnms config:set discovery_modules.hr-device true lnms config:set discovery_modules.discovery-protocols true lnms config:set discovery_modules.arp-table true lnms config:set discovery_modules.discovery-arp false lnms config:set discovery_modules.junose-atm-vp false lnms config:set discovery_modules.bgp-peers true lnms config:set discovery_modules.vlans true lnms config:set discovery_modules.vminfo false lnms config:set discovery_modules.printer-supplies false lnms config:set discovery_modules.ucd-diskio true lnms config:set discovery_modules.applications false lnms config:set discovery_modules.services true lnms config:set discovery_modules.stp true lnms config:set discovery_modules.ntp true lnms config:set discovery_modules.loadbalancers false lnms config:set discovery_modules.mef false lnms config:set discovery_modules.wireless true lnms config:set discovery_modules.fdb-table true lnms config:set discovery_modules.xdsl false OS based Discovery config You can enable or disable modules for a specific OS by using lnms config:set OS based settings have preference over global. Device based settings have preference over all others Discover performance improvement can be achieved by deactivating all modules that are not supported by specific OS. E.g. to deactivate spanning tree but activate discovery-arp module for linux OS discovery/discovery_modules lnms config:set os.linux.discovery_modules.stp false lnms config:set os.linux.discovery_modules.discovery-arp true Discovery modules os : Os detection. This module will pick up the OS of the device. ports : This module will detect all ports on a device excluding ones configured to be ignored by config options. ports-stack : Same as ports except for stacks. xdsl : Module to collect more metrics for xDSL interfaces. entity-physical : Module to pick up the devices hardware support. processors : Processor support for devices. mempools : Memory detection support for devices. cisco-vrf-lite : VRF-Lite detection and support. ipv4-addresses : IPv4 Address detection ipv6-addresses : IPv6 Address detection route : This module will load the routing table of the device. The default route limit is 1000 (configurable with lnms config:set routes.max_number 1000 ), with history data. sensors : Sensor detection such as Temperature, Humidity, Voltages + More storage : Storage detection for hard disks hr-device : Processor and Memory support via HOST-RESOURCES-MIB. discovery-protocols : Auto discovery module for xDP, OSPF and BGP. arp-table : Detection of the ARP table for the device. fdb-table : Detection of the Forwarding DataBase table for the device, with history data. discovery-arp : Auto discovery via ARP. junose-atm-vp : Juniper ATM support. bgp-peers : BGP detection and support. vlans : VLAN detection and support. cisco-mac-accounting : MAC Address account support. cisco-pw : Pseudowires wires detection and support. vrf : VRF detection and support. cisco-cef : CEF detection and support. slas : SLA detection and support. vminfo : Detection of vm guests for VMware ESXi and libvert printer-supplies : Toner levels support. ucd-diskio : Disk I/O support. services : *Nix services support. charge : APC Charge detection and support. Running Here are some examples of running discovery from within your install directory. ./discovery.php -h localhost ./discovery.php -h localhost -m ports Debugging To provide debugging output you will need to run the discovery process with the -d flag. You can do this either against all modules, single or multiple modules: All Modules ./discovery.php -h localhost -d Single Module ./discovery.php -h localhost -m ports -d Multiple Modules ./discovery.php -h localhost -m ports,entity-physical -d Using -d shouldn't output much sensitive information, -v will so it is then advisable to sanitise the output before pasting it somewhere as the debug output will contain snmp details amongst other items including port descriptions. The output will contain: DB Updates SNMP Response","title":"Discovery Support"},{"location":"Support/Discovery%20Support/#discoveryphp","text":"This document will explain how to use discovery.php to debug issues or manually running to process data.","title":"discovery.php"},{"location":"Support/Discovery%20Support/#command-options","text":"-h | Poll single device -h odd Poll odd numbered devices ( same as -i 2 -n 0 ) -h even Poll even numbered devices ( same as -i 2 -n 1 ) -h all Poll all devices -h new Poll all devices that have not had a discovery run before --os Poll devices only with specified operating system --type Poll devices only with specified type -i -n Poll as instance of Instances start at 0 . 0 -3 for -n 4 Debugging and testing options: -d Enable debugging output -v Enable verbose debugging output -m Specify module ( s ) to be run. Comma separate modules, submodules may be added with / -h Use this to specify a device via either id or hostname (including wildcard using *). You can also specify odd and even. all will run discovery against all devices whilst new will poll only those devices that have recently been added or have been selected for rediscovery. -i This can be used to stagger the discovery process. -d Enables debugging output (verbose output but with most sensitive data masked) so that you can see what is happening during a discovery run. This includes things like rrd updates, SQL queries and response from snmp. -v Enables verbose debugging output with all data in tact. -m This enables you to specify the module you want to run for discovery.","title":"Command options"},{"location":"Support/Discovery%20Support/#discovery-wrapper","text":"We have a discovery-wrapper.py script which is based on poller-wrapper.py by Job Snijders . This script is currently the default. If you need to debug the output of discovery-wrapper.py then you can add -d to the end of the command - it is NOT recommended to do this in cron. You also may use -m to pass a list of comma-separated modules. Please refer to Command options of discovery.php. Example: /opt/librenms/discovery-wrapper.py 1 -m bgp-peers If you want to switch back to discovery.php then you can replace: 33 */6 * * * librenms /opt/librenms/discovery-wrapper.py 1 >> /dev/null 2>&1 With: 33 */6 * * * librenms /opt/librenms/discovery.php -h all >> /dev/null 2>&1","title":"Discovery wrapper"},{"location":"Support/Discovery%20Support/#discovery-config","text":"These are the default discovery config items. You can globally disable a module by setting it to 0. If you just want to disable it for one device then you can do this within the WebUI -> Device -> Settings -> Modules. discovery/discovery_modules lnms config:set discovery_modules.os true lnms config:set discovery_modules.ports true lnms config:set discovery_modules.ports-stack true lnms config:set discovery_modules.entity-physical true lnms config:set discovery_modules.entity-state false lnms config:set discovery_modules.processors true lnms config:set discovery_modules.mempools true lnms config:set discovery_modules.cisco-vrf-lite true lnms config:set discovery_modules.cisco-mac-accounting false lnms config:set discovery_modules.cisco-pw false lnms config:set discovery_modules.vrf false lnms config:set discovery_modules.cisco-cef false lnms config:set discovery_modules.slas false lnms config:set discovery_modules.cisco-cbqos false lnms config:set discovery_modules.cisco-otv false lnms config:set discovery_modules.ipv4-addresses true lnms config:set discovery_modules.ipv6-addresses true lnms config:set discovery_modules.route false lnms config:set discovery_modules.sensors true lnms config:set discovery_modules.storage true lnms config:set discovery_modules.hr-device true lnms config:set discovery_modules.discovery-protocols true lnms config:set discovery_modules.arp-table true lnms config:set discovery_modules.discovery-arp false lnms config:set discovery_modules.junose-atm-vp false lnms config:set discovery_modules.bgp-peers true lnms config:set discovery_modules.vlans true lnms config:set discovery_modules.vminfo false lnms config:set discovery_modules.printer-supplies false lnms config:set discovery_modules.ucd-diskio true lnms config:set discovery_modules.applications false lnms config:set discovery_modules.services true lnms config:set discovery_modules.stp true lnms config:set discovery_modules.ntp true lnms config:set discovery_modules.loadbalancers false lnms config:set discovery_modules.mef false lnms config:set discovery_modules.wireless true lnms config:set discovery_modules.fdb-table true lnms config:set discovery_modules.xdsl false","title":"Discovery config"},{"location":"Support/Discovery%20Support/#os-based-discovery-config","text":"You can enable or disable modules for a specific OS by using lnms config:set OS based settings have preference over global. Device based settings have preference over all others Discover performance improvement can be achieved by deactivating all modules that are not supported by specific OS. E.g. to deactivate spanning tree but activate discovery-arp module for linux OS discovery/discovery_modules lnms config:set os.linux.discovery_modules.stp false lnms config:set os.linux.discovery_modules.discovery-arp true","title":"OS based Discovery config"},{"location":"Support/Discovery%20Support/#discovery-modules","text":"os : Os detection. This module will pick up the OS of the device. ports : This module will detect all ports on a device excluding ones configured to be ignored by config options. ports-stack : Same as ports except for stacks. xdsl : Module to collect more metrics for xDSL interfaces. entity-physical : Module to pick up the devices hardware support. processors : Processor support for devices. mempools : Memory detection support for devices. cisco-vrf-lite : VRF-Lite detection and support. ipv4-addresses : IPv4 Address detection ipv6-addresses : IPv6 Address detection route : This module will load the routing table of the device. The default route limit is 1000 (configurable with lnms config:set routes.max_number 1000 ), with history data. sensors : Sensor detection such as Temperature, Humidity, Voltages + More storage : Storage detection for hard disks hr-device : Processor and Memory support via HOST-RESOURCES-MIB. discovery-protocols : Auto discovery module for xDP, OSPF and BGP. arp-table : Detection of the ARP table for the device. fdb-table : Detection of the Forwarding DataBase table for the device, with history data. discovery-arp : Auto discovery via ARP. junose-atm-vp : Juniper ATM support. bgp-peers : BGP detection and support. vlans : VLAN detection and support. cisco-mac-accounting : MAC Address account support. cisco-pw : Pseudowires wires detection and support. vrf : VRF detection and support. cisco-cef : CEF detection and support. slas : SLA detection and support. vminfo : Detection of vm guests for VMware ESXi and libvert printer-supplies : Toner levels support. ucd-diskio : Disk I/O support. services : *Nix services support. charge : APC Charge detection and support.","title":"Discovery modules"},{"location":"Support/Discovery%20Support/#running","text":"Here are some examples of running discovery from within your install directory. ./discovery.php -h localhost ./discovery.php -h localhost -m ports","title":"Running"},{"location":"Support/Discovery%20Support/#debugging","text":"To provide debugging output you will need to run the discovery process with the -d flag. You can do this either against all modules, single or multiple modules: All Modules ./discovery.php -h localhost -d Single Module ./discovery.php -h localhost -m ports -d Multiple Modules ./discovery.php -h localhost -m ports,entity-physical -d Using -d shouldn't output much sensitive information, -v will so it is then advisable to sanitise the output before pasting it somewhere as the debug output will contain snmp details amongst other items including port descriptions. The output will contain: DB Updates SNMP Response","title":"Debugging"},{"location":"Support/Environment-Variables/","text":"Environment Variables LibreNMS allows certain settings to be set via the environment or through the .env file. Database Set the variables to connect to the database. The default values are shown below. DB_HOST=localhost DB_PORT=3306 DB_DATABASE=librenms DB_USERNAME=librenms DB_PASSWORD= DB_SOCKET= Trusted Reverse Proxies A comma separated list of trusted reverse proxy IPs or CIDR. For legacy reasons the default is '*' , which means any proxy is allowed. '**' means trust any proxy up the chain. APP_TRUSTED_PROXIES=192.168.1.0/24,192.167.8.20 Base url Set the base url for generated urls. This will be needed when using signed graph urls for alerting. It may be needed when using reverse proxies combined with a subdirectory. Generally, LibreNMS will make correct URLs (especially if you have set up your proxy variables correctly) APP_URL=http://librenms/ User / Group The user and group that LibreNMS should operate as. Group will default to the same as the user if unset. LIBRENMS_USER=librenms LIBRENMS_GROUP=librenms Debug Increases the amount of information shown when an error occurs. WARNING: This may leak information, do not leave enabled. APP_DEBUG=true","title":"Environment Variables"},{"location":"Support/Environment-Variables/#environment-variables","text":"LibreNMS allows certain settings to be set via the environment or through the .env file.","title":"Environment Variables"},{"location":"Support/Environment-Variables/#database","text":"Set the variables to connect to the database. The default values are shown below. DB_HOST=localhost DB_PORT=3306 DB_DATABASE=librenms DB_USERNAME=librenms DB_PASSWORD= DB_SOCKET=","title":"Database"},{"location":"Support/Environment-Variables/#trusted-reverse-proxies","text":"A comma separated list of trusted reverse proxy IPs or CIDR. For legacy reasons the default is '*' , which means any proxy is allowed. '**' means trust any proxy up the chain. APP_TRUSTED_PROXIES=192.168.1.0/24,192.167.8.20","title":"Trusted Reverse Proxies"},{"location":"Support/Environment-Variables/#base-url","text":"Set the base url for generated urls. This will be needed when using signed graph urls for alerting. It may be needed when using reverse proxies combined with a subdirectory. Generally, LibreNMS will make correct URLs (especially if you have set up your proxy variables correctly) APP_URL=http://librenms/","title":"Base url"},{"location":"Support/Environment-Variables/#user-group","text":"The user and group that LibreNMS should operate as. Group will default to the same as the user if unset. LIBRENMS_USER=librenms LIBRENMS_GROUP=librenms","title":"User / Group"},{"location":"Support/Environment-Variables/#debug","text":"Increases the amount of information shown when an error occurs. WARNING: This may leak information, do not leave enabled. APP_DEBUG=true","title":"Debug"},{"location":"Support/Example-Hardware-Setup/","text":"Example hardware setups The information in this document is direct from users, it's a place for people to share their setups so you have an idea of what may be required for your install. To obtain the device, port and sensor counts you can run: select count ( * ) from devices ; select count ( * ) from ports where `deleted` = 0 ; select count ( * ) from sensors where `sensor_deleted` = 0 ; laf Home Running in Proxmox. LibreNMS MySQL Type Virtual Virtual OS CentOS 7 CentOS 7 CPU 2 Sockets, 4 Cores 1 Socket, 2 Cores Memory 2GB 2GB Disk Type Raid 1, SSD Raid 1, SSD Disk Space 18GB 30GB Devices 20 - Ports 133 - Health sensors 47 - Load < 0.1 < 0.1 Vente-Priv\u00e9e NOC LibreNMS MariaDB Type Dell R430 Dell R430 OS Debian 7 (dotdeb) Debian 7 (dotdeb) CPU 2 Sockets, 14 Cores 1 Socket, 2 Cores Memory 256GB 256GB Disk Type Raid 10, SSD Raid 10, SSD Disk Space 1TB 1TB Devices 1028 - Ports 26745 - Health sensors 6238 - Load < 0.5 < 0.5 KKrumm Home LibreNMS MySQL Type VM Same Server OS CentOS 7 CPU 2 Sockets, 4 Cores Memory 4GB Disk Type Raid 10, SAS Drives Disk Space 40 GB Devices 12 Ports 130 Health sensors 44 Load < 2.5 KKrumm Work LibreNMS MySQL Type HP Proliantdl380gen8 Same Server OS CentOS 7 CPU 2 Sockets, 24 Cores Memory 32GB Disk Type Raid 10, SAS Drives Disk Space 250 GB Devices 390 Ports 16167 Health sensors 3223 Load < 14.5 CppMonkey(KodApa85) Home LibreNMS MariaDB Type i5-4690K Same Workstation OS Ubuntu 18.04.2 CPU 4 Cores Memory 16GB Disk Type Hybrid SATA Disk Space 2 TB Devices 14 Ports 0 Health sensors 70 Load < 0.5 CppMonkey(KodApa85) Dev Running in Ganeti LibreNMS MariaDB Type VM Same VM OS CentOS 7.5 CPU 2 Cores Memory 4GB Disk Type M.2 Disk Space 40 GB Devices 38 Ports 1583 Health sensors 884 Load < 1.0 CppMonkey(KodApa85) Work NOC Running in Ganeti Cluster with 2x Dell PER730xd - 64GB, Dual E5-2660 v3 LibreNMS MariaDB Type VM VM OS Debian Stretch Debian Stretch CPU 4 Cores 2 Cores Memory 8GB 4GB Disk Type Raid 6, SAS Drives Disk Space 100 GB 40GB Devices 179 Ports 14495 Health sensors 2329 Load < 2.5 < 1.5 LaZyDK Home LibreNMS MariaDB Type VM - QNAP TS-453 Pro Same Server OS Ubuntu 16.04 CPU 1 vCore Memory 2GB Disk Type Raid 1, SATA Drives Disk Space 10 GB Devices 26 Ports 228 Health sensors 117 Load < 0.92 SirMaple Home LibreNMS MariaDB Type VM Same Server OS Debian 11 CPU 4 vCore Memory 4GB Disk Type Raid 1, SSD Disk Space 50 GB Devices 41 Ports 317 Health sensors 243 Load < 3.15 VVelox Home / Dev LibreNMS MariaDB Type Supermicro X7SPA-HF Same Server OS FreeBSD 12-STABLE CPU Intel Atom D525 Memory 4GB Disk Type Raid 1, SATA Disk Space 1TB Devices 17 Ports 174 Health sensors 76 Load < 3 SourceDoctor Home / Dev Running in VMWare Workstation Pro LibreNMS MariaDB Type VM Same Server OS Debian Buster CPU 2 vCore Memory 2GB Disk Type Raid 5, SSD Disk Space 20GB Devices 35 Ports 245 Health sensors 101 Load < 1 lazyb0nes Lab LibreNMS MariaDB Type VM Same Server OS RHEL 7.7 CPU 32 cores Memory 64GB Disk Type Flash San Array Disk Space 400GB Devices 670 Ports 25678 Health sensors 2457 Load 10.92 dagb Work Running in VMware. LibreNMS MariaDB Type Virtual Same Server OS CentOS 7 CPU 12 Cores Xeon 6130 Memory 8GB Disk Type SAN (SSD) Disk Space 26GB/72GB/7GB (logs/RRDs/db) Devices 650 Ports 34300 Health sensors 10500 Load 5.5 (45%)","title":"Example Hardware Setups"},{"location":"Support/Example-Hardware-Setup/#example-hardware-setups","text":"The information in this document is direct from users, it's a place for people to share their setups so you have an idea of what may be required for your install. To obtain the device, port and sensor counts you can run: select count ( * ) from devices ; select count ( * ) from ports where `deleted` = 0 ; select count ( * ) from sensors where `sensor_deleted` = 0 ;","title":"Example hardware setups"},{"location":"Support/Example-Hardware-Setup/#laf","text":"Home Running in Proxmox. LibreNMS MySQL Type Virtual Virtual OS CentOS 7 CentOS 7 CPU 2 Sockets, 4 Cores 1 Socket, 2 Cores Memory 2GB 2GB Disk Type Raid 1, SSD Raid 1, SSD Disk Space 18GB 30GB Devices 20 - Ports 133 - Health sensors 47 - Load < 0.1 < 0.1","title":"laf"},{"location":"Support/Example-Hardware-Setup/#vente-privee","text":"NOC LibreNMS MariaDB Type Dell R430 Dell R430 OS Debian 7 (dotdeb) Debian 7 (dotdeb) CPU 2 Sockets, 14 Cores 1 Socket, 2 Cores Memory 256GB 256GB Disk Type Raid 10, SSD Raid 10, SSD Disk Space 1TB 1TB Devices 1028 - Ports 26745 - Health sensors 6238 - Load < 0.5 < 0.5","title":"Vente-Priv\u00e9e"},{"location":"Support/Example-Hardware-Setup/#kkrumm","text":"Home LibreNMS MySQL Type VM Same Server OS CentOS 7 CPU 2 Sockets, 4 Cores Memory 4GB Disk Type Raid 10, SAS Drives Disk Space 40 GB Devices 12 Ports 130 Health sensors 44 Load < 2.5","title":"KKrumm"},{"location":"Support/Example-Hardware-Setup/#kkrumm_1","text":"Work LibreNMS MySQL Type HP Proliantdl380gen8 Same Server OS CentOS 7 CPU 2 Sockets, 24 Cores Memory 32GB Disk Type Raid 10, SAS Drives Disk Space 250 GB Devices 390 Ports 16167 Health sensors 3223 Load < 14.5","title":"KKrumm"},{"location":"Support/Example-Hardware-Setup/#cppmonkeykodapa85","text":"Home LibreNMS MariaDB Type i5-4690K Same Workstation OS Ubuntu 18.04.2 CPU 4 Cores Memory 16GB Disk Type Hybrid SATA Disk Space 2 TB Devices 14 Ports 0 Health sensors 70 Load < 0.5","title":"CppMonkey(KodApa85)"},{"location":"Support/Example-Hardware-Setup/#cppmonkeykodapa85_1","text":"Dev Running in Ganeti LibreNMS MariaDB Type VM Same VM OS CentOS 7.5 CPU 2 Cores Memory 4GB Disk Type M.2 Disk Space 40 GB Devices 38 Ports 1583 Health sensors 884 Load < 1.0","title":"CppMonkey(KodApa85)"},{"location":"Support/Example-Hardware-Setup/#cppmonkeykodapa85_2","text":"Work NOC Running in Ganeti Cluster with 2x Dell PER730xd - 64GB, Dual E5-2660 v3 LibreNMS MariaDB Type VM VM OS Debian Stretch Debian Stretch CPU 4 Cores 2 Cores Memory 8GB 4GB Disk Type Raid 6, SAS Drives Disk Space 100 GB 40GB Devices 179 Ports 14495 Health sensors 2329 Load < 2.5 < 1.5","title":"CppMonkey(KodApa85)"},{"location":"Support/Example-Hardware-Setup/#lazydk","text":"Home LibreNMS MariaDB Type VM - QNAP TS-453 Pro Same Server OS Ubuntu 16.04 CPU 1 vCore Memory 2GB Disk Type Raid 1, SATA Drives Disk Space 10 GB Devices 26 Ports 228 Health sensors 117 Load < 0.92","title":"LaZyDK"},{"location":"Support/Example-Hardware-Setup/#sirmaple","text":"Home LibreNMS MariaDB Type VM Same Server OS Debian 11 CPU 4 vCore Memory 4GB Disk Type Raid 1, SSD Disk Space 50 GB Devices 41 Ports 317 Health sensors 243 Load < 3.15","title":"SirMaple"},{"location":"Support/Example-Hardware-Setup/#vvelox","text":"Home / Dev LibreNMS MariaDB Type Supermicro X7SPA-HF Same Server OS FreeBSD 12-STABLE CPU Intel Atom D525 Memory 4GB Disk Type Raid 1, SATA Disk Space 1TB Devices 17 Ports 174 Health sensors 76 Load < 3","title":"VVelox"},{"location":"Support/Example-Hardware-Setup/#sourcedoctor","text":"Home / Dev Running in VMWare Workstation Pro LibreNMS MariaDB Type VM Same Server OS Debian Buster CPU 2 vCore Memory 2GB Disk Type Raid 5, SSD Disk Space 20GB Devices 35 Ports 245 Health sensors 101 Load < 1","title":"SourceDoctor"},{"location":"Support/Example-Hardware-Setup/#lazyb0nes","text":"Lab LibreNMS MariaDB Type VM Same Server OS RHEL 7.7 CPU 32 cores Memory 64GB Disk Type Flash San Array Disk Space 400GB Devices 670 Ports 25678 Health sensors 2457 Load 10.92","title":"lazyb0nes"},{"location":"Support/Example-Hardware-Setup/#dagb","text":"Work Running in VMware. LibreNMS MariaDB Type Virtual Same Server OS CentOS 7 CPU 12 Cores Xeon 6130 Memory 8GB Disk Type SAN (SSD) Disk Space 26GB/72GB/7GB (logs/RRDs/db) Devices 650 Ports 34300 Health sensors 10500 Load 5.5 (45%)","title":"dagb"},{"location":"Support/FAQ/","text":"Getting started How do I install LibreNMS? This is currently well documented within the doc folder of the installation files. Please see the following doc How do I add a device? You have two options for adding a new device into LibreNMS. 1: Using the command line via ssh you can add a new device by changing to the directory of your LibreNMS install and typing: lnms device:add [ hostname or ip ] To see all options run: lnms device:add -h Please note that if the community contains special characters such as $ then you will need to wrap it in ' . I.e: 'Pa$$w0rd' . 2: Using the web interface, go to Devices and then Add Device. Enter the details required for the device that you want to add and then click 'Add Host'. How do I get help? Getting Help What are the supported OSes for installing LibreNMS on? Supported is quite a strong word :) The 'officially' supported distros are: Ubuntu / Debian Red Hat / CentOS Gentoo However we will always aim to help wherever possible so if you are running a distro that isn't one of the above then give it a try anyway and if you need help then jump on the discord server . Do you have a demo available? We do indeed, you can find access to the demo here Support How does LibreNMS use MIBs? LibreNMS does not parse MIBs to discover sensors for devices. LibreNMS uses static discovery definitions written in YAML or PHP. Therefore, updating a MIB alone will not improve OS support, the definitions must be updated. LibreNMS only uses MIBs to make OIDs easier to read. Why do I get blank pages sometimes in the WebUI? You can enable debug information by setting APP_DEBUG=true in your .env. (Do not leave this enabled, it could leak private data) If the page you are trying to load has a substantial amount of data in it then it could be that the php memory limit needs to be increased in config.php . Why do I not see any graphs? The easiest way to check if all is well is to run ./validate.php as librenms from within your install directory. This should give you info on why things aren't working. One other reason could be a restricted snmpd.conf file or snmp view which limits the data sent back. If you use net-snmp then we suggest using the included snmpd.conf file. How do I debug pages not loading correctly? A debug system is in place which enables you to see the output from php errors, warnings and notices along with the MySQL queries that have been run for that page. You can enable debug information by setting APP_DEBUG=true in your .env. (Do not leave this enabled, it could leak private data) To see additional information, run ./scripts/composer_wrapper.php install , to install additional debug tools. This will add a debug bar at the bottom of every page that will show you detailed debug information. How do I debug the discovery process? Please see the Discovery Support document for further details. How do I debug the poller process? Please see the Poller Support document for further details. Why do I get a lot apache or rrdtool zombies in my process list? If this is related to your web service for LibreNMS then this has been tracked down to an issue within php which the developers aren't fixing. We have implemented a work around which means you shouldn't be seeing this. If you are, please report this in issue 443 . Why do I see traffic spikes in my graphs? This occurs either when a counter resets or the device sends back bogus data making it look like a counter reset. We have enabled support for setting a maximum value for rrd files for ports. Before this all rrd files were set to 100G max values, now you can enable support to limit this to the actual port speed. rrdtool tune will change the max value when the interface speed is detected as being changed (min value will be set for anything 10M or over) or when you run the included script (./scripts/tune_port.php) - see RRDTune doc SNMP ifInOctets and ifOutOctets are counters, which means they start at 0 (at device boot) and count up from there. LibreNMS records the value every 5 minutes and uses the difference between the previous value and the current value to calculate rate. (Also, this value resets to 0 when it hits the max value) Now, when the value is not recorded for awhile RRD (our time series storage) does not record a 0, it records the last value, otherwise, there would be even worse problems. Then finally we get the current ifIn/OutOctets value and record that. Now, it appears as though all of the traffic since it stopped getting values have occurred in the last 5 minute interval. So whenever you see spikes like this, it means we have not received data from the device for several polling intervals. The cause can vary quite a bit: bad snmp implementations, intermittent network connectivity, broken poller, and more. Why do I see gaps in my graphs? This is most commonly due to the poller not being able to complete it's run within 300 seconds. Check which devices are causing this by going to /poll-log/ within the Web interface. When you find the device(s) which are taking the longest you can then look at the Polling module graph under Graphs -> Poller -> Poller Modules Performance. Take a look at what modules are taking the longest and disabled un used modules. If you poll a large number of devices / ports then it's recommended to run a local recursive dns server such as pdns-recursor. Running RRDCached is also highly advised in larger installs but has benefits no matter the size. How do I change the IP / hostname of a device? There is a host rename tool called renamehost.php in your librenms root directory. When renaming you are also changing the device's IP / hostname address for monitoring. Usage: ./renamehost.php You can also rename a device in the Web UI by going to the device, then clicking settings Icon -> Edit. My device doesn't finish polling within 300 seconds We have a few things you can try: Disable unnecessary polling modules under edit device. Set a max repeater value within the snmp settings for a device. What to set this to is tricky, you really should run an snmpbulkwalk with -Cr10 through -Cr50 to see what works best. 50 is usually a good choice if the device can cope. Things aren't working correctly? Run ./validate.php as librenms from within your install. Re-run ./validate.php once you've resolved any issues raised. You have an odd issue - we'd suggest you join our discord server to discuss. What do the values mean in my graphs? The values you see are reported as metric values. Thanks to a post on Reddit here are those values: 10^-18 a - atto 10^-15 f - femto 10^-12 p - pico 10^-9 n - nano 10^-6 u - micro 10^-3 m - milli 0 (no unit) 10^3 k - kilo 10^6 M - mega 10^9 G - giga 10^12 T - tera 10^15 P - peta Why does a device show as a warning? This is indicating that the device has rebooted within the last 24 hours (by default). If you want to adjust this threshold then you can do so by setting $config['uptime_warning'] = '86400'; in config.php . The value must be in seconds. Why do I not see all interfaces in the Overall traffic graph for a device? By default numerous interface types and interface descriptions are excluded from this graph. The excluded defaults are: $config [ 'device_traffic_iftype' ][] = '/loopback/' ; $config [ 'device_traffic_iftype' ][] = '/tunnel/' ; $config [ 'device_traffic_iftype' ][] = '/virtual/' ; $config [ 'device_traffic_iftype' ][] = '/mpls/' ; $config [ 'device_traffic_iftype' ][] = '/ieee8023adLag/' ; $config [ 'device_traffic_iftype' ][] = '/l2vlan/' ; $config [ 'device_traffic_iftype' ][] = '/ppp/' ; $config [ 'device_traffic_descr' ][] = '/loopback/' ; $config [ 'device_traffic_descr' ][] = '/vlan/' ; $config [ 'device_traffic_descr' ][] = '/tunnel/' ; $config [ 'device_traffic_descr' ][] = '/bond/' ; $config [ 'device_traffic_descr' ][] = '/null/' ; $config [ 'device_traffic_descr' ][] = '/dummy/' ; If you would like to re-include l2vlan interfaces for instance, you first need to unset the config array and set your options: unset ( $config [ 'device_traffic_iftype' ]); $config [ 'device_traffic_iftype' ][] = '/loopback/' ; $config [ 'device_traffic_iftype' ][] = '/tunnel/' ; $config [ 'device_traffic_iftype' ][] = '/virtual/' ; $config [ 'device_traffic_iftype' ][] = '/mpls/' ; $config [ 'device_traffic_iftype' ][] = '/ieee8023adLag/' ; $config [ 'device_traffic_iftype' ][] = '/ppp/' ; How do I migrate my LibreNMS install to another server? If you are moving from one CPU architecture to another then you will need to dump the rrd files and re-create them. If you are in this scenario then you can use Dan Brown's migration scripts . If you are just moving to another server with the same CPU architecture then the following steps should be all that's needed: Install LibreNMS as per our normal documentation; you don't need to run through the web installer or building the sql schema. Stop cron by commenting out all lines in /etc/cron.d/librenms Dump the MySQL database librenms from your old server ( mysqldump librenms -u root -p > librenms.sql )... and import it into your new server ( mysql -u root -p librenms < librenms.sql ). Copy the rrd/ folder to the new server. Copy the .env and config.php files to the new server. Check for modified files (eg specific os, ...) with git status and migrate them. Ensure ownership of the copied files and folders (substitute your user if necessary) - chown -R librenms:librenms /opt/librenms Delete old pollers on the GUI (gear icon --> Pollers --> Pollers) Validate your installation (/opt/librenms/validate.php) Re-enable cron by uncommenting all lines in /etc/cron.d/librenms Why is my EdgeRouter device not detected? If you have service snmp description set in your config then this will be why, please remove this. For some reason Ubnt have decided setting this value should override the sysDescr value returned which breaks our detection. If you don't have that set then this may be then due to an update of EdgeOS or a new device type, please create an issue . Why are some of my disks not showing? If you are monitoring a linux server then net-snmp doesn't always expose all disks via hrStorage (HOST-RESOURCES-MIB). We have additional support which will retrieve disks via dskTable (UCD-SNMP-MIB). To expose these disks you need to add additional config to your snmpd.conf file. For example, to expose /dev/sda1 which may be mounted as /storage you can specify: disk /dev/sda1 Or disk /storage Restart snmpd and LibreNMS should populate the additional disk after a fresh discovery. Why are my disks reporting an incorrect size? There is a known issue for net-snmp, which causes it to report incorrect disk size and disk usage when the size of the disk (or raid) are larger then 16TB, a workaround has been implemented but is not active on Centos 6.8 by default due to the fact that this workaround breaks official SNMP specs, and as such could cause unexpected behaviour in other SNMP tools. You can activate the workaround by adding to /etc/snmp/snmpd.conf : realStorageUnits 0 What does mean \\\"ignore alert tag\\\" on device, component, service and port? Tag device, component, service and port to ignore alerts. Alert checks will still run. However, ignore tag can be read in alert rules. For example on device, if devices.ignore = 0 or macros.device = 1 condition is is set and ignore alert tag is on, the alert rule won't match. The alert rule is ignored. How do I clean up alerts from my switches and routers about ports being down or changing speed Some properties used for alerting (ending in _prev ) are only updated when a change is detected, and not every time the poller runs. This means that if you make a permanant change to your network such as removing a device, performing a major firmware upgrade, or downgrading a WAN connection, you may be stuck with some unresolvable alerts. If a port will be permantly down, it's best practice to configure it to be administratively down on the device to prevent malicious access. You can then only run alerts on ports with ifAdminStatus = up . Otherwise, you'll need to reset the device port state history. On the device generating alerts, use the cog button to go to the edit device page. At the top of the device settings pane is a button labelled Reset Port State - this will clear the historic state for all ports on that device, allowing any active alerts to clear. Why can't Normal and Global View users see Oxidized? Configs can often contain sensitive data. Because of that only global admins can see configs. What is the Demo User for? Demo users allow full access except adding/editing users and deleting devices and can't change passwords. Why does modifying 'Default Alert Template' fail? This template's entry could be missing in the database. Please run this from the LibreNMS directory: php artisan db:seed --class = DefaultAlertTemplateSeeder Why would alert un-mute itself? If alert un-mutes itself then it most likely means that the alert cleared and is then triggered again. Please review eventlog as it will tell you in there. How do I change the Device Type? You can change the Device Type by going to the device you would like to change, then click on the Gear Icon -> Edit. If you would like to define custom types, we suggest using Device Groups . They will be listed in the menu similarly to device types. Editing large device groups gives error messages If the device group contains large amount of devices, editing it from the UI might cause errors on the form even when all the data seems correct. This is caused by PHP's max_input_vars -variable. You should be able to confirm that this is the case by inspecting the PHP's error logs. With the basic installation on Ubuntu 22.04 LTS with Nginx and PHP 8.1 FPM this value can be tuned by editing the file /etc/php/8.1/fpm/php.ini and adjusting the value of max_input_vars to be at least the size of the large group. In larger installations a value such as 10000 should suffice. Where do I update my database credentials? If you've changed your database credentials then you will need to update LibreNMS with those new details. Please edit .env .env : DB_HOST= DB_DATABASE= DB_USERNAME= DB_PASSWORD= DB_PORT= My reverse proxy is not working Make sure your proxy is passing the proper variables. At a minimum: X-Forwarded-For and X-Forwarded-Proto (X-Forwarded-Port if needed) You also need to Set the proxy or proxies as trusted If you are using a subdirectory on the reverse proxy and not on the actual web server, you may need to set APP_URL and $config['base_url'] . My alerts aren't being delivered on time If you're running MySQL/MariaDB on a separate machine or container make sure the timezone is set properly on both the LibreNMS and MySQL/MariaDB instance. Alerts will be delivered according to MySQL/MariaDB's time, so a mismatch between the two can cause alerts to be delivered late if LibreNMS is on a timezone later than MySQL/MariaDB. My alert templates stopped working You should probably have a look in the documentation concerning the new template syntax . Since version 1.42, syntax changed, and you basically need to convert your templates to this new syntax (including the titles). How do I use trend prediction in graphs As of Ver. 1.55 a new feature has been added where you can view a simple linear prediction in port graphs. It doesn't work on non-port graphs or consolidated graphs at the time this FAQ entry was written. To view a prediction: Click on any port graph of any network device Select a From date to your liking (not earlier than the device was actually added to LNMS), and then select a future date in the To field. Click update You should now see a linear prediction line on the graph. How do I move only the DB to another server? There is already a reference how to move your whole LNMS installation to another server. But the following steps will help you to split up an \"All-in-one\" installation to one LibreNMS installation with a separate database install. *Note: This section assumes you have a MySQL/MariaDB instance Stop the apache and mysql service in you LibreNMS installation. Edit out all the cron entries in /etc/cron.d/librenms . Dump your librenms database on your current install by issuing mysqldump librenms -u root -p > librenms.sql . Stop and disable the MySQL server on your current install. On your new server make sure you create a new database with the standard install command, no need to add a user for localhost though. Copy this over to your new database server and import it with mysql -u root -p librenms < librenms.sql . Enter to mysql and add permissions with the following two commands: GRANT ALL PRIVILEGES ON librenms . * TO 'librenms' @ 'IP_OF_YOUR_LNMS_SERVER' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION ; GRANT ALL PRIVILEGES ON librenms . * TO 'librenms' @ 'FQDN_OF_YOUR_LNMS_SERVER' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION ; FLUSH PRIVILEGES ; exit ; Enable and restart MySQL server. Edit your config.php file to point the install to the new database server location. Very important : On your LibreNMS server, inside your install directory is a .env file, in it you need to edit the DBHOST paramater to point to your new server location. After all this is done, enable all the cron entries again and start apache. What are the \"optional requirements message\" when I add SNMPv3 devices? When you add a device via the WebUI you may see a little message stating \"Optional requirements are not met so some options are disabled\". Do not panic. This simply means your system does not contain openssl >= 1.1 and net-snmp >= 5.8 , which are the minimum specifications needed to be able to use SHA-224|256|384|512 as auth algorithms. For crypto algorithms AES-192, AES-256 you need net-snmp compiled with --enable-blumenthal-aes . Developing How do I add support for a new OS? Please see Supporting a new OS if you are adding all the support yourself, i.e. writing all of the supporting code. If you are only able to supply supporting info, and would like the help of others to write up the code, please follow the below steps. What information do you need to add a new OS? Please open a feature request in the community forum and provide the output of Discovery, Poller, and Snmpwalk as separate non-expiring https://p.libren.ms/ links : Please use preferably the command line to obtain the information. Especially, if snmpwalk results in a large amount of data. Replace the relevant information in these commands such as HOSTNAME and COMMUNITY. Use snmpwalk instead of snmpbulkwalk for v1 devices. These commands will automatically upload the data to LibreNMS servers. ./discovery.php -h HOSTNAME -d | ./pbin.sh lnms device:poll HOSTNAME -vv | ./pbin.sh snmpbulkwalk -OUneb -v2c -c COMMUNITY HOSTNAME . | ./pbin.sh You can use the links provided by these commands within the community post. If possible please also provide what the OS name should be if it doesn't exist already, as well as any useful link (MIBs from vendor, logo, etc etc) What can I do to help? Thanks for asking, sometimes it's not quite so obvious and everyone can contribute something different. So here are some ways you can help LibreNMS improve. Code. This is a big thing. We want this community to grow by the software developing and evolving to cater for users needs. The biggest area that people can help make this happen is by providing code support. This doesn't necessarily mean contributing code for discovering a new device: Web UI, a new look and feel has been adopted but we are not finished by any stretch of the imagination. Make suggestions, find and fix bugs, update the design / layout. Poller / Discovery code. Improving it (we think a lot can be done to speed things up), adding new device support and updating old ones. The LibreNMS main website, this is hosted on GitHub like the main repo and we accept use contributions here as well :) Hardware. We don't physically need it but if we are to add device support, it's made a whole lot easier with access to the kit via SNMP. If you've got MIBs, they are handy as well :) If you know the vendor and can get permission to use logos that's also great. Bugs. Found one? We want to know about it. Most bugs are fixed after being spotted and reported by someone, I'd love to say we are amazing developers and will fix all bugs before you spot them but that's just not true. Feature requests. Can't code / won't code. No worries, chuck a feature request into our community forum with enough detail and someone will take a look. A lot of the time this might be what interests someone, they need the same feature or they just have time. Please be patient, everyone who contributes does so in their own time. Documentation. Documentation can always be improved and every little bit helps. Not all features are currently documented or documented well, there's spelling mistakes etc. It's very easy to submit updates through the GitHub website , no git experience needed. Be nice, this is the foundation of this project. We expect everyone to be nice. People will fall out, people will disagree but please do it so in a respectable way. Ask questions. Sometimes just by asking questions you prompt deeper conversations that can lead us to somewhere amazing so please never be afraid to ask a question. How can I test another users branch? LibreNMS can and is developed by anyone, this means someone may be working on a new feature or support for a device that you want. It can be helpful for others to test these new features, using Git, this is made easy. cd /opt/librenms Firstly ensure that your current branch is in good state: git status If you see nothing to commit, working directory clean then let's go for it :) Let's say that you want to test a users (f0o) new development branch (issue-1337) then you can do the following: git remote add f0o https://github.com/f0o/librenms.git git remote update f0o git checkout issue-1337 Once you are done testing, you can easily switch back to the master branch: git checkout master If you want to pull any new updates provided by f0o's branch then whilst you are still in it, do the following: git pull f0o issue-1337","title":"FAQ"},{"location":"Support/FAQ/#getting-started","text":"","title":"Getting started"},{"location":"Support/FAQ/#how-do-i-install-librenms","text":"This is currently well documented within the doc folder of the installation files. Please see the following doc","title":" How do I install LibreNMS?"},{"location":"Support/FAQ/#how-do-i-add-a-device","text":"You have two options for adding a new device into LibreNMS. 1: Using the command line via ssh you can add a new device by changing to the directory of your LibreNMS install and typing: lnms device:add [ hostname or ip ] To see all options run: lnms device:add -h Please note that if the community contains special characters such as $ then you will need to wrap it in ' . I.e: 'Pa$$w0rd' . 2: Using the web interface, go to Devices and then Add Device. Enter the details required for the device that you want to add and then click 'Add Host'.","title":" How do I add a device?"},{"location":"Support/FAQ/#how-do-i-get-help","text":"Getting Help","title":" How do I get help?"},{"location":"Support/FAQ/#what-are-the-supported-oses-for-installing-librenms-on","text":"Supported is quite a strong word :) The 'officially' supported distros are: Ubuntu / Debian Red Hat / CentOS Gentoo However we will always aim to help wherever possible so if you are running a distro that isn't one of the above then give it a try anyway and if you need help then jump on the discord server .","title":" What are the supported OSes for installing LibreNMS on?"},{"location":"Support/FAQ/#do-you-have-a-demo-available","text":"We do indeed, you can find access to the demo here","title":" Do you have a demo available?"},{"location":"Support/FAQ/#support","text":"","title":"Support"},{"location":"Support/FAQ/#how-does-librenms-use-mibs","text":"LibreNMS does not parse MIBs to discover sensors for devices. LibreNMS uses static discovery definitions written in YAML or PHP. Therefore, updating a MIB alone will not improve OS support, the definitions must be updated. LibreNMS only uses MIBs to make OIDs easier to read.","title":"How does LibreNMS use MIBs?"},{"location":"Support/FAQ/#why-do-i-get-blank-pages-sometimes-in-the-webui","text":"You can enable debug information by setting APP_DEBUG=true in your .env. (Do not leave this enabled, it could leak private data) If the page you are trying to load has a substantial amount of data in it then it could be that the php memory limit needs to be increased in config.php .","title":" Why do I get blank pages sometimes in the WebUI?"},{"location":"Support/FAQ/#why-do-i-not-see-any-graphs","text":"The easiest way to check if all is well is to run ./validate.php as librenms from within your install directory. This should give you info on why things aren't working. One other reason could be a restricted snmpd.conf file or snmp view which limits the data sent back. If you use net-snmp then we suggest using the included snmpd.conf file.","title":" Why do I not see any graphs?"},{"location":"Support/FAQ/#how-do-i-debug-pages-not-loading-correctly","text":"A debug system is in place which enables you to see the output from php errors, warnings and notices along with the MySQL queries that have been run for that page. You can enable debug information by setting APP_DEBUG=true in your .env. (Do not leave this enabled, it could leak private data) To see additional information, run ./scripts/composer_wrapper.php install , to install additional debug tools. This will add a debug bar at the bottom of every page that will show you detailed debug information.","title":" How do I debug pages not loading correctly?"},{"location":"Support/FAQ/#how-do-i-debug-the-discovery-process","text":"Please see the Discovery Support document for further details.","title":" How do I debug the discovery process?"},{"location":"Support/FAQ/#how-do-i-debug-the-poller-process","text":"Please see the Poller Support document for further details.","title":" How do I debug the poller process?"},{"location":"Support/FAQ/#why-do-i-get-a-lot-apache-or-rrdtool-zombies-in-my-process-list","text":"If this is related to your web service for LibreNMS then this has been tracked down to an issue within php which the developers aren't fixing. We have implemented a work around which means you shouldn't be seeing this. If you are, please report this in issue 443 .","title":" Why do I get a lot apache or rrdtool zombies in my process list?"},{"location":"Support/FAQ/#why-do-i-see-traffic-spikes-in-my-graphs","text":"This occurs either when a counter resets or the device sends back bogus data making it look like a counter reset. We have enabled support for setting a maximum value for rrd files for ports. Before this all rrd files were set to 100G max values, now you can enable support to limit this to the actual port speed. rrdtool tune will change the max value when the interface speed is detected as being changed (min value will be set for anything 10M or over) or when you run the included script (./scripts/tune_port.php) - see RRDTune doc SNMP ifInOctets and ifOutOctets are counters, which means they start at 0 (at device boot) and count up from there. LibreNMS records the value every 5 minutes and uses the difference between the previous value and the current value to calculate rate. (Also, this value resets to 0 when it hits the max value) Now, when the value is not recorded for awhile RRD (our time series storage) does not record a 0, it records the last value, otherwise, there would be even worse problems. Then finally we get the current ifIn/OutOctets value and record that. Now, it appears as though all of the traffic since it stopped getting values have occurred in the last 5 minute interval. So whenever you see spikes like this, it means we have not received data from the device for several polling intervals. The cause can vary quite a bit: bad snmp implementations, intermittent network connectivity, broken poller, and more.","title":" Why do I see traffic spikes in my graphs?"},{"location":"Support/FAQ/#why-do-i-see-gaps-in-my-graphs","text":"This is most commonly due to the poller not being able to complete it's run within 300 seconds. Check which devices are causing this by going to /poll-log/ within the Web interface. When you find the device(s) which are taking the longest you can then look at the Polling module graph under Graphs -> Poller -> Poller Modules Performance. Take a look at what modules are taking the longest and disabled un used modules. If you poll a large number of devices / ports then it's recommended to run a local recursive dns server such as pdns-recursor. Running RRDCached is also highly advised in larger installs but has benefits no matter the size.","title":" Why do I see gaps in my graphs?"},{"location":"Support/FAQ/#how-do-i-change-the-ip-hostname-of-a-device","text":"There is a host rename tool called renamehost.php in your librenms root directory. When renaming you are also changing the device's IP / hostname address for monitoring. Usage: ./renamehost.php You can also rename a device in the Web UI by going to the device, then clicking settings Icon -> Edit.","title":" How do I change the IP / hostname of a device?"},{"location":"Support/FAQ/#my-device-doesnt-finish-polling-within-300-seconds","text":"We have a few things you can try: Disable unnecessary polling modules under edit device. Set a max repeater value within the snmp settings for a device. What to set this to is tricky, you really should run an snmpbulkwalk with -Cr10 through -Cr50 to see what works best. 50 is usually a good choice if the device can cope.","title":" My device doesn't finish polling within 300 seconds"},{"location":"Support/FAQ/#things-arent-working-correctly","text":"Run ./validate.php as librenms from within your install. Re-run ./validate.php once you've resolved any issues raised. You have an odd issue - we'd suggest you join our discord server to discuss.","title":" Things aren't working correctly?"},{"location":"Support/FAQ/#what-do-the-values-mean-in-my-graphs","text":"The values you see are reported as metric values. Thanks to a post on Reddit here are those values: 10^-18 a - atto 10^-15 f - femto 10^-12 p - pico 10^-9 n - nano 10^-6 u - micro 10^-3 m - milli 0 (no unit) 10^3 k - kilo 10^6 M - mega 10^9 G - giga 10^12 T - tera 10^15 P - peta","title":" What do the values mean in my graphs?"},{"location":"Support/FAQ/#why-does-a-device-show-as-a-warning","text":"This is indicating that the device has rebooted within the last 24 hours (by default). If you want to adjust this threshold then you can do so by setting $config['uptime_warning'] = '86400'; in config.php . The value must be in seconds.","title":" Why does a device show as a warning?"},{"location":"Support/FAQ/#why-do-i-not-see-all-interfaces-in-the-overall-traffic-graph-for-a-device","text":"By default numerous interface types and interface descriptions are excluded from this graph. The excluded defaults are: $config [ 'device_traffic_iftype' ][] = '/loopback/' ; $config [ 'device_traffic_iftype' ][] = '/tunnel/' ; $config [ 'device_traffic_iftype' ][] = '/virtual/' ; $config [ 'device_traffic_iftype' ][] = '/mpls/' ; $config [ 'device_traffic_iftype' ][] = '/ieee8023adLag/' ; $config [ 'device_traffic_iftype' ][] = '/l2vlan/' ; $config [ 'device_traffic_iftype' ][] = '/ppp/' ; $config [ 'device_traffic_descr' ][] = '/loopback/' ; $config [ 'device_traffic_descr' ][] = '/vlan/' ; $config [ 'device_traffic_descr' ][] = '/tunnel/' ; $config [ 'device_traffic_descr' ][] = '/bond/' ; $config [ 'device_traffic_descr' ][] = '/null/' ; $config [ 'device_traffic_descr' ][] = '/dummy/' ; If you would like to re-include l2vlan interfaces for instance, you first need to unset the config array and set your options: unset ( $config [ 'device_traffic_iftype' ]); $config [ 'device_traffic_iftype' ][] = '/loopback/' ; $config [ 'device_traffic_iftype' ][] = '/tunnel/' ; $config [ 'device_traffic_iftype' ][] = '/virtual/' ; $config [ 'device_traffic_iftype' ][] = '/mpls/' ; $config [ 'device_traffic_iftype' ][] = '/ieee8023adLag/' ; $config [ 'device_traffic_iftype' ][] = '/ppp/' ;","title":" Why do I not see all interfaces in the Overall traffic graph for a device?"},{"location":"Support/FAQ/#how-do-i-migrate-my-librenms-install-to-another-server","text":"If you are moving from one CPU architecture to another then you will need to dump the rrd files and re-create them. If you are in this scenario then you can use Dan Brown's migration scripts . If you are just moving to another server with the same CPU architecture then the following steps should be all that's needed: Install LibreNMS as per our normal documentation; you don't need to run through the web installer or building the sql schema. Stop cron by commenting out all lines in /etc/cron.d/librenms Dump the MySQL database librenms from your old server ( mysqldump librenms -u root -p > librenms.sql )... and import it into your new server ( mysql -u root -p librenms < librenms.sql ). Copy the rrd/ folder to the new server. Copy the .env and config.php files to the new server. Check for modified files (eg specific os, ...) with git status and migrate them. Ensure ownership of the copied files and folders (substitute your user if necessary) - chown -R librenms:librenms /opt/librenms Delete old pollers on the GUI (gear icon --> Pollers --> Pollers) Validate your installation (/opt/librenms/validate.php) Re-enable cron by uncommenting all lines in /etc/cron.d/librenms","title":" How do I migrate my LibreNMS install to another server?"},{"location":"Support/FAQ/#why-is-my-edgerouter-device-not-detected","text":"If you have service snmp description set in your config then this will be why, please remove this. For some reason Ubnt have decided setting this value should override the sysDescr value returned which breaks our detection. If you don't have that set then this may be then due to an update of EdgeOS or a new device type, please create an issue .","title":" Why is my EdgeRouter device not detected?"},{"location":"Support/FAQ/#why-are-some-of-my-disks-not-showing","text":"If you are monitoring a linux server then net-snmp doesn't always expose all disks via hrStorage (HOST-RESOURCES-MIB). We have additional support which will retrieve disks via dskTable (UCD-SNMP-MIB). To expose these disks you need to add additional config to your snmpd.conf file. For example, to expose /dev/sda1 which may be mounted as /storage you can specify: disk /dev/sda1 Or disk /storage Restart snmpd and LibreNMS should populate the additional disk after a fresh discovery.","title":" Why are some of my disks not showing?"},{"location":"Support/FAQ/#why-are-my-disks-reporting-an-incorrect-size","text":"There is a known issue for net-snmp, which causes it to report incorrect disk size and disk usage when the size of the disk (or raid) are larger then 16TB, a workaround has been implemented but is not active on Centos 6.8 by default due to the fact that this workaround breaks official SNMP specs, and as such could cause unexpected behaviour in other SNMP tools. You can activate the workaround by adding to /etc/snmp/snmpd.conf : realStorageUnits 0","title":" Why are my disks reporting an incorrect size?"},{"location":"Support/FAQ/#what-does-mean-ignore-alert-tag-on-device-component-service-and-port","text":"Tag device, component, service and port to ignore alerts. Alert checks will still run. However, ignore tag can be read in alert rules. For example on device, if devices.ignore = 0 or macros.device = 1 condition is is set and ignore alert tag is on, the alert rule won't match. The alert rule is ignored.","title":" What does mean \\\"ignore alert tag\\\" on device, component, service and port?"},{"location":"Support/FAQ/#how-do-i-clean-up-alerts-from-my-switches-and-routers-about-ports-being-down-or-changing-speed","text":"Some properties used for alerting (ending in _prev ) are only updated when a change is detected, and not every time the poller runs. This means that if you make a permanant change to your network such as removing a device, performing a major firmware upgrade, or downgrading a WAN connection, you may be stuck with some unresolvable alerts. If a port will be permantly down, it's best practice to configure it to be administratively down on the device to prevent malicious access. You can then only run alerts on ports with ifAdminStatus = up . Otherwise, you'll need to reset the device port state history. On the device generating alerts, use the cog button to go to the edit device page. At the top of the device settings pane is a button labelled Reset Port State - this will clear the historic state for all ports on that device, allowing any active alerts to clear.","title":" How do I clean up alerts from my switches and routers about ports being down or changing speed"},{"location":"Support/FAQ/#why-cant-normal-and-global-view-users-see-oxidized","text":"Configs can often contain sensitive data. Because of that only global admins can see configs.","title":" Why can't Normal and Global View users see Oxidized?"},{"location":"Support/FAQ/#what-is-the-demo-user-for","text":"Demo users allow full access except adding/editing users and deleting devices and can't change passwords.","title":" What is the Demo User for?"},{"location":"Support/FAQ/#why-does-modifying-default-alert-template-fail","text":"This template's entry could be missing in the database. Please run this from the LibreNMS directory: php artisan db:seed --class = DefaultAlertTemplateSeeder","title":" Why does modifying 'Default Alert Template' fail?"},{"location":"Support/FAQ/#why-would-alert-un-mute-itself","text":"If alert un-mutes itself then it most likely means that the alert cleared and is then triggered again. Please review eventlog as it will tell you in there.","title":" Why would alert un-mute itself?"},{"location":"Support/FAQ/#how-do-i-change-the-device-type","text":"You can change the Device Type by going to the device you would like to change, then click on the Gear Icon -> Edit. If you would like to define custom types, we suggest using Device Groups . They will be listed in the menu similarly to device types.","title":" How do I change the Device Type?"},{"location":"Support/FAQ/#editing-large-device-groups-gives-error-messages","text":"If the device group contains large amount of devices, editing it from the UI might cause errors on the form even when all the data seems correct. This is caused by PHP's max_input_vars -variable. You should be able to confirm that this is the case by inspecting the PHP's error logs. With the basic installation on Ubuntu 22.04 LTS with Nginx and PHP 8.1 FPM this value can be tuned by editing the file /etc/php/8.1/fpm/php.ini and adjusting the value of max_input_vars to be at least the size of the large group. In larger installations a value such as 10000 should suffice.","title":" Editing large device groups gives error messages"},{"location":"Support/FAQ/#where-do-i-update-my-database-credentials","text":"If you've changed your database credentials then you will need to update LibreNMS with those new details. Please edit .env .env : DB_HOST= DB_DATABASE= DB_USERNAME= DB_PASSWORD= DB_PORT=","title":"Where do I update my database credentials?"},{"location":"Support/FAQ/#my-reverse-proxy-is-not-working","text":"Make sure your proxy is passing the proper variables. At a minimum: X-Forwarded-For and X-Forwarded-Proto (X-Forwarded-Port if needed) You also need to Set the proxy or proxies as trusted If you are using a subdirectory on the reverse proxy and not on the actual web server, you may need to set APP_URL and $config['base_url'] .","title":"My reverse proxy is not working"},{"location":"Support/FAQ/#my-alerts-arent-being-delivered-on-time","text":"If you're running MySQL/MariaDB on a separate machine or container make sure the timezone is set properly on both the LibreNMS and MySQL/MariaDB instance. Alerts will be delivered according to MySQL/MariaDB's time, so a mismatch between the two can cause alerts to be delivered late if LibreNMS is on a timezone later than MySQL/MariaDB.","title":"My alerts aren't being delivered on time"},{"location":"Support/FAQ/#my-alert-templates-stopped-working","text":"You should probably have a look in the documentation concerning the new template syntax . Since version 1.42, syntax changed, and you basically need to convert your templates to this new syntax (including the titles).","title":"My alert templates stopped working"},{"location":"Support/FAQ/#how-do-i-use-trend-prediction-in-graphs","text":"As of Ver. 1.55 a new feature has been added where you can view a simple linear prediction in port graphs. It doesn't work on non-port graphs or consolidated graphs at the time this FAQ entry was written. To view a prediction: Click on any port graph of any network device Select a From date to your liking (not earlier than the device was actually added to LNMS), and then select a future date in the To field. Click update You should now see a linear prediction line on the graph.","title":"How do I use trend prediction in graphs"},{"location":"Support/FAQ/#how-do-i-move-only-the-db-to-another-server","text":"There is already a reference how to move your whole LNMS installation to another server. But the following steps will help you to split up an \"All-in-one\" installation to one LibreNMS installation with a separate database install. *Note: This section assumes you have a MySQL/MariaDB instance Stop the apache and mysql service in you LibreNMS installation. Edit out all the cron entries in /etc/cron.d/librenms . Dump your librenms database on your current install by issuing mysqldump librenms -u root -p > librenms.sql . Stop and disable the MySQL server on your current install. On your new server make sure you create a new database with the standard install command, no need to add a user for localhost though. Copy this over to your new database server and import it with mysql -u root -p librenms < librenms.sql . Enter to mysql and add permissions with the following two commands: GRANT ALL PRIVILEGES ON librenms . * TO 'librenms' @ 'IP_OF_YOUR_LNMS_SERVER' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION ; GRANT ALL PRIVILEGES ON librenms . * TO 'librenms' @ 'FQDN_OF_YOUR_LNMS_SERVER' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION ; FLUSH PRIVILEGES ; exit ; Enable and restart MySQL server. Edit your config.php file to point the install to the new database server location. Very important : On your LibreNMS server, inside your install directory is a .env file, in it you need to edit the DBHOST paramater to point to your new server location. After all this is done, enable all the cron entries again and start apache.","title":"How do I move only the DB to another server?"},{"location":"Support/FAQ/#what-are-the-optional-requirements-message-when-i-add-snmpv3-devices","text":"When you add a device via the WebUI you may see a little message stating \"Optional requirements are not met so some options are disabled\". Do not panic. This simply means your system does not contain openssl >= 1.1 and net-snmp >= 5.8 , which are the minimum specifications needed to be able to use SHA-224|256|384|512 as auth algorithms. For crypto algorithms AES-192, AES-256 you need net-snmp compiled with --enable-blumenthal-aes .","title":"What are the \"optional requirements message\" when I add SNMPv3 devices?"},{"location":"Support/FAQ/#developing","text":"","title":"Developing"},{"location":"Support/FAQ/#how-do-i-add-support-for-a-new-os","text":"Please see Supporting a new OS if you are adding all the support yourself, i.e. writing all of the supporting code. If you are only able to supply supporting info, and would like the help of others to write up the code, please follow the below steps.","title":" How do I add support for a new OS?"},{"location":"Support/FAQ/#what-information-do-you-need-to-add-a-new-os","text":"Please open a feature request in the community forum and provide the output of Discovery, Poller, and Snmpwalk as separate non-expiring https://p.libren.ms/ links : Please use preferably the command line to obtain the information. Especially, if snmpwalk results in a large amount of data. Replace the relevant information in these commands such as HOSTNAME and COMMUNITY. Use snmpwalk instead of snmpbulkwalk for v1 devices. These commands will automatically upload the data to LibreNMS servers. ./discovery.php -h HOSTNAME -d | ./pbin.sh lnms device:poll HOSTNAME -vv | ./pbin.sh snmpbulkwalk -OUneb -v2c -c COMMUNITY HOSTNAME . | ./pbin.sh You can use the links provided by these commands within the community post. If possible please also provide what the OS name should be if it doesn't exist already, as well as any useful link (MIBs from vendor, logo, etc etc)","title":" What information do you need to add a new OS?"},{"location":"Support/FAQ/#what-can-i-do-to-help","text":"Thanks for asking, sometimes it's not quite so obvious and everyone can contribute something different. So here are some ways you can help LibreNMS improve. Code. This is a big thing. We want this community to grow by the software developing and evolving to cater for users needs. The biggest area that people can help make this happen is by providing code support. This doesn't necessarily mean contributing code for discovering a new device: Web UI, a new look and feel has been adopted but we are not finished by any stretch of the imagination. Make suggestions, find and fix bugs, update the design / layout. Poller / Discovery code. Improving it (we think a lot can be done to speed things up), adding new device support and updating old ones. The LibreNMS main website, this is hosted on GitHub like the main repo and we accept use contributions here as well :) Hardware. We don't physically need it but if we are to add device support, it's made a whole lot easier with access to the kit via SNMP. If you've got MIBs, they are handy as well :) If you know the vendor and can get permission to use logos that's also great. Bugs. Found one? We want to know about it. Most bugs are fixed after being spotted and reported by someone, I'd love to say we are amazing developers and will fix all bugs before you spot them but that's just not true. Feature requests. Can't code / won't code. No worries, chuck a feature request into our community forum with enough detail and someone will take a look. A lot of the time this might be what interests someone, they need the same feature or they just have time. Please be patient, everyone who contributes does so in their own time. Documentation. Documentation can always be improved and every little bit helps. Not all features are currently documented or documented well, there's spelling mistakes etc. It's very easy to submit updates through the GitHub website , no git experience needed. Be nice, this is the foundation of this project. We expect everyone to be nice. People will fall out, people will disagree but please do it so in a respectable way. Ask questions. Sometimes just by asking questions you prompt deeper conversations that can lead us to somewhere amazing so please never be afraid to ask a question.","title":" What can I do to help?"},{"location":"Support/FAQ/#how-can-i-test-another-users-branch","text":"LibreNMS can and is developed by anyone, this means someone may be working on a new feature or support for a device that you want. It can be helpful for others to test these new features, using Git, this is made easy. cd /opt/librenms Firstly ensure that your current branch is in good state: git status If you see nothing to commit, working directory clean then let's go for it :) Let's say that you want to test a users (f0o) new development branch (issue-1337) then you can do the following: git remote add f0o https://github.com/f0o/librenms.git git remote update f0o git checkout issue-1337 Once you are done testing, you can easily switch back to the master branch: git checkout master If you want to pull any new updates provided by f0o's branch then whilst you are still in it, do the following: git pull f0o issue-1337","title":" How can I test another users branch?"},{"location":"Support/Features/","text":"Features Here's a brief list of supported features, some might be missing. If you think something is missing, feel free to ask us. Auto discovery Alerting Multiple environment sensors support Multiple protocols data collection (STP, OSPF, BGP etc) VLAN, ARP and FDB table collection Customizable Dashboards Device Backup integration (Oxidized, RANCID) Distributed Polling Multiple Authentication Methods (MySQL, LDAP, Active Directory, HTTP) NetFlow, sFlow, IPFIX (NfSen) Service monitoring (Nagios Plugins) Syslog (Integrated, Graylog) Traffic Billing (Quota, 95th Percentile) Two Factor Authentication API Auto Updating Supported Vendors Here's a list of supported vendors, some might be missing. If you are unsure of whether your device is supported or not, feel free to ask us. 3 3Com A A10 Networks Acano OS Accedian AEN Adtran AOS ADVA FSP150CC ADVA FSP3000 R7 ADVA OptiSwitch Advantech Aerohive HiveOS Airconsole Server AIX AKCP SensorProbe Alcatel OmniPCX Alcatel-Lucent Enterprise Stellar Wireless OS (AWOS) Alcatel-Lucent OS Alcoma ALGCOM DC UPS Allied Telesis Wireless (TQ) Alliedware Alliedware Plus Allworx VoIP Alpha Comp@s Alpha CXC HP Controller Alpha FXM Alpine OptoElectronics TDCM-EDFA platform AlteonOS Alvarion Breeze Anue AnyOS APC Environmental Monitoring Unit APC ePDU APC Management Module APC MGE UPS Apex Lynx Apex Plus Apple AirPort Apple OS X Aprisa ApsoluteOS ArbOS Areca RAID Subsystem Arista EOS Arista MOS Array Networks Arris Apex Arris CMTS Arris D5 Universal EdgeQAM ARRIS DOCSIS Arris Satellite Receiver Aruba Clearpass Aruba Instant ArubaOS ArubaOS-CX Ascom Asentria SiteBoss AsusWRT Merlin Aten PDU Audiocodes Automatic Transfer Switch Avaya Scopia AvediaPlayer Receivers AvediaStream Encoder Aviat WTM Avocent Avtech Environment Sensor AXIS Audio Appliances AXIS Network Camera AXIS Network Document Server B Barco Clickshare Barracuda Email Security Gateway Barracuda Load Balancer Barracuda NG Firewall Barracuda Web Application Firewall BATS AATS BDCOM(tm) Software BeagleBoard Benu Bintec Be.IP Plus Bintec Smart Router BKE BKtel Blade Network Technologies BladeShelter PDU by PowerTek Blue Coat PacketShaper Blue Coat SSL Visibility Bluecat Networks BlueCoat ProxySG Broadcom BCM963xx Brocade FabricOS Brocade IronWare Brocade NOS Brocade ServerIron Brother Printer BTI SA-800 Buffalo C C&C Power Commander plus Calix AXOS Calix B6 System Calix EXA Calix Legacy Cambium Cambium CMM Cambium CMM4 Cambium cnMatrix Cambium cnPilot Cambium cnPilot Router Cambium cnWave60 Cambium epmp Cambium PTP 250 Cambium PTP 300/500 Cambium PTP 600 Cambium PTP 650 Cambium PTP 670 Cambium PTP 800 Canon Printer Carel pCOWeb cdata Ceragon CeraOS CET TSI Controller Chatsworth PDU Check Point GAiA CheckPoint SecurePlatform Christie Projector Ciena SAOS Ciena Service Delivery Switch Ciena Waveserver Ciena Z-Series cirpack Cisco ACE Cisco ACS Cisco APIC Cisco ASA Cisco AsyncOS Cisco Catalyst 1900 Cisco CatOS Cisco EPC Cisco FTD Cisco FX-OS Cisco Identity Services Engine Cisco Integrated Management Controller Cisco Intrusion Prevention System Cisco IOS Cisco IOS-XE Cisco IOS-XR Cisco ME1200 Cisco Nexus 3550 Series Cisco NX-OS Cisco ONS Cisco PIX-OS Cisco SAN-OS Cisco Satellite Receiver Cisco SCE Cisco Services Ready Platform Cisco Small Business Cisco Unified Communications Manager Cisco Voice Gateway Cisco WAAS Cisco Wireless Access Point Cisco WLC Citrix Netscaler Comet System Web Sensor Comtrol Industrial Switch Controlbox TH-332B CoreOS Corero CMS Coriant TNMS CradlePoint WiPipe CTC Union Cumulus Linux CXR Networks TS Cyberoam UTM Cyberpower D D-Link Access Point D-Link Switch Dahua NVR Dantel Webmon Dantherm Dasan NOS Datacom dd-wrt DDN Storage Deliberant OS Dell DRAC Dell EMC Networking OS10 Enterprise Dell EqualLogic Dell Laser Dell Networking OS Dell OpenManage Enterprise Modular Dell PowerConnect Dell PowerVault Dell PowerVault MD Dell Rack PDU Dell Remote Console Dell Storage Dell UPS Delta Orion Controller Delta UPS Develop Printer DHCPatriot Digipower Digital China Networks DKT Comega DPS Telecom NetGuardian DragonflyBSD Dragonwave Harmony Enhanced Dragonwave Horizon Compact Dragonwave Horizon Compact Plus Dragonwave Horizon Duo DrayTek DVB Modulator & Ampiflier DVB-T Transmitter E E3 Meter E3 Meter DataConcentrator Eagle-I East Eaton ATS Eaton Matrix Eaton MGE PDU Eaton PDU Eaton SC200 Controller Eaton UPS EDFA Edgecore EdgeOS EdgeSwitch EDS EfficientIP SOLIDserver Ekinops Optical Eltek Valere Eltek Valere eNexus Eltek WebPower Eltex OLT Eltex-MES21xx Eltex-MES23xx EMC Data Domain EMC Flare OS EMC Isilon OneFS Emerson Energy System Emerson Netsure Endian EndRun EnGenius Access Point enLogic PDU Enterasys Epson Printer Epson Projector Ericsson 6600 series Ericsson IPOS Ericsson LG iPECS UCP Ericsson MINI-LINK Ericsson Traffic Node EricssonLG IPECS ES Etherwan Managed Switch EUROstor RAID Subsystem Exagrid Exalt ExtendAir Exinda Extrahop Appliance Extreme BOSS Extreme SLX-OS Extreme VOSS Extreme Wireless Convergence Extreme XOS Extremeware F F5 Big IP F5OS Fiberhome FiberHome Switch Fibernet XMUX 4+ Fiberstore GBN Fiberstore Switch Firebrick FireEye OS Force10 FTOS Fortinet Application Deliver Controller Fortinet FortiAuthenticator Fortinet Fortigate Fortinet FortiMail Fortinet FortiSandbox Fortinet FortiSwitch Fortinet FortiVoice Fortinet FortiWeb Fortinet FortiWLC FortiOS Foundry Networking FreeBSD FreshTomato FS.COM monitored pdu Fujitsu Fujitsu ETERNUS FUJITSU iRMC Fujitsu NAS FusionHub G Gamatronic UPS Stack Gandi Packet Journey GE Digital Energy UPS GE MDS Orbit network Operating System GE Pulsar Geist PDU Geist Watchdog Generex UPS SNMP adapter Generic Generic Device Gestetner Printer GigaVUE Glass Way WDM EYDFA Grandstream HT Greenbone OS Gude Expert Transfer Switch gwd H Halon Hanwha Techwin HAProxy ALOHA Hardware Appliance Hatteras Overdue DSLAM Helios IP Hikvision Camera Hikvision NVR Hillstone StoneOs Himoinsa Generator Sets Hirschmann Railswitch Hitachi Storage Virtualization Operating System (SVOS) HP Blade Management HP MSM HP PDU Management Module HP Print server HP ProCurve HP UPS HP Virtual Connect HPE 3PAR HPE Comware HPE Integrated Lights Out HPE iPDU HPE Managed Power Distribution Unit HPE MSA HPE OpenVMS HPE StoreEver MSL Huawei iBMC Management Console Huawei OceanStor Huawei SmartAX Huawei SmartAX MDU Huawei SMU Huawei UPS Huawei VRP HWg Poseidon HWg STE HWg STE2 HWg WLD Hytera Repeater I IBM AMM IBM DPI IBM i IBM IMM IBM Networking Operating System IBM Tape Library iBoot PDU Icotera OS ICR-OS ICT Digital Series Power Supply ICT Distribution Series ICT Modular Power System ICT Sine Wave Inverter Ifotec IgniteNet FusionSwitch IgniteNet HeliOS Illustra Network Camera Imco Power Imco Power LS110 Infinera Groove Infinera PON Infinera XTM Infoblox Ingrasys iPoMan Innovaphone ISDN Inteno GW IONODES IP Infusion OcNOS IP Office Firmware ITWatchDogs Goose J Jacarta InterSeptor Janitza Janitza UMG96 Juniper EX2500 Juniper JunOS Juniper JunOSe Juniper JWOS Juniper MSS Juniper ScreenOS K Kemp Loadbalancer Konica-Minolta Printer KTI Kyocera Mita Printer L Lambdatrail Lancom OS Lanier Printer LANTIME v6 Lantronix SLC Lantronix UDS Last Mile Gear CTM Lenovo Cloud Network Operating System Lenovo XCC IMPI LenovoEMC Lexmark Printer Liebert LigoWave Infinity LigoWave LigoOS Linksys Smart Switch Linux Loadbalancer.org LogMaster Loop Telecom Operating System M m0n0wall Maipu MyPower Marathon UPS McAfee Linux OS - ATD McAfee Linux OS - NSP McAfee SIEM Nitro Mcafee Web Gateway MegaTec NetAgent II Mellanox Meraki AP Meraki MX Appliance Meraki Switch Microsemi PowerDsine Midspan PoE Microsemi Synchronization Supply Unit Microsoft Windows Mikrotik RouterOS Mikrotik SwOS Mimosa Minkels RMS Mirth Connect Mitel Standard Linux MNI Microwave Radio MobileIron Montclair EDFA Motorola DOCSIS Cable Modem Motorola Netopia Moxa Moxa AWK MRV LambdaDriver MRV OptiDriver N NEC Univerge NetApp NetBotz Environment Sensor NetBSD Netgear ProSafe NetMan Plus NetModule Netonix NetScaler SD-WAN Network Management Unit Nexans Nimble OS NOKIA ISAM Nokia SR OS (TiMOS) Novell Netware NRG Printer NTI Nutanix AOS NVT Phybridge O OKI Printer Omnitron iConverter OneAccess Open Access Netspire Open-E OpenBSD Opengear OpenIndiana OpenSystems OpenWrt OPNsense Oracle ILOM Orvaldi UPS P Packetflux SiteMonitor Packetlight Panasonic KX-NS Series Panduit PDU PanOS Papouch QUIDO Papouch TME Paradyne (by Zhone) Patton SmartNode PBI Digital Decoder PBN PBN P2P CP100 Series Platform Pegasus Pepwave Perle pfSense Pica8 OS Ping only PLANET Polycom Videoconferencing System Powercode BMU PowerWalker UPS PowerWalker VFI Prime Infrastructure Procera Networks Proxim proxmox pve Pulse Secure Q QNAP TurboNAS QTECH Quanta QuantaStor R Radlan RADWIN Raisecom ROAP Raisecom ROS Raritan EMX Raritan KVM Raritan PDU RAy RAy3 RecoveryOS Red Lion Sixnet Redback Networks SmartEdge Redlion N-Tron Ribbon GSX Ribbon SBC Ricoh Printer Rittal CMC Rittal CMC III PU Rittal IT Chiller Rittal LCP Rittal LCP DX Chiller Riverbed RNX UPDU Rohde & Schwarz Rubrik Ruckus Wireless HotZone Ruckus Wireless SmartZone Ruckus Wireless Unleashed Ruckus Wireless ZoneDirector Ruijie Networks S SAF CFM SAF Integra B SAF Integra E SAF Integra W SAF Integra X SAF Tehnika Sagem ADR IONOS Samsung Printer Savin Printer Schleifenbauer SPDM Schneider PowerLogic SCS KS Sensatronics EM1 Sensatronics ITTM ServersCheck ServerTech Sentry3 ServerTech Sentry4 Sharp Printer SIAE Alfoplus 80HD Siemens Ruggedcom Switches (ROS) Siemens SCALANCE Siklu Wireless Silver Peak VXOA Sinetica UPS SM-OS SmartOptics DCP-M Series SmartOptics M-Series SmartOptics T-Series snr snr-erd Socomec Net Vision Socomec PDU Software Appliance Solid Optics EDFAMUX SonicWALL Sophos UTM Firewall Sophos XG Stormshield NS-BSD Stulz GMBH Klimatechnik Sub10 Systems Sun OpenSolaris Sun Solaris Supermicro Switch Symbol AP SyncServer Synology DSM T Tait Infra93 Series Tait TN Admin OS Tandberg Magnum technicolor TG MediaAcces Tegile IntelliFlash Telco Systems BiNOS Telco Systems BiNOX Teldat TelePresence Codec TelePresence Conductor Teleste Luminato teltonika rutos Teltonika RutOS RUTX Series Teradici PCoIP Terra Thomson DOCSIS Cable Modem Thomson Speedtouch Tomato TopVision Toshiba Printer Toshiba RemotEye4 TP-Link JetStream TP-Link Switch Transition Tranzeo TRENDnet Switch Tripp Lite PowerAlert TrueNAS TSC Printer Tycon Systems TPDIN U Ubiquiti AirFiber Ubiquiti AirFiber 60 Ubiquiti AirFiber LTU Ubiquiti AirOS Ubiquiti Edgepower Ubiquiti UniFi Ubiquoss PON Ucopia UFiber UHP Networks VSAT Terminal UniPing V V-Solution Vanguard ApplicationsWare Vertiv Avocent MergePoint Unity Vertiv PDU Video Communication Server Viprinux Viptela Vivotek Camera VMware ESXi VMware SD-WAN VMware vCenter Volius Voswall Vubiq Networks Vutlan Vyatta VyOS W Watchguard Fireware Waystream iBOS Web-Thermo-Hygrometer WebPower West Mountain RMCU WISI Tangram WTI CONSOLE WTI MPC WTI POWER X Xerox Printer Xirrus ArrayOS Z ZebraNet Zhone MXK Zmtel Greenpacket ZTE ZXA10 ZTE ZXR10 ZXDSL ZyXEL AC ZyXEL DSLAM ZyXEL Ethernet Switch ZyXEL IES MSAN ZyXEL IES-5000 DSLAM ZyXEL NWA ZyXEL Prestige ZyXEL ZyWALL","title":"Features"},{"location":"Support/Features/#features","text":"Here's a brief list of supported features, some might be missing. If you think something is missing, feel free to ask us. Auto discovery Alerting Multiple environment sensors support Multiple protocols data collection (STP, OSPF, BGP etc) VLAN, ARP and FDB table collection Customizable Dashboards Device Backup integration (Oxidized, RANCID) Distributed Polling Multiple Authentication Methods (MySQL, LDAP, Active Directory, HTTP) NetFlow, sFlow, IPFIX (NfSen) Service monitoring (Nagios Plugins) Syslog (Integrated, Graylog) Traffic Billing (Quota, 95th Percentile) Two Factor Authentication API Auto Updating","title":"Features"},{"location":"Support/Features/#supported-vendors","text":"Here's a list of supported vendors, some might be missing. If you are unsure of whether your device is supported or not, feel free to ask us.","title":"Supported Vendors"},{"location":"Support/Features/#3","text":"3Com","title":"3"},{"location":"Support/Features/#a","text":"A10 Networks Acano OS Accedian AEN Adtran AOS ADVA FSP150CC ADVA FSP3000 R7 ADVA OptiSwitch Advantech Aerohive HiveOS Airconsole Server AIX AKCP SensorProbe Alcatel OmniPCX Alcatel-Lucent Enterprise Stellar Wireless OS (AWOS) Alcatel-Lucent OS Alcoma ALGCOM DC UPS Allied Telesis Wireless (TQ) Alliedware Alliedware Plus Allworx VoIP Alpha Comp@s Alpha CXC HP Controller Alpha FXM Alpine OptoElectronics TDCM-EDFA platform AlteonOS Alvarion Breeze Anue AnyOS APC Environmental Monitoring Unit APC ePDU APC Management Module APC MGE UPS Apex Lynx Apex Plus Apple AirPort Apple OS X Aprisa ApsoluteOS ArbOS Areca RAID Subsystem Arista EOS Arista MOS Array Networks Arris Apex Arris CMTS Arris D5 Universal EdgeQAM ARRIS DOCSIS Arris Satellite Receiver Aruba Clearpass Aruba Instant ArubaOS ArubaOS-CX Ascom Asentria SiteBoss AsusWRT Merlin Aten PDU Audiocodes Automatic Transfer Switch Avaya Scopia AvediaPlayer Receivers AvediaStream Encoder Aviat WTM Avocent Avtech Environment Sensor AXIS Audio Appliances AXIS Network Camera AXIS Network Document Server","title":"A"},{"location":"Support/Features/#b","text":"Barco Clickshare Barracuda Email Security Gateway Barracuda Load Balancer Barracuda NG Firewall Barracuda Web Application Firewall BATS AATS BDCOM(tm) Software BeagleBoard Benu Bintec Be.IP Plus Bintec Smart Router BKE BKtel Blade Network Technologies BladeShelter PDU by PowerTek Blue Coat PacketShaper Blue Coat SSL Visibility Bluecat Networks BlueCoat ProxySG Broadcom BCM963xx Brocade FabricOS Brocade IronWare Brocade NOS Brocade ServerIron Brother Printer BTI SA-800 Buffalo","title":"B"},{"location":"Support/Features/#c","text":"C&C Power Commander plus Calix AXOS Calix B6 System Calix EXA Calix Legacy Cambium Cambium CMM Cambium CMM4 Cambium cnMatrix Cambium cnPilot Cambium cnPilot Router Cambium cnWave60 Cambium epmp Cambium PTP 250 Cambium PTP 300/500 Cambium PTP 600 Cambium PTP 650 Cambium PTP 670 Cambium PTP 800 Canon Printer Carel pCOWeb cdata Ceragon CeraOS CET TSI Controller Chatsworth PDU Check Point GAiA CheckPoint SecurePlatform Christie Projector Ciena SAOS Ciena Service Delivery Switch Ciena Waveserver Ciena Z-Series cirpack Cisco ACE Cisco ACS Cisco APIC Cisco ASA Cisco AsyncOS Cisco Catalyst 1900 Cisco CatOS Cisco EPC Cisco FTD Cisco FX-OS Cisco Identity Services Engine Cisco Integrated Management Controller Cisco Intrusion Prevention System Cisco IOS Cisco IOS-XE Cisco IOS-XR Cisco ME1200 Cisco Nexus 3550 Series Cisco NX-OS Cisco ONS Cisco PIX-OS Cisco SAN-OS Cisco Satellite Receiver Cisco SCE Cisco Services Ready Platform Cisco Small Business Cisco Unified Communications Manager Cisco Voice Gateway Cisco WAAS Cisco Wireless Access Point Cisco WLC Citrix Netscaler Comet System Web Sensor Comtrol Industrial Switch Controlbox TH-332B CoreOS Corero CMS Coriant TNMS CradlePoint WiPipe CTC Union Cumulus Linux CXR Networks TS Cyberoam UTM Cyberpower","title":"C"},{"location":"Support/Features/#d","text":"D-Link Access Point D-Link Switch Dahua NVR Dantel Webmon Dantherm Dasan NOS Datacom dd-wrt DDN Storage Deliberant OS Dell DRAC Dell EMC Networking OS10 Enterprise Dell EqualLogic Dell Laser Dell Networking OS Dell OpenManage Enterprise Modular Dell PowerConnect Dell PowerVault Dell PowerVault MD Dell Rack PDU Dell Remote Console Dell Storage Dell UPS Delta Orion Controller Delta UPS Develop Printer DHCPatriot Digipower Digital China Networks DKT Comega DPS Telecom NetGuardian DragonflyBSD Dragonwave Harmony Enhanced Dragonwave Horizon Compact Dragonwave Horizon Compact Plus Dragonwave Horizon Duo DrayTek DVB Modulator & Ampiflier DVB-T Transmitter","title":"D"},{"location":"Support/Features/#e","text":"E3 Meter E3 Meter DataConcentrator Eagle-I East Eaton ATS Eaton Matrix Eaton MGE PDU Eaton PDU Eaton SC200 Controller Eaton UPS EDFA Edgecore EdgeOS EdgeSwitch EDS EfficientIP SOLIDserver Ekinops Optical Eltek Valere Eltek Valere eNexus Eltek WebPower Eltex OLT Eltex-MES21xx Eltex-MES23xx EMC Data Domain EMC Flare OS EMC Isilon OneFS Emerson Energy System Emerson Netsure Endian EndRun EnGenius Access Point enLogic PDU Enterasys Epson Printer Epson Projector Ericsson 6600 series Ericsson IPOS Ericsson LG iPECS UCP Ericsson MINI-LINK Ericsson Traffic Node EricssonLG IPECS ES Etherwan Managed Switch EUROstor RAID Subsystem Exagrid Exalt ExtendAir Exinda Extrahop Appliance Extreme BOSS Extreme SLX-OS Extreme VOSS Extreme Wireless Convergence Extreme XOS Extremeware","title":"E"},{"location":"Support/Features/#f","text":"F5 Big IP F5OS Fiberhome FiberHome Switch Fibernet XMUX 4+ Fiberstore GBN Fiberstore Switch Firebrick FireEye OS Force10 FTOS Fortinet Application Deliver Controller Fortinet FortiAuthenticator Fortinet Fortigate Fortinet FortiMail Fortinet FortiSandbox Fortinet FortiSwitch Fortinet FortiVoice Fortinet FortiWeb Fortinet FortiWLC FortiOS Foundry Networking FreeBSD FreshTomato FS.COM monitored pdu Fujitsu Fujitsu ETERNUS FUJITSU iRMC Fujitsu NAS FusionHub","title":"F"},{"location":"Support/Features/#g","text":"Gamatronic UPS Stack Gandi Packet Journey GE Digital Energy UPS GE MDS Orbit network Operating System GE Pulsar Geist PDU Geist Watchdog Generex UPS SNMP adapter Generic Generic Device Gestetner Printer GigaVUE Glass Way WDM EYDFA Grandstream HT Greenbone OS Gude Expert Transfer Switch gwd","title":"G"},{"location":"Support/Features/#h","text":"Halon Hanwha Techwin HAProxy ALOHA Hardware Appliance Hatteras Overdue DSLAM Helios IP Hikvision Camera Hikvision NVR Hillstone StoneOs Himoinsa Generator Sets Hirschmann Railswitch Hitachi Storage Virtualization Operating System (SVOS) HP Blade Management HP MSM HP PDU Management Module HP Print server HP ProCurve HP UPS HP Virtual Connect HPE 3PAR HPE Comware HPE Integrated Lights Out HPE iPDU HPE Managed Power Distribution Unit HPE MSA HPE OpenVMS HPE StoreEver MSL Huawei iBMC Management Console Huawei OceanStor Huawei SmartAX Huawei SmartAX MDU Huawei SMU Huawei UPS Huawei VRP HWg Poseidon HWg STE HWg STE2 HWg WLD Hytera Repeater","title":"H"},{"location":"Support/Features/#i","text":"IBM AMM IBM DPI IBM i IBM IMM IBM Networking Operating System IBM Tape Library iBoot PDU Icotera OS ICR-OS ICT Digital Series Power Supply ICT Distribution Series ICT Modular Power System ICT Sine Wave Inverter Ifotec IgniteNet FusionSwitch IgniteNet HeliOS Illustra Network Camera Imco Power Imco Power LS110 Infinera Groove Infinera PON Infinera XTM Infoblox Ingrasys iPoMan Innovaphone ISDN Inteno GW IONODES IP Infusion OcNOS IP Office Firmware ITWatchDogs Goose","title":"I"},{"location":"Support/Features/#j","text":"Jacarta InterSeptor Janitza Janitza UMG96 Juniper EX2500 Juniper JunOS Juniper JunOSe Juniper JWOS Juniper MSS Juniper ScreenOS","title":"J"},{"location":"Support/Features/#k","text":"Kemp Loadbalancer Konica-Minolta Printer KTI Kyocera Mita Printer","title":"K"},{"location":"Support/Features/#l","text":"Lambdatrail Lancom OS Lanier Printer LANTIME v6 Lantronix SLC Lantronix UDS Last Mile Gear CTM Lenovo Cloud Network Operating System Lenovo XCC IMPI LenovoEMC Lexmark Printer Liebert LigoWave Infinity LigoWave LigoOS Linksys Smart Switch Linux Loadbalancer.org LogMaster Loop Telecom Operating System","title":"L"},{"location":"Support/Features/#m","text":"m0n0wall Maipu MyPower Marathon UPS McAfee Linux OS - ATD McAfee Linux OS - NSP McAfee SIEM Nitro Mcafee Web Gateway MegaTec NetAgent II Mellanox Meraki AP Meraki MX Appliance Meraki Switch Microsemi PowerDsine Midspan PoE Microsemi Synchronization Supply Unit Microsoft Windows Mikrotik RouterOS Mikrotik SwOS Mimosa Minkels RMS Mirth Connect Mitel Standard Linux MNI Microwave Radio MobileIron Montclair EDFA Motorola DOCSIS Cable Modem Motorola Netopia Moxa Moxa AWK MRV LambdaDriver MRV OptiDriver","title":"M"},{"location":"Support/Features/#n","text":"NEC Univerge NetApp NetBotz Environment Sensor NetBSD Netgear ProSafe NetMan Plus NetModule Netonix NetScaler SD-WAN Network Management Unit Nexans Nimble OS NOKIA ISAM Nokia SR OS (TiMOS) Novell Netware NRG Printer NTI Nutanix AOS NVT Phybridge","title":"N"},{"location":"Support/Features/#o","text":"OKI Printer Omnitron iConverter OneAccess Open Access Netspire Open-E OpenBSD Opengear OpenIndiana OpenSystems OpenWrt OPNsense Oracle ILOM Orvaldi UPS","title":"O"},{"location":"Support/Features/#p","text":"Packetflux SiteMonitor Packetlight Panasonic KX-NS Series Panduit PDU PanOS Papouch QUIDO Papouch TME Paradyne (by Zhone) Patton SmartNode PBI Digital Decoder PBN PBN P2P CP100 Series Platform Pegasus Pepwave Perle pfSense Pica8 OS Ping only PLANET Polycom Videoconferencing System Powercode BMU PowerWalker UPS PowerWalker VFI Prime Infrastructure Procera Networks Proxim proxmox pve Pulse Secure","title":"P"},{"location":"Support/Features/#q","text":"QNAP TurboNAS QTECH Quanta QuantaStor","title":"Q"},{"location":"Support/Features/#r","text":"Radlan RADWIN Raisecom ROAP Raisecom ROS Raritan EMX Raritan KVM Raritan PDU RAy RAy3 RecoveryOS Red Lion Sixnet Redback Networks SmartEdge Redlion N-Tron Ribbon GSX Ribbon SBC Ricoh Printer Rittal CMC Rittal CMC III PU Rittal IT Chiller Rittal LCP Rittal LCP DX Chiller Riverbed RNX UPDU Rohde & Schwarz Rubrik Ruckus Wireless HotZone Ruckus Wireless SmartZone Ruckus Wireless Unleashed Ruckus Wireless ZoneDirector Ruijie Networks","title":"R"},{"location":"Support/Features/#s","text":"SAF CFM SAF Integra B SAF Integra E SAF Integra W SAF Integra X SAF Tehnika Sagem ADR IONOS Samsung Printer Savin Printer Schleifenbauer SPDM Schneider PowerLogic SCS KS Sensatronics EM1 Sensatronics ITTM ServersCheck ServerTech Sentry3 ServerTech Sentry4 Sharp Printer SIAE Alfoplus 80HD Siemens Ruggedcom Switches (ROS) Siemens SCALANCE Siklu Wireless Silver Peak VXOA Sinetica UPS SM-OS SmartOptics DCP-M Series SmartOptics M-Series SmartOptics T-Series snr snr-erd Socomec Net Vision Socomec PDU Software Appliance Solid Optics EDFAMUX SonicWALL Sophos UTM Firewall Sophos XG Stormshield NS-BSD Stulz GMBH Klimatechnik Sub10 Systems Sun OpenSolaris Sun Solaris Supermicro Switch Symbol AP SyncServer Synology DSM","title":"S"},{"location":"Support/Features/#t","text":"Tait Infra93 Series Tait TN Admin OS Tandberg Magnum technicolor TG MediaAcces Tegile IntelliFlash Telco Systems BiNOS Telco Systems BiNOX Teldat TelePresence Codec TelePresence Conductor Teleste Luminato teltonika rutos Teltonika RutOS RUTX Series Teradici PCoIP Terra Thomson DOCSIS Cable Modem Thomson Speedtouch Tomato TopVision Toshiba Printer Toshiba RemotEye4 TP-Link JetStream TP-Link Switch Transition Tranzeo TRENDnet Switch Tripp Lite PowerAlert TrueNAS TSC Printer Tycon Systems TPDIN","title":"T"},{"location":"Support/Features/#u","text":"Ubiquiti AirFiber Ubiquiti AirFiber 60 Ubiquiti AirFiber LTU Ubiquiti AirOS Ubiquiti Edgepower Ubiquiti UniFi Ubiquoss PON Ucopia UFiber UHP Networks VSAT Terminal UniPing","title":"U"},{"location":"Support/Features/#v","text":"V-Solution Vanguard ApplicationsWare Vertiv Avocent MergePoint Unity Vertiv PDU Video Communication Server Viprinux Viptela Vivotek Camera VMware ESXi VMware SD-WAN VMware vCenter Volius Voswall Vubiq Networks Vutlan Vyatta VyOS","title":"V"},{"location":"Support/Features/#w","text":"Watchguard Fireware Waystream iBOS Web-Thermo-Hygrometer WebPower West Mountain RMCU WISI Tangram WTI CONSOLE WTI MPC WTI POWER","title":"W"},{"location":"Support/Features/#x","text":"Xerox Printer Xirrus ArrayOS","title":"X"},{"location":"Support/Features/#z","text":"ZebraNet Zhone MXK Zmtel Greenpacket ZTE ZXA10 ZTE ZXR10 ZXDSL ZyXEL AC ZyXEL DSLAM ZyXEL Ethernet Switch ZyXEL IES MSAN ZyXEL IES-5000 DSLAM ZyXEL NWA ZyXEL Prestige ZyXEL ZyWALL","title":"Z"},{"location":"Support/Install%20Validation/","text":"Install validation With a lot of configuration possibilities, manually editing config.php means it's not uncommon that mistakes get made. It's also impossible to validate user input in config.php when you're just using a text editor :) So, to try and help with some of the general issues people come across we've put together a simple validation tool which at present will: Validate config.php from a php perspective including whitespace where it shouldn't be. Connection to your MySQL server to verify credentials. Checks if you are running the older alerting system. Checks your rrd directory setup if not running rrdcached. Checks disk space for where /opt/librenms is installed. Checks location to fping Tests MySQL strict mode being enabled Tests for files not owned by librenms user (if configured) Optionally you can also pass -m and a module name for that to be tested. Current modules are: mail - This will validate your mail transport configuration. dist-poller - This will test your distributed poller configuration. rrdcheck - This will test your rrd files to see if they are unreadable or corrupted (source of broken graphs). You can run validate.php as root by executing ./validate.php within your install directory. The output will provide you either a clean bill of health or a list of things you need to fix: OK - This is a good thing, you can skip over these :) WARN - You probably want to check this out. FAIL - This is going to need your attention! Validate from the WebUI You can validate your LibreNMS install from the WebUI, using the nav bar and clicking on the little Gear Icon -> Validate Config. Then You should see the results of validate. Below is just example of the results.","title":"Install Validation"},{"location":"Support/Install%20Validation/#install-validation","text":"With a lot of configuration possibilities, manually editing config.php means it's not uncommon that mistakes get made. It's also impossible to validate user input in config.php when you're just using a text editor :) So, to try and help with some of the general issues people come across we've put together a simple validation tool which at present will: Validate config.php from a php perspective including whitespace where it shouldn't be. Connection to your MySQL server to verify credentials. Checks if you are running the older alerting system. Checks your rrd directory setup if not running rrdcached. Checks disk space for where /opt/librenms is installed. Checks location to fping Tests MySQL strict mode being enabled Tests for files not owned by librenms user (if configured) Optionally you can also pass -m and a module name for that to be tested. Current modules are: mail - This will validate your mail transport configuration. dist-poller - This will test your distributed poller configuration. rrdcheck - This will test your rrd files to see if they are unreadable or corrupted (source of broken graphs). You can run validate.php as root by executing ./validate.php within your install directory. The output will provide you either a clean bill of health or a list of things you need to fix: OK - This is a good thing, you can skip over these :) WARN - You probably want to check this out. FAIL - This is going to need your attention!","title":"Install validation"},{"location":"Support/Install%20Validation/#validate-from-the-webui","text":"You can validate your LibreNMS install from the WebUI, using the nav bar and clicking on the little Gear Icon -> Validate Config. Then You should see the results of validate. Below is just example of the results.","title":"Validate from the WebUI"},{"location":"Support/Performance/","text":"Performance optimisations This document will give you some guidance on optimising your setup. The suggestions are in a rough order of how much impact they will have. RRDCached We absolutely recommend running this, it will save on IO load . RRDCached MySQL Optimisation It's advisable after 24 hours of running MySQL that you run MySQL Tuner which will make suggestions on things you can change specific to your setup. One recommendation we can make is that you set the following in my.cnf under a [mysqld] group: innodb_flush_log_at_trx_commit = 0 You can also set this to 2. This will have the possibility that you could lose up to 1 second on mysql data in the event MySQL crashes or your server does but it provides an amazing difference in IO use. Polling modules Review the graph of poller module time take under gear > pollers > performance to see what modules are consuming poller time. This data is shown per device under device > graphs > poller. Disable polling (and discovery) modules that you do not need. You can do this globally in config.php like: Disable OSPF polling poller/poller_modules lnms config:set poller_modules.ospf false You can disable modules globally then re-enable the module per device or the opposite way. For a list of modules please see Poller modules SNMP Max Repeaters We have support for SNMP Max repeaters which can be handy on devices where we poll a lot of ports or bgp sessions for instance and where snmpwalk or snmpbulkwalk is used. This needs to be enabled on a per device basis under edit device -> snmp -> Max repeaters. You can also set this globally with the config option $config['snmp']['max_repeaters'] = X; . It's advisable to test the time taken to snmpwalk IF-MIB or something similar to work out what the best value is. To do this run the following but replace -REPEATERS- with varying numbers from 10 upto around 50. You will also need to set the correct snmp version, hostname and community string: time snmpbulkwalk -v2c -cpublic HOSTNAME -Cr-REPEATERS- -M /opt/librenms/mibs -m IF-MIB IfEntry NOTE: Do not go blindly setting this value as you can impact polling negatively. SNMP Max OIDs For sensors polling we now do bulk snmp gets to speed things up. By default this is ten but you can overwrite this per device under edit device -> snmp -> Max OIDs. You can also set this globally with the config option $config['snmp']['max_oid'] = X; . NOTE: It is advisable to monitor sensor polling when you change this to ensure you don't set the value too high. fping tuning You can change some of the default fping options used globally or per device. The defaults are: poller/ping lnms config:set fping_options.timeout 500 lnms config:set fping_options.count 3 lnms config:set fping_options.interval 500 If your devices are slow to respond then you will need to increase the timeout value and potentially the interval value. However if your network is stable, you can increase poller performance by dropping the count value to 1 and/or the timeout+millsec value to 200 or 300: poller/ping lnms config:set fping_options.timeout 300 lnms config:set fping_options.count 1 lnms config:set fping_options.interval 300 This will mean that we no longer delay each icmp packet sent (we send 3 in total by default) by 0.5 seconds. With only 1 icmp packet being sent then we will receive a response quicker. The defaults mean it will take at least 1 second for a response no matter how quick the icmp packet is returned. Optimise poller-wrapper poller-wrapper.py defaults to using 16 threads, this isn't necessarily optimal. A general rule of thumb is 2 threads per core but we suggest that you play around with lowering / increasing the number until you get the optimal value. Note KEEP in MIND that this doesn't always help, it depends on your system and CPU. So be careful. This can be changed by going to the cron job for librenms. Usually in /etc/cron.d/librenms and changing the \"16\" */5 * * * * librenms /opt/librenms/cronic /opt/librenms/poller-wrapper.py 16 Please also see Dispatcher Service Recursive DNS If your install uses hostnames for devices and you have quite a lot then it's advisable to setup a local recursive dns instance on the LibreNMS server. Something like pdns-recursor can be used and then configure /etc/resolv.conf to use 127.0.0.1 for queries. Per port polling - experimental By default the polling ports module will walk ifXEntry + some items from ifEntry regardless of the port. So if a port is marked as deleted because you don't want to see them or it's disabled then we still collect data. For the most part this is fine as the walks are quite quick. However for devices with a lot of ports and good % of those are either deleted or disabled then this approach isn't optimal. So to counter this you can enable 'selected port polling' per device within the edit device -> misc section or by globally enabling it ( not recommended ): $config['polling']['selected_ports'] = true; . This is truly not recommended, as it has been proven to affect cpu usage of your poller negatively. You can also set it for a specific OS: $config['os']['ios']['polling']['selected_ports'] = true; . Running ./scripts/collect-port-polling.php will poll your devices with both full and selective polling, display a table with the difference and optionally enable or disable selected ports polling for devices which would benefit from a change. Note that it doesn't continuously re-evaluate this, it will only be updated when the script is run. There are a number of options: -h | Poll single device or wildcard hostname -e Enable/disable selected ports polling for devices which would benefit from a change If you want to run this script to have it set selected port polling on devices where a change of 10% or more is evaluated , run it with ./scripts/collect-port-polling.php -e 10 . But note: it will not blindly use only the 10%. There is a second condition that the change has to be more than one second in polling time. Web interface HTTP/2 If you are running https then you should enable http/2 support in whatever web server you use: For Nginx (1.9.5 and above) change listen 443 ssl; to listen 443 ssl http2; in the Virtualhost config. For Apache (2.4.17 and above) set Protocols h2 http/1.1 in the Virtualhost config. PHP-opcache A lot of performance can be gained from setting up php-opcache correctly. Note: Memory based caching with PHP cli will increase memory usage and slow things down. File based caching is not as fast as memory based and is more likely to have stale cache issues. Some distributions allow separate cli, mod_php and php-fpm configurations, we can use this to set the optimal config. For web servers using mod_php and php-fpm Update your web PHP opcache.ini. Possible locations: /etc/php/8.1/fpm/conf.d/opcache.ini , /etc/php.d/opcache.ini , or /etc/php/conf.d/opcache.ini . zend_extension=opcache opcache.enable=1 opcache.memory_consumption=256 If you are having caching issues, you can clear the opcache by simply restarting httpd or php-fpm. For pollers Create a cache directory that is writable by the librenms user first: sudo mkdir -p /tmp/cache && sudo chmod 775 /tmp/cache && sudo chown -R librenms /tmp/cache Update your PHP opcache.ini. Possible locations: /etc/php/8.1/cli/conf.d/opcache.ini , /etc/php.d/opcache.ini , or /etc/php/conf.d/opcache.ini . zend_extension=opcache.so opcache.enable=1 opcache.enable_cli=1 opcache.file_cache=\"/tmp/cache/\" opcache.file_cache_only=0 opcache.file_cache_consistency_checks=1 opcache.memory_consumption=256 If you are having caching issues, you can clear the file based opcache with rm -rf /tmp/cache .","title":"Performance"},{"location":"Support/Performance/#performance-optimisations","text":"This document will give you some guidance on optimising your setup. The suggestions are in a rough order of how much impact they will have.","title":"Performance optimisations"},{"location":"Support/Performance/#rrdcached","text":"We absolutely recommend running this, it will save on IO load . RRDCached","title":"RRDCached"},{"location":"Support/Performance/#mysql-optimisation","text":"It's advisable after 24 hours of running MySQL that you run MySQL Tuner which will make suggestions on things you can change specific to your setup. One recommendation we can make is that you set the following in my.cnf under a [mysqld] group: innodb_flush_log_at_trx_commit = 0 You can also set this to 2. This will have the possibility that you could lose up to 1 second on mysql data in the event MySQL crashes or your server does but it provides an amazing difference in IO use.","title":"MySQL Optimisation"},{"location":"Support/Performance/#polling-modules","text":"Review the graph of poller module time take under gear > pollers > performance to see what modules are consuming poller time. This data is shown per device under device > graphs > poller. Disable polling (and discovery) modules that you do not need. You can do this globally in config.php like: Disable OSPF polling poller/poller_modules lnms config:set poller_modules.ospf false You can disable modules globally then re-enable the module per device or the opposite way. For a list of modules please see Poller modules","title":"Polling modules"},{"location":"Support/Performance/#snmp-max-repeaters","text":"We have support for SNMP Max repeaters which can be handy on devices where we poll a lot of ports or bgp sessions for instance and where snmpwalk or snmpbulkwalk is used. This needs to be enabled on a per device basis under edit device -> snmp -> Max repeaters. You can also set this globally with the config option $config['snmp']['max_repeaters'] = X; . It's advisable to test the time taken to snmpwalk IF-MIB or something similar to work out what the best value is. To do this run the following but replace -REPEATERS- with varying numbers from 10 upto around 50. You will also need to set the correct snmp version, hostname and community string: time snmpbulkwalk -v2c -cpublic HOSTNAME -Cr-REPEATERS- -M /opt/librenms/mibs -m IF-MIB IfEntry NOTE: Do not go blindly setting this value as you can impact polling negatively.","title":"SNMP Max Repeaters"},{"location":"Support/Performance/#snmp-max-oids","text":"For sensors polling we now do bulk snmp gets to speed things up. By default this is ten but you can overwrite this per device under edit device -> snmp -> Max OIDs. You can also set this globally with the config option $config['snmp']['max_oid'] = X; . NOTE: It is advisable to monitor sensor polling when you change this to ensure you don't set the value too high.","title":"SNMP Max OIDs"},{"location":"Support/Performance/#fping-tuning","text":"You can change some of the default fping options used globally or per device. The defaults are: poller/ping lnms config:set fping_options.timeout 500 lnms config:set fping_options.count 3 lnms config:set fping_options.interval 500 If your devices are slow to respond then you will need to increase the timeout value and potentially the interval value. However if your network is stable, you can increase poller performance by dropping the count value to 1 and/or the timeout+millsec value to 200 or 300: poller/ping lnms config:set fping_options.timeout 300 lnms config:set fping_options.count 1 lnms config:set fping_options.interval 300 This will mean that we no longer delay each icmp packet sent (we send 3 in total by default) by 0.5 seconds. With only 1 icmp packet being sent then we will receive a response quicker. The defaults mean it will take at least 1 second for a response no matter how quick the icmp packet is returned.","title":"fping tuning"},{"location":"Support/Performance/#optimise-poller-wrapper","text":"poller-wrapper.py defaults to using 16 threads, this isn't necessarily optimal. A general rule of thumb is 2 threads per core but we suggest that you play around with lowering / increasing the number until you get the optimal value. Note KEEP in MIND that this doesn't always help, it depends on your system and CPU. So be careful. This can be changed by going to the cron job for librenms. Usually in /etc/cron.d/librenms and changing the \"16\" */5 * * * * librenms /opt/librenms/cronic /opt/librenms/poller-wrapper.py 16 Please also see Dispatcher Service","title":"Optimise poller-wrapper"},{"location":"Support/Performance/#recursive-dns","text":"If your install uses hostnames for devices and you have quite a lot then it's advisable to setup a local recursive dns instance on the LibreNMS server. Something like pdns-recursor can be used and then configure /etc/resolv.conf to use 127.0.0.1 for queries.","title":"Recursive DNS"},{"location":"Support/Performance/#per-port-polling-experimental","text":"By default the polling ports module will walk ifXEntry + some items from ifEntry regardless of the port. So if a port is marked as deleted because you don't want to see them or it's disabled then we still collect data. For the most part this is fine as the walks are quite quick. However for devices with a lot of ports and good % of those are either deleted or disabled then this approach isn't optimal. So to counter this you can enable 'selected port polling' per device within the edit device -> misc section or by globally enabling it ( not recommended ): $config['polling']['selected_ports'] = true; . This is truly not recommended, as it has been proven to affect cpu usage of your poller negatively. You can also set it for a specific OS: $config['os']['ios']['polling']['selected_ports'] = true; . Running ./scripts/collect-port-polling.php will poll your devices with both full and selective polling, display a table with the difference and optionally enable or disable selected ports polling for devices which would benefit from a change. Note that it doesn't continuously re-evaluate this, it will only be updated when the script is run. There are a number of options: -h | Poll single device or wildcard hostname -e Enable/disable selected ports polling for devices which would benefit from a change If you want to run this script to have it set selected port polling on devices where a change of 10% or more is evaluated , run it with ./scripts/collect-port-polling.php -e 10 . But note: it will not blindly use only the 10%. There is a second condition that the change has to be more than one second in polling time.","title":"Per port polling - experimental"},{"location":"Support/Performance/#web-interface","text":"","title":"Web interface"},{"location":"Support/Performance/#http2","text":"If you are running https then you should enable http/2 support in whatever web server you use: For Nginx (1.9.5 and above) change listen 443 ssl; to listen 443 ssl http2; in the Virtualhost config. For Apache (2.4.17 and above) set Protocols h2 http/1.1 in the Virtualhost config.","title":"HTTP/2"},{"location":"Support/Performance/#php-opcache","text":"A lot of performance can be gained from setting up php-opcache correctly. Note: Memory based caching with PHP cli will increase memory usage and slow things down. File based caching is not as fast as memory based and is more likely to have stale cache issues. Some distributions allow separate cli, mod_php and php-fpm configurations, we can use this to set the optimal config.","title":"PHP-opcache"},{"location":"Support/Performance/#for-web-servers-using-mod_php-and-php-fpm","text":"Update your web PHP opcache.ini. Possible locations: /etc/php/8.1/fpm/conf.d/opcache.ini , /etc/php.d/opcache.ini , or /etc/php/conf.d/opcache.ini . zend_extension=opcache opcache.enable=1 opcache.memory_consumption=256 If you are having caching issues, you can clear the opcache by simply restarting httpd or php-fpm.","title":"For web servers using mod_php and php-fpm"},{"location":"Support/Performance/#for-pollers","text":"Create a cache directory that is writable by the librenms user first: sudo mkdir -p /tmp/cache && sudo chmod 775 /tmp/cache && sudo chown -R librenms /tmp/cache Update your PHP opcache.ini. Possible locations: /etc/php/8.1/cli/conf.d/opcache.ini , /etc/php.d/opcache.ini , or /etc/php/conf.d/opcache.ini . zend_extension=opcache.so opcache.enable=1 opcache.enable_cli=1 opcache.file_cache=\"/tmp/cache/\" opcache.file_cache_only=0 opcache.file_cache_consistency_checks=1 opcache.memory_consumption=256 If you are having caching issues, you can clear the file based opcache with rm -rf /tmp/cache .","title":"For pollers"},{"location":"Support/Poller%20Support/","text":"lnms device:poll This document will explain how to use lnms device:poll to debug issues or manually running to process data. Command options Description: Poll data from device ( s ) as defined by discovery Usage: device:poll [ options ] [ -- ] Arguments: device spec Device spec to poll: device_id, hostname, wildcard ( * ) , odd, even, all Options: -m, --modules = MODULES Specify single module to be run. Comma separate modules, submodules may be added with / -x, --no-data Do not update datastores ( RRD, InfluxDB, etc ) -h, --help Display help for the given command. When no command is given display help for the list command -q, --quiet Do not output any message -V, --version Display this application version --ansi | --no-ansi Force ( or disable --no-ansi ) ANSI output -n, --no-interaction Do not ask any interactive question --env [= ENV ] The environment the command should run under -v | vv | vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Poller Wrapper We have a poller-wrapper.py script by Job Snijders . This script is currently the default. If you need to debug the output of poller-wrapper.py then you can add -d to the end of the command - it is NOT recommended to do this in cron. Poller config These are the default poller config items. You can globally disable a module by setting it to 0. If you just want to disable it for one device then you can do this within the WebUI Device -> Edit -> Modules. poller/poller_modules lnms config:set poller_modules.unix-agent false lnms config:set poller_modules.os true lnms config:set poller_modules.ipmi true lnms config:set poller_modules.sensors true lnms config:set poller_modules.processors true lnms config:set poller_modules.mempools true lnms config:set poller_modules.storage true lnms config:set poller_modules.netstats true lnms config:set poller_modules.hr-mib true lnms config:set poller_modules.ucd-mib true lnms config:set poller_modules.ipSystemStats true lnms config:set poller_modules.ports true lnms config:set poller_modules.nac false lnms config:set poller_modules.bgp-peers true lnms config:set poller_modules.junose-atm-vp false lnms config:set poller_modules.printer-supplies false lnms config:set poller_modules.ucd-diskio true lnms config:set poller_modules.wireless true lnms config:set poller_modules.ospf true lnms config:set poller_modules.cisco-ipsec-flow-monitor false lnms config:set poller_modules.cisco-remote-access-monitor false lnms config:set poller_modules.cisco-cef false lnms config:set poller_modules.slas false lnms config:set poller_modules.cisco-mac-accounting false lnms config:set poller_modules.cipsec-tunnels false lnms config:set poller_modules.cisco-ace-loadbalancer false lnms config:set poller_modules.cisco-ace-serverfarms false lnms config:set poller_modules.cisco-asa-firewall false lnms config:set poller_modules.cisco-voice false lnms config:set poller_modules.cisco-cbqos false lnms config:set poller_modules.cisco-otv false lnms config:set poller_modules.cisco-vpdn false lnms config:set poller_modules.netscaler-vsvr false lnms config:set poller_modules.aruba-controller false lnms config:set poller_modules.entity-physical true lnms config:set poller_modules.entity-state false lnms config:set poller_modules.applications true lnms config:set poller_modules.availability true lnms config:set poller_modules.stp true lnms config:set poller_modules.vminfo false lnms config:set poller_modules.ntp true lnms config:set poller_modules.services true lnms config:set poller_modules.loadbalancers false lnms config:set poller_modules.mef false lnms config:set poller_modules.mef false OS based Poller config You can enable or disable modules for a specific OS by add corresponding line in config.php OS based settings have preference over global. Device based settings have preference over all others Poller performance improvement can be achieved by deactivating all modules that are not supported by specific OS. E.g. to deactivate spanning tree but activate unix-agent module for linux OS poller/poller_modules lnms config:set os.linux.poller_modules.stp false lnms config:set os.linux.poller_modules.unix-agent true Poller modules unix-agent : Enable the check_mk agent for external support for applications. system : Provides information on some common items like uptime, sysDescr and sysContact. os : Os detection. This module will pick up the OS of the device. ipmi : Enables support for IPMI if login details have been provided for IPMI. sensors : Sensor detection such as Temperature, Humidity, Voltages + More. processors : Processor support for devices. mempools : Memory detection support for devices. storage : Storage detection for hard disks netstats : Statistics for IP, TCP, UDP, ICMP and SNMP. hr-mib : Host resource support. ucd-mib : Support for CPU, Memory and Load. ipSystemStats : IP statistics for device. ports : This module will detect all ports on a device excluding ones configured to be ignored by config options. xdsl : This module will collect more metrics for xdsl interfaces. nac : Network Access Control (NAC) or 802.1X support. bgp-peers : BGP detection and support. junose-atm-vp : Juniper ATM support. printer-supplies : Toner levels support. ucd-diskio : Disk I/O support. wifi : WiFi Support for those devices with support. ospf : OSPF Support. cisco-ipsec-flow-monitor : IPSec statistics support. cisco-remote-access-monitor : Cisco remote access support. cisco-cef : CEF detection and support. slas : SLA detection and support. cisco-mac-accounting : MAC Address account support. cipsec-tunnels : IPSec tunnel support. cisco-ace-loadbalancer : Cisco ACE Support. cisco-ace-serverfarms : Cisco ACE Support. netscaler-vsvr : Netscaler support. aruba-controller : Aruba wireless controller support. entity-physical : Module to pick up the devices hardware support. applications : Device application support. availability : Device Availability Calculation. cisco-asa-firewall : Cisco ASA firewall support. Running Here are some examples of running poller from within your install directory. lnms device:poll localhost lnms device:poll localhost -m ports Debugging To provide debugging output you will need to run the poller process with the -vv flag. You can do this either against all modules, single or multiple modules: All Modules lnms device:poll localhost -vv Single Module lnms device:poll localhost -m ports -vv Multiple Modules lnms device:poll localhost -m ports,entity-physical -vv Using -vv shouldn't output much sensitive information, -vvv will so it is then advisable to sanitise the output before pasting it somewhere as the debug output will contain snmp details amongst other items including port descriptions. The output will contain: DB Updates RRD Updates SNMP Response","title":"Poller Support"},{"location":"Support/Poller%20Support/#lnms-devicepoll","text":"This document will explain how to use lnms device:poll to debug issues or manually running to process data.","title":"lnms device:poll"},{"location":"Support/Poller%20Support/#command-options","text":"Description: Poll data from device ( s ) as defined by discovery Usage: device:poll [ options ] [ -- ] Arguments: device spec Device spec to poll: device_id, hostname, wildcard ( * ) , odd, even, all Options: -m, --modules = MODULES Specify single module to be run. Comma separate modules, submodules may be added with / -x, --no-data Do not update datastores ( RRD, InfluxDB, etc ) -h, --help Display help for the given command. When no command is given display help for the list command -q, --quiet Do not output any message -V, --version Display this application version --ansi | --no-ansi Force ( or disable --no-ansi ) ANSI output -n, --no-interaction Do not ask any interactive question --env [= ENV ] The environment the command should run under -v | vv | vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug","title":"Command options"},{"location":"Support/Poller%20Support/#poller-wrapper","text":"We have a poller-wrapper.py script by Job Snijders . This script is currently the default. If you need to debug the output of poller-wrapper.py then you can add -d to the end of the command - it is NOT recommended to do this in cron.","title":"Poller Wrapper"},{"location":"Support/Poller%20Support/#poller-config","text":"These are the default poller config items. You can globally disable a module by setting it to 0. If you just want to disable it for one device then you can do this within the WebUI Device -> Edit -> Modules. poller/poller_modules lnms config:set poller_modules.unix-agent false lnms config:set poller_modules.os true lnms config:set poller_modules.ipmi true lnms config:set poller_modules.sensors true lnms config:set poller_modules.processors true lnms config:set poller_modules.mempools true lnms config:set poller_modules.storage true lnms config:set poller_modules.netstats true lnms config:set poller_modules.hr-mib true lnms config:set poller_modules.ucd-mib true lnms config:set poller_modules.ipSystemStats true lnms config:set poller_modules.ports true lnms config:set poller_modules.nac false lnms config:set poller_modules.bgp-peers true lnms config:set poller_modules.junose-atm-vp false lnms config:set poller_modules.printer-supplies false lnms config:set poller_modules.ucd-diskio true lnms config:set poller_modules.wireless true lnms config:set poller_modules.ospf true lnms config:set poller_modules.cisco-ipsec-flow-monitor false lnms config:set poller_modules.cisco-remote-access-monitor false lnms config:set poller_modules.cisco-cef false lnms config:set poller_modules.slas false lnms config:set poller_modules.cisco-mac-accounting false lnms config:set poller_modules.cipsec-tunnels false lnms config:set poller_modules.cisco-ace-loadbalancer false lnms config:set poller_modules.cisco-ace-serverfarms false lnms config:set poller_modules.cisco-asa-firewall false lnms config:set poller_modules.cisco-voice false lnms config:set poller_modules.cisco-cbqos false lnms config:set poller_modules.cisco-otv false lnms config:set poller_modules.cisco-vpdn false lnms config:set poller_modules.netscaler-vsvr false lnms config:set poller_modules.aruba-controller false lnms config:set poller_modules.entity-physical true lnms config:set poller_modules.entity-state false lnms config:set poller_modules.applications true lnms config:set poller_modules.availability true lnms config:set poller_modules.stp true lnms config:set poller_modules.vminfo false lnms config:set poller_modules.ntp true lnms config:set poller_modules.services true lnms config:set poller_modules.loadbalancers false lnms config:set poller_modules.mef false lnms config:set poller_modules.mef false","title":"Poller config"},{"location":"Support/Poller%20Support/#os-based-poller-config","text":"You can enable or disable modules for a specific OS by add corresponding line in config.php OS based settings have preference over global. Device based settings have preference over all others Poller performance improvement can be achieved by deactivating all modules that are not supported by specific OS. E.g. to deactivate spanning tree but activate unix-agent module for linux OS poller/poller_modules lnms config:set os.linux.poller_modules.stp false lnms config:set os.linux.poller_modules.unix-agent true","title":"OS based Poller config"},{"location":"Support/Poller%20Support/#poller-modules","text":"unix-agent : Enable the check_mk agent for external support for applications. system : Provides information on some common items like uptime, sysDescr and sysContact. os : Os detection. This module will pick up the OS of the device. ipmi : Enables support for IPMI if login details have been provided for IPMI. sensors : Sensor detection such as Temperature, Humidity, Voltages + More. processors : Processor support for devices. mempools : Memory detection support for devices. storage : Storage detection for hard disks netstats : Statistics for IP, TCP, UDP, ICMP and SNMP. hr-mib : Host resource support. ucd-mib : Support for CPU, Memory and Load. ipSystemStats : IP statistics for device. ports : This module will detect all ports on a device excluding ones configured to be ignored by config options. xdsl : This module will collect more metrics for xdsl interfaces. nac : Network Access Control (NAC) or 802.1X support. bgp-peers : BGP detection and support. junose-atm-vp : Juniper ATM support. printer-supplies : Toner levels support. ucd-diskio : Disk I/O support. wifi : WiFi Support for those devices with support. ospf : OSPF Support. cisco-ipsec-flow-monitor : IPSec statistics support. cisco-remote-access-monitor : Cisco remote access support. cisco-cef : CEF detection and support. slas : SLA detection and support. cisco-mac-accounting : MAC Address account support. cipsec-tunnels : IPSec tunnel support. cisco-ace-loadbalancer : Cisco ACE Support. cisco-ace-serverfarms : Cisco ACE Support. netscaler-vsvr : Netscaler support. aruba-controller : Aruba wireless controller support. entity-physical : Module to pick up the devices hardware support. applications : Device application support. availability : Device Availability Calculation. cisco-asa-firewall : Cisco ASA firewall support.","title":"Poller modules"},{"location":"Support/Poller%20Support/#running","text":"Here are some examples of running poller from within your install directory. lnms device:poll localhost lnms device:poll localhost -m ports","title":"Running"},{"location":"Support/Poller%20Support/#debugging","text":"To provide debugging output you will need to run the poller process with the -vv flag. You can do this either against all modules, single or multiple modules: All Modules lnms device:poll localhost -vv Single Module lnms device:poll localhost -m ports -vv Multiple Modules lnms device:poll localhost -m ports,entity-physical -vv Using -vv shouldn't output much sensitive information, -vvv will so it is then advisable to sanitise the output before pasting it somewhere as the debug output will contain snmp details amongst other items including port descriptions. The output will contain: DB Updates RRD Updates SNMP Response","title":"Debugging"},{"location":"Support/Remote-Monitoring-VPN/","text":"Remote monitoring using tinc VPN This article describes how to use tinc to connect several remote sites and their subnets to your central monitoring server. This will let you connect to devices on remote private IP ranges through one gateway on each site, routing them securely back to your LibreNMS installation. Configuring the monitoring server tinc should be available on nearly all Linux distributions via package management. If you are running something different, just take a look at tinc's homepage to find an appropriate version for your operating system: https://www.tinc-vpn.org/download/ I am going to describe the setup for Debian-based systems, but there are virtually no differences for e.g. CentOS or similar. First make sure your firewall accepts connections on port 655 UDP and TCP. Then install tinc via apt-get install tinc . Create the following directory structure to hold all your configuration files: mkdir -p /etc/tinc/myvpn/hosts \"myvpn\" is your VPN network's name and can be chosen freely. Create your main configuration file: vim /etc/tinc/myvpn/tinc.conf Name = monitoring AddressFamily = ipv4 Device = /dev/net/tun Next we need network up- and down scripts to define a few network settings for inside our VPN: vim /etc/tinc/myvpn/tinc-up #!/bin/sh ifconfig $INTERFACE 10 .6.1.1 netmask 255 .255.255.0 ip route add 10 .6.1.1/24 dev $INTERFACE ip route add 10 .0.0.0/22 dev $INTERFACE ip route add 10 .100.0.0/22 dev $INTERFACE ip route add 10 .200.0.0/22 dev $INTERFACE In this example we have 10.6.1.1 as the VPN IP address for the monitoring server on a /24 subnet. $INTERFACE will be automatically substituted with the name of the VPN, \"myvpn\" in this case. Then we have a route for the VPN subnet, so we can reach other sites via their VPN address. The last 3 lines designate the remote subnets. In the example I want to reach devices on three different remote private /22 subnets and be able to monitor devices on them from this server, so I set up routes for each of those remote sites in my tinc-up script. The tinc-down script is relatively simple as it just removes the custom interface, which should get rid of the routes as well: vim /etc/tinc/myvpn/tinc-down #!/bin/sh ifconfig $INTERFACE down Make sure your scripts scan be executed: chmod +x /etc/tinc/myvpn/tinc-* As a last step we need a host configuration file. This should be named the same as the \"Name\" you defined in tinc.conf: vim /etc/tinc/myvpn/hosts/monitoring Subnet = 10 .6.1.1/32 On the monitoring server we will just fill in the subnet and not define its external IP address to make sure it listens on all available external interfaces. It's time to use tinc to create our key-pair: tincd -n myvpn -K Now the file /etc/tinc/myvpn/hosts/monitoring should have an RSA public key appended to it and your private key should reside in /etc/tinc/myvpn/rsa_key.priv . To make sure that the connection will be restored after each reboot, you can add your VPN name to /etc/tinc/nets.boot . Now you can start tinc with tincd -n myvpn and it will listen for your remote sites to connect to it. Remote site configuration Essentially the same steps as for your central monitoring server apply for all remote gateway devices. These can be routers, or just any computer or VM running on the remote subnet, able to reach the internet with the ability to forward IP packets externally. Install tinc Create directory structure: mkdir -p /etc/tinc/myvpn/hosts Create main configuration: vim /etc/tinc/myvpn/tinc.conf Name = remote1 AddressFamily = ipv4 Device = /dev/net/tun ConnectTo = monitoring Create up script: vim /etc/tinc/myvpn/tinc-up #!/bin/sh ifconfig $INTERFACE 10 .6.1.2 netmask 255 .255.255.0 ip route add 10 .6.1.2/32 dev $INTERFACE Create down script: vim /etc/tinc/myvpn/tinc-down #!/bin/sh ifconfig $INTERFACE down Make executable: chmod +x /etc/tinc/myvpn/tinc* Create device configuration: vim /etc/tinc/myvpn/hosts/remote1 Address = 198 .51.100.2 Subnet = 10 .0.0.0/22 This defines the device IP address outside of the VPN and the subnet it will expose. Copy over the monitoring server's host configuration (including the embedded public key) and add it's external IP address: vim /etc/tinc/myvpn/hosts/monitoring Address = 203 .0.113.6 Subnet = 10 .6.1.1/32 -----BEGIN RSA PUBLIC KEY----- VeDyaqhKd4o2Fz... Generate this device's keys: tincd -n myvpn -K Copy over this devices host file including the embedded public key to your monitoring server. Add the name for the VPN to /etc/tinc/nets.boot if you want to autostart the connection upon reboot. Start tinc: tincd -n myvpn These steps can basically be repeated for every remote site just choosing different names and other internal IP addresses. In my case I connected 3 remote sites running behind Ubiquiti EdgeRouters. Since those devices let me install software through Debian's package management it was very easy to set up. Just create the necessary configuration files and network scripts on each device and distribute the host configurations including the public keys to each device that will actively connect back. Now you can add all devices you want to monitor in LibreNMS using their internal IP address on the remote subnets or using some form of name resolution. I opted to declare the most important devices in my /etc/hosts file on the monitoring server. As an added bonus tinc is a mesh VPN, so in theory you could specify several \"ConnectTo\" on each device and they should hold connections even if one network path goes down.","title":"Remote Monitoring VPN"},{"location":"Support/Remote-Monitoring-VPN/#remote-monitoring-using-tinc-vpn","text":"This article describes how to use tinc to connect several remote sites and their subnets to your central monitoring server. This will let you connect to devices on remote private IP ranges through one gateway on each site, routing them securely back to your LibreNMS installation.","title":"Remote monitoring using tinc VPN"},{"location":"Support/Remote-Monitoring-VPN/#configuring-the-monitoring-server","text":"tinc should be available on nearly all Linux distributions via package management. If you are running something different, just take a look at tinc's homepage to find an appropriate version for your operating system: https://www.tinc-vpn.org/download/ I am going to describe the setup for Debian-based systems, but there are virtually no differences for e.g. CentOS or similar. First make sure your firewall accepts connections on port 655 UDP and TCP. Then install tinc via apt-get install tinc . Create the following directory structure to hold all your configuration files: mkdir -p /etc/tinc/myvpn/hosts \"myvpn\" is your VPN network's name and can be chosen freely. Create your main configuration file: vim /etc/tinc/myvpn/tinc.conf Name = monitoring AddressFamily = ipv4 Device = /dev/net/tun Next we need network up- and down scripts to define a few network settings for inside our VPN: vim /etc/tinc/myvpn/tinc-up #!/bin/sh ifconfig $INTERFACE 10 .6.1.1 netmask 255 .255.255.0 ip route add 10 .6.1.1/24 dev $INTERFACE ip route add 10 .0.0.0/22 dev $INTERFACE ip route add 10 .100.0.0/22 dev $INTERFACE ip route add 10 .200.0.0/22 dev $INTERFACE In this example we have 10.6.1.1 as the VPN IP address for the monitoring server on a /24 subnet. $INTERFACE will be automatically substituted with the name of the VPN, \"myvpn\" in this case. Then we have a route for the VPN subnet, so we can reach other sites via their VPN address. The last 3 lines designate the remote subnets. In the example I want to reach devices on three different remote private /22 subnets and be able to monitor devices on them from this server, so I set up routes for each of those remote sites in my tinc-up script. The tinc-down script is relatively simple as it just removes the custom interface, which should get rid of the routes as well: vim /etc/tinc/myvpn/tinc-down #!/bin/sh ifconfig $INTERFACE down Make sure your scripts scan be executed: chmod +x /etc/tinc/myvpn/tinc-* As a last step we need a host configuration file. This should be named the same as the \"Name\" you defined in tinc.conf: vim /etc/tinc/myvpn/hosts/monitoring Subnet = 10 .6.1.1/32 On the monitoring server we will just fill in the subnet and not define its external IP address to make sure it listens on all available external interfaces. It's time to use tinc to create our key-pair: tincd -n myvpn -K Now the file /etc/tinc/myvpn/hosts/monitoring should have an RSA public key appended to it and your private key should reside in /etc/tinc/myvpn/rsa_key.priv . To make sure that the connection will be restored after each reboot, you can add your VPN name to /etc/tinc/nets.boot . Now you can start tinc with tincd -n myvpn and it will listen for your remote sites to connect to it.","title":"Configuring the monitoring server"},{"location":"Support/Remote-Monitoring-VPN/#remote-site-configuration","text":"Essentially the same steps as for your central monitoring server apply for all remote gateway devices. These can be routers, or just any computer or VM running on the remote subnet, able to reach the internet with the ability to forward IP packets externally. Install tinc Create directory structure: mkdir -p /etc/tinc/myvpn/hosts Create main configuration: vim /etc/tinc/myvpn/tinc.conf Name = remote1 AddressFamily = ipv4 Device = /dev/net/tun ConnectTo = monitoring Create up script: vim /etc/tinc/myvpn/tinc-up #!/bin/sh ifconfig $INTERFACE 10 .6.1.2 netmask 255 .255.255.0 ip route add 10 .6.1.2/32 dev $INTERFACE Create down script: vim /etc/tinc/myvpn/tinc-down #!/bin/sh ifconfig $INTERFACE down Make executable: chmod +x /etc/tinc/myvpn/tinc* Create device configuration: vim /etc/tinc/myvpn/hosts/remote1 Address = 198 .51.100.2 Subnet = 10 .0.0.0/22 This defines the device IP address outside of the VPN and the subnet it will expose. Copy over the monitoring server's host configuration (including the embedded public key) and add it's external IP address: vim /etc/tinc/myvpn/hosts/monitoring Address = 203 .0.113.6 Subnet = 10 .6.1.1/32 -----BEGIN RSA PUBLIC KEY----- VeDyaqhKd4o2Fz... Generate this device's keys: tincd -n myvpn -K Copy over this devices host file including the embedded public key to your monitoring server. Add the name for the VPN to /etc/tinc/nets.boot if you want to autostart the connection upon reboot. Start tinc: tincd -n myvpn These steps can basically be repeated for every remote site just choosing different names and other internal IP addresses. In my case I connected 3 remote sites running behind Ubiquiti EdgeRouters. Since those devices let me install software through Debian's package management it was very easy to set up. Just create the necessary configuration files and network scripts on each device and distribute the host configurations including the public keys to each device that will actively connect back. Now you can add all devices you want to monitor in LibreNMS using their internal IP address on the remote subnets or using some form of name resolution. I opted to declare the most important devices in my /etc/hosts file on the monitoring server. As an added bonus tinc is a mesh VPN, so in theory you could specify several \"ConnectTo\" on each device and they should hold connections even if one network path goes down.","title":"Remote site configuration"},{"location":"Support/SNMP-Configuration-Examples/","text":"SNMP configuration examples Devices Cisco Adaptive Security Appliance (ASA) ASDM Launch ASDM and connect to your device Go to Configuration > Management Access > SNMP Add your community string Add in the \"SNMP Host Access List\" section your LibreNMS server IP address Click Apply and Save CLI # SNMPv2c snmp-server community snmp-server contact snmp-server location snmp-server host poll community version 2c # SNMPv3 snmp-server group v3 priv snmp-server user v3 auth sha priv aes 128 snmp-server contact snmp-server location snmp-server host poll version 3 Note: If the device is unable to find the SNMP user, reboot the ASA. Once rebooted, continue the steps as normal. IOS / IOS XE # SNMPv2c snmp-server community RO snmp-server contact snmp-server location # SNMPv3 snmp-server group v3 priv snmp-server user v3 auth sha priv aes 128 snmp-server contact snmp-server location # Note: The following is also required if using SNMPv3 and you want to populate the FDB table, STP info and others. snmp-server group v3 priv context vlan- match prefix Note: If the device is unable to find the SNMP user, reboot the ASA. Once rebooted, continue the steps as normal. NX-OS # SNMPv2c snmp-server community RO snmp-server contact snmp-server location # SNMPv3 snmp-server user v3 auth sha priv aes 128 snmp-server contact snmp-server location Wireless LAN Controller (WLC) Access the web admin page and log in If you are running version 8.1 and later, on the new dashboard click \"Advanced\" Go to management Tab On SNMP sub-menu, select \"Communities\" Click \"New...\" Add your community name and leave IP addresses empty Click Apply and Save Eaton Network Card-MS Connect to the Web UI of the device Upgrade to the latest available manufacturer firmware which applies to your hardware revision. Refer to the release notes. For devices which can use the Lx releases, do install LD. After rebooting the card (safe for connected load), configure Network, System and Access Control. Save config for each step. Configure SNMP. The device defaults to both SNMP v1 and v3 enabled, with default credentials. Disable what you do not need. SNMP v3 works, but uses MD5/DES. You may have to add another section to your SNMP credentials table in LibreNMS. Save. HPE / 3PAR Comware SNMPv2c snmp-agent community read snmp-agent sys-info contact snmp-agent sys-info location snmp-agent sys-info version all snmp-agent packet max-size 6000 packet max-size is required for some walks to complete, but the path must support fragmentation. SNMPv3 snmp-agent mib-view excluded ExcludeAll snmp snmp-agent group v3 V3ROGroup privacy read-view ViewDefault write-view ExcludeAll snmp-agent usm-user v3 V3ROGroup simple authentication-mode sha privacy-mode aes128 snmp-agent sys-info contact snmp-agent sys-info location snmp-agent sys-info version v3 undo snmp-agent sys-info version v1 v2c snmp-agent packet max-size 6000 packet max-size is required for some walks to complete, but the path must support fragmentation. Inform OS 3.2.x Access the CLI Add an SNMP Manager with your LibreNMS IP address: addsnmpmgr Add your SNMP community: setsnmppw Infoblox NIOS 7.x+ Access the web admin page and log in Go to Grid tab > Grid Manager In the right menu select \"Grid properties\" Select \"SNMP\" menu Click \"Enable SNMPv1/SNMPv2 Queries\" Add your community Click Save & Close Juniper Junos OS for SNMPv1/v2c set snmp description description set snmp location location set snmp contact contact set snmp community YOUR-COMMUNITY authorization read-only for SNMPv3 (authPriv): set snmp v3 usm local-engine user authpriv authentication-sha authentication-password YOUR_AUTH_SECRET set snmp v3 usm local-engine user authpriv privacy-aes128 privacy-password YOUR_PRIV_SECRET set snmp v3 vacm security-to-group security-model usm security-name authpriv group mysnmpv3 set snmp v3 vacm access group mysnmpv3 default-context-prefix security-model any security-level authentication read-view mysnmpv3view set snmp v3 vacm access group mysnmpv3 default-context-prefix security-model any security-level privacy read-view mysnmpv3view set snmp view mysnmpv3view oid iso include Mikrotik RouterOS 6.x CLI SNMP v2 Configuration /snmp community set [ find default=yes ] read-access=no add addresses= name= /snmp set contact=\"\" enabled=yes engine-id= location=\"\" Notes: About the snmp community commands: The commands change the default snmp community. It is probably possible to create a new one instead. specify the address and host (not network) netmask of the LibreNMS server. Example: 192.168.8.71/32 trap-version=2 must also be specified if some other trap-version has been set trap-interfaces may also be used to limit the interfaces the router listens on About the snmp command: contact, engine-id and location are optional trap-community is probably required if a new snmp community has been created. CLI SNMP v3 Configuration for authPriv /snmp community add name=\"\" addresses=\"\" set \"\" authentication-password=\"\" authentication-protocol=MD5 set \"\" encryption-password=\"\" encryption-protocol=AES set \"\" read-access=yes write-access=no security=private #Disable public SNMP set public read-access=no write-access=no security=private /snmp set contact=\"\" enabled=yes engine-id=\"\" location=\"\" Notes: Use password with length of min 8 chars Notes for both SNMP v2 and v3 In some cases of advanced routing one may need to set explicitly the source IP address from which the SNMP daemon will reply - /snmp set src-address= Palo Alto PANOS 6.x/7.x Access the web admin page and log in Go to Device tab > Setup Go to the sub-tab \"Operations\" Click \"SNMP Setup\" Enter your SNMP community and then click \"OK\" Click Apply Note that you need to allow SNMP on the needed interfaces. To do that you need to create a network \"Interface Mgmt\" profile for standard interface and allow SNMP under \"Device > Management > Management Interface Settings\" for out of band management interface. One may also configure SNMP from the command line, which is useful when you need to configure more than one firewall for SNMP monitoring. Log into the firewall(s) via ssh, and perform these commands for basic SNMPv3 configuration: username@devicename> configure username@devicename# set deviceconfig system service disable-snmp no username@devicename# set deviceconfig system snmp-setting access-setting version v3 views pa view iso oid 1.3.6.1 username@devicename# set deviceconfig system snmp-setting access-setting version v3 views pa view iso option include username@devicename# set deviceconfig system snmp-setting access-setting version v3 views pa view iso mask 0xf0 username@devicename# set deviceconfig system snmp-setting access-setting version v3 users authpriv authpwd YOUR_AUTH_SECRET username@devicename# set deviceconfig system snmp-setting access-setting version v3 users authpriv privpwd YOUR_PRIV_SECRET username@devicename# set deviceconfig system snmp-setting access-setting version v3 users authpriv view pa username@devicename# set deviceconfig system snmp-setting snmp-system location \"Yourcity, Yourcountry [60.4,5.31]\" username@devicename# set deviceconfig system snmp-setting snmp-system contact noc@your.org username@devicename# commit username@devicename# exit Ubiquiti EdgeOs If you use the HTTP interface: 1. Access the legacy web admin page and log in 1. Go to System > Advanced Configuration 1. Go to the sub-tab \"SNMP\" > \"Community\" 1. Click \"Add Community Group\" 1. Enter your SNMP community, ip address and click submit 1. Go to System > Summary 1. Go to the sub-tab \"Description\" 1. Enter your System Name, System Location and System Contact. 1. Click submit 1. Click \"Save Configuration\" If you use CLI: username@devicename> enable username@devicename# configure username@devicename (Config)# snmp-server community \"public\" ro username@devicename (Config)# snmp-server sysname \"devicename\" username@devicename (Config)# snmp-server contact \"noc@example.com\" username@devicename (Config)# exit username@devicename# write memory VMware ESX/ESXi 5.x/6.x Log on to your ESX server by means of ssh. You may have to enable the ssh service in the GUI first. From the CLI, execute the following commands: esxcli system snmp set --authentication SHA1 esxcli system snmp set --privacy AES128 esxcli system snmp hash --auth-hash YOUR_AUTH_SECRET --priv-hash YOUR_PRIV_SECRET --raw-secret This command produces output like this Authhash: f3d8982fc28e8d1346c26eee49eb2c4a5950c934 Privhash: 0596ab30b315576a4e9f7d7bde65bf49b749e335 Now define a SNMPv3 user: esxcli system snmp set --users /f3d8982fc28e8d1346c26eee49eb2c4a5950c934/0596ab30b315576a4e9f7d7bde65bf49b749e335/priv esxcli system snmp set -L \"Yourcity, Yourcountry [60.4,5.3]\" esxcli system snmp set -C noc@your.org esxcli system snmp set --enable true Note: In case of snmp timeouts, disable the firewall with esxcli network firewall set --enabled false If snmp timeouts still occur with firewall disabled, migrate VMs if needed and reboot ESXi host. VCenter 6.x Log on to your ESX server by means of ssh. You may have to enable the ssh service in the GUI first. From the CLI, execute the following commands: snmp.set --authentication SHA1 snmp.set --privacy AES128 snmp.hash --auth_hash YOUR_AUTH_SECRET --priv_hash YOUR_PRIV_SECRET --raw_secret true This command produces output like this Privhash: 0596ab30b315576a4e9f7d7bde65bf49b749e335 Authhash: f3d8982fc28e8d1346c26eee49eb2c4a5950c934 Now define a SNMPv3 user: snmp.set --users authpriv/f3d8982fc28e8d1346c26eee49eb2c4a5950c934/0596ab30b315576a4e9f7d7bde65bf49b749e335/priv snmp.enable Operating systems Linux (snmpd v2) Replace your snmpd.conf file by the example below and edit it with appropriate community in \"RANDOMSTRINGGOESHERE\". vi /etc/snmp/snmpd.conf # Change RANDOMSTRINGGOESHERE to your preferred SNMP community string com2sec readonly default RANDOMSTRINGGOESHERE group MyROGroup v2c readonly view all included .1 80 access MyROGroup \"\" any noauth exact all none none syslocation Rack, Room, Building, City, Country [GPSX,Y] syscontact Your Name #Distro Detection extend distro /usr/bin/distro #Hardware Detection (uncomment to enable) #extend hardware '/bin/cat /sys/devices/virtual/dmi/id/product_name' #extend manufacturer '/bin/cat /sys/devices/virtual/dmi/id/sys_vendor' #extend serial '/bin/cat /sys/devices/virtual/dmi/id/product_serial' NOTE : On some systems the snmpd is running as its own user, which means it can't read /sys/devices/virtual/dmi/id/product_serial which is mode 0400. One solution is to include @reboot chmod 444 /sys/devices/virtual/dmi/id/product_serial in the crontab for root or equivalent. Non-x86 or SMBIOS-based systems, such as ARM-based Raspberry Pi units should query device tree locations for this metadata, for example: extend hardware '/bin/cat /sys/firmware/devicetree/base/model' extend serial '/bin/cat /sys/firmware/devicetree/base/serial-number' The LibreNMS server include a copy of this example here: /opt/librenms/snmpd.conf.example The binary /usr/bin/distro must be copied from the original source repository: curl -o /usr/bin/distro https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/distro chmod +x /usr/bin/distro Linux (snmpd v3) Go to /etc/snmp/snmpd.conf Open the file in vi or nano /etc/snmp/snmpd.conf and add the following line to create SNMPV3 User (replace username and passwords with your own): createUser authPrivUser SHA \"authPassword\" AES \"privPassword\" Make sure the agent listens to all interfaces by adding the following line inside snmpd.conf: agentAddress udp:161,udp6:161 This line simply means listen to connections across all interfaces IPv4 and IPv6 respectively Uncomment and change the following line to give read access to the username created above (rouser is what LibreNMS uses) : #rouser authPrivUser priv Change the following details inside snmpd.conf syslocation Rack, Room, Building, City, Country [GPSX,Y] syscontact Your Name Save and exit the file Restart the snmpd service CentOS 6 / Red hat 6 service snmpd restart CentOS 7 / Red hat 7 systemctl restart snmpd Add SNMP to Firewalld firewall-cmd --zone=public --permanent --add-service=snmp firewall-cmd --reload Ubuntu service snmpd restart Arch Linux (snmpd v2) Install SNMP Package pacman -S net-snmp create SNMP folder mkdir /etc/snmp/ set community echo rocommunity read_only_community_string >> /etc/snmp/snmpd.conf set contact echo syscontact Firstname Lastname >> /etc/snmp/snmpd.conf set location echo syslocation L69 4RX >> /etc/snmp/snmpd.conf enable startup systemctl enable snmpd.service start snmp systemctl restart snmpd.service Windows Server 2008 R2 Log in to your Windows Server 2008 R2 Start \"Server Manager\" under \"Administrative Tools\" Click \"Features\" and then click \"Add Feature\" Check (if not checked) \"SNMP Service\", click \"Next\" until \"Install\" Start \"Services\" under \"Administrative Tools\" Edit \"SNMP Service\" properties Go to the security tab In \"Accepted community name\" click \"Add\" to add your community string and permission In \"Accept SNMP packets from these hosts\" click \"Add\" and add your LibreNMS server IP address Validate change by clicking \"Apply\" Windows Server 2012 R2 and newer GUI Log in to your Windows Server 2012 R2 or newer Start \"Server Manager\" under \"Administrative Tools\" Click \"Manage\" and then \"Add Roles and Features\" Continue by pressing \"Next\" to the \"Features\" menu Install (if not installed) \"SNMP Service\" Start \"Services\" under \"Administrative Tools\" Edit \"SNMP Service\" properties Go to the security tab In \"Accepted community name\" click \"Add\" to add your community string and permission In \"Accept SNMP packets from these hosts\" click \"Add\" and add your LibreNMS server IP address Validate change by clicking \"Apply\" PowerShell The following example will install SNMP, set the Librenms IP and set a read only community string. Replace $IP and $communitystring with your values. Install-WindowsFeature -Name 'SNMP-Service' , 'RSAT-SNMP' New-ItemProperty -Path \"HKLM:\\SYSTEM\\CurrentControlSet\\services\\SNMP\\Parameters\\PermittedManagers\" -Name 2 -Value $IP New-ItemProperty -Path \"HKLM:\\SYSTEM\\CurrentControlSet\\services\\SNMP\\Parameters\\ValidCommunities\" -Name $communitystring -Value 4 Note: SNMPv3 can be supported on Windows platforms with the use of Net-SNMP. Mac OSX Step 1: sudo nano /etc/snmp/snmpd.conf #Allow read-access with the following SNMP Community String: rocommunity public # all other settings are optional but recommended. # Location of the device syslocation data centre A # Human Contact for the device syscontact SysAdmin # System Name of the device sysName SystemName # the system OID for this device. This is optional but recommended, # to identify this as a MAC OS system. sysobjectid 1 .3.6.1.4.1.8072.3.2.16 Step 2: sudo launchctl load -w /System/Library/LaunchDaemons/org.net-snmp.snmpd.plist","title":"SNMP Configuration Examples"},{"location":"Support/SNMP-Configuration-Examples/#snmp-configuration-examples","text":"","title":"SNMP configuration examples"},{"location":"Support/SNMP-Configuration-Examples/#devices","text":"","title":"Devices"},{"location":"Support/SNMP-Configuration-Examples/#cisco","text":"","title":"Cisco"},{"location":"Support/SNMP-Configuration-Examples/#adaptive-security-appliance-asa","text":"ASDM Launch ASDM and connect to your device Go to Configuration > Management Access > SNMP Add your community string Add in the \"SNMP Host Access List\" section your LibreNMS server IP address Click Apply and Save CLI # SNMPv2c snmp-server community snmp-server contact snmp-server location snmp-server host poll community version 2c # SNMPv3 snmp-server group v3 priv snmp-server user v3 auth sha priv aes 128 snmp-server contact snmp-server location snmp-server host poll version 3 Note: If the device is unable to find the SNMP user, reboot the ASA. Once rebooted, continue the steps as normal.","title":"Adaptive Security Appliance (ASA)"},{"location":"Support/SNMP-Configuration-Examples/#ios-ios-xe","text":"# SNMPv2c snmp-server community RO snmp-server contact snmp-server location # SNMPv3 snmp-server group v3 priv snmp-server user v3 auth sha priv aes 128 snmp-server contact snmp-server location # Note: The following is also required if using SNMPv3 and you want to populate the FDB table, STP info and others. snmp-server group v3 priv context vlan- match prefix Note: If the device is unable to find the SNMP user, reboot the ASA. Once rebooted, continue the steps as normal.","title":"IOS / IOS XE"},{"location":"Support/SNMP-Configuration-Examples/#nx-os","text":"# SNMPv2c snmp-server community RO snmp-server contact snmp-server location # SNMPv3 snmp-server user v3 auth sha priv aes 128 snmp-server contact snmp-server location ","title":"NX-OS"},{"location":"Support/SNMP-Configuration-Examples/#wireless-lan-controller-wlc","text":"Access the web admin page and log in If you are running version 8.1 and later, on the new dashboard click \"Advanced\" Go to management Tab On SNMP sub-menu, select \"Communities\" Click \"New...\" Add your community name and leave IP addresses empty Click Apply and Save","title":"Wireless LAN Controller (WLC)"},{"location":"Support/SNMP-Configuration-Examples/#eaton","text":"","title":"Eaton"},{"location":"Support/SNMP-Configuration-Examples/#network-card-ms","text":"Connect to the Web UI of the device Upgrade to the latest available manufacturer firmware which applies to your hardware revision. Refer to the release notes. For devices which can use the Lx releases, do install LD. After rebooting the card (safe for connected load), configure Network, System and Access Control. Save config for each step. Configure SNMP. The device defaults to both SNMP v1 and v3 enabled, with default credentials. Disable what you do not need. SNMP v3 works, but uses MD5/DES. You may have to add another section to your SNMP credentials table in LibreNMS. Save.","title":"Network Card-MS"},{"location":"Support/SNMP-Configuration-Examples/#hpe-3par","text":"","title":"HPE / 3PAR"},{"location":"Support/SNMP-Configuration-Examples/#comware","text":"SNMPv2c snmp-agent community read snmp-agent sys-info contact snmp-agent sys-info location snmp-agent sys-info version all snmp-agent packet max-size 6000 packet max-size is required for some walks to complete, but the path must support fragmentation. SNMPv3 snmp-agent mib-view excluded ExcludeAll snmp snmp-agent group v3 V3ROGroup privacy read-view ViewDefault write-view ExcludeAll snmp-agent usm-user v3 V3ROGroup simple authentication-mode sha privacy-mode aes128 snmp-agent sys-info contact snmp-agent sys-info location snmp-agent sys-info version v3 undo snmp-agent sys-info version v1 v2c snmp-agent packet max-size 6000 packet max-size is required for some walks to complete, but the path must support fragmentation.","title":"Comware"},{"location":"Support/SNMP-Configuration-Examples/#inform-os-32x","text":"Access the CLI Add an SNMP Manager with your LibreNMS IP address: addsnmpmgr Add your SNMP community: setsnmppw ","title":"Inform OS 3.2.x"},{"location":"Support/SNMP-Configuration-Examples/#infoblox","text":"","title":"Infoblox"},{"location":"Support/SNMP-Configuration-Examples/#nios-7x","text":"Access the web admin page and log in Go to Grid tab > Grid Manager In the right menu select \"Grid properties\" Select \"SNMP\" menu Click \"Enable SNMPv1/SNMPv2 Queries\" Add your community Click Save & Close","title":"NIOS 7.x+"},{"location":"Support/SNMP-Configuration-Examples/#juniper","text":"","title":"Juniper"},{"location":"Support/SNMP-Configuration-Examples/#junos-os","text":"for SNMPv1/v2c set snmp description description set snmp location location set snmp contact contact set snmp community YOUR-COMMUNITY authorization read-only for SNMPv3 (authPriv): set snmp v3 usm local-engine user authpriv authentication-sha authentication-password YOUR_AUTH_SECRET set snmp v3 usm local-engine user authpriv privacy-aes128 privacy-password YOUR_PRIV_SECRET set snmp v3 vacm security-to-group security-model usm security-name authpriv group mysnmpv3 set snmp v3 vacm access group mysnmpv3 default-context-prefix security-model any security-level authentication read-view mysnmpv3view set snmp v3 vacm access group mysnmpv3 default-context-prefix security-model any security-level privacy read-view mysnmpv3view set snmp view mysnmpv3view oid iso include","title":"Junos OS"},{"location":"Support/SNMP-Configuration-Examples/#mikrotik","text":"","title":"Mikrotik"},{"location":"Support/SNMP-Configuration-Examples/#routeros-6x","text":"CLI SNMP v2 Configuration /snmp community set [ find default=yes ] read-access=no add addresses= name= /snmp set contact=\"\" enabled=yes engine-id= location=\"\" Notes: About the snmp community commands: The commands change the default snmp community. It is probably possible to create a new one instead. specify the address and host (not network) netmask of the LibreNMS server. Example: 192.168.8.71/32 trap-version=2 must also be specified if some other trap-version has been set trap-interfaces may also be used to limit the interfaces the router listens on About the snmp command: contact, engine-id and location are optional trap-community is probably required if a new snmp community has been created. CLI SNMP v3 Configuration for authPriv /snmp community add name=\"\" addresses=\"\" set \"\" authentication-password=\"\" authentication-protocol=MD5 set \"\" encryption-password=\"\" encryption-protocol=AES set \"\" read-access=yes write-access=no security=private #Disable public SNMP set public read-access=no write-access=no security=private /snmp set contact=\"\" enabled=yes engine-id=\"\" location=\"\" Notes: Use password with length of min 8 chars Notes for both SNMP v2 and v3 In some cases of advanced routing one may need to set explicitly the source IP address from which the SNMP daemon will reply - /snmp set src-address=","title":"RouterOS 6.x"},{"location":"Support/SNMP-Configuration-Examples/#palo-alto","text":"","title":"Palo Alto"},{"location":"Support/SNMP-Configuration-Examples/#panos-6x7x","text":"Access the web admin page and log in Go to Device tab > Setup Go to the sub-tab \"Operations\" Click \"SNMP Setup\" Enter your SNMP community and then click \"OK\" Click Apply Note that you need to allow SNMP on the needed interfaces. To do that you need to create a network \"Interface Mgmt\" profile for standard interface and allow SNMP under \"Device > Management > Management Interface Settings\" for out of band management interface. One may also configure SNMP from the command line, which is useful when you need to configure more than one firewall for SNMP monitoring. Log into the firewall(s) via ssh, and perform these commands for basic SNMPv3 configuration: username@devicename> configure username@devicename# set deviceconfig system service disable-snmp no username@devicename# set deviceconfig system snmp-setting access-setting version v3 views pa view iso oid 1.3.6.1 username@devicename# set deviceconfig system snmp-setting access-setting version v3 views pa view iso option include username@devicename# set deviceconfig system snmp-setting access-setting version v3 views pa view iso mask 0xf0 username@devicename# set deviceconfig system snmp-setting access-setting version v3 users authpriv authpwd YOUR_AUTH_SECRET username@devicename# set deviceconfig system snmp-setting access-setting version v3 users authpriv privpwd YOUR_PRIV_SECRET username@devicename# set deviceconfig system snmp-setting access-setting version v3 users authpriv view pa username@devicename# set deviceconfig system snmp-setting snmp-system location \"Yourcity, Yourcountry [60.4,5.31]\" username@devicename# set deviceconfig system snmp-setting snmp-system contact noc@your.org username@devicename# commit username@devicename# exit","title":"PANOS 6.x/7.x"},{"location":"Support/SNMP-Configuration-Examples/#ubiquiti","text":"","title":"Ubiquiti"},{"location":"Support/SNMP-Configuration-Examples/#edgeos","text":"If you use the HTTP interface: 1. Access the legacy web admin page and log in 1. Go to System > Advanced Configuration 1. Go to the sub-tab \"SNMP\" > \"Community\" 1. Click \"Add Community Group\" 1. Enter your SNMP community, ip address and click submit 1. Go to System > Summary 1. Go to the sub-tab \"Description\" 1. Enter your System Name, System Location and System Contact. 1. Click submit 1. Click \"Save Configuration\" If you use CLI: username@devicename> enable username@devicename# configure username@devicename (Config)# snmp-server community \"public\" ro username@devicename (Config)# snmp-server sysname \"devicename\" username@devicename (Config)# snmp-server contact \"noc@example.com\" username@devicename (Config)# exit username@devicename# write memory","title":"EdgeOs"},{"location":"Support/SNMP-Configuration-Examples/#vmware","text":"","title":"VMware"},{"location":"Support/SNMP-Configuration-Examples/#esxesxi-5x6x","text":"Log on to your ESX server by means of ssh. You may have to enable the ssh service in the GUI first. From the CLI, execute the following commands: esxcli system snmp set --authentication SHA1 esxcli system snmp set --privacy AES128 esxcli system snmp hash --auth-hash YOUR_AUTH_SECRET --priv-hash YOUR_PRIV_SECRET --raw-secret This command produces output like this Authhash: f3d8982fc28e8d1346c26eee49eb2c4a5950c934 Privhash: 0596ab30b315576a4e9f7d7bde65bf49b749e335 Now define a SNMPv3 user: esxcli system snmp set --users /f3d8982fc28e8d1346c26eee49eb2c4a5950c934/0596ab30b315576a4e9f7d7bde65bf49b749e335/priv esxcli system snmp set -L \"Yourcity, Yourcountry [60.4,5.3]\" esxcli system snmp set -C noc@your.org esxcli system snmp set --enable true Note: In case of snmp timeouts, disable the firewall with esxcli network firewall set --enabled false If snmp timeouts still occur with firewall disabled, migrate VMs if needed and reboot ESXi host.","title":"ESX/ESXi 5.x/6.x"},{"location":"Support/SNMP-Configuration-Examples/#vcenter-6x","text":"Log on to your ESX server by means of ssh. You may have to enable the ssh service in the GUI first. From the CLI, execute the following commands: snmp.set --authentication SHA1 snmp.set --privacy AES128 snmp.hash --auth_hash YOUR_AUTH_SECRET --priv_hash YOUR_PRIV_SECRET --raw_secret true This command produces output like this Privhash: 0596ab30b315576a4e9f7d7bde65bf49b749e335 Authhash: f3d8982fc28e8d1346c26eee49eb2c4a5950c934 Now define a SNMPv3 user: snmp.set --users authpriv/f3d8982fc28e8d1346c26eee49eb2c4a5950c934/0596ab30b315576a4e9f7d7bde65bf49b749e335/priv snmp.enable","title":"VCenter 6.x"},{"location":"Support/SNMP-Configuration-Examples/#operating-systems","text":"","title":"Operating systems"},{"location":"Support/SNMP-Configuration-Examples/#linux-snmpd-v2","text":"Replace your snmpd.conf file by the example below and edit it with appropriate community in \"RANDOMSTRINGGOESHERE\". vi /etc/snmp/snmpd.conf # Change RANDOMSTRINGGOESHERE to your preferred SNMP community string com2sec readonly default RANDOMSTRINGGOESHERE group MyROGroup v2c readonly view all included .1 80 access MyROGroup \"\" any noauth exact all none none syslocation Rack, Room, Building, City, Country [GPSX,Y] syscontact Your Name #Distro Detection extend distro /usr/bin/distro #Hardware Detection (uncomment to enable) #extend hardware '/bin/cat /sys/devices/virtual/dmi/id/product_name' #extend manufacturer '/bin/cat /sys/devices/virtual/dmi/id/sys_vendor' #extend serial '/bin/cat /sys/devices/virtual/dmi/id/product_serial' NOTE : On some systems the snmpd is running as its own user, which means it can't read /sys/devices/virtual/dmi/id/product_serial which is mode 0400. One solution is to include @reboot chmod 444 /sys/devices/virtual/dmi/id/product_serial in the crontab for root or equivalent. Non-x86 or SMBIOS-based systems, such as ARM-based Raspberry Pi units should query device tree locations for this metadata, for example: extend hardware '/bin/cat /sys/firmware/devicetree/base/model' extend serial '/bin/cat /sys/firmware/devicetree/base/serial-number' The LibreNMS server include a copy of this example here: /opt/librenms/snmpd.conf.example The binary /usr/bin/distro must be copied from the original source repository: curl -o /usr/bin/distro https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/distro chmod +x /usr/bin/distro","title":"Linux (snmpd v2)"},{"location":"Support/SNMP-Configuration-Examples/#linux-snmpd-v3","text":"Go to /etc/snmp/snmpd.conf Open the file in vi or nano /etc/snmp/snmpd.conf and add the following line to create SNMPV3 User (replace username and passwords with your own): createUser authPrivUser SHA \"authPassword\" AES \"privPassword\" Make sure the agent listens to all interfaces by adding the following line inside snmpd.conf: agentAddress udp:161,udp6:161 This line simply means listen to connections across all interfaces IPv4 and IPv6 respectively Uncomment and change the following line to give read access to the username created above (rouser is what LibreNMS uses) : #rouser authPrivUser priv Change the following details inside snmpd.conf syslocation Rack, Room, Building, City, Country [GPSX,Y] syscontact Your Name Save and exit the file","title":"Linux (snmpd v3)"},{"location":"Support/SNMP-Configuration-Examples/#restart-the-snmpd-service","text":"","title":"Restart the snmpd service"},{"location":"Support/SNMP-Configuration-Examples/#centos-6-red-hat-6","text":"service snmpd restart","title":"CentOS 6 / Red hat 6"},{"location":"Support/SNMP-Configuration-Examples/#centos-7-red-hat-7","text":"systemctl restart snmpd Add SNMP to Firewalld firewall-cmd --zone=public --permanent --add-service=snmp firewall-cmd --reload","title":"CentOS 7 / Red hat 7"},{"location":"Support/SNMP-Configuration-Examples/#ubuntu","text":"service snmpd restart","title":"Ubuntu"},{"location":"Support/SNMP-Configuration-Examples/#arch-linux-snmpd-v2","text":"Install SNMP Package pacman -S net-snmp create SNMP folder mkdir /etc/snmp/ set community echo rocommunity read_only_community_string >> /etc/snmp/snmpd.conf set contact echo syscontact Firstname Lastname >> /etc/snmp/snmpd.conf set location echo syslocation L69 4RX >> /etc/snmp/snmpd.conf enable startup systemctl enable snmpd.service start snmp systemctl restart snmpd.service","title":"Arch Linux (snmpd v2)"},{"location":"Support/SNMP-Configuration-Examples/#windows-server-2008-r2","text":"Log in to your Windows Server 2008 R2 Start \"Server Manager\" under \"Administrative Tools\" Click \"Features\" and then click \"Add Feature\" Check (if not checked) \"SNMP Service\", click \"Next\" until \"Install\" Start \"Services\" under \"Administrative Tools\" Edit \"SNMP Service\" properties Go to the security tab In \"Accepted community name\" click \"Add\" to add your community string and permission In \"Accept SNMP packets from these hosts\" click \"Add\" and add your LibreNMS server IP address Validate change by clicking \"Apply\"","title":"Windows Server 2008 R2"},{"location":"Support/SNMP-Configuration-Examples/#windows-server-2012-r2-and-newer","text":"","title":"Windows Server 2012 R2 and newer"},{"location":"Support/SNMP-Configuration-Examples/#gui","text":"Log in to your Windows Server 2012 R2 or newer Start \"Server Manager\" under \"Administrative Tools\" Click \"Manage\" and then \"Add Roles and Features\" Continue by pressing \"Next\" to the \"Features\" menu Install (if not installed) \"SNMP Service\" Start \"Services\" under \"Administrative Tools\" Edit \"SNMP Service\" properties Go to the security tab In \"Accepted community name\" click \"Add\" to add your community string and permission In \"Accept SNMP packets from these hosts\" click \"Add\" and add your LibreNMS server IP address Validate change by clicking \"Apply\"","title":"GUI"},{"location":"Support/SNMP-Configuration-Examples/#powershell","text":"The following example will install SNMP, set the Librenms IP and set a read only community string. Replace $IP and $communitystring with your values. Install-WindowsFeature -Name 'SNMP-Service' , 'RSAT-SNMP' New-ItemProperty -Path \"HKLM:\\SYSTEM\\CurrentControlSet\\services\\SNMP\\Parameters\\PermittedManagers\" -Name 2 -Value $IP New-ItemProperty -Path \"HKLM:\\SYSTEM\\CurrentControlSet\\services\\SNMP\\Parameters\\ValidCommunities\" -Name $communitystring -Value 4 Note: SNMPv3 can be supported on Windows platforms with the use of Net-SNMP.","title":"PowerShell"},{"location":"Support/SNMP-Configuration-Examples/#mac-osx","text":"Step 1: sudo nano /etc/snmp/snmpd.conf #Allow read-access with the following SNMP Community String: rocommunity public # all other settings are optional but recommended. # Location of the device syslocation data centre A # Human Contact for the device syscontact SysAdmin # System Name of the device sysName SystemName # the system OID for this device. This is optional but recommended, # to identify this as a MAC OS system. sysobjectid 1 .3.6.1.4.1.8072.3.2.16 Step 2: sudo launchctl load -w /System/Library/LaunchDaemons/org.net-snmp.snmpd.plist","title":"Mac OSX"},{"location":"Support/Device-Notes/AsuswrtMerlin/","text":"To use Wireless Sensors on AsuswrtMerlin, an agent of sorts is required. The purpose of the agent is to execute on the client (AsuswrtMerlin) side, to ensure that the needed Wireless Sensor information is returned for SNMP queries (from LibreNMS). Installation AsuswrtMerlin Two items are required on the AsuswrtMerlin side - scripts to generate the necessary information (for SNMP replies), and an SNMP extend configuration update (to return the information vs. the expected query). 1: Install the scripts: Copy the scripts from librenms-agent/snmp/Openwrt - preferably inside /etc/librenms on AsuswrtMerlin (and add this directory to /etc/sysupgrade.conf, to survive firmware updates). The only file that needs to be edited is wlInterfaces.txt, which is a mapping from the wireless interfaces, to the desired display name in LibreNMS. For example, wlan0,wl-2.4G wlan1,wl-5.0G 2: Update the AsuswrtMerlin SNMP configuration, adding extend support for the Wireless Sensor queries: vi /etc/config/snmpd , adding the following entries (assuming the scripts are installed in /etc/librenms, and are executable), and update the network interfaces as needed to match the hardware, config extend option name interfaces option prog \"/bin/cat /etc/librenms/wlInterfaces.txt\" config extend option name clients-wlan0 option prog \"/etc/librenms/wlClients.sh wlan0\" config extend option name clients-wlan1 option prog \"/etc/librenms/wlClients.sh wlan1\" config extend option name clients-wlan option prog \"/etc/librenms/wlClients.sh\" config extend option name frequency-wlan0 option prog \"/etc/librenms/wlFrequency.sh wlan0\" config extend option name frequency-wlan1 option prog \"/etc/librenms/wlFrequency.sh wlan1\" config extend option name rate-tx-wlan0-min option prog \"/etc/librenms/wlRate.sh wlan0 tx min\" config extend option name rate-tx-wlan0-avg option prog \"/etc/librenms/wlRate.sh wlan0 tx avg\" config extend option name rate-tx-wlan0-max option prog \"/etc/librenms/wlRate.sh wlan0 tx max\" config extend option name rate-tx-wlan1-min option prog \"/etc/librenms/wlRate.sh wlan1 tx min\" config extend option name rate-tx-wlan1-avg option prog \"/etc/librenms/wlRate.sh wlan1 tx avg\" config extend option name rate-tx-wlan1-max option prog \"/etc/librenms/wlRate.sh wlan1 tx max\" config extend option name rate-rx-wlan0-min option prog \"/etc/librenms/wlRate.sh wlan0 rx min\" config extend option name rate-rx-wlan0-avg option prog \"/etc/librenms/wlRate.sh wlan0 rx avg\" config extend option name rate-rx-wlan0-max option prog \"/etc/librenms/wlRate.sh wlan0 rx max\" config extend option name rate-rx-wlan1-min option prog \"/etc/librenms/wlRate.sh wlan1 rx min\" config extend option name rate-rx-wlan1-avg option prog \"/etc/librenms/wlRate.sh wlan1 rx avg\" config extend option name rate-rx-wlan1-max option prog \"/etc/librenms/wlRate.sh wlan1 rx max\" config extend option name noise-floor-wlan0 option prog \"/etc/librenms/wlNoiseFloor.sh wlan0\" config extend option name noise-floor-wlan1 option prog \"/etc/librenms/wlNoiseFloor.sh wlan1\" config extend option name snr-wlan0-min option prog \"/etc/librenms/wlSNR.sh wlan0 min\" config extend option name snr-wlan0-avg option prog \"/etc/librenms/wlSNR.sh wlan0 avg\" config extend option name snr-wlan0-max option prog \"/etc/librenms/wlSNR.sh wlan0 max\" config extend option name snr-wlan1-min option prog \"/etc/librenms/wlSNR.sh wlan1 min\" config extend option name snr-wlan1-avg option prog \"/etc/librenms/wlSNR.sh wlan1 avg\" config extend option name snr-wlan1-max option prog \"/etc/librenms/wlSNR.sh wlan1 max\" NOTE, any of the scripts above can be tested simply by running the corresponding command. NOTE, to check the output data from any of these extensions, on the LibreNMS machine, run (for example), snmpwalk -v 2c -c public -Osqnv 'NET-SNMP-EXTEND-MIB::nsExtendOutputFull.\"frequency-wlan0\"' NOTE, on the LibreNMS machine, ensure that snmp-mibs-downloader is installed. NOTE, on the AsuswrtMerlin machine, ensure that distro is installed (i.e. that the OS is correctly detected!). 3: Restart the snmp service on AsuswrtMerlin: service snmpd restart And then wait for discovery and polling on LibreNMS!","title":"Asuswrt-Merlin"},{"location":"Support/Device-Notes/AsuswrtMerlin/#installation","text":"","title":"Installation"},{"location":"Support/Device-Notes/AsuswrtMerlin/#asuswrtmerlin","text":"Two items are required on the AsuswrtMerlin side - scripts to generate the necessary information (for SNMP replies), and an SNMP extend configuration update (to return the information vs. the expected query). 1: Install the scripts: Copy the scripts from librenms-agent/snmp/Openwrt - preferably inside /etc/librenms on AsuswrtMerlin (and add this directory to /etc/sysupgrade.conf, to survive firmware updates). The only file that needs to be edited is wlInterfaces.txt, which is a mapping from the wireless interfaces, to the desired display name in LibreNMS. For example, wlan0,wl-2.4G wlan1,wl-5.0G 2: Update the AsuswrtMerlin SNMP configuration, adding extend support for the Wireless Sensor queries: vi /etc/config/snmpd , adding the following entries (assuming the scripts are installed in /etc/librenms, and are executable), and update the network interfaces as needed to match the hardware, config extend option name interfaces option prog \"/bin/cat /etc/librenms/wlInterfaces.txt\" config extend option name clients-wlan0 option prog \"/etc/librenms/wlClients.sh wlan0\" config extend option name clients-wlan1 option prog \"/etc/librenms/wlClients.sh wlan1\" config extend option name clients-wlan option prog \"/etc/librenms/wlClients.sh\" config extend option name frequency-wlan0 option prog \"/etc/librenms/wlFrequency.sh wlan0\" config extend option name frequency-wlan1 option prog \"/etc/librenms/wlFrequency.sh wlan1\" config extend option name rate-tx-wlan0-min option prog \"/etc/librenms/wlRate.sh wlan0 tx min\" config extend option name rate-tx-wlan0-avg option prog \"/etc/librenms/wlRate.sh wlan0 tx avg\" config extend option name rate-tx-wlan0-max option prog \"/etc/librenms/wlRate.sh wlan0 tx max\" config extend option name rate-tx-wlan1-min option prog \"/etc/librenms/wlRate.sh wlan1 tx min\" config extend option name rate-tx-wlan1-avg option prog \"/etc/librenms/wlRate.sh wlan1 tx avg\" config extend option name rate-tx-wlan1-max option prog \"/etc/librenms/wlRate.sh wlan1 tx max\" config extend option name rate-rx-wlan0-min option prog \"/etc/librenms/wlRate.sh wlan0 rx min\" config extend option name rate-rx-wlan0-avg option prog \"/etc/librenms/wlRate.sh wlan0 rx avg\" config extend option name rate-rx-wlan0-max option prog \"/etc/librenms/wlRate.sh wlan0 rx max\" config extend option name rate-rx-wlan1-min option prog \"/etc/librenms/wlRate.sh wlan1 rx min\" config extend option name rate-rx-wlan1-avg option prog \"/etc/librenms/wlRate.sh wlan1 rx avg\" config extend option name rate-rx-wlan1-max option prog \"/etc/librenms/wlRate.sh wlan1 rx max\" config extend option name noise-floor-wlan0 option prog \"/etc/librenms/wlNoiseFloor.sh wlan0\" config extend option name noise-floor-wlan1 option prog \"/etc/librenms/wlNoiseFloor.sh wlan1\" config extend option name snr-wlan0-min option prog \"/etc/librenms/wlSNR.sh wlan0 min\" config extend option name snr-wlan0-avg option prog \"/etc/librenms/wlSNR.sh wlan0 avg\" config extend option name snr-wlan0-max option prog \"/etc/librenms/wlSNR.sh wlan0 max\" config extend option name snr-wlan1-min option prog \"/etc/librenms/wlSNR.sh wlan1 min\" config extend option name snr-wlan1-avg option prog \"/etc/librenms/wlSNR.sh wlan1 avg\" config extend option name snr-wlan1-max option prog \"/etc/librenms/wlSNR.sh wlan1 max\" NOTE, any of the scripts above can be tested simply by running the corresponding command. NOTE, to check the output data from any of these extensions, on the LibreNMS machine, run (for example), snmpwalk -v 2c -c public -Osqnv 'NET-SNMP-EXTEND-MIB::nsExtendOutputFull.\"frequency-wlan0\"' NOTE, on the LibreNMS machine, ensure that snmp-mibs-downloader is installed. NOTE, on the AsuswrtMerlin machine, ensure that distro is installed (i.e. that the OS is correctly detected!). 3: Restart the snmp service on AsuswrtMerlin: service snmpd restart And then wait for discovery and polling on LibreNMS!","title":"AsuswrtMerlin"},{"location":"Support/Device-Notes/Carel-pCOweb-Devices/","text":"Carel pCOweb Devices The pCOWeb card is used to interface the pCO system to networks that use the HVAC protocols based on the Ethernet physical standard such as SNMP. The problem with this card is that the implementation is based on the final manufacturer of the HVAC (Heating, Ventilation and Air Conditioning) and not based on a standard given by Carel. So each pCOweb card has a different configuration that needs a different MIB depending on the manufacturers implementation. The main problem is that LibreNMS will by default discover this card as pCOweb and not as your real manufacturer like it should. A solution was found to bypass this issue, but it's LibreNMS independent and you need to first configure your pCOWeb through the admin interface. Accessing the pCOWeb card Log on to the configuration page of the pCOWeb card. The pCOWeb interface is not always found when accessing the ip directly but rather a subdirectory. If you cant directly reach the configuration page try /config . The default username and password is admin/fadmin . Modern browsers require you to enter this 2 or 3 times. Configuring the pCOweb card SNMP for LibreNMS First you need to configure your SNMP card using the admin interface. An SNMP tab in the configuration menu leaves you the choice to choose a System OID and a Enterprise OID. This is a little tricky but based on this information we defined a \"standard\" for all implementation of Carel products with LibreNMS. The base Carel OID is 1.3.6.1.4.1.9839. To this OID we will add the final manufacturer Enterprise OID. You can find all enterprise OID following this link . This will allow us to create a specific support for this device. Librenms uses this value to detect which HVAC device is connected to the pCOWeb card. Example for the Rittal IT Chiller that uses a pCOweb card: Base Carel OID : 1.3.6.1.4.1.9839 Rittal (the manufacturer) base enterprise OID : 2606 Adding value to identify this device in LibreNMS : 1 Complete System OID for a Rittal Chiller using a Carel pCOweb card: 1.3.6.1.4.1.9839.2606.1 Use 9839 as Enterprise OID The way this works is that the pCOWeb card pretends to be another device. In reality the pCOWeb card just inserts the \"enterprise OID\" in place of the vendor id in the OID. In the table below you can find the values needed for devices which are already supported. Supported devices LibreNMS is ready for the devices listed in this table. You only need to configure your pCOweb card with the accorded System OID and Enterprise OID: Manufacturer Description System OID Enterprise OID Rittal IT Chiller 1.3.6.1.4.1.9839.2606.1 9839 Rittal LCP DX 3311 1.3.6.1.4.1.9839.2606.3311 9839.2606 Unsupported devices After constructing the correct System OID for your SNMP card, you can start the LibreNMS new OS implementation and use this new OID as sysObjectID for the YAML definition file.","title":"Carel pCOweb"},{"location":"Support/Device-Notes/Carel-pCOweb-Devices/#carel-pcoweb-devices","text":"The pCOWeb card is used to interface the pCO system to networks that use the HVAC protocols based on the Ethernet physical standard such as SNMP. The problem with this card is that the implementation is based on the final manufacturer of the HVAC (Heating, Ventilation and Air Conditioning) and not based on a standard given by Carel. So each pCOweb card has a different configuration that needs a different MIB depending on the manufacturers implementation. The main problem is that LibreNMS will by default discover this card as pCOweb and not as your real manufacturer like it should. A solution was found to bypass this issue, but it's LibreNMS independent and you need to first configure your pCOWeb through the admin interface.","title":"Carel pCOweb Devices"},{"location":"Support/Device-Notes/Carel-pCOweb-Devices/#accessing-the-pcoweb-card","text":"Log on to the configuration page of the pCOWeb card. The pCOWeb interface is not always found when accessing the ip directly but rather a subdirectory. If you cant directly reach the configuration page try /config . The default username and password is admin/fadmin . Modern browsers require you to enter this 2 or 3 times.","title":"Accessing the pCOWeb card"},{"location":"Support/Device-Notes/Carel-pCOweb-Devices/#configuring-the-pcoweb-card-snmp-for-librenms","text":"First you need to configure your SNMP card using the admin interface. An SNMP tab in the configuration menu leaves you the choice to choose a System OID and a Enterprise OID. This is a little tricky but based on this information we defined a \"standard\" for all implementation of Carel products with LibreNMS. The base Carel OID is 1.3.6.1.4.1.9839. To this OID we will add the final manufacturer Enterprise OID. You can find all enterprise OID following this link . This will allow us to create a specific support for this device. Librenms uses this value to detect which HVAC device is connected to the pCOWeb card. Example for the Rittal IT Chiller that uses a pCOweb card: Base Carel OID : 1.3.6.1.4.1.9839 Rittal (the manufacturer) base enterprise OID : 2606 Adding value to identify this device in LibreNMS : 1 Complete System OID for a Rittal Chiller using a Carel pCOweb card: 1.3.6.1.4.1.9839.2606.1 Use 9839 as Enterprise OID The way this works is that the pCOWeb card pretends to be another device. In reality the pCOWeb card just inserts the \"enterprise OID\" in place of the vendor id in the OID. In the table below you can find the values needed for devices which are already supported.","title":"Configuring the pCOweb card SNMP for LibreNMS"},{"location":"Support/Device-Notes/Carel-pCOweb-Devices/#supported-devices","text":"LibreNMS is ready for the devices listed in this table. You only need to configure your pCOweb card with the accorded System OID and Enterprise OID: Manufacturer Description System OID Enterprise OID Rittal IT Chiller 1.3.6.1.4.1.9839.2606.1 9839 Rittal LCP DX 3311 1.3.6.1.4.1.9839.2606.3311 9839.2606","title":"Supported devices"},{"location":"Support/Device-Notes/Carel-pCOweb-Devices/#unsupported-devices","text":"After constructing the correct System OID for your SNMP card, you can start the LibreNMS new OS implementation and use this new OID as sysObjectID for the YAML definition file.","title":"Unsupported devices"},{"location":"Support/Device-Notes/Openwrt/","text":"To use Wireless Sensors on Openwrt, an agent of sorts is required. The purpose of the agent is to execute on the client (Openwrt) side, to ensure that the needed Wireless Sensor information is returned for SNMP queries (from LibreNMS). Installation Openwrt Two items are required on the Openwrt side - scripts to generate the necessary information (for SNMP replies), and an SNMP extend configuration update (to return the information vs. the expected query). 1: Install the scripts: Copy the scripts from librenms-agent repository - preferably inside /etc/librenms on Openwrt (and add this directory to /etc/sysupgrade.conf, to survive firmware updates): wget -O /etc/librenms/wlClients.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlClients.sh wget -O /etc/librenms/wlFrequency.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlFrequency.sh wget -O /etc/librenms/wlInterfaces.txt https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlInterfaces.txt wget -O /etc/librenms/wlNoiseFloor.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlNoiseFloor.sh wget -O /etc/librenms/wlRate.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlRate.sh wget -O /etc/librenms/wlSNR.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlSNR.sh wget -O /etc/librenms/distro https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/distro chmod +x /etc/librenms/*.sh chmod +x /etc/librenms/distro The only file that needs to be edited is wlInterfaces.txt, which is a mapping from the wireless interfaces, to the desired display name in LibreNMS. For example, wlan0,wl-2.4G wlan1,wl-5.0G 2: Update the Openwrt SNMP configuration, adding extend support for the OS detection and the Wireless Sensor queries: vi /etc/config/snmpd , adding the following entries (assuming the scripts are installed in /etc/librenms, and are executable), and update the network interfaces as needed to match the hardware, config extend option name distro option prog '/etc/librenms/distro' config extend option name hardware option prog '/bin/cat' option args '/sys/firmware/devicetree/base/model' config extend option name interfaces option prog \"/bin/cat /etc/librenms/wlInterfaces.txt\" config extend option name clients-wlan0 option prog \"/etc/librenms/wlClients.sh wlan0\" config extend option name clients-wlan1 option prog \"/etc/librenms/wlClients.sh wlan1\" config extend option name clients-wlan option prog \"/etc/librenms/wlClients.sh\" config extend option name frequency-wlan0 option prog \"/etc/librenms/wlFrequency.sh wlan0\" config extend option name frequency-wlan1 option prog \"/etc/librenms/wlFrequency.sh wlan1\" config extend option name rate-tx-wlan0-min option prog \"/etc/librenms/wlRate.sh wlan0 tx min\" config extend option name rate-tx-wlan0-avg option prog \"/etc/librenms/wlRate.sh wlan0 tx avg\" config extend option name rate-tx-wlan0-max option prog \"/etc/librenms/wlRate.sh wlan0 tx max\" config extend option name rate-tx-wlan1-min option prog \"/etc/librenms/wlRate.sh wlan1 tx min\" config extend option name rate-tx-wlan1-avg option prog \"/etc/librenms/wlRate.sh wlan1 tx avg\" config extend option name rate-tx-wlan1-max option prog \"/etc/librenms/wlRate.sh wlan1 tx max\" config extend option name rate-rx-wlan0-min option prog \"/etc/librenms/wlRate.sh wlan0 rx min\" config extend option name rate-rx-wlan0-avg option prog \"/etc/librenms/wlRate.sh wlan0 rx avg\" config extend option name rate-rx-wlan0-max option prog \"/etc/librenms/wlRate.sh wlan0 rx max\" config extend option name rate-rx-wlan1-min option prog \"/etc/librenms/wlRate.sh wlan1 rx min\" config extend option name rate-rx-wlan1-avg option prog \"/etc/librenms/wlRate.sh wlan1 rx avg\" config extend option name rate-rx-wlan1-max option prog \"/etc/librenms/wlRate.sh wlan1 rx max\" config extend option name noise-floor-wlan0 option prog \"/etc/librenms/wlNoiseFloor.sh wlan0\" config extend option name noise-floor-wlan1 option prog \"/etc/librenms/wlNoiseFloor.sh wlan1\" config extend option name snr-wlan0-min option prog \"/etc/librenms/wlSNR.sh wlan0 min\" config extend option name snr-wlan0-avg option prog \"/etc/librenms/wlSNR.sh wlan0 avg\" config extend option name snr-wlan0-max option prog \"/etc/librenms/wlSNR.sh wlan0 max\" config extend option name snr-wlan1-min option prog \"/etc/librenms/wlSNR.sh wlan1 min\" config extend option name snr-wlan1-avg option prog \"/etc/librenms/wlSNR.sh wlan1 avg\" config extend option name snr-wlan1-max option prog \"/etc/librenms/wlSNR.sh wlan1 max\" NOTE, any of the scripts above can be tested simply by running the corresponding command. NOTE, to check the output data from any of these extensions, on the LibreNMS machine, run (for example), snmpwalk -v 2c -c public -Osqnv 'NET-SNMP-EXTEND-MIB::nsExtendOutputFull.\"frequency-wlan0\"' NOTE, on the LibreNMS machine, ensure that snmp-mibs-downloader is installed. NOTE, on the AsuswrtMerlin machine, ensure that distro is installed (i.e. that the OS is correctly detected!). 3: Restart the snmp service on Openwrt: service snmpd restart And then wait for discovery and polling on LibreNMS!","title":"OpenWRT"},{"location":"Support/Device-Notes/Openwrt/#installation","text":"","title":"Installation"},{"location":"Support/Device-Notes/Openwrt/#openwrt","text":"Two items are required on the Openwrt side - scripts to generate the necessary information (for SNMP replies), and an SNMP extend configuration update (to return the information vs. the expected query). 1: Install the scripts: Copy the scripts from librenms-agent repository - preferably inside /etc/librenms on Openwrt (and add this directory to /etc/sysupgrade.conf, to survive firmware updates): wget -O /etc/librenms/wlClients.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlClients.sh wget -O /etc/librenms/wlFrequency.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlFrequency.sh wget -O /etc/librenms/wlInterfaces.txt https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlInterfaces.txt wget -O /etc/librenms/wlNoiseFloor.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlNoiseFloor.sh wget -O /etc/librenms/wlRate.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlRate.sh wget -O /etc/librenms/wlSNR.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlSNR.sh wget -O /etc/librenms/distro https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/distro chmod +x /etc/librenms/*.sh chmod +x /etc/librenms/distro The only file that needs to be edited is wlInterfaces.txt, which is a mapping from the wireless interfaces, to the desired display name in LibreNMS. For example, wlan0,wl-2.4G wlan1,wl-5.0G 2: Update the Openwrt SNMP configuration, adding extend support for the OS detection and the Wireless Sensor queries: vi /etc/config/snmpd , adding the following entries (assuming the scripts are installed in /etc/librenms, and are executable), and update the network interfaces as needed to match the hardware, config extend option name distro option prog '/etc/librenms/distro' config extend option name hardware option prog '/bin/cat' option args '/sys/firmware/devicetree/base/model' config extend option name interfaces option prog \"/bin/cat /etc/librenms/wlInterfaces.txt\" config extend option name clients-wlan0 option prog \"/etc/librenms/wlClients.sh wlan0\" config extend option name clients-wlan1 option prog \"/etc/librenms/wlClients.sh wlan1\" config extend option name clients-wlan option prog \"/etc/librenms/wlClients.sh\" config extend option name frequency-wlan0 option prog \"/etc/librenms/wlFrequency.sh wlan0\" config extend option name frequency-wlan1 option prog \"/etc/librenms/wlFrequency.sh wlan1\" config extend option name rate-tx-wlan0-min option prog \"/etc/librenms/wlRate.sh wlan0 tx min\" config extend option name rate-tx-wlan0-avg option prog \"/etc/librenms/wlRate.sh wlan0 tx avg\" config extend option name rate-tx-wlan0-max option prog \"/etc/librenms/wlRate.sh wlan0 tx max\" config extend option name rate-tx-wlan1-min option prog \"/etc/librenms/wlRate.sh wlan1 tx min\" config extend option name rate-tx-wlan1-avg option prog \"/etc/librenms/wlRate.sh wlan1 tx avg\" config extend option name rate-tx-wlan1-max option prog \"/etc/librenms/wlRate.sh wlan1 tx max\" config extend option name rate-rx-wlan0-min option prog \"/etc/librenms/wlRate.sh wlan0 rx min\" config extend option name rate-rx-wlan0-avg option prog \"/etc/librenms/wlRate.sh wlan0 rx avg\" config extend option name rate-rx-wlan0-max option prog \"/etc/librenms/wlRate.sh wlan0 rx max\" config extend option name rate-rx-wlan1-min option prog \"/etc/librenms/wlRate.sh wlan1 rx min\" config extend option name rate-rx-wlan1-avg option prog \"/etc/librenms/wlRate.sh wlan1 rx avg\" config extend option name rate-rx-wlan1-max option prog \"/etc/librenms/wlRate.sh wlan1 rx max\" config extend option name noise-floor-wlan0 option prog \"/etc/librenms/wlNoiseFloor.sh wlan0\" config extend option name noise-floor-wlan1 option prog \"/etc/librenms/wlNoiseFloor.sh wlan1\" config extend option name snr-wlan0-min option prog \"/etc/librenms/wlSNR.sh wlan0 min\" config extend option name snr-wlan0-avg option prog \"/etc/librenms/wlSNR.sh wlan0 avg\" config extend option name snr-wlan0-max option prog \"/etc/librenms/wlSNR.sh wlan0 max\" config extend option name snr-wlan1-min option prog \"/etc/librenms/wlSNR.sh wlan1 min\" config extend option name snr-wlan1-avg option prog \"/etc/librenms/wlSNR.sh wlan1 avg\" config extend option name snr-wlan1-max option prog \"/etc/librenms/wlSNR.sh wlan1 max\" NOTE, any of the scripts above can be tested simply by running the corresponding command. NOTE, to check the output data from any of these extensions, on the LibreNMS machine, run (for example), snmpwalk -v 2c -c public -Osqnv 'NET-SNMP-EXTEND-MIB::nsExtendOutputFull.\"frequency-wlan0\"' NOTE, on the LibreNMS machine, ensure that snmp-mibs-downloader is installed. NOTE, on the AsuswrtMerlin machine, ensure that distro is installed (i.e. that the OS is correctly detected!). 3: Restart the snmp service on Openwrt: service snmpd restart And then wait for discovery and polling on LibreNMS!","title":"Openwrt"},{"location":"Support/Device-Notes/Routeros/","text":"This agent script will allow LibreNMS to run a script on a Mikrotik / RouterOS device to gather the vlan information from both /interface/vlan/ and /interface/bridge/vlan/ Installation Go to https://github.com/librenms/librenms-agent/tree/master/snmp/Routeros Copy and paste the contents of LNMS_vlans.scr file into a script within a RouterOS device. Name this script LNMS_vlans. (This is NOT the same thing as creating a txt file and importing it into the Files section of the device) If you're unsure how to create the script. Download the LNMS_vlans.scr file. Rename to remove the .scr extension. Copy this file onto all the Mikrotik devices you want to monitor. Open a Terminal / CLI on each tik and run this. { :global txtContent [/file get LNMS_vlans contents]; /system/script/add name=LNMS_vlans owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=$txtContent ;} This will import the contents of that txt file into a script named LNMS_vlans Enable an SNMP community that has both READ and WRITE capabilities. This is important, otherwise, LibreNMS will not be able to run the above script. It is recommended to use SNMP v3 for this. Discover / Force rediscover your Mikrotik devices. After discovery has been completed the vlans menu should appear within LibreNMS for the device. IMPORTANT NOTE It is strongly recommended that SNMP service only be allowed to be communicated on a very limited set of IP addresses that LibreNMS and related systems will be coming from. (usually /32 address for each) because the write permission could allow an attack on a device. (such as dropping all firewall filters or changing the admin credentials) Theory of operation: Mikrotik vlan discovery plugin using the ability of ROS to \"fire up\" a script through SNMP. At first, LibreNMS check for the existence of the script, and if it is present, it will start the LNMS_vlans script. The script will gather information from: - /interface/bridge/vlan for tagged ports inside bridge - /interface/bridge/vlan for currently untagged ports inside bridge - /interface/bridge/port for ports PVID (untagged) inside bridge - /interface/vlan for vlan interfaces after the information is gathered, it is transmitted to LibreNMS over SNMP protocol is: type,vlanId,ifName i.e: T,254,ether1 is translated to Tagged vlan 254 on port ether1 U,100,wlan2 is translated to Untagged vlan 100 on port wlan2","title":"RouterOS"},{"location":"Support/Device-Notes/Routeros/#installation","text":"Go to https://github.com/librenms/librenms-agent/tree/master/snmp/Routeros Copy and paste the contents of LNMS_vlans.scr file into a script within a RouterOS device. Name this script LNMS_vlans. (This is NOT the same thing as creating a txt file and importing it into the Files section of the device) If you're unsure how to create the script. Download the LNMS_vlans.scr file. Rename to remove the .scr extension. Copy this file onto all the Mikrotik devices you want to monitor. Open a Terminal / CLI on each tik and run this. { :global txtContent [/file get LNMS_vlans contents]; /system/script/add name=LNMS_vlans owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=$txtContent ;} This will import the contents of that txt file into a script named LNMS_vlans Enable an SNMP community that has both READ and WRITE capabilities. This is important, otherwise, LibreNMS will not be able to run the above script. It is recommended to use SNMP v3 for this. Discover / Force rediscover your Mikrotik devices. After discovery has been completed the vlans menu should appear within LibreNMS for the device.","title":"Installation"},{"location":"Support/Device-Notes/Routeros/#important-note","text":"It is strongly recommended that SNMP service only be allowed to be communicated on a very limited set of IP addresses that LibreNMS and related systems will be coming from. (usually /32 address for each) because the write permission could allow an attack on a device. (such as dropping all firewall filters or changing the admin credentials)","title":"IMPORTANT NOTE"},{"location":"Support/Device-Notes/Routeros/#theory-of-operation","text":"Mikrotik vlan discovery plugin using the ability of ROS to \"fire up\" a script through SNMP. At first, LibreNMS check for the existence of the script, and if it is present, it will start the LNMS_vlans script. The script will gather information from: - /interface/bridge/vlan for tagged ports inside bridge - /interface/bridge/vlan for currently untagged ports inside bridge - /interface/bridge/port for ports PVID (untagged) inside bridge - /interface/vlan for vlan interfaces after the information is gathered, it is transmitted to LibreNMS over SNMP protocol is: type,vlanId,ifName i.e: T,254,ether1 is translated to Tagged vlan 254 on port ether1 U,100,wlan2 is translated to Untagged vlan 100 on port wlan2","title":"Theory of operation:"}]} \ No newline at end of file +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Installing Install LibreNMS Now Install Using Docker Setup Applications Auto Discovery Oxidized RRDCached Alerting Rules Templates Transports More... API Using the API API Endpoints Support FAQ Install validation Performance tweaks More... Developing Getting Started Support for a new OS","title":"Home"},{"location":"API/","text":"Versioning Versioning an API is a minefield which saw us looking at numerous options on how to do this. We have currently settled on using versioning within the API end point itself /api/v0 . As the API itself is new and still in active development we also decided that v0 would be the best starting point to indicate it's in development. Tokens To access any of the token end points you will be required to authenticate using a token. Tokens can be created directly from within the LibreNMS web interface by going to /api-access/ . Click on 'Create API access token'. Select the user you would like to generate the token for. Enter an optional description. Click Create API Token. Endpoints Whilst this documentation will describe and show examples of the end points, we've designed the API so you should be able to traverse through it without knowing any of the available API routes. You can do this by first calling /api/v0 : curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0 Output: { \"list_bgp\" : \"https://librenms.org/api/v0/bgp\" , ... \"edit_rule\" : \"https://librenms.org/api/v0/rules\" } Input Input to the API is done in three different ways, sometimes a combination of two or three of these. Passing parameters via the api route. For example when obtaining a devices details you will pass the hostname of the device in the route: /api/v0/devices/:hostname . Passing parameters via the query string. For example you can list all devices on your install but limit the output to devices that are currently down: /api/v0/devices?type=down Passing data in via JSON, this will mainly be used when adding or updating information via the API, for instance adding a new device: curl -X POST -d '{\"hostname\":\"localhost.localdomain\",\"version\":\"v1\",\"community\":\"public\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices Output Output from the API currently is via two output types: JSON: Most API responses will output json. As shown in the example for calling the API endpoint. PNG: This is for when the request is for an image such as a graph for a switch port. Endpoint Categories Devices DeviceGroups Ports Port_Groups PortGroups Alerts Routing Switching Inventory Bills ARP Services Logs System Locations","title":"Using the API"},{"location":"API/#versioning","text":"Versioning an API is a minefield which saw us looking at numerous options on how to do this. We have currently settled on using versioning within the API end point itself /api/v0 . As the API itself is new and still in active development we also decided that v0 would be the best starting point to indicate it's in development.","title":"Versioning"},{"location":"API/#tokens","text":"To access any of the token end points you will be required to authenticate using a token. Tokens can be created directly from within the LibreNMS web interface by going to /api-access/ . Click on 'Create API access token'. Select the user you would like to generate the token for. Enter an optional description. Click Create API Token.","title":"Tokens"},{"location":"API/#endpoints","text":"Whilst this documentation will describe and show examples of the end points, we've designed the API so you should be able to traverse through it without knowing any of the available API routes. You can do this by first calling /api/v0 : curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0 Output: { \"list_bgp\" : \"https://librenms.org/api/v0/bgp\" , ... \"edit_rule\" : \"https://librenms.org/api/v0/rules\" }","title":"Endpoints"},{"location":"API/#input","text":"Input to the API is done in three different ways, sometimes a combination of two or three of these. Passing parameters via the api route. For example when obtaining a devices details you will pass the hostname of the device in the route: /api/v0/devices/:hostname . Passing parameters via the query string. For example you can list all devices on your install but limit the output to devices that are currently down: /api/v0/devices?type=down Passing data in via JSON, this will mainly be used when adding or updating information via the API, for instance adding a new device: curl -X POST -d '{\"hostname\":\"localhost.localdomain\",\"version\":\"v1\",\"community\":\"public\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices","title":"Input"},{"location":"API/#output","text":"Output from the API currently is via two output types: JSON: Most API responses will output json. As shown in the example for calling the API endpoint. PNG: This is for when the request is for an image such as a graph for a switch port.","title":"Output"},{"location":"API/#endpoint-categories","text":"Devices DeviceGroups Ports Port_Groups PortGroups Alerts Routing Switching Inventory Bills ARP Services Logs System Locations","title":"Endpoint Categories"},{"location":"API/ARP/","text":"list_arp Retrieve a specific ARP entry or all ARP entries for a device Route: /api/v0/resources/ip/arp/:query Query can be: - An IP address - A MAC address - A CIDR network (192.168.1.0/24) - all and set ?device= hostname (or device id) Input: device if you specify all for the query then you need to populate this with the hostname or id of the device. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/arp/1.1.1.1 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/arp/192.168.1.0/24 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/arp/all?device=localhost Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"arp\" : [ { \"port_id\" : \"229\" , \"mac_address\" : \"da160e5c2002\" , \"ipv4_address\" : \"1.1.1.1\" , \"context_name\" : \"\" } ] }","title":"ARP"},{"location":"API/ARP/#list_arp","text":"Retrieve a specific ARP entry or all ARP entries for a device Route: /api/v0/resources/ip/arp/:query Query can be: - An IP address - A MAC address - A CIDR network (192.168.1.0/24) - all and set ?device= hostname (or device id) Input: device if you specify all for the query then you need to populate this with the hostname or id of the device. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/arp/1.1.1.1 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/arp/192.168.1.0/24 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/arp/all?device=localhost Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"arp\" : [ { \"port_id\" : \"229\" , \"mac_address\" : \"da160e5c2002\" , \"ipv4_address\" : \"1.1.1.1\" , \"context_name\" : \"\" } ] }","title":"list_arp"},{"location":"API/Alerts/","text":"get_alert Get details of an alert Route: /api/v0/alerts/:id id is the alert id, you can obtain a list of alert ids from list_alerts . Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts/1 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 7 , \"alerts\" : [ { \"hostname\" : \"localhost\" , \"id\" : \"1\" , \"device_id\" : \"1\" , \"rule_id\" : \"1\" , \"state\" : \"1\" , \"alerted\" : \"1\" , \"open\" : \"1\" , \"timestamp\" : \"2014-12-11 14:40:02\" }] } ack_alert Acknowledge an alert Route: /api/v0/alerts/:id id is the alert id, you can obtain a list of alert ids from list_alerts . note is the note to add to the alert until_clear is a boolean and if set to false, the alert will re-alert if it worsens/betters. Input: - Example: curl -X PUT -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts/1 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"message\" : \"Alert has been acknowledged\" } unmute_alert Unmute an alert Route: /api/v0/alerts/unmute/:id id is the alert id, you can obtain a list of alert ids from list_alerts . Input: - Example: curl -X PUT -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts/unmute/1 Output: { \"status\" : \"ok\" , \"message\" : \"Alert has been unmuted\" } list_alerts List all alerts Route: /api/v0/alerts Input: state: Filter the alerts by state, 0 = ok, 1 = alert, 2 = ack severity: Filter the alerts by severity. Valid values are ok , warning , critical . alert_rule: Filter alerts by alert rule ID. order: How to order the output, default is by timestamp (descending). Can be appended by DESC or ASC to change the order. Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts?state=1 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts?severity=critical curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts?order=timestamp%20ASC curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts?alert_rule=49 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"alerts\" : [ { \"id\" : \"1\" , \"device_id\" : \"1\" , \"rule_id\" : \"1\" , \"state\" : \"1\" , \"alerted\" : \"1\" , \"open\" : \"1\" , \"timestamp\" : \"2014-12-11 14:40:02\" }] } Rules get_alert_rule Get the alert rule details. Route: /api/v0/rules/:id id is the rule id. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules/1 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"rules\" : [ { \"id\" : \"1\" , \"device_id\" : \"1\" , \"rule\" : \"%devices.os != \\\"Juniper\\\"\" , \"severity\" : \"warning\" , \"extra\" : \"{\\\"mute\\\":true,\\\"count\\\":\\\"15\\\",\\\"delay\\\":null,\\\"invert\\\":false}\" , \"disabled\" : \"0\" , \"name\" : \"A test rule\" } ] } delete_rule Delete an alert rule by id Route: /api/v0/rules/:id id is the rule id. Input: - Example: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules/1 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"message\" : \"Alert rule has been removed\" } list_alert_rules List the alert rules. Route: /api/v0/rules - Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"rules\" : [ { \"id\" : \"1\" , \"device_id\" : \"-1\" , \"rule\" : \"%devices.os != \\\"Juniper\\\"\" , \"severity\" : \"critical\" , \"extra\" : \"{\\\"mute\\\":false,\\\"count\\\":\\\"15\\\",\\\"delay\\\":\\\"300\\\",\\\"invert\\\":false}\" , \"disabled\" : \"0\" , \"name\" : \"A test rule\" }] } add_rule Add a new alert rule. Route: /api/v0/rules - Input (JSON): devices: This is either an array of device ids or -1 for a global rule builder: The rule which should be in the format entity.condition value (i.e devices.status != 0 for devices marked as down). It must be json encoded in the format rules are currently stored. severity: The severity level the alert will be raised against, Ok, Warning, Critical. disabled: Whether the rule will be disabled or not, 0 = enabled, 1 = disabled count: This is how many polling runs before an alert will trigger and the frequency. delay: Delay is when to start alerting and how frequently. The value is stored in seconds but you can specify minutes, hours or days by doing 5 m, 5 h, 5 d for each one. interval: How often to re-issue notifications while this alert is active,0 means notify once.The value is stored in seconds but you can specify minutes, hours or days by doing 5 m, 5 h, 5 d for each one. mute: If mute is enabled then an alert will never be sent but will show up in the Web UI (true or false). invert: This would invert the rules check. name: This is the name of the rule and is mandatory. notes: Some informal notes for this rule Example: curl -X POST -d '{\"devices\":[1,2,3], \"name\": \"testrule\", \"builder\":{\"condition\":\"AND\",\"rules\":[{\"id\":\"devices.hostname\",\"field\":\"devices.hostname\",\"type\":\"string\",\"input\":\"text\",\"operator\":\"equal\",\"value\":\"localhost\"}],\"valid\":true},\"severity\": \"critical\",\"count\":15,\"delay\":\"5 m\",\"interval\":\"5 m\",\"mute\":false,\"notes\":\"This a note from the API\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules Output: { \"status\" : \"ok\" } edit_rule Edit an existing alert rule Route: /api/v0/rules - Input (JSON): rule_id: You must specify the rule_id to edit an existing rule, if this is absent then a new rule will be created. devices: This is either an array of device ids or -1 for a global rule builder: The rule which should be in the format entity.condition value (i.e devices.status != 0 for devices marked as down). It must be json encoded in the format rules are currently stored. severity: The severity level the alert will be raised against, Ok, Warning, Critical. disabled: Whether the rule will be disabled or not, 0 = enabled, 1 = disabled count: This is how many polling runs before an alert will trigger and the frequency. delay: Delay is when to start alerting and how frequently. The value is stored in seconds but you can specify minutes, hours or days by doing 5 m, 5 h, 5 d for each one. interval: How often to re-issue notifications while this alert is active,0 means notify once.The value is stored in seconds but you can specify minutes, hours or days by doing 5 m, 5 h, 5 d for each one. mute: If mute is enabled then an alert will never be sent but will show up in the Web UI (true or false). invert: This would invert the rules check. name: This is the name of the rule and is mandatory. notes: Some informal notes for this rule Example: curl -X PUT -d '{\"rule_id\":1,\"device_id\":\"-1\", \"name\": \"testrule\", \"builder\":{\"condition\":\"AND\",\"rules\":[{\"id\":\"devices.hostname\",\"field\":\"devices.hostname\",\"type\":\"string\",\"input\":\"text\",\"operator\":\"equal\",\"value\":\"localhost\"}],\"valid\":true},\"severity\": \"critical\",\"count\":15,\"delay\":\"5 m\",\"interval\":\"5 m\",\"mute\":false,\"notes\":\"This a note from the API\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules Output: { \"status\" : \"ok\" }","title":"Alerts"},{"location":"API/Alerts/#get_alert","text":"Get details of an alert Route: /api/v0/alerts/:id id is the alert id, you can obtain a list of alert ids from list_alerts . Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts/1 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 7 , \"alerts\" : [ { \"hostname\" : \"localhost\" , \"id\" : \"1\" , \"device_id\" : \"1\" , \"rule_id\" : \"1\" , \"state\" : \"1\" , \"alerted\" : \"1\" , \"open\" : \"1\" , \"timestamp\" : \"2014-12-11 14:40:02\" }] }","title":"get_alert"},{"location":"API/Alerts/#ack_alert","text":"Acknowledge an alert Route: /api/v0/alerts/:id id is the alert id, you can obtain a list of alert ids from list_alerts . note is the note to add to the alert until_clear is a boolean and if set to false, the alert will re-alert if it worsens/betters. Input: - Example: curl -X PUT -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts/1 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"message\" : \"Alert has been acknowledged\" }","title":"ack_alert"},{"location":"API/Alerts/#unmute_alert","text":"Unmute an alert Route: /api/v0/alerts/unmute/:id id is the alert id, you can obtain a list of alert ids from list_alerts . Input: - Example: curl -X PUT -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts/unmute/1 Output: { \"status\" : \"ok\" , \"message\" : \"Alert has been unmuted\" }","title":"unmute_alert"},{"location":"API/Alerts/#list_alerts","text":"List all alerts Route: /api/v0/alerts Input: state: Filter the alerts by state, 0 = ok, 1 = alert, 2 = ack severity: Filter the alerts by severity. Valid values are ok , warning , critical . alert_rule: Filter alerts by alert rule ID. order: How to order the output, default is by timestamp (descending). Can be appended by DESC or ASC to change the order. Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts?state=1 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts?severity=critical curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts?order=timestamp%20ASC curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/alerts?alert_rule=49 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"alerts\" : [ { \"id\" : \"1\" , \"device_id\" : \"1\" , \"rule_id\" : \"1\" , \"state\" : \"1\" , \"alerted\" : \"1\" , \"open\" : \"1\" , \"timestamp\" : \"2014-12-11 14:40:02\" }] }","title":"list_alerts"},{"location":"API/Alerts/#rules","text":"","title":"Rules"},{"location":"API/Alerts/#get_alert_rule","text":"Get the alert rule details. Route: /api/v0/rules/:id id is the rule id. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules/1 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"rules\" : [ { \"id\" : \"1\" , \"device_id\" : \"1\" , \"rule\" : \"%devices.os != \\\"Juniper\\\"\" , \"severity\" : \"warning\" , \"extra\" : \"{\\\"mute\\\":true,\\\"count\\\":\\\"15\\\",\\\"delay\\\":null,\\\"invert\\\":false}\" , \"disabled\" : \"0\" , \"name\" : \"A test rule\" } ] }","title":"get_alert_rule"},{"location":"API/Alerts/#delete_rule","text":"Delete an alert rule by id Route: /api/v0/rules/:id id is the rule id. Input: - Example: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules/1 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"message\" : \"Alert rule has been removed\" }","title":"delete_rule"},{"location":"API/Alerts/#list_alert_rules","text":"List the alert rules. Route: /api/v0/rules - Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"rules\" : [ { \"id\" : \"1\" , \"device_id\" : \"-1\" , \"rule\" : \"%devices.os != \\\"Juniper\\\"\" , \"severity\" : \"critical\" , \"extra\" : \"{\\\"mute\\\":false,\\\"count\\\":\\\"15\\\",\\\"delay\\\":\\\"300\\\",\\\"invert\\\":false}\" , \"disabled\" : \"0\" , \"name\" : \"A test rule\" }] }","title":"list_alert_rules"},{"location":"API/Alerts/#add_rule","text":"Add a new alert rule. Route: /api/v0/rules - Input (JSON): devices: This is either an array of device ids or -1 for a global rule builder: The rule which should be in the format entity.condition value (i.e devices.status != 0 for devices marked as down). It must be json encoded in the format rules are currently stored. severity: The severity level the alert will be raised against, Ok, Warning, Critical. disabled: Whether the rule will be disabled or not, 0 = enabled, 1 = disabled count: This is how many polling runs before an alert will trigger and the frequency. delay: Delay is when to start alerting and how frequently. The value is stored in seconds but you can specify minutes, hours or days by doing 5 m, 5 h, 5 d for each one. interval: How often to re-issue notifications while this alert is active,0 means notify once.The value is stored in seconds but you can specify minutes, hours or days by doing 5 m, 5 h, 5 d for each one. mute: If mute is enabled then an alert will never be sent but will show up in the Web UI (true or false). invert: This would invert the rules check. name: This is the name of the rule and is mandatory. notes: Some informal notes for this rule Example: curl -X POST -d '{\"devices\":[1,2,3], \"name\": \"testrule\", \"builder\":{\"condition\":\"AND\",\"rules\":[{\"id\":\"devices.hostname\",\"field\":\"devices.hostname\",\"type\":\"string\",\"input\":\"text\",\"operator\":\"equal\",\"value\":\"localhost\"}],\"valid\":true},\"severity\": \"critical\",\"count\":15,\"delay\":\"5 m\",\"interval\":\"5 m\",\"mute\":false,\"notes\":\"This a note from the API\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules Output: { \"status\" : \"ok\" }","title":"add_rule"},{"location":"API/Alerts/#edit_rule","text":"Edit an existing alert rule Route: /api/v0/rules - Input (JSON): rule_id: You must specify the rule_id to edit an existing rule, if this is absent then a new rule will be created. devices: This is either an array of device ids or -1 for a global rule builder: The rule which should be in the format entity.condition value (i.e devices.status != 0 for devices marked as down). It must be json encoded in the format rules are currently stored. severity: The severity level the alert will be raised against, Ok, Warning, Critical. disabled: Whether the rule will be disabled or not, 0 = enabled, 1 = disabled count: This is how many polling runs before an alert will trigger and the frequency. delay: Delay is when to start alerting and how frequently. The value is stored in seconds but you can specify minutes, hours or days by doing 5 m, 5 h, 5 d for each one. interval: How often to re-issue notifications while this alert is active,0 means notify once.The value is stored in seconds but you can specify minutes, hours or days by doing 5 m, 5 h, 5 d for each one. mute: If mute is enabled then an alert will never be sent but will show up in the Web UI (true or false). invert: This would invert the rules check. name: This is the name of the rule and is mandatory. notes: Some informal notes for this rule Example: curl -X PUT -d '{\"rule_id\":1,\"device_id\":\"-1\", \"name\": \"testrule\", \"builder\":{\"condition\":\"AND\",\"rules\":[{\"id\":\"devices.hostname\",\"field\":\"devices.hostname\",\"type\":\"string\",\"input\":\"text\",\"operator\":\"equal\",\"value\":\"localhost\"}],\"valid\":true},\"severity\": \"critical\",\"count\":15,\"delay\":\"5 m\",\"interval\":\"5 m\",\"mute\":false,\"notes\":\"This a note from the API\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/rules Output: { \"status\" : \"ok\" }","title":"edit_rule"},{"location":"API/Bills/","text":"list_bills Retrieve the list of bills currently in the system. Route: /api/v0/bills /api/v0/bills?period=previous Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills?period=previous Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"bills\" : [ { \"bill_id\" : \"1\" , \"bill_name\" : \"Router bills\" , \"bill_type\" : \"cdr\" , \"bill_cdr\" : \"10000000\" , \"bill_day\" : \"1\" , \"bill_quota\" : \"0\" , \"rate_95th_in\" : \"0\" , \"rate_95th_out\" : \"0\" , \"rate_95th\" : \"0\" , \"dir_95th\" : \"in\" , \"total_data\" : \"0\" , \"total_data_in\" : \"0\" , \"total_data_out\" : \"0\" , \"rate_average_in\" : \"0\" , \"rate_average_out\" : \"0\" , \"rate_average\" : \"0\" , \"bill_last_calc\" : \"2015-07-02 17:01:26\" , \"bill_custid\" : \"Router\" , \"bill_ref\" : \"Router\" , \"bill_notes\" : \"Bill me\" , \"bill_autoadded\" : \"0\" , \"ports_total\" : \"0\" , \"allowed\" : \"10Mbps\" , \"used\" : \"0bps\" , \"percent\" : 0 , \"overuse\" : \"-\" , \"ports\" : [ { \"device_id\" : \"168\" , \"port_id\" : \"35146\" , \"ifName\" : \"eth0\" } ] } ] } get_bill Retrieve a specific bill Route: /api/v0/bills/:id /api/v0/bills/:id?period=previous /api/v0/bills?ref=:ref /api/v0/bills?ref=:ref&period=previous /api/v0/bills?custid=:custid /api/v0/bills?custid=:custid&period=previous id is the specific bill id ref is the billing reference custid is the customer reference period=previous indicates you would like the data for the last complete period rather than the current period Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills?ref=:customerref curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills?custid=:custid Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"bills\" : [ { \"bill_id\" : \"1\" , \"bill_name\" : \"Router bills\" , \"bill_type\" : \"cdr\" , \"bill_cdr\" : \"10000000\" , \"bill_day\" : \"1\" , \"bill_quota\" : \"0\" , \"rate_95th_in\" : \"0\" , \"rate_95th_out\" : \"0\" , \"rate_95th\" : \"0\" , \"dir_95th\" : \"in\" , \"total_data\" : \"0\" , \"total_data_in\" : \"0\" , \"total_data_out\" : \"0\" , \"rate_average_in\" : \"0\" , \"rate_average_out\" : \"0\" , \"rate_average\" : \"0\" , \"bill_last_calc\" : \"2015-07-02 17:01:26\" , \"bill_custid\" : \"Router\" , \"bill_ref\" : \"Router\" , \"bill_notes\" : \"Bill me\" , \"bill_autoadded\" : \"0\" , \"ports_total\" : \"0\" , \"allowed\" : \"10Mbps\" , \"used\" : \"0bps\" , \"percent\" : 0 , \"overuse\" : \"-\" , \"ports\" : [ { \"device_id\" : \"168\" , \"port_id\" : \"35146\" , \"ifName\" : \"eth0\" } ] } ] } get_bill_graph Retrieve a graph image associated with a bill. NB: The graphs returned from this will always be png as they do not come from rrdtool, even if you have SVG set. Route: `/api/v0/bills/:id/graphs/:graph_type Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphs/bits curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphs/bits?from=1517443200 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphs/bits?from=1517443200&to=1517788800 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphs/monthly Output: Graph Image get_bill_graphdata Retrieve the data used to draw a graph so it can be rendered in an external system Route: /api/v0/bills/:id/graphdata/:graph_type Input: The reducefactor parameter is used to reduce the number of data points. Billing data has 5 minute granularity, so requesting a graph for a long time period will result in many data points. If not supplied, it will be automatically calculated. A reducefactor of 1 means return all items, 2 means half of the items etc. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphdata/bits curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphdata/bits?from=1517443200 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphdata/bits?from=1517443200&to=1517788800 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphdata/bits?from=1517443200&to=1517788800&reducefactor=5 Output: { \"status\": \"ok\", \"graph_data\": { \"from\": \"1517443200\", \"to\": 1518196161, \"last\": \"1518195901\", \"in_data\": [ 103190525.20999999, 104949255.81 ], \"out_data\": [ 1102059.1299999999, 1079216.46 ], \"tot_data\": [ 104292584.33999999, 106028472.27 ], \"ticks\": [ \"1517750401\", \"1517756101\" ], \"rate_95th\": \"251880417\", \"rate_average\": \"146575554\", \"bill_type\": \"cdr\", \"max_in\": 9888289942, \"max_out\": 75848756, \"ave_in\": 18029660.242105871, \"ave_out\": 196447.38060137472, \"last_in\": 3790227.9500000002, \"last_out\": 122731.63333333333 } } get_bill_history Retrieve the history of specific bill Route: /api/v0/bills/:id/history Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history Output: { \"status\" : \"ok\" , \"bill_history\" : [ { \"bill_hist_id\" : \"1\" , \"bill_id\" : \"1\" , \"updated\" : \"2018-02-06 17:01:01\" , \"bill_datefrom\" : \"2018-02-01 00:00:00\" , \"bill_dateto\" : \"2018-02-28 23:59:59\" , \"bill_type\" : \"CDR\" , \"bill_allowed\" : \"100000000\" , \"bill_used\" : \"229963765\" , \"bill_overuse\" : \"129963765\" , \"bill_percent\" : \"229.96\" , \"rate_95th_in\" : \"229963765\" , \"rate_95th_out\" : \"1891344\" , \"rate_95th\" : \"229963765\" , \"dir_95th\" : \"in\" , \"rate_average\" : \"136527101\" , \"rate_average_in\" : \"135123359\" , \"rate_average_out\" : \"1403743\" , \"traf_in\" : \"3235123452544\" , \"traf_out\" : \"33608406566\" , \"traf_total\" : \"3268731859110\" , \"bill_peak_out\" : \"2782349290\" , \"bill_peak_in\" : \"10161119\" , \"pdf\" : null } ], \"count\" : 1 , } get_bill_history_graph Retrieve a graph of a previous period of a bill NB: The graphs returned from this will always be png as they do not come from rrdtool, even if you have SVG set. Route: /api/v0/bills/:id/history/:bill_hist_id/graphs/:graph_type Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphs/bits curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphs/hour curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphs/day Output: (image) get_bill_history_graphdata Retrieve the data for a graph of a previous period of a bill, to be rendered in an external system Route: /api/v0/bills/:id/history/:bill_hist_id/graphdata/:graph_type Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphdata/bits curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphdata/hour curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphdata/day Output: delete_bill Delete a specific bill and all dependent data Route: /api/v0/bills/:id id is the specific bill id Input: Example: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1 Output: { \"status\" : \"ok\" , \"message\" : \"Bill has been removed\" } create_edit_bill Creates a new bill or updates an existing one Route: /api/v0/bills Method: POST If you send an existing bill_id the call replaces all values it receives. For example if you send 2 ports it will delete the existing ports and add the the 2 new ports. So to add ports you have to get the current ports first and add them to your update call. Input: Example (create): curl -X POST -d '{\"ports\":[ 1021 ],\"bill_name\":\"NEWBILL\",\"bill_day\":\"1\",\"bill_type\":\"quota\",\"bill_quota\":\"2000000000000\",\"bill_custid\":\"1337\",\"bill_ref\":\"reference1\",\"bill_notes\":\"mynote\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills Example (set): curl -X POST -d '{\"bill_id\":\"32\",\"ports\":[ 1021 ],\"bill_name\":\"NEWNAME\",\"bill_quota\":\"1000000000000\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills Output: { \"status\" : \"ok\" , \"bill_id\" : 32 }","title":"Bills"},{"location":"API/Bills/#list_bills","text":"Retrieve the list of bills currently in the system. Route: /api/v0/bills /api/v0/bills?period=previous Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills?period=previous Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"bills\" : [ { \"bill_id\" : \"1\" , \"bill_name\" : \"Router bills\" , \"bill_type\" : \"cdr\" , \"bill_cdr\" : \"10000000\" , \"bill_day\" : \"1\" , \"bill_quota\" : \"0\" , \"rate_95th_in\" : \"0\" , \"rate_95th_out\" : \"0\" , \"rate_95th\" : \"0\" , \"dir_95th\" : \"in\" , \"total_data\" : \"0\" , \"total_data_in\" : \"0\" , \"total_data_out\" : \"0\" , \"rate_average_in\" : \"0\" , \"rate_average_out\" : \"0\" , \"rate_average\" : \"0\" , \"bill_last_calc\" : \"2015-07-02 17:01:26\" , \"bill_custid\" : \"Router\" , \"bill_ref\" : \"Router\" , \"bill_notes\" : \"Bill me\" , \"bill_autoadded\" : \"0\" , \"ports_total\" : \"0\" , \"allowed\" : \"10Mbps\" , \"used\" : \"0bps\" , \"percent\" : 0 , \"overuse\" : \"-\" , \"ports\" : [ { \"device_id\" : \"168\" , \"port_id\" : \"35146\" , \"ifName\" : \"eth0\" } ] } ] }","title":"list_bills"},{"location":"API/Bills/#get_bill","text":"Retrieve a specific bill Route: /api/v0/bills/:id /api/v0/bills/:id?period=previous /api/v0/bills?ref=:ref /api/v0/bills?ref=:ref&period=previous /api/v0/bills?custid=:custid /api/v0/bills?custid=:custid&period=previous id is the specific bill id ref is the billing reference custid is the customer reference period=previous indicates you would like the data for the last complete period rather than the current period Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills?ref=:customerref curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills?custid=:custid Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"bills\" : [ { \"bill_id\" : \"1\" , \"bill_name\" : \"Router bills\" , \"bill_type\" : \"cdr\" , \"bill_cdr\" : \"10000000\" , \"bill_day\" : \"1\" , \"bill_quota\" : \"0\" , \"rate_95th_in\" : \"0\" , \"rate_95th_out\" : \"0\" , \"rate_95th\" : \"0\" , \"dir_95th\" : \"in\" , \"total_data\" : \"0\" , \"total_data_in\" : \"0\" , \"total_data_out\" : \"0\" , \"rate_average_in\" : \"0\" , \"rate_average_out\" : \"0\" , \"rate_average\" : \"0\" , \"bill_last_calc\" : \"2015-07-02 17:01:26\" , \"bill_custid\" : \"Router\" , \"bill_ref\" : \"Router\" , \"bill_notes\" : \"Bill me\" , \"bill_autoadded\" : \"0\" , \"ports_total\" : \"0\" , \"allowed\" : \"10Mbps\" , \"used\" : \"0bps\" , \"percent\" : 0 , \"overuse\" : \"-\" , \"ports\" : [ { \"device_id\" : \"168\" , \"port_id\" : \"35146\" , \"ifName\" : \"eth0\" } ] } ] }","title":"get_bill"},{"location":"API/Bills/#get_bill_graph","text":"Retrieve a graph image associated with a bill. NB: The graphs returned from this will always be png as they do not come from rrdtool, even if you have SVG set. Route: `/api/v0/bills/:id/graphs/:graph_type Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphs/bits curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphs/bits?from=1517443200 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphs/bits?from=1517443200&to=1517788800 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphs/monthly Output: Graph Image","title":"get_bill_graph"},{"location":"API/Bills/#get_bill_graphdata","text":"Retrieve the data used to draw a graph so it can be rendered in an external system Route: /api/v0/bills/:id/graphdata/:graph_type Input: The reducefactor parameter is used to reduce the number of data points. Billing data has 5 minute granularity, so requesting a graph for a long time period will result in many data points. If not supplied, it will be automatically calculated. A reducefactor of 1 means return all items, 2 means half of the items etc. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphdata/bits curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphdata/bits?from=1517443200 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphdata/bits?from=1517443200&to=1517788800 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/graphdata/bits?from=1517443200&to=1517788800&reducefactor=5 Output: { \"status\": \"ok\", \"graph_data\": { \"from\": \"1517443200\", \"to\": 1518196161, \"last\": \"1518195901\", \"in_data\": [ 103190525.20999999, 104949255.81 ], \"out_data\": [ 1102059.1299999999, 1079216.46 ], \"tot_data\": [ 104292584.33999999, 106028472.27 ], \"ticks\": [ \"1517750401\", \"1517756101\" ], \"rate_95th\": \"251880417\", \"rate_average\": \"146575554\", \"bill_type\": \"cdr\", \"max_in\": 9888289942, \"max_out\": 75848756, \"ave_in\": 18029660.242105871, \"ave_out\": 196447.38060137472, \"last_in\": 3790227.9500000002, \"last_out\": 122731.63333333333 } }","title":"get_bill_graphdata"},{"location":"API/Bills/#get_bill_history","text":"Retrieve the history of specific bill Route: /api/v0/bills/:id/history Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history Output: { \"status\" : \"ok\" , \"bill_history\" : [ { \"bill_hist_id\" : \"1\" , \"bill_id\" : \"1\" , \"updated\" : \"2018-02-06 17:01:01\" , \"bill_datefrom\" : \"2018-02-01 00:00:00\" , \"bill_dateto\" : \"2018-02-28 23:59:59\" , \"bill_type\" : \"CDR\" , \"bill_allowed\" : \"100000000\" , \"bill_used\" : \"229963765\" , \"bill_overuse\" : \"129963765\" , \"bill_percent\" : \"229.96\" , \"rate_95th_in\" : \"229963765\" , \"rate_95th_out\" : \"1891344\" , \"rate_95th\" : \"229963765\" , \"dir_95th\" : \"in\" , \"rate_average\" : \"136527101\" , \"rate_average_in\" : \"135123359\" , \"rate_average_out\" : \"1403743\" , \"traf_in\" : \"3235123452544\" , \"traf_out\" : \"33608406566\" , \"traf_total\" : \"3268731859110\" , \"bill_peak_out\" : \"2782349290\" , \"bill_peak_in\" : \"10161119\" , \"pdf\" : null } ], \"count\" : 1 , }","title":"get_bill_history"},{"location":"API/Bills/#get_bill_history_graph","text":"Retrieve a graph of a previous period of a bill NB: The graphs returned from this will always be png as they do not come from rrdtool, even if you have SVG set. Route: /api/v0/bills/:id/history/:bill_hist_id/graphs/:graph_type Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphs/bits curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphs/hour curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphs/day Output: (image)","title":"get_bill_history_graph"},{"location":"API/Bills/#get_bill_history_graphdata","text":"Retrieve the data for a graph of a previous period of a bill, to be rendered in an external system Route: /api/v0/bills/:id/history/:bill_hist_id/graphdata/:graph_type Input: Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphdata/bits curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphdata/hour curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1/history/1/graphdata/day Output:","title":"get_bill_history_graphdata"},{"location":"API/Bills/#delete_bill","text":"Delete a specific bill and all dependent data Route: /api/v0/bills/:id id is the specific bill id Input: Example: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills/1 Output: { \"status\" : \"ok\" , \"message\" : \"Bill has been removed\" }","title":"delete_bill"},{"location":"API/Bills/#create_edit_bill","text":"Creates a new bill or updates an existing one Route: /api/v0/bills Method: POST If you send an existing bill_id the call replaces all values it receives. For example if you send 2 ports it will delete the existing ports and add the the 2 new ports. So to add ports you have to get the current ports first and add them to your update call. Input: Example (create): curl -X POST -d '{\"ports\":[ 1021 ],\"bill_name\":\"NEWBILL\",\"bill_day\":\"1\",\"bill_type\":\"quota\",\"bill_quota\":\"2000000000000\",\"bill_custid\":\"1337\",\"bill_ref\":\"reference1\",\"bill_notes\":\"mynote\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills Example (set): curl -X POST -d '{\"bill_id\":\"32\",\"ports\":[ 1021 ],\"bill_name\":\"NEWNAME\",\"bill_quota\":\"1000000000000\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bills Output: { \"status\" : \"ok\" , \"bill_id\" : 32 }","title":"create_edit_bill"},{"location":"API/DeviceGroups/","text":"get_devicegroups List all device groups. Route: /api/v0/devicegroups Input (JSON): - Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devicegroups Output: [ { \"status\" : \"ok\" , \"message\" : \"Found 1 device groups\" , \"count\" : 1 , \"groups\" : [ { \"id\" : \"1\" , \"name\" : \"Testing\" , \"desc\" : \"Testing\" , \"pattern\" : \"%devices.status = \\\"1\\\" &&\" } ] } ] add_devicegroup Add a new device group. Upon success, the ID of the new device group is returned and the HTTP response code is 201 . Route: /api/v0/devicegroups Input (JSON): name : required - The name of the device group type : required - should be static or dynamic . Setting this to static requires that the devices input be provided desc : optional - Description of the device group rules : required if type == dynamic - A set of rules to determine which devices should be included in this device group devices : required if type == static - A list of devices that should be included in this group. This is a static list of devices Examples: Dynamic Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups \\ --data-raw ' { \"name\": \"New Device Group\", \"desc\": \"A very fancy dynamic group\", \"type\": \"dynamic\", \"rules\": \"{\\\"condition\\\":\\\"AND\\\",\\\"rules\\\":[{\\\"id\\\":\\\"access_points.name\\\",\\\"field\\\":\\\"access_points.name\\\",\\\"type\\\":\\\"string\\\",\\\"input\\\":\\\"text\\\",\\\"operator\\\":\\\"equal\\\",\\\"value\\\":\\\"accesspoint1\\\"}],\\\"valid\\\":true}\" } ' Output: { \"status\" : \"ok\" , \"id\" : 86 , \"message\" : \"Device group New Device Group created\" } Static Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups \\ -d '{\"name\":\"New Device Group\",\"type\":\"static\",\"devices\":[261,271]}' Output: { \"status\" : \"ok\" , \"id\" : 86 , \"message\" : \"Device group New Device Group created\" } update_devicegroup Updates a device group. Route: /api/v0/devicegroups/:name name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input (JSON): name : optional - The name of the device group type : optional - should be static or dynamic . Setting this to static requires that the devices input be provided desc : optional - Description of the device group rules : required if type == dynamic - A set of rules to determine which devices should be included in this device group devices : required if type == static - A list of devices that should be included in this group. This is a static list of devices Examples: curl -X PATCH -d '{\"name\": \"NewLinuxServers\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/LinuxServers Output: { \"status\" : \"ok\" , \"message\" : \"Device group LinuxServers updated\" } delete_devicegroup Deletes a device group. Route: /api/v0/devicegroups/:name name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input: - Examples: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/LinuxServers Output: { \"status\" : \"ok\" , \"message\" : \"Device group LinuxServers deleted\" } get_devices_by_group List all devices matching the group provided. Route: /api/v0/devicegroups/:name name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input (JSON): full: set to any value to return all data for the devices in a given group Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devicegroups/LinuxServers Output: [ { \"status\" : \"ok\" , \"message\" : \"Found 3 in group LinuxServers\" , \"count\" : 3 , \"devices\" : [ { \"device_id\" : \"15\" }, { \"device_id\" : \"18\" }, { \"device_id\" : \"20\" } ] } ] maintenance_devicegroup Set a device group into maintenance mode. Route: /api/v0/devicesgroups/:name/maintenance Input (JSON): title : optional - Some title for the Maintenance Will be replaced with device group name if omitted notes : optional - Some description for the Maintenance start : optional - start time of Maintenance in full format Y-m-d H:i:00 eg: 2022-08-01 22:45:00 Current system time now() will be used if omitted duration : required - Duration of Maintenance in format H:i / Hrs:Mins eg: 02:00 Example with start time: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups/Cisco%20switches/maintenance/ \\ --data-raw ' { \"title\":\"Device group Maintenance\", \"notes\":\"A 2 hour Maintenance triggered via API with start time\", \"start\":\"2022-08-01 08:00:00\", \"duration\":\"2:00\" } ' Output: { \"status\" : \"ok\" , \"message\" : \"Device group Cisco switches (2) will begin maintenance mode at 2022-08-01 22:45:00 for 2:00h\" } Example with no start time: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups/Cisco%20switches/maintenance/ \\ --data-raw ' { \"title\":\"Device group Maintenance\", \"notes\":\"A 2 hour Maintenance triggered via API with no start time\", \"duration\":\"2:00\" } ' Output: { \"status\" : \"ok\" , \"message\" : \"Device group Cisco switches (2) moved into maintenance mode for 2:00h\" } Add devices to group Add devices to a device group. Route: /api/v0/devicesgroups/:name/devices name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input (JSON): devices : required - A list of devices to be added to the group. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups/devices \\ --data-raw '{\"devices\":[261,271]}' Output: { \"status\" : \"ok\" , \"message\" : \"Devices added\" } Remove devices from group Removes devices from a device group. Route: /api/v0/devicesgroups/:name/devices name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input (JSON): devices : required - A list of devices to be removed from the group. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X DELETE https://librenms.org/api/v0/devicegroups/devices \\ --data-raw '{\"devices\":[261,271]}' Output: { \"status\" : \"ok\" , \"message\" : \"Devices removed\" }","title":"DeviceGroups"},{"location":"API/DeviceGroups/#get_devicegroups","text":"List all device groups. Route: /api/v0/devicegroups Input (JSON): - Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devicegroups Output: [ { \"status\" : \"ok\" , \"message\" : \"Found 1 device groups\" , \"count\" : 1 , \"groups\" : [ { \"id\" : \"1\" , \"name\" : \"Testing\" , \"desc\" : \"Testing\" , \"pattern\" : \"%devices.status = \\\"1\\\" &&\" } ] } ]","title":"get_devicegroups"},{"location":"API/DeviceGroups/#add_devicegroup","text":"Add a new device group. Upon success, the ID of the new device group is returned and the HTTP response code is 201 . Route: /api/v0/devicegroups Input (JSON): name : required - The name of the device group type : required - should be static or dynamic . Setting this to static requires that the devices input be provided desc : optional - Description of the device group rules : required if type == dynamic - A set of rules to determine which devices should be included in this device group devices : required if type == static - A list of devices that should be included in this group. This is a static list of devices Examples: Dynamic Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups \\ --data-raw ' { \"name\": \"New Device Group\", \"desc\": \"A very fancy dynamic group\", \"type\": \"dynamic\", \"rules\": \"{\\\"condition\\\":\\\"AND\\\",\\\"rules\\\":[{\\\"id\\\":\\\"access_points.name\\\",\\\"field\\\":\\\"access_points.name\\\",\\\"type\\\":\\\"string\\\",\\\"input\\\":\\\"text\\\",\\\"operator\\\":\\\"equal\\\",\\\"value\\\":\\\"accesspoint1\\\"}],\\\"valid\\\":true}\" } ' Output: { \"status\" : \"ok\" , \"id\" : 86 , \"message\" : \"Device group New Device Group created\" } Static Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups \\ -d '{\"name\":\"New Device Group\",\"type\":\"static\",\"devices\":[261,271]}' Output: { \"status\" : \"ok\" , \"id\" : 86 , \"message\" : \"Device group New Device Group created\" }","title":"add_devicegroup"},{"location":"API/DeviceGroups/#update_devicegroup","text":"Updates a device group. Route: /api/v0/devicegroups/:name name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input (JSON): name : optional - The name of the device group type : optional - should be static or dynamic . Setting this to static requires that the devices input be provided desc : optional - Description of the device group rules : required if type == dynamic - A set of rules to determine which devices should be included in this device group devices : required if type == static - A list of devices that should be included in this group. This is a static list of devices Examples: curl -X PATCH -d '{\"name\": \"NewLinuxServers\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/LinuxServers Output: { \"status\" : \"ok\" , \"message\" : \"Device group LinuxServers updated\" }","title":"update_devicegroup"},{"location":"API/DeviceGroups/#delete_devicegroup","text":"Deletes a device group. Route: /api/v0/devicegroups/:name name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input: - Examples: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/LinuxServers Output: { \"status\" : \"ok\" , \"message\" : \"Device group LinuxServers deleted\" }","title":"delete_devicegroup"},{"location":"API/DeviceGroups/#get_devices_by_group","text":"List all devices matching the group provided. Route: /api/v0/devicegroups/:name name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input (JSON): full: set to any value to return all data for the devices in a given group Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devicegroups/LinuxServers Output: [ { \"status\" : \"ok\" , \"message\" : \"Found 3 in group LinuxServers\" , \"count\" : 3 , \"devices\" : [ { \"device_id\" : \"15\" }, { \"device_id\" : \"18\" }, { \"device_id\" : \"20\" } ] } ]","title":"get_devices_by_group"},{"location":"API/DeviceGroups/#maintenance_devicegroup","text":"Set a device group into maintenance mode. Route: /api/v0/devicesgroups/:name/maintenance Input (JSON): title : optional - Some title for the Maintenance Will be replaced with device group name if omitted notes : optional - Some description for the Maintenance start : optional - start time of Maintenance in full format Y-m-d H:i:00 eg: 2022-08-01 22:45:00 Current system time now() will be used if omitted duration : required - Duration of Maintenance in format H:i / Hrs:Mins eg: 02:00 Example with start time: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups/Cisco%20switches/maintenance/ \\ --data-raw ' { \"title\":\"Device group Maintenance\", \"notes\":\"A 2 hour Maintenance triggered via API with start time\", \"start\":\"2022-08-01 08:00:00\", \"duration\":\"2:00\" } ' Output: { \"status\" : \"ok\" , \"message\" : \"Device group Cisco switches (2) will begin maintenance mode at 2022-08-01 22:45:00 for 2:00h\" } Example with no start time: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups/Cisco%20switches/maintenance/ \\ --data-raw ' { \"title\":\"Device group Maintenance\", \"notes\":\"A 2 hour Maintenance triggered via API with no start time\", \"duration\":\"2:00\" } ' Output: { \"status\" : \"ok\" , \"message\" : \"Device group Cisco switches (2) moved into maintenance mode for 2:00h\" }","title":"maintenance_devicegroup"},{"location":"API/DeviceGroups/#add-devices-to-group","text":"Add devices to a device group. Route: /api/v0/devicesgroups/:name/devices name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input (JSON): devices : required - A list of devices to be added to the group. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devicegroups/devices \\ --data-raw '{\"devices\":[261,271]}' Output: { \"status\" : \"ok\" , \"message\" : \"Devices added\" }","title":"Add devices to group"},{"location":"API/DeviceGroups/#remove-devices-from-group","text":"Removes devices from a device group. Route: /api/v0/devicesgroups/:name/devices name Is the name of the device group which can be obtained using get_devicegroups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Input (JSON): devices : required - A list of devices to be removed from the group. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X DELETE https://librenms.org/api/v0/devicegroups/devices \\ --data-raw '{\"devices\":[261,271]}' Output: { \"status\" : \"ok\" , \"message\" : \"Devices removed\" }","title":"Remove devices from group"},{"location":"API/Devices/","text":"del_device Delete a given device. Route: /api/v0/devices/:hostname hostname can be either the device hostname or id Input: - Example: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost Output: { \"status\" : \"ok\" , \"message\" : \"Removed device localhost\" , \"devices\" : [ { \"device_id\" : \"1\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } ] } get_device Get details of a given device. Route: /api/v0/devices/:hostname hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost Output: { \"status\" : \"ok\" , \"devices\" : [ { \"device_id\" : \"1\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } ] } discover_device Trigger a discovery of given device. Route: /api/v0/devices/:hostname/discover hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/discover Output: { \"status\" : \"ok\" , \"result\" : { \"status\" : 0 , \"message\" : \"Device will be rediscovered\" }, \"count\" : 2 } availability Get calculated availabilities of given device. Route: /api/v0/devices/:hostname/availability hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/availability Output: { \"status\" : \"ok\" , \"availability\" : [ { \"duration\" : 86400 , \"availability_perc\" : \"100.000000\" }, { \"duration\" : 604800 , \"availability_perc\" : \"100.000000\" }, { \"duration\" : 2592000 , \"availability_perc\" : \"99.946000\" }, { \"duration\" : 31536000 , \"availability_perc\" : \"99.994000\" } ], \"count\" : 4 } outages Get detected outages of given device. Route: /api/v0/devices/:hostname/outages hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/outages Output: { \"status\" : \"ok\" , \"outages\" : [ { \"going_down\" : 1593194031 , \"up_again\" : 1593194388 }, { \"going_down\" : 1593946507 , \"up_again\" : 1593946863 }, { \"going_down\" : 1594628616 , \"up_again\" : 1594628968 }, { \"going_down\" : 1594628974 , \"up_again\" : 1594629339 }, { \"going_down\" : 1594638668 , \"up_again\" : 1594638992 } ], \"count\" : 5 } get_graphs Get a list of available graphs for a device, this does not include ports. Route: /api/v0/devices/:hostname/graphs hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 3 , \"graphs\" : [ { \"desc\" : \"Poller Time\" , \"name\" : \"device_poller_perf\" }, { \"desc\" : \"Ping Response\" , \"name\" : \"device_ping_perf\" }, { \"desc\" : \"System Uptime\" , \"name\" : \"uptime\" } ] } list_available_health_graphs This function allows to do three things: Get a list of overall health graphs available. Get a list of health graphs based on provided class. Get the health sensors information based on ID. Route: /api/v0/devices/:hostname/health(/:type)(/:sensor_id) hostname can be either the device hostname or id type (optional) is health type / sensor class sensor_id (optional) is the sensor id to retrieve specific information. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/health Output: { \"status\": \"ok\", \"message\": \"\", \"count\": 2, \"graphs\": [ { \"desc\": \"Airflow\", \"name\": \"device_airflow\" }, { \"desc\": \"Voltage\", \"name\": \"device_voltage\" } ] } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/health/device_voltage Output: { \"status\": \"ok\", \"message\": \"\", \"count\": 2, \"graphs\": [ { \"sensor_id\": \"1\", \"desc\": \"Input Feed A\" }, { \"sensor_id\": \"2\", \"desc\": \"Output Feed\" } ] } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/health/device_voltage/1 Output: { \"status\": \"ok\", \"message\": \"\", \"count\": 1, \"graphs\": [ { \"sensor_id\": \"1\", \"sensor_deleted\": \"0\", \"sensor_class\": \"voltage\", \"device_id\": \"1\", \"poller_type\": \"snmp\", \"sensor_oid\": \".1.3.6.1.4.1.318.1.1.27.1.1.0\", \"sensor_index\": \"1\", \"sensor_type\": \"apc\", \"sensor_descr\": \"Input\", \"sensor_divisor\": \"1\", \"sensor_multiplier\": \"1\", \"sensor_current\": \"1\", \"sensor_limit\": \"1.15\", \"sensor_limit_warn\": null, \"sensor_limit_low\": \"0.85\", \"sensor_limit_low_warn\": null, \"sensor_alert\": \"1\", \"sensor_custom\": \"No\", \"entPhysicalIndex\": null, \"entPhysicalIndex_measured\": null, \"lastupdate\": \"2017-01-13 13:50:26\", \"sensor_prev\": \"1\" } ] } list_available_wireless_graphs This function allows to do three things: Get a list of overall wireless graphs available. Get a list of wireless graphs based on provided class. Get the wireless sensors information based on ID. Route: /api/v0/devices/:hostname/wireless(/:type)(/:sensor_id) hostname can be either the device hostname or id type (optional) is wireless type / wireless class sensor_id (optional) is the sensor id to retrieve specific information. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/wireless Output: { \"status\": \"ok\", \"graphs\": [ { \"desc\": \"Ccq\", \"name\": \"device_wireless_ccq\" }, { \"desc\": \"Clients\", \"name\": \"device_wireless_clients\" } ], \"count\": 2 } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/wireless/device_wireless_ccq Output: { \"status\": \"ok\", \"graphs\": [ { \"sensor_id\": \"791\", \"desc\": \"SSID: bast (ng)\" }, { \"sensor_id\": \"792\", \"desc\": \"SSID: bast (na)\" } ], \"count\": 2 } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/health/device_wireless_ccq/1 Output: { \"status\": \"ok\", \"graphs\": [ { \"sensor_id\": \"791\", \"sensor_deleted\": \"0\", \"sensor_class\": \"ccq\", \"device_id\": \"381\", \"sensor_index\": \"0\", \"sensor_type\": \"unifi\", \"sensor_descr\": \"SSID: bast (ng)\", \"sensor_divisor\": \"10\", \"sensor_multiplier\": \"1\", \"sensor_aggregator\": \"sum\", \"sensor_current\": \"100\", \"sensor_prev\": \"100\", \"sensor_limit\": null, \"sensor_limit_warn\": null, \"sensor_limit_low\": null, \"sensor_limit_low_warn\": null, \"sensor_alert\": \"1\", \"sensor_custom\": \"No\", \"entPhysicalIndex\": null, \"entPhysicalIndex_measured\": null, \"lastupdate\": \"2017-12-06 21:26:29\", \"sensor_oids\": \"[\\\".1.3.6.1.4.1.41112.1.6.1.2.1.3.0\\\"]\", \"access_point_id\": null } ], \"count\": 1 } get_health_graph Get a particular health class graph for a device, if you provide a sensor_id as well then a single sensor graph will be provided. If no sensor_id value is provided then you will be sent a stacked sensor graph. Route: /api/v0/devices/:hostname/graphs/health/:type(/:sensor_id) hostname can be either the device hostname or id type is the name of the health graph as returned by list_available_health_graphs sensor_id (optional) restricts the graph to return a particular health sensor graph. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs/health/device_voltage Output: Output is a stacked graph for the health type provided. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs/health/device_voltage/1 Output: Output is the graph of the particular health type sensor provided. get_wireless_graph Get a particular wireless class graph for a device, if you provide a sensor_id as well then a single sensor graph will be provided. If no sensor_id value is provided then you will be sent a stacked wireless graph. Route: /api/v0/devices/:hostname/graphs/wireless/:type(/:sensor_id) hostname can be either the device hostname or id type is the name of the wireless graph as returned by list_available_wireless_graphs sensor_id (optional) restricts the graph to return a particular wireless sensor graph. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs/wireless/device_wireless_ccq Output: Output is a stacked graph for the wireless type provided. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs/wireless/device_wireless_ccq/1 Output: Output is the graph of the particular wireless type sensor provided. get_graph_generic_by_hostname Get a specific graph for a device, this does not include ports. Route: /api/v0/devices/:hostname/:type hostname can be either the device hostname or id type is the type of graph you want, use [ get_graphs ](#function-get_graphs to see the graphs available. Defaults to device uptime. Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. output: Set how the graph should be outputted (base64, display), defaults to display. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/device_poller_perf Output: Output is an image. get_graph_by_service Get the graph for a service Route: /api/v0/devices/:hostname/services/:service_id/graphs/:datasource hostname can be either the device hostname or id service id datasource is the name of the service datasource Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/localhost/35/graphs/loss Output: Output is an image. get_port_graphs Get a list of ports for a particular device. Route: /api/v0/devices/:hostname/ports hostname can be either the device hostname or id Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/ports Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 3 , \"ports\" : [ { \"ifName\" : \"lo\" }, { \"ifName\" : \"eth0\" }, { \"ifName\" : \"eth1\" } ] } get_device_fdb Get a list of FDB entries associated with a device. Route: /api/v0/devices/:hostname/fdb hostname can be either the device hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/fdb Output: { \"status\" : \"ok\" , \"ports_fdb\" : { \"ports_fdb_id\" : 10 , \"port_id\" : 10000 , \"mac_address\" : \"1aaa2bbb3ccc\" , \"vlan_id\" : 20000 , \"device_id\" : 1 , \"created_at\" : \"2019-01-1 01:01:01\" , \"updated_at\" : \"2019-01-1 01:01:01\" } } get_device_ip_addresses Get a list of IP addresses (v4 and v6) associated with a device. Route: /api/v0/devices/:hostname/ip hostname can be either the device hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/ip Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"addresses\" : [ { \"ipv4_address_id\" : \"290\" , \"ipv4_address\" : \"192.168.99.292\" , \"ipv4_prefixlen\" : \"30\" , \"ipv4_network_id\" : \"247\" , \"port_id\" : \"323\" , \"context_name\" : \"\" } ] } get_port_stack Get a list of port mappings for a device. This is useful for showing physical ports that are in a virtual port-channel. Route: /api/v0/devices/:hostname/port_stack hostname can be either the device hostname or id Input: valid_mappings: Filter the result by only showing valid mappings (\"0\" values not shown). Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/port_stack?valid_mappings Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 2 , \"mappings\" : [ { \"device_id\" : \"3742\" , \"port_id_high\" : \"1001000\" , \"port_id_low\" : \"51001\" , \"ifStackStatus\" : \"active\" }, { \"device_id\" : \"3742\" , \"port_id_high\" : \"1001000\" , \"port_id_low\" : \"52001\" , \"ifStackStatus\" : \"active\" } ] } get_components Get a list of components for a particular device. Route: /api/v0/devices/:hostname/components hostname can be either the device hostname or id Input: type: Filter the result by type (Equals). id: Filter the result by id (Equals). label: Filter the result by label (Contains). status: Filter the result by status (Equals). disabled: Filter the result by disabled (Equals). ignore: Filter the result by ignore (Equals). Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/components Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 3 , \"components\" : { \"2\" : { \"TestAttribute-1\" : \"Value1\" , \"TestAttribute-2\" : \"Value2\" , \"TestAttribute-3\" : \"Value3\" , \"type\" : \"TestComponent-1\" , \"label\" : \"This is a really cool blue component\" , \"status\" : \"1\" , \"ignore\" : \"0\" , \"disabled\" : \"0\" }, \"20\" : { \"TestAttribute-1\" : \"Value4\" , \"TestAttribute-2\" : \"Value5\" , \"TestAttribute-3\" : \"Value6\" , \"type\" : \"TestComponent-1\" , \"label\" : \"This is a really cool red component\" , \"status\" : \"1\" , \"ignore\" : \"0\" , \"disabled\" : \"0\" }, \"27\" : { \"TestAttribute-1\" : \"Value7\" , \"TestAttribute-2\" : \"Value8\" , \"TestAttribute-3\" : \"Value9\" , \"type\" : \"TestComponent-2\" , \"label\" : \"This is a really cool yellow widget\" , \"status\" : \"1\" , \"ignore\" : \"0\" , \"disabled\" : \"0\" } } } add_components Create a new component of a type on a particular device. Route: /api/v0/devices/:hostname/components/:type hostname can be either the device hostname or id type is the type of component to add Example: curl -X POST -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/components/APITEST Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"components\" : { \"4459\" : { \"type\" : \"APITEST\" , \"label\" : \"\" , \"status\" : 1 , \"ignore\" : 0 , \"disabled\" : 0 , \"error\" : \"\" } } } edit_components Edit an existing component on a particular device. Route: /api/v0/devices/:hostname/components hostname can be either the device hostname or id In this example we set the label and add a new field: TestField: curl -X PUT -d '{\"4459\": {\"type\": \"APITEST\",\"label\": \"This is a test label\",\"status\": 1,\"ignore\": 0,\"disabled\": 0,\"error\": \"\",\"TestField\": \"TestData\"}}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/components Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 } Just take the JSON array from add_components or edit_components, edit as you wish and submit it back to edit components. delete_components Delete an existing component on a particular device. Route: /api/v0/devices/:hostname/components/:component hostname can be either the device hostname or id component is the component ID to be deleted. Example: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/components/4459 Output: { \"status\" : \"ok\" , \"message\" : \"\" } get_port_stats_by_port_hostname Get information about a particular port for a device. Route: /api/v0/devices/:hostname/ports/:ifname hostname can be either the device hostname or id ifname can be any of the interface names for the device which can be obtained using get_port_graphs . Please ensure that the ifname is urlencoded if it needs to be (i.e Gi0/1/0 would need to be urlencoded. Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/ports/eth0 Output: { \"status\" : \"ok\" , \"port\" : { \"port_id\" : \"2\" , \"device_id\" : \"1\" , ... \"poll_prev\" : \"1418412902\" , \"poll_period\" : \"300\" } } get_graph_by_port_hostname Get a graph of a port for a particular device. Route: /api/v0/devices/:hostname/ports/:ifname/:type hostname can be either the device hostname or id ifname can be any of the interface names for the device which can be obtained using get_port_graphs . Please ensure that the ifname is urlencoded if it needs to be (i.e Gi0/1/0 would need to be urlencoded. type is the port type you want the graph for, you can request a list of ports for a device with get_port_graphs . Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. ifDescr: If this is set to true then we will use ifDescr to lookup the port instead of ifName. Pass the ifDescr value you want to search as you would ifName. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/ports/eth0/port_bits Output: Output is an image. list_sensors Get a list of all Sensors. Route: /api/v0/resources/sensors Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/sensors Output: { \"status\" : \"ok\" , \"sensors\" : [ { \"sensor_id\" : 218810 , \"sensor_deleted\" : 0 , \"sensor_class\" : \"dbm\" , \"device_id\" : 136 , \"poller_type\" : \"snmp\" , \"sensor_oid\" : \".1.3.6.1.4.1.2636.3.60.1.1.1.1.7.919\" , \"sensor_index\" : \"tx-919\" , \"sensor_type\" : \"junos\" , \"sensor_descr\" : \"xe-2/1/4 Tx Power\" , \"group\" : null , \"sensor_divisor\" : 100 , \"sensor_multiplier\" : 1 , \"sensor_current\" : -1.81 , \"sensor_limit\" : 2 , \"sensor_limit_warn\" : 0.5 , \"sensor_limit_low\" : -9.7 , \"sensor_limit_low_warn\" : -8.21 , \"sensor_alert\" : 1 , \"sensor_custom\" : \"No\" , \"entPhysicalIndex\" : \"919\" , \"entPhysicalIndex_measured\" : \"ports\" , \"lastupdate\" : \"2019-02-18 02:47:09\" , \"sensor_prev\" : -1.77 , \"user_func\" : null }, ... ], \"count\" : 100 } list_devices Return a list of devices. Route: /api/v0/devices Input: order: How to order the output, default is by hostname. Can be prepended by DESC or ASC to change the order. type: can be one of the following to filter or search by: all: All devices active: Only not ignored and not disabled devices ignored: Only ignored devices up: Only devices that are up down: Only devices that are down disabled: Disabled devices os: search by os type mac: search by mac address ipv4: search by IPv4 address ipv6: search by IPv6 address (compressed or uncompressed) location: search by location location_id: serach by locaiton_id hostname: search by hostname sysName: search by sysName display: search by display name device_id: exact match by device-id type: search by device type query: If searching by, then this will be used as the input. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices?order=hostname%20DESC&type=down Output: { \"status\" : \"ok\" , \"count\" : 1 , \"devices\" : [ { \"device_id\" : \"1\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } ] } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices?type=mac&query=00000c9ff013 Output: { \"status\" : \"ok\" , \"count\" : 1 , \"devices\" : [ { \"device_id\" : \"1\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } ] } maintenance_device Set a device into maintenance mode. Route: /api/v0/devices/:hostname/maintenance Input (JSON): title : optional - Some title for the Maintenance Will be replaced with hostname if omitted notes : optional - Some description for the Maintenance Will also be added to device notes if user prefs \"Add schedule notes to devices notes\" is set start : optional - start time of Maintenance in full format Y-m-d H:i:00 eg: 2022-08-01 22:45:00 Current system time now() will be used if omitted duration : required - Duration of Maintenance in format H:i / Hrs:Mins eg: 02:00 Example with start time: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devices/localhost/maintenance/ \\ --data-raw ' \"title\":\"Device Maintenance\", \"notes\":\"A 2 hour Maintenance triggered via API with start time\", \"start\":\"2022-08-01 08:00:00\", \"duration\":\"2:00\" } ' Output: { \"status\" : \"ok\" , \"message\" : \"Device localhost (1) will begin maintenance mode at 2022-08-01 22:45:00 for 2:00h\" } Example with no start time: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devices/localhost/maintenance/ \\ --data-raw ' \"title\":\"Device Maintenance\", \"notes\":\"A 2 hour Maintenance triggered via API with no start time\", \"duration\":\"2:00\" } ' Output: { \"status\" : \"ok\" , \"message\" : \"Device localhost (1) moved into maintenance mode for 2:00h\" } add_device Add a new device. Most fields are optional. You may omit snmp credentials to attempt each system credential in order. See snmp.version, snmp.community, and snmp.v3 To guarantee device is added, use force_add. This will skip checks for duplicate device and snmp reachability, but not duplicate hostname. Route: /api/v0/devices Input (JSON): Fields: hostname (required): device hostname or IP display: A string to display as the name of this device, defaults to hostname (or device_display_default setting). May be a simple template using replacements: {{ $hostname }}, {{ $sysName }}, {{ $sysName_fallback }}, {{ $ip }} snmpver: SNMP version to use, v1, v2c or v3. During checks detection order is v2c,v3,v1 port: SNMP port (defaults to port defined in config). transport: SNMP protocol (udp,tcp,udp6,tcp6) Defaults to transport defined in config. port_association_mode: method to identify ports: ifIndex (default), ifName, ifDescr, ifAlias poller_group: This is the poller_group id used for distributed poller setup. Defaults to 0. location or location_id: set the location by text or location id Options: force_add: Skip all checks and attempts to detect credentials. Add the device as given directly to the database. ping_fallback: if snmp checks fail, add the device as ping only instead of failing SNMP v1 or v2c credentials: community: Required for SNMP v1 or v2c. SNMP v3 credentials: authlevel: SNMP authlevel (noAuthNoPriv, authNoPriv, authPriv). authname: SNMP Auth username authpass: SNMP Auth password authalgo: SNMP Auth algorithm (MD5, SHA) (SHA-224, SHA-256, SHA-384, SHA-512 if supported by your server) cryptopass: SNMP Crypto Password cryptoalgo: SNMP Crypto algorithm (AES, DES) For ICMP only: snmp_disable: set to true for ICMP only. Disables SNMP checks and polling. os: OS short name for the device (defaults to ping). sysName: sysName for the device. hardware: Device hardware. Example: curl -X POST -d '{\"hostname\":\"localhost.localdomain\",\"version\":\"v1\",\"community\":\"public\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices Output: { \"status\" : \"ok\" , \"message\" : \"Device localhost.localdomain (57) has been added successfully\" , \"devices\" : [ { \"device_id\" : \"57\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } } list_oxidized List devices for use with Oxidized. If you have group support enabled then a group will also be returned based on your config. LibreNMS will automatically map the OS to the Oxidized model name if they don't match. Route: /api/v0/oxidized(/:hostname) Input (JSON): - Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/oxidized Output: [ { \"hostname\" : \"localhost\" , \"os\" : \"linux\" }, { \"hostname\" : \"otherserver\" , \"os\" : \"linux\" } ] update_device_field Update devices field in the database. Route: /api/v0/devices/:hostname hostname can be either the device hostname or id Input (JSON): field: The column name within the database (can be an array of fields) data: The data to update the column with (can be an array of data)) Examples: curl -X PATCH -d '{\"field\": \"notes\", \"data\": \"This server should be kept online\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost Output: [ { \"status\" : \"ok\" , \"message\" : \"Device notes has been updated\" } ] update_device_port_notes Update a device port notes field in the devices_attrs database. Route: /api/v0/devices/:hostname/port/:portid hostname can be either the device hostname or id portid needs to be the port unique id (int). Input (JSON): - notes: The string data to populate on the port notes field. Examples: curl -X PATCH -d '{\"notes\": \"This port is in a scheduled maintenance with the provider.\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/port/5 Output: [ { \"status\" : \"ok\" , \"message\" : \"Port notes field has been updated\" } ] curl -X PATCH -d '{\"field\": [\"notes\",\"purpose\"], \"data\": [\"This server should be kept online\", \"For serving web traffic\"]}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost Output: [ { \"status\" : \"ok\" , \"message\" : \"Device fields have been updated\" } ] rename_device Rename device. Route: /api/v0/devices/:hostname/rename/:new_hostname hostname can be either the device hostname or id Input: - Examples: curl -X PATCH -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/rename/localhost2 Output: [ { \"status\" : \"ok\" , \"message\" : \"Device has been renamed\" } ] get_device_groups List the device groups that a device is matched on. Route: /api/v0/devices/:hostname/groups hostname can be either the device hostname or id Input (JSON): - Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/groups Output: [ { \"status\" : \"ok\" , \"message\" : \"Found 1 device groups\" , \"count\" : 1 , \"groups\" : [ { \"id\" : \"1\" , \"name\" : \"Testing\" , \"desc\" : \"Testing\" , \"pattern\" : \"%devices.status = \\\"1\\\" &&\" } ] } ] search_oxidized search all oxidized device configs for a string. Route: api/v0/oxidized/config/search/:searchstring searchstring is the specific string you would like to search for. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/oxidized/config/search/vlan10 Output: { \"status\" : \"ok\" , \"nodes\" : [ { \"node\" : \"asr9k.librenms.org\" , \"full_name\" : \"cisco\\/ASR9K.Librenms.org\" }, { \"node\" : \"ios.Librenms.org\" , \"full_name\" : \"cisco\\/ios.Librenms.org\" } ], \"count\" : 2 } get_oxidized_config Returns a specific device's config from oxidized. Route: api/v0/oxidized/config/:hostname hostname is the Hostname or IP of the device used when adding the device to librenms. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/oxidized/config/router.corp.com Output: { \"status\" : \"ok\" , \"config\" : \"DEVICE CONFIG HERE\" } add_parents_to_host Add one or more parents to a host. Route: /api/v0/devices/:device/parents Input (JSON): parent_ids: one or more parent ids or hostnames Example: curl -X POST -d '{\"parent_ids\":\"15,16,17\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/1/parents Output: { \"status\" : \"ok\" , \"message\" : \"Device dependencies have been saved\" } delete_parents_from_host Deletes some or all the parents from a host. Route: /api/v0/devices/:device/parents Input (JSON): parent_ids: One or more parent ids or hostnames, if not specified deletes all parents from host. Example: curl -X DELETE -d '{\"parent_ids\":\"15,16,17\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/1/parents Output: { \"status\" : \"ok\" , \"message\" : \"All device dependencies have been removed\" } list_parents_of_host This is not a seperate API call. Instead, you obtain the list of parents from list_devices . See that entry point for more detailed information. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' 'http://librenms.org/api/v0/devices?type=device_id&query=34' Output: { \"status\" : \"ok\" , \"devices\" : [ { ... \"dependency_parent_id\" : \"98,99\" , \"dependency_parent_hostname\" : \"HOSTNAME1,HOSTNAME2\" , ... } ], \"count\" : 1 }","title":"Devices"},{"location":"API/Devices/#del_device","text":"Delete a given device. Route: /api/v0/devices/:hostname hostname can be either the device hostname or id Input: - Example: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost Output: { \"status\" : \"ok\" , \"message\" : \"Removed device localhost\" , \"devices\" : [ { \"device_id\" : \"1\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } ] }","title":"del_device"},{"location":"API/Devices/#get_device","text":"Get details of a given device. Route: /api/v0/devices/:hostname hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost Output: { \"status\" : \"ok\" , \"devices\" : [ { \"device_id\" : \"1\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } ] }","title":"get_device"},{"location":"API/Devices/#discover_device","text":"Trigger a discovery of given device. Route: /api/v0/devices/:hostname/discover hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/discover Output: { \"status\" : \"ok\" , \"result\" : { \"status\" : 0 , \"message\" : \"Device will be rediscovered\" }, \"count\" : 2 }","title":"discover_device"},{"location":"API/Devices/#availability","text":"Get calculated availabilities of given device. Route: /api/v0/devices/:hostname/availability hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/availability Output: { \"status\" : \"ok\" , \"availability\" : [ { \"duration\" : 86400 , \"availability_perc\" : \"100.000000\" }, { \"duration\" : 604800 , \"availability_perc\" : \"100.000000\" }, { \"duration\" : 2592000 , \"availability_perc\" : \"99.946000\" }, { \"duration\" : 31536000 , \"availability_perc\" : \"99.994000\" } ], \"count\" : 4 }","title":"availability"},{"location":"API/Devices/#outages","text":"Get detected outages of given device. Route: /api/v0/devices/:hostname/outages hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/outages Output: { \"status\" : \"ok\" , \"outages\" : [ { \"going_down\" : 1593194031 , \"up_again\" : 1593194388 }, { \"going_down\" : 1593946507 , \"up_again\" : 1593946863 }, { \"going_down\" : 1594628616 , \"up_again\" : 1594628968 }, { \"going_down\" : 1594628974 , \"up_again\" : 1594629339 }, { \"going_down\" : 1594638668 , \"up_again\" : 1594638992 } ], \"count\" : 5 }","title":"outages"},{"location":"API/Devices/#get_graphs","text":"Get a list of available graphs for a device, this does not include ports. Route: /api/v0/devices/:hostname/graphs hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 3 , \"graphs\" : [ { \"desc\" : \"Poller Time\" , \"name\" : \"device_poller_perf\" }, { \"desc\" : \"Ping Response\" , \"name\" : \"device_ping_perf\" }, { \"desc\" : \"System Uptime\" , \"name\" : \"uptime\" } ] }","title":"get_graphs"},{"location":"API/Devices/#list_available_health_graphs","text":"This function allows to do three things: Get a list of overall health graphs available. Get a list of health graphs based on provided class. Get the health sensors information based on ID. Route: /api/v0/devices/:hostname/health(/:type)(/:sensor_id) hostname can be either the device hostname or id type (optional) is health type / sensor class sensor_id (optional) is the sensor id to retrieve specific information. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/health Output: { \"status\": \"ok\", \"message\": \"\", \"count\": 2, \"graphs\": [ { \"desc\": \"Airflow\", \"name\": \"device_airflow\" }, { \"desc\": \"Voltage\", \"name\": \"device_voltage\" } ] } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/health/device_voltage Output: { \"status\": \"ok\", \"message\": \"\", \"count\": 2, \"graphs\": [ { \"sensor_id\": \"1\", \"desc\": \"Input Feed A\" }, { \"sensor_id\": \"2\", \"desc\": \"Output Feed\" } ] } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/health/device_voltage/1 Output: { \"status\": \"ok\", \"message\": \"\", \"count\": 1, \"graphs\": [ { \"sensor_id\": \"1\", \"sensor_deleted\": \"0\", \"sensor_class\": \"voltage\", \"device_id\": \"1\", \"poller_type\": \"snmp\", \"sensor_oid\": \".1.3.6.1.4.1.318.1.1.27.1.1.0\", \"sensor_index\": \"1\", \"sensor_type\": \"apc\", \"sensor_descr\": \"Input\", \"sensor_divisor\": \"1\", \"sensor_multiplier\": \"1\", \"sensor_current\": \"1\", \"sensor_limit\": \"1.15\", \"sensor_limit_warn\": null, \"sensor_limit_low\": \"0.85\", \"sensor_limit_low_warn\": null, \"sensor_alert\": \"1\", \"sensor_custom\": \"No\", \"entPhysicalIndex\": null, \"entPhysicalIndex_measured\": null, \"lastupdate\": \"2017-01-13 13:50:26\", \"sensor_prev\": \"1\" } ] }","title":"list_available_health_graphs"},{"location":"API/Devices/#list_available_wireless_graphs","text":"This function allows to do three things: Get a list of overall wireless graphs available. Get a list of wireless graphs based on provided class. Get the wireless sensors information based on ID. Route: /api/v0/devices/:hostname/wireless(/:type)(/:sensor_id) hostname can be either the device hostname or id type (optional) is wireless type / wireless class sensor_id (optional) is the sensor id to retrieve specific information. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/wireless Output: { \"status\": \"ok\", \"graphs\": [ { \"desc\": \"Ccq\", \"name\": \"device_wireless_ccq\" }, { \"desc\": \"Clients\", \"name\": \"device_wireless_clients\" } ], \"count\": 2 } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/wireless/device_wireless_ccq Output: { \"status\": \"ok\", \"graphs\": [ { \"sensor_id\": \"791\", \"desc\": \"SSID: bast (ng)\" }, { \"sensor_id\": \"792\", \"desc\": \"SSID: bast (na)\" } ], \"count\": 2 } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/health/device_wireless_ccq/1 Output: { \"status\": \"ok\", \"graphs\": [ { \"sensor_id\": \"791\", \"sensor_deleted\": \"0\", \"sensor_class\": \"ccq\", \"device_id\": \"381\", \"sensor_index\": \"0\", \"sensor_type\": \"unifi\", \"sensor_descr\": \"SSID: bast (ng)\", \"sensor_divisor\": \"10\", \"sensor_multiplier\": \"1\", \"sensor_aggregator\": \"sum\", \"sensor_current\": \"100\", \"sensor_prev\": \"100\", \"sensor_limit\": null, \"sensor_limit_warn\": null, \"sensor_limit_low\": null, \"sensor_limit_low_warn\": null, \"sensor_alert\": \"1\", \"sensor_custom\": \"No\", \"entPhysicalIndex\": null, \"entPhysicalIndex_measured\": null, \"lastupdate\": \"2017-12-06 21:26:29\", \"sensor_oids\": \"[\\\".1.3.6.1.4.1.41112.1.6.1.2.1.3.0\\\"]\", \"access_point_id\": null } ], \"count\": 1 }","title":"list_available_wireless_graphs"},{"location":"API/Devices/#get_health_graph","text":"Get a particular health class graph for a device, if you provide a sensor_id as well then a single sensor graph will be provided. If no sensor_id value is provided then you will be sent a stacked sensor graph. Route: /api/v0/devices/:hostname/graphs/health/:type(/:sensor_id) hostname can be either the device hostname or id type is the name of the health graph as returned by list_available_health_graphs sensor_id (optional) restricts the graph to return a particular health sensor graph. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs/health/device_voltage Output: Output is a stacked graph for the health type provided. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs/health/device_voltage/1 Output: Output is the graph of the particular health type sensor provided.","title":"get_health_graph"},{"location":"API/Devices/#get_wireless_graph","text":"Get a particular wireless class graph for a device, if you provide a sensor_id as well then a single sensor graph will be provided. If no sensor_id value is provided then you will be sent a stacked wireless graph. Route: /api/v0/devices/:hostname/graphs/wireless/:type(/:sensor_id) hostname can be either the device hostname or id type is the name of the wireless graph as returned by list_available_wireless_graphs sensor_id (optional) restricts the graph to return a particular wireless sensor graph. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs/wireless/device_wireless_ccq Output: Output is a stacked graph for the wireless type provided. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/graphs/wireless/device_wireless_ccq/1 Output: Output is the graph of the particular wireless type sensor provided.","title":"get_wireless_graph"},{"location":"API/Devices/#get_graph_generic_by_hostname","text":"Get a specific graph for a device, this does not include ports. Route: /api/v0/devices/:hostname/:type hostname can be either the device hostname or id type is the type of graph you want, use [ get_graphs ](#function-get_graphs to see the graphs available. Defaults to device uptime. Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. output: Set how the graph should be outputted (base64, display), defaults to display. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/device_poller_perf Output: Output is an image.","title":"get_graph_generic_by_hostname"},{"location":"API/Devices/#get_graph_by_service","text":"Get the graph for a service Route: /api/v0/devices/:hostname/services/:service_id/graphs/:datasource hostname can be either the device hostname or id service id datasource is the name of the service datasource Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/localhost/35/graphs/loss Output: Output is an image.","title":"get_graph_by_service"},{"location":"API/Devices/#get_port_graphs","text":"Get a list of ports for a particular device. Route: /api/v0/devices/:hostname/ports hostname can be either the device hostname or id Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/ports Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 3 , \"ports\" : [ { \"ifName\" : \"lo\" }, { \"ifName\" : \"eth0\" }, { \"ifName\" : \"eth1\" } ] }","title":"get_port_graphs"},{"location":"API/Devices/#get_device_fdb","text":"Get a list of FDB entries associated with a device. Route: /api/v0/devices/:hostname/fdb hostname can be either the device hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/fdb Output: { \"status\" : \"ok\" , \"ports_fdb\" : { \"ports_fdb_id\" : 10 , \"port_id\" : 10000 , \"mac_address\" : \"1aaa2bbb3ccc\" , \"vlan_id\" : 20000 , \"device_id\" : 1 , \"created_at\" : \"2019-01-1 01:01:01\" , \"updated_at\" : \"2019-01-1 01:01:01\" } }","title":"get_device_fdb"},{"location":"API/Devices/#get_device_ip_addresses","text":"Get a list of IP addresses (v4 and v6) associated with a device. Route: /api/v0/devices/:hostname/ip hostname can be either the device hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/ip Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"addresses\" : [ { \"ipv4_address_id\" : \"290\" , \"ipv4_address\" : \"192.168.99.292\" , \"ipv4_prefixlen\" : \"30\" , \"ipv4_network_id\" : \"247\" , \"port_id\" : \"323\" , \"context_name\" : \"\" } ] }","title":"get_device_ip_addresses"},{"location":"API/Devices/#get_port_stack","text":"Get a list of port mappings for a device. This is useful for showing physical ports that are in a virtual port-channel. Route: /api/v0/devices/:hostname/port_stack hostname can be either the device hostname or id Input: valid_mappings: Filter the result by only showing valid mappings (\"0\" values not shown). Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/port_stack?valid_mappings Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 2 , \"mappings\" : [ { \"device_id\" : \"3742\" , \"port_id_high\" : \"1001000\" , \"port_id_low\" : \"51001\" , \"ifStackStatus\" : \"active\" }, { \"device_id\" : \"3742\" , \"port_id_high\" : \"1001000\" , \"port_id_low\" : \"52001\" , \"ifStackStatus\" : \"active\" } ] }","title":"get_port_stack"},{"location":"API/Devices/#get_components","text":"Get a list of components for a particular device. Route: /api/v0/devices/:hostname/components hostname can be either the device hostname or id Input: type: Filter the result by type (Equals). id: Filter the result by id (Equals). label: Filter the result by label (Contains). status: Filter the result by status (Equals). disabled: Filter the result by disabled (Equals). ignore: Filter the result by ignore (Equals). Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/components Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 3 , \"components\" : { \"2\" : { \"TestAttribute-1\" : \"Value1\" , \"TestAttribute-2\" : \"Value2\" , \"TestAttribute-3\" : \"Value3\" , \"type\" : \"TestComponent-1\" , \"label\" : \"This is a really cool blue component\" , \"status\" : \"1\" , \"ignore\" : \"0\" , \"disabled\" : \"0\" }, \"20\" : { \"TestAttribute-1\" : \"Value4\" , \"TestAttribute-2\" : \"Value5\" , \"TestAttribute-3\" : \"Value6\" , \"type\" : \"TestComponent-1\" , \"label\" : \"This is a really cool red component\" , \"status\" : \"1\" , \"ignore\" : \"0\" , \"disabled\" : \"0\" }, \"27\" : { \"TestAttribute-1\" : \"Value7\" , \"TestAttribute-2\" : \"Value8\" , \"TestAttribute-3\" : \"Value9\" , \"type\" : \"TestComponent-2\" , \"label\" : \"This is a really cool yellow widget\" , \"status\" : \"1\" , \"ignore\" : \"0\" , \"disabled\" : \"0\" } } }","title":"get_components"},{"location":"API/Devices/#add_components","text":"Create a new component of a type on a particular device. Route: /api/v0/devices/:hostname/components/:type hostname can be either the device hostname or id type is the type of component to add Example: curl -X POST -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/components/APITEST Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"components\" : { \"4459\" : { \"type\" : \"APITEST\" , \"label\" : \"\" , \"status\" : 1 , \"ignore\" : 0 , \"disabled\" : 0 , \"error\" : \"\" } } }","title":"add_components"},{"location":"API/Devices/#edit_components","text":"Edit an existing component on a particular device. Route: /api/v0/devices/:hostname/components hostname can be either the device hostname or id In this example we set the label and add a new field: TestField: curl -X PUT -d '{\"4459\": {\"type\": \"APITEST\",\"label\": \"This is a test label\",\"status\": 1,\"ignore\": 0,\"disabled\": 0,\"error\": \"\",\"TestField\": \"TestData\"}}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/components Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 } Just take the JSON array from add_components or edit_components, edit as you wish and submit it back to edit components.","title":"edit_components"},{"location":"API/Devices/#delete_components","text":"Delete an existing component on a particular device. Route: /api/v0/devices/:hostname/components/:component hostname can be either the device hostname or id component is the component ID to be deleted. Example: curl -X DELETE -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/components/4459 Output: { \"status\" : \"ok\" , \"message\" : \"\" }","title":"delete_components"},{"location":"API/Devices/#get_port_stats_by_port_hostname","text":"Get information about a particular port for a device. Route: /api/v0/devices/:hostname/ports/:ifname hostname can be either the device hostname or id ifname can be any of the interface names for the device which can be obtained using get_port_graphs . Please ensure that the ifname is urlencoded if it needs to be (i.e Gi0/1/0 would need to be urlencoded. Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/ports/eth0 Output: { \"status\" : \"ok\" , \"port\" : { \"port_id\" : \"2\" , \"device_id\" : \"1\" , ... \"poll_prev\" : \"1418412902\" , \"poll_period\" : \"300\" } }","title":"get_port_stats_by_port_hostname"},{"location":"API/Devices/#get_graph_by_port_hostname","text":"Get a graph of a port for a particular device. Route: /api/v0/devices/:hostname/ports/:ifname/:type hostname can be either the device hostname or id ifname can be any of the interface names for the device which can be obtained using get_port_graphs . Please ensure that the ifname is urlencoded if it needs to be (i.e Gi0/1/0 would need to be urlencoded. type is the port type you want the graph for, you can request a list of ports for a device with get_port_graphs . Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. ifDescr: If this is set to true then we will use ifDescr to lookup the port instead of ifName. Pass the ifDescr value you want to search as you would ifName. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/ports/eth0/port_bits Output: Output is an image.","title":"get_graph_by_port_hostname"},{"location":"API/Devices/#list_sensors","text":"Get a list of all Sensors. Route: /api/v0/resources/sensors Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/sensors Output: { \"status\" : \"ok\" , \"sensors\" : [ { \"sensor_id\" : 218810 , \"sensor_deleted\" : 0 , \"sensor_class\" : \"dbm\" , \"device_id\" : 136 , \"poller_type\" : \"snmp\" , \"sensor_oid\" : \".1.3.6.1.4.1.2636.3.60.1.1.1.1.7.919\" , \"sensor_index\" : \"tx-919\" , \"sensor_type\" : \"junos\" , \"sensor_descr\" : \"xe-2/1/4 Tx Power\" , \"group\" : null , \"sensor_divisor\" : 100 , \"sensor_multiplier\" : 1 , \"sensor_current\" : -1.81 , \"sensor_limit\" : 2 , \"sensor_limit_warn\" : 0.5 , \"sensor_limit_low\" : -9.7 , \"sensor_limit_low_warn\" : -8.21 , \"sensor_alert\" : 1 , \"sensor_custom\" : \"No\" , \"entPhysicalIndex\" : \"919\" , \"entPhysicalIndex_measured\" : \"ports\" , \"lastupdate\" : \"2019-02-18 02:47:09\" , \"sensor_prev\" : -1.77 , \"user_func\" : null }, ... ], \"count\" : 100 }","title":"list_sensors"},{"location":"API/Devices/#list_devices","text":"Return a list of devices. Route: /api/v0/devices Input: order: How to order the output, default is by hostname. Can be prepended by DESC or ASC to change the order. type: can be one of the following to filter or search by: all: All devices active: Only not ignored and not disabled devices ignored: Only ignored devices up: Only devices that are up down: Only devices that are down disabled: Disabled devices os: search by os type mac: search by mac address ipv4: search by IPv4 address ipv6: search by IPv6 address (compressed or uncompressed) location: search by location location_id: serach by locaiton_id hostname: search by hostname sysName: search by sysName display: search by display name device_id: exact match by device-id type: search by device type query: If searching by, then this will be used as the input. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices?order=hostname%20DESC&type=down Output: { \"status\" : \"ok\" , \"count\" : 1 , \"devices\" : [ { \"device_id\" : \"1\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } ] } Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices?type=mac&query=00000c9ff013 Output: { \"status\" : \"ok\" , \"count\" : 1 , \"devices\" : [ { \"device_id\" : \"1\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } ] }","title":"list_devices"},{"location":"API/Devices/#maintenance_device","text":"Set a device into maintenance mode. Route: /api/v0/devices/:hostname/maintenance Input (JSON): title : optional - Some title for the Maintenance Will be replaced with hostname if omitted notes : optional - Some description for the Maintenance Will also be added to device notes if user prefs \"Add schedule notes to devices notes\" is set start : optional - start time of Maintenance in full format Y-m-d H:i:00 eg: 2022-08-01 22:45:00 Current system time now() will be used if omitted duration : required - Duration of Maintenance in format H:i / Hrs:Mins eg: 02:00 Example with start time: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devices/localhost/maintenance/ \\ --data-raw ' \"title\":\"Device Maintenance\", \"notes\":\"A 2 hour Maintenance triggered via API with start time\", \"start\":\"2022-08-01 08:00:00\", \"duration\":\"2:00\" } ' Output: { \"status\" : \"ok\" , \"message\" : \"Device localhost (1) will begin maintenance mode at 2022-08-01 22:45:00 for 2:00h\" } Example with no start time: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST https://librenms.org/api/v0/devices/localhost/maintenance/ \\ --data-raw ' \"title\":\"Device Maintenance\", \"notes\":\"A 2 hour Maintenance triggered via API with no start time\", \"duration\":\"2:00\" } ' Output: { \"status\" : \"ok\" , \"message\" : \"Device localhost (1) moved into maintenance mode for 2:00h\" }","title":"maintenance_device"},{"location":"API/Devices/#add_device","text":"Add a new device. Most fields are optional. You may omit snmp credentials to attempt each system credential in order. See snmp.version, snmp.community, and snmp.v3 To guarantee device is added, use force_add. This will skip checks for duplicate device and snmp reachability, but not duplicate hostname. Route: /api/v0/devices Input (JSON): Fields: hostname (required): device hostname or IP display: A string to display as the name of this device, defaults to hostname (or device_display_default setting). May be a simple template using replacements: {{ $hostname }}, {{ $sysName }}, {{ $sysName_fallback }}, {{ $ip }} snmpver: SNMP version to use, v1, v2c or v3. During checks detection order is v2c,v3,v1 port: SNMP port (defaults to port defined in config). transport: SNMP protocol (udp,tcp,udp6,tcp6) Defaults to transport defined in config. port_association_mode: method to identify ports: ifIndex (default), ifName, ifDescr, ifAlias poller_group: This is the poller_group id used for distributed poller setup. Defaults to 0. location or location_id: set the location by text or location id Options: force_add: Skip all checks and attempts to detect credentials. Add the device as given directly to the database. ping_fallback: if snmp checks fail, add the device as ping only instead of failing SNMP v1 or v2c credentials: community: Required for SNMP v1 or v2c. SNMP v3 credentials: authlevel: SNMP authlevel (noAuthNoPriv, authNoPriv, authPriv). authname: SNMP Auth username authpass: SNMP Auth password authalgo: SNMP Auth algorithm (MD5, SHA) (SHA-224, SHA-256, SHA-384, SHA-512 if supported by your server) cryptopass: SNMP Crypto Password cryptoalgo: SNMP Crypto algorithm (AES, DES) For ICMP only: snmp_disable: set to true for ICMP only. Disables SNMP checks and polling. os: OS short name for the device (defaults to ping). sysName: sysName for the device. hardware: Device hardware. Example: curl -X POST -d '{\"hostname\":\"localhost.localdomain\",\"version\":\"v1\",\"community\":\"public\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices Output: { \"status\" : \"ok\" , \"message\" : \"Device localhost.localdomain (57) has been added successfully\" , \"devices\" : [ { \"device_id\" : \"57\" , \"hostname\" : \"localhost\" , ... \"serial\" : null , \"icon\" : null } }","title":"add_device"},{"location":"API/Devices/#list_oxidized","text":"List devices for use with Oxidized. If you have group support enabled then a group will also be returned based on your config. LibreNMS will automatically map the OS to the Oxidized model name if they don't match. Route: /api/v0/oxidized(/:hostname) Input (JSON): - Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/oxidized Output: [ { \"hostname\" : \"localhost\" , \"os\" : \"linux\" }, { \"hostname\" : \"otherserver\" , \"os\" : \"linux\" } ]","title":"list_oxidized"},{"location":"API/Devices/#update_device_field","text":"Update devices field in the database. Route: /api/v0/devices/:hostname hostname can be either the device hostname or id Input (JSON): field: The column name within the database (can be an array of fields) data: The data to update the column with (can be an array of data)) Examples: curl -X PATCH -d '{\"field\": \"notes\", \"data\": \"This server should be kept online\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost Output: [ { \"status\" : \"ok\" , \"message\" : \"Device notes has been updated\" } ]","title":"update_device_field"},{"location":"API/Devices/#update_device_port_notes","text":"Update a device port notes field in the devices_attrs database. Route: /api/v0/devices/:hostname/port/:portid hostname can be either the device hostname or id portid needs to be the port unique id (int). Input (JSON): - notes: The string data to populate on the port notes field. Examples: curl -X PATCH -d '{\"notes\": \"This port is in a scheduled maintenance with the provider.\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/port/5 Output: [ { \"status\" : \"ok\" , \"message\" : \"Port notes field has been updated\" } ] curl -X PATCH -d '{\"field\": [\"notes\",\"purpose\"], \"data\": [\"This server should be kept online\", \"For serving web traffic\"]}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost Output: [ { \"status\" : \"ok\" , \"message\" : \"Device fields have been updated\" } ]","title":"update_device_port_notes"},{"location":"API/Devices/#rename_device","text":"Rename device. Route: /api/v0/devices/:hostname/rename/:new_hostname hostname can be either the device hostname or id Input: - Examples: curl -X PATCH -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/rename/localhost2 Output: [ { \"status\" : \"ok\" , \"message\" : \"Device has been renamed\" } ]","title":"rename_device"},{"location":"API/Devices/#get_device_groups","text":"List the device groups that a device is matched on. Route: /api/v0/devices/:hostname/groups hostname can be either the device hostname or id Input (JSON): - Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/groups Output: [ { \"status\" : \"ok\" , \"message\" : \"Found 1 device groups\" , \"count\" : 1 , \"groups\" : [ { \"id\" : \"1\" , \"name\" : \"Testing\" , \"desc\" : \"Testing\" , \"pattern\" : \"%devices.status = \\\"1\\\" &&\" } ] } ]","title":"get_device_groups"},{"location":"API/Devices/#search_oxidized","text":"search all oxidized device configs for a string. Route: api/v0/oxidized/config/search/:searchstring searchstring is the specific string you would like to search for. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/oxidized/config/search/vlan10 Output: { \"status\" : \"ok\" , \"nodes\" : [ { \"node\" : \"asr9k.librenms.org\" , \"full_name\" : \"cisco\\/ASR9K.Librenms.org\" }, { \"node\" : \"ios.Librenms.org\" , \"full_name\" : \"cisco\\/ios.Librenms.org\" } ], \"count\" : 2 }","title":"search_oxidized"},{"location":"API/Devices/#get_oxidized_config","text":"Returns a specific device's config from oxidized. Route: api/v0/oxidized/config/:hostname hostname is the Hostname or IP of the device used when adding the device to librenms. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/oxidized/config/router.corp.com Output: { \"status\" : \"ok\" , \"config\" : \"DEVICE CONFIG HERE\" }","title":"get_oxidized_config"},{"location":"API/Devices/#add_parents_to_host","text":"Add one or more parents to a host. Route: /api/v0/devices/:device/parents Input (JSON): parent_ids: one or more parent ids or hostnames Example: curl -X POST -d '{\"parent_ids\":\"15,16,17\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/1/parents Output: { \"status\" : \"ok\" , \"message\" : \"Device dependencies have been saved\" }","title":"add_parents_to_host"},{"location":"API/Devices/#delete_parents_from_host","text":"Deletes some or all the parents from a host. Route: /api/v0/devices/:device/parents Input (JSON): parent_ids: One or more parent ids or hostnames, if not specified deletes all parents from host. Example: curl -X DELETE -d '{\"parent_ids\":\"15,16,17\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/1/parents Output: { \"status\" : \"ok\" , \"message\" : \"All device dependencies have been removed\" }","title":"delete_parents_from_host"},{"location":"API/Devices/#list_parents_of_host","text":"This is not a seperate API call. Instead, you obtain the list of parents from list_devices . See that entry point for more detailed information. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' 'http://librenms.org/api/v0/devices?type=device_id&query=34' Output: { \"status\" : \"ok\" , \"devices\" : [ { ... \"dependency_parent_id\" : \"98,99\" , \"dependency_parent_hostname\" : \"HOSTNAME1,HOSTNAME2\" , ... } ], \"count\" : 1 }","title":"list_parents_of_host"},{"location":"API/Inventory/","text":"get_inventory Retrieve the inventory for a device. If you call this without any parameters then you will only get part of the inventory. This is because a lot of devices nest each component, for instance you may initially have the chassis, within this the ports - 1 being an sfp cage, then the sfp itself. The way this API call is designed is to enable a recursive lookup. The first call will retrieve the root entry, included within this response will be entPhysicalIndex, you can then call for entPhysicalContainedIn which will then return the next layer of results. To retrieve all items together, see get_inventory_for_device . Route: /api/v0/inventory/:hostname hostname can be either the device hostname or the device id Input: entPhysicalClass: This is used to restrict the class of the inventory, for example you can specify chassis to only return items in the inventory that are labelled as chassis. entPhysicalContainedIn: This is used to retrieve items within the inventory assigned to a previous component, for example specifying the chassis (entPhysicalIndex) will retrieve all items where the chassis is the parent. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/inventory/localhost?entPhysicalContainedIn=65536 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"inventory\" : [ { \"entPhysical_id\" : \"2\" , \"device_id\" : \"32\" , \"entPhysicalIndex\" : \"262145\" , \"entPhysicalDescr\" : \"Linux 3.3.5 ehci_hcd RB400 EHCI\" , \"entPhysicalClass\" : \"unknown\" , \"entPhysicalName\" : \"1:1\" , \"entPhysicalHardwareRev\" : \"\" , \"entPhysicalFirmwareRev\" : \"\" , \"entPhysicalSoftwareRev\" : \"\" , \"entPhysicalAlias\" : \"\" , \"entPhysicalAssetID\" : \"\" , \"entPhysicalIsFRU\" : \"false\" , \"entPhysicalModelName\" : \"0x0002\" , \"entPhysicalVendorType\" : \"zeroDotZero\" , \"entPhysicalSerialNum\" : \"rb400_usb\" , \"entPhysicalContainedIn\" : \"65536\" , \"entPhysicalParentRelPos\" : \"-1\" , \"entPhysicalMfgName\" : \"0x1d6b\" , \"ifIndex\" : \"0\" } ] } get_inventory_for_device Retrieve the flattened inventory for a device. This retrieves all inventory items for a device regardless of their structure, and may be more useful for devices with with nested components. Route: /api/v0/inventory/:hostname/all hostname can be either the device hostname or the device id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/inventory/localhost?entPhysicalContainedIn=65536 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"inventory\" : [ { \"entPhysical_id\" : \"2\" , \"device_id\" : \"32\" , \"entPhysicalIndex\" : \"262145\" , \"entPhysicalDescr\" : \"Linux 3.3.5 ehci_hcd RB400 EHCI\" , \"entPhysicalClass\" : \"unknown\" , \"entPhysicalName\" : \"1:1\" , \"entPhysicalHardwareRev\" : \"\" , \"entPhysicalFirmwareRev\" : \"\" , \"entPhysicalSoftwareRev\" : \"\" , \"entPhysicalAlias\" : \"\" , \"entPhysicalAssetID\" : \"\" , \"entPhysicalIsFRU\" : \"false\" , \"entPhysicalModelName\" : \"0x0002\" , \"entPhysicalVendorType\" : \"zeroDotZero\" , \"entPhysicalSerialNum\" : \"rb400_usb\" , \"entPhysicalContainedIn\" : \"65536\" , \"entPhysicalParentRelPos\" : \"-1\" , \"entPhysicalMfgName\" : \"0x1d6b\" , \"ifIndex\" : \"0\" } ] }","title":"Inventory"},{"location":"API/Inventory/#get_inventory","text":"Retrieve the inventory for a device. If you call this without any parameters then you will only get part of the inventory. This is because a lot of devices nest each component, for instance you may initially have the chassis, within this the ports - 1 being an sfp cage, then the sfp itself. The way this API call is designed is to enable a recursive lookup. The first call will retrieve the root entry, included within this response will be entPhysicalIndex, you can then call for entPhysicalContainedIn which will then return the next layer of results. To retrieve all items together, see get_inventory_for_device . Route: /api/v0/inventory/:hostname hostname can be either the device hostname or the device id Input: entPhysicalClass: This is used to restrict the class of the inventory, for example you can specify chassis to only return items in the inventory that are labelled as chassis. entPhysicalContainedIn: This is used to retrieve items within the inventory assigned to a previous component, for example specifying the chassis (entPhysicalIndex) will retrieve all items where the chassis is the parent. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/inventory/localhost?entPhysicalContainedIn=65536 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"inventory\" : [ { \"entPhysical_id\" : \"2\" , \"device_id\" : \"32\" , \"entPhysicalIndex\" : \"262145\" , \"entPhysicalDescr\" : \"Linux 3.3.5 ehci_hcd RB400 EHCI\" , \"entPhysicalClass\" : \"unknown\" , \"entPhysicalName\" : \"1:1\" , \"entPhysicalHardwareRev\" : \"\" , \"entPhysicalFirmwareRev\" : \"\" , \"entPhysicalSoftwareRev\" : \"\" , \"entPhysicalAlias\" : \"\" , \"entPhysicalAssetID\" : \"\" , \"entPhysicalIsFRU\" : \"false\" , \"entPhysicalModelName\" : \"0x0002\" , \"entPhysicalVendorType\" : \"zeroDotZero\" , \"entPhysicalSerialNum\" : \"rb400_usb\" , \"entPhysicalContainedIn\" : \"65536\" , \"entPhysicalParentRelPos\" : \"-1\" , \"entPhysicalMfgName\" : \"0x1d6b\" , \"ifIndex\" : \"0\" } ] }","title":"get_inventory"},{"location":"API/Inventory/#get_inventory_for_device","text":"Retrieve the flattened inventory for a device. This retrieves all inventory items for a device regardless of their structure, and may be more useful for devices with with nested components. Route: /api/v0/inventory/:hostname/all hostname can be either the device hostname or the device id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/inventory/localhost?entPhysicalContainedIn=65536 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"inventory\" : [ { \"entPhysical_id\" : \"2\" , \"device_id\" : \"32\" , \"entPhysicalIndex\" : \"262145\" , \"entPhysicalDescr\" : \"Linux 3.3.5 ehci_hcd RB400 EHCI\" , \"entPhysicalClass\" : \"unknown\" , \"entPhysicalName\" : \"1:1\" , \"entPhysicalHardwareRev\" : \"\" , \"entPhysicalFirmwareRev\" : \"\" , \"entPhysicalSoftwareRev\" : \"\" , \"entPhysicalAlias\" : \"\" , \"entPhysicalAssetID\" : \"\" , \"entPhysicalIsFRU\" : \"false\" , \"entPhysicalModelName\" : \"0x0002\" , \"entPhysicalVendorType\" : \"zeroDotZero\" , \"entPhysicalSerialNum\" : \"rb400_usb\" , \"entPhysicalContainedIn\" : \"65536\" , \"entPhysicalParentRelPos\" : \"-1\" , \"entPhysicalMfgName\" : \"0x1d6b\" , \"ifIndex\" : \"0\" } ] }","title":"get_inventory_for_device"},{"location":"API/Locations/","text":"list_locations Return a list of locations. Route: /api/v0/resources/locations Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/locations Output: { \"status\" : \"ok\" , \"locations\" : [ { \"id\" : \"1\" , \"location\" : \"Example location, Example city, Example Country\" , \"lat\" : \"-18.911436\" , \"lng\" : \"47.517446\" , \"timestamp\" : \"2017-04-01 02:40:05\" }, ... ], \"count\" : 100 } add_location Add a new location Route: /api/v0/locations/ Input: location: name of the new location lat: latitude lng: longitude fixed_coordinates: 0 if updated from the device or 1 if the coordinate is fixed (default is fixed if lat and lng are valid) Example: curl -X POST -d '{\"location\":\"Google\", \"lat\":\"37.4220041\",\"lng\":\"-122.0862462\"}' -H 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/locations Output: { \"status\" : \"ok\" , \"message\" : \"Location added with id #45\" } delete_location Deletes an existing location Route: /api/v0/locations/:location location: name or id of the location to delete Example: curl -X DELETE -H 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/locations/Google Output: { \"status\" : \"ok\" , \"message\" : \"Location Google has been deleted successfully\" } edit_location Edits a location Route: /api/v0/locations/:location location: name or id of the location to edit Input: lat: latitude lng: longitude Example: curl -X PATCH -d '{\"lng\":\"100.0862462\"}' -H 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/locations/Google Output: { \"status\" : \"ok\" , \"message\" : \"Location updated successfully\" } get_location Gets a specific location Route: /api/v0/location/:location location: name or id of the location to get Output: { \"status\" : \"ok\" , \"get_location\" : [ { \"id\" : 1 , \"location\" : \"TEST\" , \"lat\" : 00.000000 , \"lng\" : 00.000000 , \"timestamp\" : \"2023-01-01 00:00:00\" , \"fixed_coordinates\" : 1 } ], \"count\" : 1 }","title":"Locations"},{"location":"API/Locations/#list_locations","text":"Return a list of locations. Route: /api/v0/resources/locations Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/locations Output: { \"status\" : \"ok\" , \"locations\" : [ { \"id\" : \"1\" , \"location\" : \"Example location, Example city, Example Country\" , \"lat\" : \"-18.911436\" , \"lng\" : \"47.517446\" , \"timestamp\" : \"2017-04-01 02:40:05\" }, ... ], \"count\" : 100 }","title":"list_locations"},{"location":"API/Locations/#add_location","text":"Add a new location Route: /api/v0/locations/ Input: location: name of the new location lat: latitude lng: longitude fixed_coordinates: 0 if updated from the device or 1 if the coordinate is fixed (default is fixed if lat and lng are valid) Example: curl -X POST -d '{\"location\":\"Google\", \"lat\":\"37.4220041\",\"lng\":\"-122.0862462\"}' -H 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/locations Output: { \"status\" : \"ok\" , \"message\" : \"Location added with id #45\" }","title":"add_location"},{"location":"API/Locations/#delete_location","text":"Deletes an existing location Route: /api/v0/locations/:location location: name or id of the location to delete Example: curl -X DELETE -H 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/locations/Google Output: { \"status\" : \"ok\" , \"message\" : \"Location Google has been deleted successfully\" }","title":"delete_location"},{"location":"API/Locations/#edit_location","text":"Edits a location Route: /api/v0/locations/:location location: name or id of the location to edit Input: lat: latitude lng: longitude Example: curl -X PATCH -d '{\"lng\":\"100.0862462\"}' -H 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/locations/Google Output: { \"status\" : \"ok\" , \"message\" : \"Location updated successfully\" }","title":"edit_location"},{"location":"API/Locations/#get_location","text":"Gets a specific location Route: /api/v0/location/:location location: name or id of the location to get Output: { \"status\" : \"ok\" , \"get_location\" : [ { \"id\" : 1 , \"location\" : \"TEST\" , \"lat\" : 00.000000 , \"lng\" : 00.000000 , \"timestamp\" : \"2023-01-01 00:00:00\" , \"fixed_coordinates\" : 1 } ], \"count\" : 1 }","title":"get_location"},{"location":"API/Logs/","text":"All the list_*logs calls are aliased to list_logs . Retrieve all logs or logs for a specific device. id or hostname is the specific device Input: start: The page number to request. limit: The limit of results to be returned. from: The date and time or the event id to search from. to: The data and time or the event id to search to. list_eventlog Route: /api/v0/logs/eventlog/:hostname list_syslog Route: /api/v0/logs/syslog/:hostname list_alertlog Route: /api/v0/logs/alertlog/:hostname list_authlog Route: /api/v0/logs/authlog/:hostname Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/eventlog/:hostname curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/syslog/:hostname?limit=20 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/eventlog/:hostname?limit=20&start=5&from=2017-07-22%2023:00:00 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/eventlog/:hostname?sortorder=DESC Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 5 , \"total\" : \"15\" , \"logs\" : [ { \"hostname\" : \"localhost\" , \"sysName\" : \"web01.1.novalocal\" , \"event_id\" : \"10050349\" , \"host\" : \"279\" , \"device_id\" : \"279\" , \"datetime\" : \"2017-07-22 19:57:47\" , \"message\" : \"ifAlias: -> \" , \"type\" : \"interface\" , \"reference\" : \"NULL\" , \"username\" : \"\" , \"severity\" : \"3\" }, .... { \"hostname\" : \"localhost\" , \"sysName\" : \"web01.1.novalocal\" , \"event_id\" : \"10050353\" , \"host\" : \"279\" , \"device_id\" : \"279\" , \"datetime\" : \"2017-07-22 19:57:47\" , \"message\" : \"ifHighSpeed: -> 0\" , \"type\" : \"interface\" , \"reference\" : \"NULL\" , \"username\" : \"\" , \"severity\" : \"3\" } ] } syslogsink Route: /api/v0/logs/syslogsink Accept any json messages and passes to further syslog processing. single messages or an array of multiple messages is accepted. see Syslog for more details and logstash integration Example curl -L -X POST 'https://sink.librenms.org/api/v0/syslogsink/' -H 'X-Auth-Token: xxxxxxxLibreNMSApiToken' --data-raw '[ { \"msg\": \"kernel: minimum Message\", \"host\": \"mydevice.fqdn.com\" }, { \"msg\": \"Line protocol on Interface GigabitEthernet1/0/41, changed state to up\", \"facility\": 23, \"priority\": \"189\", \"program\": \"LINEPROTO-5-UPDOWN\", \"host\": \"172.29.10.24\", \"@timestamp\": \"2022-12-01T20:14:28.257Z\", \"severity\": 5, \"level\": \"ERROR\" }, { \"msg\": \"kernel: a unknown host\", \"host\": \"unknown.fqdn.com\" } ]'","title":"Logs"},{"location":"API/Logs/#list_eventlog","text":"Route: /api/v0/logs/eventlog/:hostname","title":"list_eventlog"},{"location":"API/Logs/#list_syslog","text":"Route: /api/v0/logs/syslog/:hostname","title":"list_syslog"},{"location":"API/Logs/#list_alertlog","text":"Route: /api/v0/logs/alertlog/:hostname","title":"list_alertlog"},{"location":"API/Logs/#list_authlog","text":"Route: /api/v0/logs/authlog/:hostname Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/eventlog/:hostname curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/syslog/:hostname?limit=20 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/eventlog/:hostname?limit=20&start=5&from=2017-07-22%2023:00:00 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/logs/eventlog/:hostname?sortorder=DESC Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 5 , \"total\" : \"15\" , \"logs\" : [ { \"hostname\" : \"localhost\" , \"sysName\" : \"web01.1.novalocal\" , \"event_id\" : \"10050349\" , \"host\" : \"279\" , \"device_id\" : \"279\" , \"datetime\" : \"2017-07-22 19:57:47\" , \"message\" : \"ifAlias: -> \" , \"type\" : \"interface\" , \"reference\" : \"NULL\" , \"username\" : \"\" , \"severity\" : \"3\" }, .... { \"hostname\" : \"localhost\" , \"sysName\" : \"web01.1.novalocal\" , \"event_id\" : \"10050353\" , \"host\" : \"279\" , \"device_id\" : \"279\" , \"datetime\" : \"2017-07-22 19:57:47\" , \"message\" : \"ifHighSpeed: -> 0\" , \"type\" : \"interface\" , \"reference\" : \"NULL\" , \"username\" : \"\" , \"severity\" : \"3\" } ] }","title":"list_authlog"},{"location":"API/Logs/#syslogsink","text":"Route: /api/v0/logs/syslogsink Accept any json messages and passes to further syslog processing. single messages or an array of multiple messages is accepted. see Syslog for more details and logstash integration Example curl -L -X POST 'https://sink.librenms.org/api/v0/syslogsink/' -H 'X-Auth-Token: xxxxxxxLibreNMSApiToken' --data-raw '[ { \"msg\": \"kernel: minimum Message\", \"host\": \"mydevice.fqdn.com\" }, { \"msg\": \"Line protocol on Interface GigabitEthernet1/0/41, changed state to up\", \"facility\": 23, \"priority\": \"189\", \"program\": \"LINEPROTO-5-UPDOWN\", \"host\": \"172.29.10.24\", \"@timestamp\": \"2022-12-01T20:14:28.257Z\", \"severity\": 5, \"level\": \"ERROR\" }, { \"msg\": \"kernel: a unknown host\", \"host\": \"unknown.fqdn.com\" } ]'","title":"syslogsink"},{"location":"API/PollerGroups/","text":"get_poller_group Gets a specific poller group or all if none is specified Route: /api/v0/poller_group/:poller_group poller_group: optional name or id of the poller group to get Output: { \"status\" : \"ok\" , \"get_poller_group\" : [ { \"id\" : 1 , \"group_name\" : \"test\" , \"descr\" : \"test group\" } ], \"count\" : 1 }","title":"PollerGroups"},{"location":"API/PollerGroups/#get_poller_group","text":"Gets a specific poller group or all if none is specified Route: /api/v0/poller_group/:poller_group poller_group: optional name or id of the poller group to get Output: { \"status\" : \"ok\" , \"get_poller_group\" : [ { \"id\" : 1 , \"group_name\" : \"test\" , \"descr\" : \"test group\" } ], \"count\" : 1 }","title":"get_poller_group"},{"location":"API/PortGroups/","text":"get_graph_by_portgroup Get the graph based on the group type. Route: /api/v0/portgroups/:group group is the type of port group graph you want, I.e Transit, Peering, etc. You can specify multiple types comma separated. Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/portgroups/transit,peering Output: Output is an image. get_graph_by_portgroup_multiport_bits Get the graph based on the multiple port id separated by commas , . Route: /api/v0/portgroups/multiport/bits/:id id is a comma separated list of port ids you want, I.e 1,2,3,4, etc. You can specify multiple IDs comma separated. Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/portgroups/multiport/bits/1,2,3 Output: Output is an image.","title":"PortGroups"},{"location":"API/PortGroups/#get_graph_by_portgroup","text":"Get the graph based on the group type. Route: /api/v0/portgroups/:group group is the type of port group graph you want, I.e Transit, Peering, etc. You can specify multiple types comma separated. Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/portgroups/transit,peering Output: Output is an image.","title":"get_graph_by_portgroup"},{"location":"API/PortGroups/#get_graph_by_portgroup_multiport_bits","text":"Get the graph based on the multiple port id separated by commas , . Route: /api/v0/portgroups/multiport/bits/:id id is a comma separated list of port ids you want, I.e 1,2,3,4, etc. You can specify multiple IDs comma separated. Input: from: This is the date you would like the graph to start - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. to: This is the date you would like the graph to end - See http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html for more information. width: The graph width, defaults to 1075. height: The graph height, defaults to 300. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/portgroups/multiport/bits/1,2,3 Output: Output is an image.","title":"get_graph_by_portgroup_multiport_bits"},{"location":"API/Port_Groups/","text":"get_port_groups List all port groups. Route: /api/v0/port_groups Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/port_groups Output: [ { \"status\" : \"ok\" , \"message\" : \"Found 1 port groups\" , \"count\" : 1 , \"groups\" : [ { \"id\" : \"1\" , \"name\" : \"Testing\" , \"desc\" : \"Testing\" } ] } ] get_ports_by_group List all ports matching the group provided. Route: /api/v0/port_groups/:name name Is the name of the port group which can be obtained using get_port_groups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Params: full: set to any value to return all data for the devices in a given group Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/port_groups/Billable Output: { \"status\" : \"ok\" , \"ports\" : [ { \"port_id\" : 1376 }, { \"port_id\" : 2376 } ], \"count\" : 2 } add_port_group Add a new port group. Upon success, the ID of the new port group is returned and the HTTP response code is 201 . Route: /api/v0/port_groups Input (JSON): name : required - The name of the port group desc : optional - Description of the port group Examples: Dynamic Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST \\ -d '{\"name\": \"New Port Group\", \\ \"desc\": \"A very fancy port group\"}' \\ https://librenms.org/api/v0/port_groups Output: { \"status\" : \"ok\" , \"id\" : 86 , \"message\" : \"Port group New Port Group created\" } assign_port_group Assign a Port Group to a list of Ports Route: /api/v0/port_groups/:port_group_id/assign Input (JSON): port_ids : required - List of Port Ids Examples: Dynamic Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' -X POST -d '{\"port_ids\": [\"4\",\"34\",\"25,\"983\"]}' https://librenms.org/api/v0/port_groups/3/assign Output: { \"status\" : \"ok\" , \"Port Ids 4, 34, 25, 983 have been added to Port Group Id 3\" : 200 } remove_port_group Remove a Port Group from a list of Ports Route: /api/v0/port_groups/:port_group_id/remove Input (JSON): port_ids : required - List of Port Ids Examples: Dynamic Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' -X POST -d '{\"port_ids\": [\"4\",\"34\",\"25,\"983\"]}' https://librenms.org/api/v0/port_groups/3/remove Output: { \"status\" : \"ok\" , \"Port Ids 4, 34, 25, 983 have been removed from Port Group Id 3\" : 200 }","title":"Port_Groups"},{"location":"API/Port_Groups/#get_port_groups","text":"List all port groups. Route: /api/v0/port_groups Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/port_groups Output: [ { \"status\" : \"ok\" , \"message\" : \"Found 1 port groups\" , \"count\" : 1 , \"groups\" : [ { \"id\" : \"1\" , \"name\" : \"Testing\" , \"desc\" : \"Testing\" } ] } ]","title":"get_port_groups"},{"location":"API/Port_Groups/#get_ports_by_group","text":"List all ports matching the group provided. Route: /api/v0/port_groups/:name name Is the name of the port group which can be obtained using get_port_groups . Please ensure that the name is urlencoded if it needs to be (i.e Linux Servers would need to be urlencoded. Params: full: set to any value to return all data for the devices in a given group Examples: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/port_groups/Billable Output: { \"status\" : \"ok\" , \"ports\" : [ { \"port_id\" : 1376 }, { \"port_id\" : 2376 } ], \"count\" : 2 }","title":"get_ports_by_group"},{"location":"API/Port_Groups/#add_port_group","text":"Add a new port group. Upon success, the ID of the new port group is returned and the HTTP response code is 201 . Route: /api/v0/port_groups Input (JSON): name : required - The name of the port group desc : optional - Description of the port group Examples: Dynamic Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' \\ -X POST \\ -d '{\"name\": \"New Port Group\", \\ \"desc\": \"A very fancy port group\"}' \\ https://librenms.org/api/v0/port_groups Output: { \"status\" : \"ok\" , \"id\" : 86 , \"message\" : \"Port group New Port Group created\" }","title":"add_port_group"},{"location":"API/Port_Groups/#assign_port_group","text":"Assign a Port Group to a list of Ports Route: /api/v0/port_groups/:port_group_id/assign Input (JSON): port_ids : required - List of Port Ids Examples: Dynamic Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' -X POST -d '{\"port_ids\": [\"4\",\"34\",\"25,\"983\"]}' https://librenms.org/api/v0/port_groups/3/assign Output: { \"status\" : \"ok\" , \"Port Ids 4, 34, 25, 983 have been added to Port Group Id 3\" : 200 }","title":"assign_port_group"},{"location":"API/Port_Groups/#remove_port_group","text":"Remove a Port Group from a list of Ports Route: /api/v0/port_groups/:port_group_id/remove Input (JSON): port_ids : required - List of Port Ids Examples: Dynamic Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' -X POST -d '{\"port_ids\": [\"4\",\"34\",\"25,\"983\"]}' https://librenms.org/api/v0/port_groups/3/remove Output: { \"status\" : \"ok\" , \"Port Ids 4, 34, 25, 983 have been removed from Port Group Id 3\" : 200 }","title":"remove_port_group"},{"location":"API/Ports/","text":"get_all_ports Get info for all ports on all devices. Strongly recommend that you use the columns parameter to avoid pulling too much data. Route: /api/v0/ports - Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports?columns=ifName%2Cport_id Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"ports\" : [ { \"ifName\" : \"Gi0/0/0\" , \"port_id\" : \"1\" }, { \"ifName\" : \"Gi0/0/1\" , \"port_id\" : \"2\" }, ... { \"ifName\" : \"Vlan 3615\" , \"port_id\" : \"5488\" } ] } search_ports Search for ports matching the query. Route: /api/v0/ports/search/:search search string to search in fields: ifAlias, ifDescr, and ifName Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/search/lo Output: { \"status\" : \"ok\" , \"ports\" : [ { \"device_id\" : 1 , \"port_id\" : 1 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" }, { \"device_id\" : 2 , \"port_id\" : 3 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" }, { \"device_id\" : 3 , \"port_id\" : 5 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" } ] } search_ports in specific field(s) Specific search for ports matching the query. Route: /api/v0/ports/search/:field/:search field: comma separated list of field(s) to search search: string to search in fields Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/search/ifName/lo Output: { \"status\" : \"ok\" , \"ports\" : [ { \"device_id\" : 1 , \"port_id\" : 1 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" }, { \"device_id\" : 2 , \"port_id\" : 3 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" }, { \"device_id\" : 3 , \"port_id\" : 5 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" } ] } ports_with_associated_mac Search for ports matching the search mac. Route: /api/v0/ports/mac/:search?filter=first search a mac address in fdb and print the ports ordered by the mac count of the associated port. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/mac/00:11:22:33:44:55 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/mac/001122.334455?filter=first curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/mac/001122334455?filter=first Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"port\" : [ { \"port_id\" : \"323\" , \"device_id\" : \"55\" , \"port_descr_type\" : null , \"port_descr_descr\" : null , \"port_descr_circuit\" : null , \"port_descr_speed\" : null , \"port_descr_notes\" : null , \"ifDescr\" : \"GigabitEthernet0/0/0\" , \"ifName\" : \"Gi0/0/0\" , \"portName\" : null , \"ifIndex\" : \"1\" , \"ifSpeed\" : \"1000000000\" , \"ifConnectorPresent\" : \"true\" , \"ifPromiscuousMode\" : \"false\" , \"ifHighSpeed\" : \"1000\" , \"ifOperStatus\" : \"up\" , \"ifOperStatus_prev\" : null , \"ifAdminStatus\" : \"up\" , \"ifAdminStatus_prev\" : null , \"ifDuplex\" : \"fullDuplex\" , \"ifMtu\" : \"1560\" , \"ifType\" : \"ethernetCsmacd\" , \"ifAlias\" : \"ASR Interconnect Trunk\" , \"ifPhysAddress\" : \"84bf20853e00\" , \"ifHardType\" : null , \"ifLastChange\" : \"42407358\" , \"ifVlan\" : \"\" , \"ifTrunk\" : \"\" , \"ifVrf\" : \"0\" , \"counter_in\" : null , \"counter_out\" : null , \"ignore\" : \"0\" , \"disabled\" : \"0\" , \"detailed\" : \"0\" , \"deleted\" : \"0\" , \"pagpOperationMode\" : null , \"pagpPortState\" : null , \"pagpPartnerDeviceId\" : null , \"pagpPartnerLearnMethod\" : null , \"pagpPartnerIfIndex\" : null , \"pagpPartnerGroupIfIndex\" : null , \"pagpPartnerDeviceName\" : null , \"pagpEthcOperationMode\" : null , \"pagpDeviceId\" : null , \"pagpGroupIfIndex\" : null , \"ifInUcastPkts\" : \"128518576\" , \"ifInUcastPkts_prev\" : \"128517284\" , \"ifInUcastPkts_delta\" : \"1292\" , \"ifInUcastPkts_rate\" : \"4\" , \"ifOutUcastPkts\" : \"128510560\" , \"ifOutUcastPkts_prev\" : \"128509268\" , \"ifOutUcastPkts_delta\" : \"1292\" , \"ifOutUcastPkts_rate\" : \"4\" , \"ifInErrors\" : \"0\" , \"ifInErrors_prev\" : \"0\" , \"ifInErrors_delta\" : \"0\" , \"ifInErrors_rate\" : \"0\" , \"ifOutErrors\" : \"0\" , \"ifOutErrors_prev\" : \"0\" , \"ifOutErrors_delta\" : \"0\" , \"ifOutErrors_rate\" : \"0\" , \"ifInOctets\" : \"12827393730\" , \"ifInOctets_prev\" : \"12827276736\" , \"ifInOctets_delta\" : \"116994\" , \"ifInOctets_rate\" : \"387\" , \"ifOutOctets\" : \"14957481766\" , \"ifOutOctets_prev\" : \"14957301765\" , \"ifOutOctets_delta\" : \"180001\" , \"ifOutOctets_rate\" : \"596\" , \"poll_time\" : \"1483779150\" , \"poll_prev\" : \"1483778848\" , \"poll_period\" : \"302\" } ] } get_port_info Get all info for a particular port. Route: /api/v0/ports/:portid portid must be an integer Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/323 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"port\" : [ { \"port_id\" : \"323\" , \"device_id\" : \"55\" , \"port_descr_type\" : null , \"port_descr_descr\" : null , \"port_descr_circuit\" : null , \"port_descr_speed\" : null , \"port_descr_notes\" : null , \"ifDescr\" : \"GigabitEthernet0/0/0\" , \"ifName\" : \"Gi0/0/0\" , \"portName\" : null , \"ifIndex\" : \"1\" , \"ifSpeed\" : \"1000000000\" , \"ifConnectorPresent\" : \"true\" , \"ifPromiscuousMode\" : \"false\" , \"ifHighSpeed\" : \"1000\" , \"ifOperStatus\" : \"up\" , \"ifOperStatus_prev\" : null , \"ifAdminStatus\" : \"up\" , \"ifAdminStatus_prev\" : null , \"ifDuplex\" : \"fullDuplex\" , \"ifMtu\" : \"1560\" , \"ifType\" : \"ethernetCsmacd\" , \"ifAlias\" : \"ASR Interconnect Trunk\" , \"ifPhysAddress\" : \"84bf20853e00\" , \"ifHardType\" : null , \"ifLastChange\" : \"42407358\" , \"ifVlan\" : \"\" , \"ifTrunk\" : \"\" , \"ifVrf\" : \"0\" , \"counter_in\" : null , \"counter_out\" : null , \"ignore\" : \"0\" , \"disabled\" : \"0\" , \"detailed\" : \"0\" , \"deleted\" : \"0\" , \"pagpOperationMode\" : null , \"pagpPortState\" : null , \"pagpPartnerDeviceId\" : null , \"pagpPartnerLearnMethod\" : null , \"pagpPartnerIfIndex\" : null , \"pagpPartnerGroupIfIndex\" : null , \"pagpPartnerDeviceName\" : null , \"pagpEthcOperationMode\" : null , \"pagpDeviceId\" : null , \"pagpGroupIfIndex\" : null , \"ifInUcastPkts\" : \"128518576\" , \"ifInUcastPkts_prev\" : \"128517284\" , \"ifInUcastPkts_delta\" : \"1292\" , \"ifInUcastPkts_rate\" : \"4\" , \"ifOutUcastPkts\" : \"128510560\" , \"ifOutUcastPkts_prev\" : \"128509268\" , \"ifOutUcastPkts_delta\" : \"1292\" , \"ifOutUcastPkts_rate\" : \"4\" , \"ifInErrors\" : \"0\" , \"ifInErrors_prev\" : \"0\" , \"ifInErrors_delta\" : \"0\" , \"ifInErrors_rate\" : \"0\" , \"ifOutErrors\" : \"0\" , \"ifOutErrors_prev\" : \"0\" , \"ifOutErrors_delta\" : \"0\" , \"ifOutErrors_rate\" : \"0\" , \"ifInOctets\" : \"12827393730\" , \"ifInOctets_prev\" : \"12827276736\" , \"ifInOctets_delta\" : \"116994\" , \"ifInOctets_rate\" : \"387\" , \"ifOutOctets\" : \"14957481766\" , \"ifOutOctets_prev\" : \"14957301765\" , \"ifOutOctets_delta\" : \"180001\" , \"ifOutOctets_rate\" : \"596\" , \"poll_time\" : \"1483779150\" , \"poll_prev\" : \"1483778848\" , \"poll_period\" : \"302\" } ] } get_port_ip_info Get all IP info (v4 and v6) for a given port id. Route: /api/v0/ports/:portid/ip portid must be an integer Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/323/ip Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"addresses\" : [ { \"ipv4_address_id\" : \"290\" , \"ipv4_address\" : \"192.168.99.292\" , \"ipv4_prefixlen\" : \"30\" , \"ipv4_network_id\" : \"247\" , \"port_id\" : \"323\" , \"context_name\" : \"\" } ] } get_port_description Get the description ( ifAlias ) for a given port id. Route: /api/v0/ports/:portid/description Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/323/description Output: { \"status\" : \"ok\" , \"port_description\" : \"GigabitEthernet14\" } update_port_description Change the description ( ifAlias ) for a given port id. Route: /api/v0/ports/:portid/description Input (JSON): description: The string data to use as the new port description. Sending an empty string will reset the description to default. Example: curl -X PATCH -d '{\"description\": \"Out-of-Band Management Link\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/323/description Output: { \"status\" : \"ok\" , \"message\" : \"Port description updated.\" }","title":"Ports"},{"location":"API/Ports/#get_all_ports","text":"Get info for all ports on all devices. Strongly recommend that you use the columns parameter to avoid pulling too much data. Route: /api/v0/ports - Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports?columns=ifName%2Cport_id Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"ports\" : [ { \"ifName\" : \"Gi0/0/0\" , \"port_id\" : \"1\" }, { \"ifName\" : \"Gi0/0/1\" , \"port_id\" : \"2\" }, ... { \"ifName\" : \"Vlan 3615\" , \"port_id\" : \"5488\" } ] }","title":"get_all_ports"},{"location":"API/Ports/#search_ports","text":"Search for ports matching the query. Route: /api/v0/ports/search/:search search string to search in fields: ifAlias, ifDescr, and ifName Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/search/lo Output: { \"status\" : \"ok\" , \"ports\" : [ { \"device_id\" : 1 , \"port_id\" : 1 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" }, { \"device_id\" : 2 , \"port_id\" : 3 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" }, { \"device_id\" : 3 , \"port_id\" : 5 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" } ] }","title":"search_ports"},{"location":"API/Ports/#search_ports-in-specific-fields","text":"Specific search for ports matching the query. Route: /api/v0/ports/search/:field/:search field: comma separated list of field(s) to search search: string to search in fields Input: columns: Comma separated list of columns you want returned. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/search/ifName/lo Output: { \"status\" : \"ok\" , \"ports\" : [ { \"device_id\" : 1 , \"port_id\" : 1 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" }, { \"device_id\" : 2 , \"port_id\" : 3 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" }, { \"device_id\" : 3 , \"port_id\" : 5 , \"ifIndex\" : 1 , \"ifName\" : \"lo\" } ] }","title":"search_ports in specific field(s)"},{"location":"API/Ports/#ports_with_associated_mac","text":"Search for ports matching the search mac. Route: /api/v0/ports/mac/:search?filter=first search a mac address in fdb and print the ports ordered by the mac count of the associated port. Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/mac/00:11:22:33:44:55 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/mac/001122.334455?filter=first curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/mac/001122334455?filter=first Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"port\" : [ { \"port_id\" : \"323\" , \"device_id\" : \"55\" , \"port_descr_type\" : null , \"port_descr_descr\" : null , \"port_descr_circuit\" : null , \"port_descr_speed\" : null , \"port_descr_notes\" : null , \"ifDescr\" : \"GigabitEthernet0/0/0\" , \"ifName\" : \"Gi0/0/0\" , \"portName\" : null , \"ifIndex\" : \"1\" , \"ifSpeed\" : \"1000000000\" , \"ifConnectorPresent\" : \"true\" , \"ifPromiscuousMode\" : \"false\" , \"ifHighSpeed\" : \"1000\" , \"ifOperStatus\" : \"up\" , \"ifOperStatus_prev\" : null , \"ifAdminStatus\" : \"up\" , \"ifAdminStatus_prev\" : null , \"ifDuplex\" : \"fullDuplex\" , \"ifMtu\" : \"1560\" , \"ifType\" : \"ethernetCsmacd\" , \"ifAlias\" : \"ASR Interconnect Trunk\" , \"ifPhysAddress\" : \"84bf20853e00\" , \"ifHardType\" : null , \"ifLastChange\" : \"42407358\" , \"ifVlan\" : \"\" , \"ifTrunk\" : \"\" , \"ifVrf\" : \"0\" , \"counter_in\" : null , \"counter_out\" : null , \"ignore\" : \"0\" , \"disabled\" : \"0\" , \"detailed\" : \"0\" , \"deleted\" : \"0\" , \"pagpOperationMode\" : null , \"pagpPortState\" : null , \"pagpPartnerDeviceId\" : null , \"pagpPartnerLearnMethod\" : null , \"pagpPartnerIfIndex\" : null , \"pagpPartnerGroupIfIndex\" : null , \"pagpPartnerDeviceName\" : null , \"pagpEthcOperationMode\" : null , \"pagpDeviceId\" : null , \"pagpGroupIfIndex\" : null , \"ifInUcastPkts\" : \"128518576\" , \"ifInUcastPkts_prev\" : \"128517284\" , \"ifInUcastPkts_delta\" : \"1292\" , \"ifInUcastPkts_rate\" : \"4\" , \"ifOutUcastPkts\" : \"128510560\" , \"ifOutUcastPkts_prev\" : \"128509268\" , \"ifOutUcastPkts_delta\" : \"1292\" , \"ifOutUcastPkts_rate\" : \"4\" , \"ifInErrors\" : \"0\" , \"ifInErrors_prev\" : \"0\" , \"ifInErrors_delta\" : \"0\" , \"ifInErrors_rate\" : \"0\" , \"ifOutErrors\" : \"0\" , \"ifOutErrors_prev\" : \"0\" , \"ifOutErrors_delta\" : \"0\" , \"ifOutErrors_rate\" : \"0\" , \"ifInOctets\" : \"12827393730\" , \"ifInOctets_prev\" : \"12827276736\" , \"ifInOctets_delta\" : \"116994\" , \"ifInOctets_rate\" : \"387\" , \"ifOutOctets\" : \"14957481766\" , \"ifOutOctets_prev\" : \"14957301765\" , \"ifOutOctets_delta\" : \"180001\" , \"ifOutOctets_rate\" : \"596\" , \"poll_time\" : \"1483779150\" , \"poll_prev\" : \"1483778848\" , \"poll_period\" : \"302\" } ] }","title":"ports_with_associated_mac"},{"location":"API/Ports/#get_port_info","text":"Get all info for a particular port. Route: /api/v0/ports/:portid portid must be an integer Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/323 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"port\" : [ { \"port_id\" : \"323\" , \"device_id\" : \"55\" , \"port_descr_type\" : null , \"port_descr_descr\" : null , \"port_descr_circuit\" : null , \"port_descr_speed\" : null , \"port_descr_notes\" : null , \"ifDescr\" : \"GigabitEthernet0/0/0\" , \"ifName\" : \"Gi0/0/0\" , \"portName\" : null , \"ifIndex\" : \"1\" , \"ifSpeed\" : \"1000000000\" , \"ifConnectorPresent\" : \"true\" , \"ifPromiscuousMode\" : \"false\" , \"ifHighSpeed\" : \"1000\" , \"ifOperStatus\" : \"up\" , \"ifOperStatus_prev\" : null , \"ifAdminStatus\" : \"up\" , \"ifAdminStatus_prev\" : null , \"ifDuplex\" : \"fullDuplex\" , \"ifMtu\" : \"1560\" , \"ifType\" : \"ethernetCsmacd\" , \"ifAlias\" : \"ASR Interconnect Trunk\" , \"ifPhysAddress\" : \"84bf20853e00\" , \"ifHardType\" : null , \"ifLastChange\" : \"42407358\" , \"ifVlan\" : \"\" , \"ifTrunk\" : \"\" , \"ifVrf\" : \"0\" , \"counter_in\" : null , \"counter_out\" : null , \"ignore\" : \"0\" , \"disabled\" : \"0\" , \"detailed\" : \"0\" , \"deleted\" : \"0\" , \"pagpOperationMode\" : null , \"pagpPortState\" : null , \"pagpPartnerDeviceId\" : null , \"pagpPartnerLearnMethod\" : null , \"pagpPartnerIfIndex\" : null , \"pagpPartnerGroupIfIndex\" : null , \"pagpPartnerDeviceName\" : null , \"pagpEthcOperationMode\" : null , \"pagpDeviceId\" : null , \"pagpGroupIfIndex\" : null , \"ifInUcastPkts\" : \"128518576\" , \"ifInUcastPkts_prev\" : \"128517284\" , \"ifInUcastPkts_delta\" : \"1292\" , \"ifInUcastPkts_rate\" : \"4\" , \"ifOutUcastPkts\" : \"128510560\" , \"ifOutUcastPkts_prev\" : \"128509268\" , \"ifOutUcastPkts_delta\" : \"1292\" , \"ifOutUcastPkts_rate\" : \"4\" , \"ifInErrors\" : \"0\" , \"ifInErrors_prev\" : \"0\" , \"ifInErrors_delta\" : \"0\" , \"ifInErrors_rate\" : \"0\" , \"ifOutErrors\" : \"0\" , \"ifOutErrors_prev\" : \"0\" , \"ifOutErrors_delta\" : \"0\" , \"ifOutErrors_rate\" : \"0\" , \"ifInOctets\" : \"12827393730\" , \"ifInOctets_prev\" : \"12827276736\" , \"ifInOctets_delta\" : \"116994\" , \"ifInOctets_rate\" : \"387\" , \"ifOutOctets\" : \"14957481766\" , \"ifOutOctets_prev\" : \"14957301765\" , \"ifOutOctets_delta\" : \"180001\" , \"ifOutOctets_rate\" : \"596\" , \"poll_time\" : \"1483779150\" , \"poll_prev\" : \"1483778848\" , \"poll_period\" : \"302\" } ] }","title":"get_port_info"},{"location":"API/Ports/#get_port_ip_info","text":"Get all IP info (v4 and v6) for a given port id. Route: /api/v0/ports/:portid/ip portid must be an integer Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/323/ip Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"addresses\" : [ { \"ipv4_address_id\" : \"290\" , \"ipv4_address\" : \"192.168.99.292\" , \"ipv4_prefixlen\" : \"30\" , \"ipv4_network_id\" : \"247\" , \"port_id\" : \"323\" , \"context_name\" : \"\" } ] }","title":"get_port_ip_info"},{"location":"API/Ports/#get_port_description","text":"Get the description ( ifAlias ) for a given port id. Route: /api/v0/ports/:portid/description Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/323/description Output: { \"status\" : \"ok\" , \"port_description\" : \"GigabitEthernet14\" }","title":"get_port_description"},{"location":"API/Ports/#update_port_description","text":"Change the description ( ifAlias ) for a given port id. Route: /api/v0/ports/:portid/description Input (JSON): description: The string data to use as the new port description. Sending an empty string will reset the description to default. Example: curl -X PATCH -d '{\"description\": \"Out-of-Band Management Link\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ports/323/description Output: { \"status\" : \"ok\" , \"message\" : \"Port description updated.\" }","title":"update_port_description"},{"location":"API/Routing/","text":"list_bgp List the current BGP sessions. Route: /api/v0/bgp Input: hostname = Either the devices hostname or id. asn = The local ASN you would like to filter by remote_asn = Filter by remote peer ASN remote_address = Filter by remote peer address local_address = Filter by local address bgp_descr = Filter by BGP neighbor description bgp_state = Filter by BGP session state (like established,idle...) bgp_state = Filter by BGP admin state (start,stop,running...) bgp_family = Filter by BGP address Family (4,6) Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?hostname=host.example.com curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?asn=1234 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?remote_asn=1234 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?local_address=1.1.1.1&remote_address=2.2.2.2 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_descr=UPSTREAM curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_state=established curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_adminstate=start curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_family=6 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_state=idle&bgp_descr=CORE&bgp_family=4 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"bgp_sessions\" : [ { \"bgpPeer_id\" : 1260 , \"device_id\" : 7 , \"vrf_id\" : null , \"astext\" : \"Acme Ltd\" , \"bgpPeerIdentifier\" : \"2001:0DB8:0000:24cb:0000:0000:0000:0001\" , \"bgpPeerRemoteAs\" : 65432 , \"bgpPeerState\" : \"established\" , \"bgpPeerAdminStatus\" : \"start\" , \"bgpPeerLastErrorCode\" : 6 , \"bgpPeerLastErrorSubCode\" : 2 , \"bgpPeerLastErrorText\" : \"administrative shutdown\" , \"bgpPeerIface\" : 268 , \"bgpLocalAddr\" : \"2001:0DB8:0000:24cb:0000:0000:0000:0002\" , \"bgpPeerRemoteAddr\" : \"0.0.0.0\" , \"bgpPeerDescr\" : \"Another one #CORE\" , \"bgpPeerInUpdates\" : 283882969 , \"bgpPeerOutUpdates\" : 7008 , \"bgpPeerInTotalMessages\" : 283883031 , \"bgpPeerOutTotalMessages\" : 1386692 , \"bgpPeerFsmEstablishedTime\" : 1628487 , \"bgpPeerInUpdateElapsedTime\" : 0 , \"context_name\" : \"\" }, ... ], \"count\" : 100 } get_bgp Retrieves a BGP session by ID Route: /api/v0/bgp/:id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp/4 Output: { \"status\" : \"ok\" , \"bgp_session\" : [ { \"bgpPeer_id\" : \"4\" , \"device_id\" : \"2\" , \"astext\" : \"\" , \"bgpPeerIdentifier\" : \"1234:1b80:1:12::2\" , \"bgpPeerRemoteAs\" : \"54321\" , \"bgpPeerState\" : \"established\" , \"bgpPeerAdminStatus\" : \"running\" , \"bgpLocalAddr\" : \"1234:1b80:1:12::1\" , \"bgpPeerRemoteAddr\" : \"0.0.0.0\" , \"bgpPeerInUpdates\" : \"3\" , \"bgpPeerOutUpdates\" : \"1\" , \"bgpPeerInTotalMessages\" : \"0\" , \"bgpPeerOutTotalMessages\" : \"0\" , \"bgpPeerFsmEstablishedTime\" : \"0\" , \"bgpPeerInUpdateElapsedTime\" : \"0\" , \"context_name\" : \"\" } ], \"count\" : 1 } edit_bgp_descr This is a POST type request Set the BGP session description by ID Route: /api/v0/bgp/:id Input: id = The id of the BGP Peer Session. bgp_descr = The description for the bgpPeerDescr field on the BGP Session. Example: curl -v -H 'X-Auth-Token: YOURAPITOKENHERE' --data '{\"bgp_descr\": \"Your description here\"}' https://librenms.org/api/v0/bgp/4 Output: { \"status\" : \"ok\" , \"message\" : \"BGP description for peer X.X.X.X on device 1 updated to Your description here\" } list_cbgp List the current BGP sessions counters. Route: /api/v0/routing/bgp/cbgp Input: hostname = Either the devices hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/bgp/cbgp curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/bgp/cbgp?hostname=host.example.com Output: { \"status\" : \"ok\" , \"bgp_counters\" : [ { \"device_id\" : \"9\" , \"bgpPeerIdentifier\" : \"192.168.99.31\" , \"afi\" : \"ipv4\" , \"safi\" : \"multicast\" , \"AcceptedPrefixes\" : \"2\" , \"DeniedPrefixes\" : \"0\" , \"PrefixAdminLimit\" : \"0\" , \"PrefixThreshold\" : \"0\" , \"PrefixClearThreshold\" : \"0\" , \"AdvertisedPrefixes\" : \"11487\" , \"SuppressedPrefixes\" : \"0\" , \"WithdrawnPrefixes\" : \"10918\" , \"AcceptedPrefixes_delta\" : \"-2\" , \"AcceptedPrefixes_prev\" : \"2\" , \"DeniedPrefixes_delta\" : \"0\" , \"DeniedPrefixes_prev\" : \"0\" , \"AdvertisedPrefixes_delta\" : \"-11487\" , \"AdvertisedPrefixes_prev\" : \"11487\" , \"SuppressedPrefixes_delta\" : \"0\" , \"SuppressedPrefixes_prev\" : \"0\" , \"WithdrawnPrefixes_delta\" : \"-10918\" , \"WithdrawnPrefixes_prev\" : \"10918\" , \"context_name\" : \"\" }, ... ], \"count\" : 100 } list_ip_addresses List all IPv4 and IPv6 addresses. Route: /api/v0/resources/ip/addresses Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/addresses Output: { \"status\" : \"ok\" , \"ip_addresses\" : [ { \"ipv4_address_id\" : \"69\" , \"ipv4_address\" : \"127.0.0.1\" , \"ipv4_prefixlen\" : \"8\" , \"ipv4_network_id\" : \"55\" , \"port_id\" : \"135\" , \"context_name\" : \"\" }, ... ], \"count\" : 55 } get_network_ip_addresses Get all IPv4 and IPv6 addresses for particular network. Route: /api/v0/resources/ip/networks/:id/ip id must be integer Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/networks/55/ip Output: { \"status\" : \"ok\" , \"addresses\" : [ { \"ipv4_address_id\" : \"69\" , \"ipv4_address\" : \"127.0.0.1\" , \"ipv4_prefixlen\" : \"8\" , \"ipv4_network_id\" : \"55\" , \"port_id\" : \"135\" , \"context_name\" : \"\" } ], \"count\" : 1 } list_ip_networks List all IPv4 and IPv6 networks. Route: /api/v0/resources/ip/networks Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/networks Output: { \"status\" : \"ok\" , \"ip_networks\" : [ { \"ipv4_network_id\" : \"1\" , \"ipv4_network\" : \"127.0.0.0/8\" , \"context_name\" : \"\" }, ... ], \"count\" : 100 } list_ipsec List the current IPSec tunnels which are active. Route: /api/v0/routing/ipsec/data/:hostname hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/ipsec/data/localhost Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 0 , \"ipsec\" : [ \"tunnel_id\" : \"1\" , \"device_id\" : \"1\" , \"peer_port\" : \"0\" , \"peer_addr\" : \"127.0.0.1\" , \"local_addr\" : \"127.0.0.2\" , \"local_port\" : \"0\" , \"tunnel_name\" : \"\" , \"tunnel_status\" : \"active\" ] } Please note, this will only show active VPN sessions not all configured. list_ospf List the current OSPF neighbours. Route: /api/v0/ospf Input: hostname = Either the devices hostname or id. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ospf curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ospf?hostname=host.example.com Output: { \"status\" : \"ok\" , \"ospf_neighbours\" : [ { \"device_id\" : \"1\" , \"port_id\" : \"0\" , \"ospf_nbr_id\" : \"172.16.1.145.0\" , \"ospfNbrIpAddr\" : \"172.16.1.145\" , \"ospfNbrAddressLessIndex\" : \"0\" , \"ospfNbrRtrId\" : \"172.16.0.140\" , \"ospfNbrOptions\" : \"82\" , \"ospfNbrPriority\" : \"1\" , \"ospfNbrState\" : \"full\" , \"ospfNbrEvents\" : \"5\" , \"ospfNbrLsRetransQLen\" : \"0\" , \"ospfNbmaNbrStatus\" : \"active\" , \"ospfNbmaNbrPermanence\" : \"dynamic\" , \"ospfNbrHelloSuppressed\" : \"false\" , \"context_name\" : \"\" } ], \"count\" : 1 } list_ospf_ports List the current OSPF ports. Route: /api/v0/ospf_ports Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ospf_ports Output: { \"status\" : \"ok\" , \"ospf_ports\" : [ { \"id\" : 189086 , \"device_id\" : 43 , \"port_id\" : 2838 , \"ospf_port_id\" : \"10.10.2.86.0\" , \"ospfIfIpAddress\" : \"10.10.2.86\" , \"ospfAddressLessIf\" : 0 , \"ospfIfAreaId\" : \"0.0.0.0\" , \"ospfIfType\" : \"pointToPoint\" , \"ospfIfAdminStat\" : \"enabled\" , \"ospfIfRtrPriority\" : 128 , \"ospfIfTransitDelay\" : 1 , \"ospfIfRetransInterval\" : 5 , \"ospfIfHelloInterval\" : 10 , \"ospfIfRtrDeadInterval\" : 40 , \"ospfIfPollInterval\" : 90 , \"ospfIfState\" : \"pointToPoint\" , \"ospfIfDesignatedRouter\" : \"0.0.0.0\" , \"ospfIfBackupDesignatedRouter\" : \"0.0.0.0\" , \"ospfIfEvents\" : 33 , \"ospfIfAuthKey\" : \"\" , \"ospfIfStatus\" : \"active\" , \"ospfIfMulticastForwarding\" : \"unicast\" , \"ospfIfDemand\" : \"false\" , \"ospfIfAuthType\" : \"0\" , \"ospfIfMetricIpAddress\" : \"10.10.2.86\" , \"ospfIfMetricAddressLessIf\" : 0 , \"ospfIfMetricTOS\" : 0 , \"ospfIfMetricValue\" : 10 , \"ospfIfMetricStatus\" : \"active\" , \"context_name\" : null } ], \"count\" : 1 } list_vrf List the current VRFs. Route: /api/v0/routing/vrf Input: hostname = Either the devices hostname or id OR vrfname = The VRF name you would like to filter by Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/vrf curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/vrf?hostname=host.example.com curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/vrf?vrfname=Mgmt-vrf Output: { \"status\" : \"ok\" , \"vrfs\" : [ { \"vrf_id\" : \"2\" , \"vrf_oid\" : \"8.77.103.109.116.45.118.114.102\" , \"vrf_name\" : \"Mgmt-vrf\" , \"mplsVpnVrfRouteDistinguisher\" : \"\" , \"mplsVpnVrfDescription\" : \"\" , \"device_id\" : \"8\" }, ... ], \"count\" : 100 } get_vrf Retrieves VRF by ID Route: /api/v0/routing/vrf/:id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/vrf/2 Output: { \"status\" : \"ok\" , \"vrf\" : [ { \"vrf_id\" : \"2\" , \"vrf_oid\" : \"8.77.103.109.116.45.118.114.102\" , \"vrf_name\" : \"Mgmt-vrf\" , \"mplsVpnVrfRouteDistinguisher\" : \"\" , \"mplsVpnVrfDescription\" : \"\" , \"device_id\" : \"8\" } ], \"count\" : 1 } list_mpls_services List MPLS services Route: /api/v0/routing/mpls/services Input: hostname = Either the devices hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/mpls/services curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/mpls/services?hostname=host.example.com Output: { \"status\" : \"ok\" , \"mpls_services\" : [ { \"svc_id\" : 1671 , \"svc_oid\" : 27 , \"device_id\" : 4 , \"svcRowStatus\" : \"active\" , \"svcType\" : \"tls\" , \"svcCustId\" : 1 , \"svcAdminStatus\" : \"up\" , \"svcOperStatus\" : \"up\" , \"svcDescription\" : \"\" , \"svcMtu\" : 9008 , \"svcNumSaps\" : 1 , \"svcNumSdps\" : 0 , \"svcLastMgmtChange\" : 2 , \"svcLastStatusChange\" : 168 , \"svcVRouterId\" : 0 , \"svcTlsMacLearning\" : \"enabled\" , \"svcTlsStpAdminStatus\" : \"disabled\" , \"svcTlsStpOperStatus\" : \"down\" , \"svcTlsFdbTableSize\" : 250 , \"svcTlsFdbNumEntries\" : 0 , \"hostname\" : \"host.example.com\" } ], \"count\" : 1 } list_mpls_saps List MPLS SAPs Route: /api/v0/routing/mpls/saps Input: hostname = Either the devices hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/mpls/saps curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/mpls/saps?hostname=host.example.com Output: { \"status\" : \"ok\" , \"saps\" : [ { \"sap_id\" : 1935 , \"svc_id\" : 1660 , \"svc_oid\" : 7 , \"sapPortId\" : 16108921125 , \"ifName\" : \"1/1/c2/1\" , \"device_id\" : 3 , \"sapEncapValue\" : \"0\" , \"sapRowStatus\" : \"active\" , \"sapType\" : \"epipe\" , \"sapDescription\" : \"\" , \"sapAdminStatus\" : \"up\" , \"sapOperStatus\" : \"down\" , \"sapLastMgmtChange\" : 2 , \"sapLastStatusChange\" : 0 , \"hostname\" : \"hostname=host.example.com\" } ], \"count\" : 1 }","title":"Routing"},{"location":"API/Routing/#list_bgp","text":"List the current BGP sessions. Route: /api/v0/bgp Input: hostname = Either the devices hostname or id. asn = The local ASN you would like to filter by remote_asn = Filter by remote peer ASN remote_address = Filter by remote peer address local_address = Filter by local address bgp_descr = Filter by BGP neighbor description bgp_state = Filter by BGP session state (like established,idle...) bgp_state = Filter by BGP admin state (start,stop,running...) bgp_family = Filter by BGP address Family (4,6) Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?hostname=host.example.com curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?asn=1234 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?remote_asn=1234 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?local_address=1.1.1.1&remote_address=2.2.2.2 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_descr=UPSTREAM curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_state=established curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_adminstate=start curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_family=6 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp?bgp_state=idle&bgp_descr=CORE&bgp_family=4 Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"bgp_sessions\" : [ { \"bgpPeer_id\" : 1260 , \"device_id\" : 7 , \"vrf_id\" : null , \"astext\" : \"Acme Ltd\" , \"bgpPeerIdentifier\" : \"2001:0DB8:0000:24cb:0000:0000:0000:0001\" , \"bgpPeerRemoteAs\" : 65432 , \"bgpPeerState\" : \"established\" , \"bgpPeerAdminStatus\" : \"start\" , \"bgpPeerLastErrorCode\" : 6 , \"bgpPeerLastErrorSubCode\" : 2 , \"bgpPeerLastErrorText\" : \"administrative shutdown\" , \"bgpPeerIface\" : 268 , \"bgpLocalAddr\" : \"2001:0DB8:0000:24cb:0000:0000:0000:0002\" , \"bgpPeerRemoteAddr\" : \"0.0.0.0\" , \"bgpPeerDescr\" : \"Another one #CORE\" , \"bgpPeerInUpdates\" : 283882969 , \"bgpPeerOutUpdates\" : 7008 , \"bgpPeerInTotalMessages\" : 283883031 , \"bgpPeerOutTotalMessages\" : 1386692 , \"bgpPeerFsmEstablishedTime\" : 1628487 , \"bgpPeerInUpdateElapsedTime\" : 0 , \"context_name\" : \"\" }, ... ], \"count\" : 100 }","title":"list_bgp"},{"location":"API/Routing/#get_bgp","text":"Retrieves a BGP session by ID Route: /api/v0/bgp/:id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/bgp/4 Output: { \"status\" : \"ok\" , \"bgp_session\" : [ { \"bgpPeer_id\" : \"4\" , \"device_id\" : \"2\" , \"astext\" : \"\" , \"bgpPeerIdentifier\" : \"1234:1b80:1:12::2\" , \"bgpPeerRemoteAs\" : \"54321\" , \"bgpPeerState\" : \"established\" , \"bgpPeerAdminStatus\" : \"running\" , \"bgpLocalAddr\" : \"1234:1b80:1:12::1\" , \"bgpPeerRemoteAddr\" : \"0.0.0.0\" , \"bgpPeerInUpdates\" : \"3\" , \"bgpPeerOutUpdates\" : \"1\" , \"bgpPeerInTotalMessages\" : \"0\" , \"bgpPeerOutTotalMessages\" : \"0\" , \"bgpPeerFsmEstablishedTime\" : \"0\" , \"bgpPeerInUpdateElapsedTime\" : \"0\" , \"context_name\" : \"\" } ], \"count\" : 1 }","title":"get_bgp"},{"location":"API/Routing/#edit_bgp_descr","text":"This is a POST type request Set the BGP session description by ID Route: /api/v0/bgp/:id Input: id = The id of the BGP Peer Session. bgp_descr = The description for the bgpPeerDescr field on the BGP Session. Example: curl -v -H 'X-Auth-Token: YOURAPITOKENHERE' --data '{\"bgp_descr\": \"Your description here\"}' https://librenms.org/api/v0/bgp/4 Output: { \"status\" : \"ok\" , \"message\" : \"BGP description for peer X.X.X.X on device 1 updated to Your description here\" }","title":"edit_bgp_descr"},{"location":"API/Routing/#list_cbgp","text":"List the current BGP sessions counters. Route: /api/v0/routing/bgp/cbgp Input: hostname = Either the devices hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/bgp/cbgp curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/bgp/cbgp?hostname=host.example.com Output: { \"status\" : \"ok\" , \"bgp_counters\" : [ { \"device_id\" : \"9\" , \"bgpPeerIdentifier\" : \"192.168.99.31\" , \"afi\" : \"ipv4\" , \"safi\" : \"multicast\" , \"AcceptedPrefixes\" : \"2\" , \"DeniedPrefixes\" : \"0\" , \"PrefixAdminLimit\" : \"0\" , \"PrefixThreshold\" : \"0\" , \"PrefixClearThreshold\" : \"0\" , \"AdvertisedPrefixes\" : \"11487\" , \"SuppressedPrefixes\" : \"0\" , \"WithdrawnPrefixes\" : \"10918\" , \"AcceptedPrefixes_delta\" : \"-2\" , \"AcceptedPrefixes_prev\" : \"2\" , \"DeniedPrefixes_delta\" : \"0\" , \"DeniedPrefixes_prev\" : \"0\" , \"AdvertisedPrefixes_delta\" : \"-11487\" , \"AdvertisedPrefixes_prev\" : \"11487\" , \"SuppressedPrefixes_delta\" : \"0\" , \"SuppressedPrefixes_prev\" : \"0\" , \"WithdrawnPrefixes_delta\" : \"-10918\" , \"WithdrawnPrefixes_prev\" : \"10918\" , \"context_name\" : \"\" }, ... ], \"count\" : 100 }","title":"list_cbgp"},{"location":"API/Routing/#list_ip_addresses","text":"List all IPv4 and IPv6 addresses. Route: /api/v0/resources/ip/addresses Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/addresses Output: { \"status\" : \"ok\" , \"ip_addresses\" : [ { \"ipv4_address_id\" : \"69\" , \"ipv4_address\" : \"127.0.0.1\" , \"ipv4_prefixlen\" : \"8\" , \"ipv4_network_id\" : \"55\" , \"port_id\" : \"135\" , \"context_name\" : \"\" }, ... ], \"count\" : 55 }","title":"list_ip_addresses"},{"location":"API/Routing/#get_network_ip_addresses","text":"Get all IPv4 and IPv6 addresses for particular network. Route: /api/v0/resources/ip/networks/:id/ip id must be integer Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/networks/55/ip Output: { \"status\" : \"ok\" , \"addresses\" : [ { \"ipv4_address_id\" : \"69\" , \"ipv4_address\" : \"127.0.0.1\" , \"ipv4_prefixlen\" : \"8\" , \"ipv4_network_id\" : \"55\" , \"port_id\" : \"135\" , \"context_name\" : \"\" } ], \"count\" : 1 }","title":"get_network_ip_addresses"},{"location":"API/Routing/#list_ip_networks","text":"List all IPv4 and IPv6 networks. Route: /api/v0/resources/ip/networks Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/ip/networks Output: { \"status\" : \"ok\" , \"ip_networks\" : [ { \"ipv4_network_id\" : \"1\" , \"ipv4_network\" : \"127.0.0.0/8\" , \"context_name\" : \"\" }, ... ], \"count\" : 100 }","title":"list_ip_networks"},{"location":"API/Routing/#list_ipsec","text":"List the current IPSec tunnels which are active. Route: /api/v0/routing/ipsec/data/:hostname hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/ipsec/data/localhost Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 0 , \"ipsec\" : [ \"tunnel_id\" : \"1\" , \"device_id\" : \"1\" , \"peer_port\" : \"0\" , \"peer_addr\" : \"127.0.0.1\" , \"local_addr\" : \"127.0.0.2\" , \"local_port\" : \"0\" , \"tunnel_name\" : \"\" , \"tunnel_status\" : \"active\" ] } Please note, this will only show active VPN sessions not all configured.","title":"list_ipsec"},{"location":"API/Routing/#list_ospf","text":"List the current OSPF neighbours. Route: /api/v0/ospf Input: hostname = Either the devices hostname or id. Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ospf curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ospf?hostname=host.example.com Output: { \"status\" : \"ok\" , \"ospf_neighbours\" : [ { \"device_id\" : \"1\" , \"port_id\" : \"0\" , \"ospf_nbr_id\" : \"172.16.1.145.0\" , \"ospfNbrIpAddr\" : \"172.16.1.145\" , \"ospfNbrAddressLessIndex\" : \"0\" , \"ospfNbrRtrId\" : \"172.16.0.140\" , \"ospfNbrOptions\" : \"82\" , \"ospfNbrPriority\" : \"1\" , \"ospfNbrState\" : \"full\" , \"ospfNbrEvents\" : \"5\" , \"ospfNbrLsRetransQLen\" : \"0\" , \"ospfNbmaNbrStatus\" : \"active\" , \"ospfNbmaNbrPermanence\" : \"dynamic\" , \"ospfNbrHelloSuppressed\" : \"false\" , \"context_name\" : \"\" } ], \"count\" : 1 }","title":"list_ospf"},{"location":"API/Routing/#list_ospf_ports","text":"List the current OSPF ports. Route: /api/v0/ospf_ports Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/ospf_ports Output: { \"status\" : \"ok\" , \"ospf_ports\" : [ { \"id\" : 189086 , \"device_id\" : 43 , \"port_id\" : 2838 , \"ospf_port_id\" : \"10.10.2.86.0\" , \"ospfIfIpAddress\" : \"10.10.2.86\" , \"ospfAddressLessIf\" : 0 , \"ospfIfAreaId\" : \"0.0.0.0\" , \"ospfIfType\" : \"pointToPoint\" , \"ospfIfAdminStat\" : \"enabled\" , \"ospfIfRtrPriority\" : 128 , \"ospfIfTransitDelay\" : 1 , \"ospfIfRetransInterval\" : 5 , \"ospfIfHelloInterval\" : 10 , \"ospfIfRtrDeadInterval\" : 40 , \"ospfIfPollInterval\" : 90 , \"ospfIfState\" : \"pointToPoint\" , \"ospfIfDesignatedRouter\" : \"0.0.0.0\" , \"ospfIfBackupDesignatedRouter\" : \"0.0.0.0\" , \"ospfIfEvents\" : 33 , \"ospfIfAuthKey\" : \"\" , \"ospfIfStatus\" : \"active\" , \"ospfIfMulticastForwarding\" : \"unicast\" , \"ospfIfDemand\" : \"false\" , \"ospfIfAuthType\" : \"0\" , \"ospfIfMetricIpAddress\" : \"10.10.2.86\" , \"ospfIfMetricAddressLessIf\" : 0 , \"ospfIfMetricTOS\" : 0 , \"ospfIfMetricValue\" : 10 , \"ospfIfMetricStatus\" : \"active\" , \"context_name\" : null } ], \"count\" : 1 }","title":"list_ospf_ports"},{"location":"API/Routing/#list_vrf","text":"List the current VRFs. Route: /api/v0/routing/vrf Input: hostname = Either the devices hostname or id OR vrfname = The VRF name you would like to filter by Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/vrf curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/vrf?hostname=host.example.com curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/vrf?vrfname=Mgmt-vrf Output: { \"status\" : \"ok\" , \"vrfs\" : [ { \"vrf_id\" : \"2\" , \"vrf_oid\" : \"8.77.103.109.116.45.118.114.102\" , \"vrf_name\" : \"Mgmt-vrf\" , \"mplsVpnVrfRouteDistinguisher\" : \"\" , \"mplsVpnVrfDescription\" : \"\" , \"device_id\" : \"8\" }, ... ], \"count\" : 100 }","title":"list_vrf"},{"location":"API/Routing/#get_vrf","text":"Retrieves VRF by ID Route: /api/v0/routing/vrf/:id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/vrf/2 Output: { \"status\" : \"ok\" , \"vrf\" : [ { \"vrf_id\" : \"2\" , \"vrf_oid\" : \"8.77.103.109.116.45.118.114.102\" , \"vrf_name\" : \"Mgmt-vrf\" , \"mplsVpnVrfRouteDistinguisher\" : \"\" , \"mplsVpnVrfDescription\" : \"\" , \"device_id\" : \"8\" } ], \"count\" : 1 }","title":"get_vrf"},{"location":"API/Routing/#list_mpls_services","text":"List MPLS services Route: /api/v0/routing/mpls/services Input: hostname = Either the devices hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/mpls/services curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/mpls/services?hostname=host.example.com Output: { \"status\" : \"ok\" , \"mpls_services\" : [ { \"svc_id\" : 1671 , \"svc_oid\" : 27 , \"device_id\" : 4 , \"svcRowStatus\" : \"active\" , \"svcType\" : \"tls\" , \"svcCustId\" : 1 , \"svcAdminStatus\" : \"up\" , \"svcOperStatus\" : \"up\" , \"svcDescription\" : \"\" , \"svcMtu\" : 9008 , \"svcNumSaps\" : 1 , \"svcNumSdps\" : 0 , \"svcLastMgmtChange\" : 2 , \"svcLastStatusChange\" : 168 , \"svcVRouterId\" : 0 , \"svcTlsMacLearning\" : \"enabled\" , \"svcTlsStpAdminStatus\" : \"disabled\" , \"svcTlsStpOperStatus\" : \"down\" , \"svcTlsFdbTableSize\" : 250 , \"svcTlsFdbNumEntries\" : 0 , \"hostname\" : \"host.example.com\" } ], \"count\" : 1 }","title":"list_mpls_services"},{"location":"API/Routing/#list_mpls_saps","text":"List MPLS SAPs Route: /api/v0/routing/mpls/saps Input: hostname = Either the devices hostname or id Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/mpls/saps curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/routing/mpls/saps?hostname=host.example.com Output: { \"status\" : \"ok\" , \"saps\" : [ { \"sap_id\" : 1935 , \"svc_id\" : 1660 , \"svc_oid\" : 7 , \"sapPortId\" : 16108921125 , \"ifName\" : \"1/1/c2/1\" , \"device_id\" : 3 , \"sapEncapValue\" : \"0\" , \"sapRowStatus\" : \"active\" , \"sapType\" : \"epipe\" , \"sapDescription\" : \"\" , \"sapAdminStatus\" : \"up\" , \"sapOperStatus\" : \"down\" , \"sapLastMgmtChange\" : 2 , \"sapLastStatusChange\" : 0 , \"hostname\" : \"hostname=host.example.com\" } ], \"count\" : 1 }","title":"list_mpls_saps"},{"location":"API/Services/","text":"list_services Retrieve all services Route: /api/v0/services Input: state: only which have a certain state (valid options are 0=Ok, 1=Warning, 2=Critical). type: service type, used sql LIKE to find services, so for tcp, use type=tcp for http use type=http Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services?state=2 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services?state=0&type=tcp Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"services\" : [ [ { \"service_id\" : \"13\" , \"device_id\" : \"1\" , \"service_ip\" : \"demo1.yourdomian.net\" , \"service_type\" : \"ntp_peer\" , \"service_desc\" : \"NTP\" , \"service_param\" : \"-H 192.168.1.10\" , \"service_ignore\" : \"0\" , \"service_status\" : \"0\" , \"service_changed\" : \"1470962470\" , \"service_message\" : \"NTP OK: Offset -0.000717 secs\" , \"service_disabled\" : \"0\" , \"service_ds\" : \"{\\\"offset\\\":\\\"s\\\"}\" } ], [ { \"service_id\" : \"2\" , \"device_id\" : \"2\" , \"service_ip\" : \"demo2.yourdomian.net\" , \"service_type\" : \"esxi_hardware.py\" , \"service_desc\" : \"vmware hardware\" , \"service_param\" : \"-H 192.168.1.11 -U USER -P PASS -p\" , \"service_ignore\" : \"0\" , \"service_status\" : \"0\" , \"service_changed\" : \"1471702206\" , \"service_message\" : \"OK - Server: Supermicro X9SCL/X9SCM s/n: 0123456789 System BIOS: 2.2 2015-02-20\" , \"service_disabled\" : \"0\" , \"service_ds\" : \"{\\\"P2Vol_0_Processor_1_Vcore\\\":\\\"\\\",\\\"P2Vol_1_System_Board_1_-12V\\\":\\\"\\\",\\\"P2Vol_2_System_Board_1_12V\\\":\\\"\\\",\\\"P2Vol_3_System_Board_1_3.3VCC\\\":\\\"\\\",\\\"P2Vol_4_System_Board_1_5VCC\\\":\\\"\\\",\\\"P2Vol_5_System_Board_1_AVCC\\\":\\\"\\\",\\\"P2Vol_6_System_Board_1_VBAT\\\":\\\"\\\",\\\"P2Vol_7_System_Board_1_\" } ] ] } get_service_for_host Retrieve services for device Route: /api/v0/services/:hostname id or hostname is the specific device Input: state: only which have a certain state (valid options are 0=Ok, 1=Warning, 2=Critical). type: service type, used sql LIKE to find services, so for tcp, use type=tcp for http use type=http Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/:hostname curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/:hostname?state=2 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/:hostname?state=0&type=tcp Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"services\" : [ [ { \"service_id\" : \"2\" , \"device_id\" : \"2\" , \"service_ip\" : \"demo2.yourdomian.net\" , \"service_type\" : \"esxi_hardware.py\" , \"service_desc\" : \"vmware hardware\" , \"service_param\" : \"-H 192.168.1.11 -U USER -P PASS -p\" , \"service_ignore\" : \"0\" , \"service_status\" : \"0\" , \"service_changed\" : \"1471702206\" , \"service_message\" : \"OK - Server: Supermicro X9SCL/X9SCM s/n: 0123456789 System BIOS: 2.2 2015-02-20\" , \"service_disabled\" : \"0\" , \"service_ds\" : \"{\\\"P2Vol_0_Processor_1_Vcore\\\":\\\"\\\",\\\"P2Vol_1_System_Board_1_-12V\\\":\\\"\\\",\\\"P2Vol_2_System_Board_1_12V\\\":\\\"\\\",\\\"P2Vol_3_System_Board_1_3.3VCC\\\":\\\"\\\",\\\"P2Vol_4_System_Board_1_5VCC\\\":\\\"\\\",\\\"P2Vol_5_System_Board_1_AVCC\\\":\\\"\\\",\\\"P2Vol_6_System_Board_1_VBAT\\\":\\\"\\\",\\\"P2Vol_7_System_Board_1_\" } ] ] } add_service_for_host Add a service for device Route: /api/v0/services/:hostname id or hostname is the specific device Input: type: service type ip: ip of the service desc: description for the service param: parameters for the service ignore: ignore the service for checks Example: curl -X POST -d '{\"type\":\"ping\",\"ip\": \"192.168.1.10\",\"desc\":\"test ping\",\"param\": \"-t 10 -c 5\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/192.168.1.10 Output: { \"status\" : \"ok\" , \"message\" : \"Service ping has been added to device 192.168.1.10 (#10)\" } edit_service_from_host Edits a service Route: /api/v0/services/:service_id service id Input: id: service id Example: curl -X PATCH -d '{\"service_disabled\":\"1\"}' 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/services/5 Output: { \"status\" : \"ok\" , \"message\" : \"Service updated successfully\" } delete_service_from_host Deletes service from device Route: /api/v0/services/:service_id service id Input: id: service id Example: curl -X DELETE -H 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/services/35 Output: { \"status\" : \"ok\" , \"message\" : \"Service has been deleted successfully\" }","title":"Services"},{"location":"API/Services/#list_services","text":"Retrieve all services Route: /api/v0/services Input: state: only which have a certain state (valid options are 0=Ok, 1=Warning, 2=Critical). type: service type, used sql LIKE to find services, so for tcp, use type=tcp for http use type=http Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services?state=2 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services?state=0&type=tcp Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"services\" : [ [ { \"service_id\" : \"13\" , \"device_id\" : \"1\" , \"service_ip\" : \"demo1.yourdomian.net\" , \"service_type\" : \"ntp_peer\" , \"service_desc\" : \"NTP\" , \"service_param\" : \"-H 192.168.1.10\" , \"service_ignore\" : \"0\" , \"service_status\" : \"0\" , \"service_changed\" : \"1470962470\" , \"service_message\" : \"NTP OK: Offset -0.000717 secs\" , \"service_disabled\" : \"0\" , \"service_ds\" : \"{\\\"offset\\\":\\\"s\\\"}\" } ], [ { \"service_id\" : \"2\" , \"device_id\" : \"2\" , \"service_ip\" : \"demo2.yourdomian.net\" , \"service_type\" : \"esxi_hardware.py\" , \"service_desc\" : \"vmware hardware\" , \"service_param\" : \"-H 192.168.1.11 -U USER -P PASS -p\" , \"service_ignore\" : \"0\" , \"service_status\" : \"0\" , \"service_changed\" : \"1471702206\" , \"service_message\" : \"OK - Server: Supermicro X9SCL/X9SCM s/n: 0123456789 System BIOS: 2.2 2015-02-20\" , \"service_disabled\" : \"0\" , \"service_ds\" : \"{\\\"P2Vol_0_Processor_1_Vcore\\\":\\\"\\\",\\\"P2Vol_1_System_Board_1_-12V\\\":\\\"\\\",\\\"P2Vol_2_System_Board_1_12V\\\":\\\"\\\",\\\"P2Vol_3_System_Board_1_3.3VCC\\\":\\\"\\\",\\\"P2Vol_4_System_Board_1_5VCC\\\":\\\"\\\",\\\"P2Vol_5_System_Board_1_AVCC\\\":\\\"\\\",\\\"P2Vol_6_System_Board_1_VBAT\\\":\\\"\\\",\\\"P2Vol_7_System_Board_1_\" } ] ] }","title":"list_services"},{"location":"API/Services/#get_service_for_host","text":"Retrieve services for device Route: /api/v0/services/:hostname id or hostname is the specific device Input: state: only which have a certain state (valid options are 0=Ok, 1=Warning, 2=Critical). type: service type, used sql LIKE to find services, so for tcp, use type=tcp for http use type=http Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/:hostname curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/:hostname?state=2 curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/:hostname?state=0&type=tcp Output: { \"status\" : \"ok\" , \"message\" : \"\" , \"count\" : 1 , \"services\" : [ [ { \"service_id\" : \"2\" , \"device_id\" : \"2\" , \"service_ip\" : \"demo2.yourdomian.net\" , \"service_type\" : \"esxi_hardware.py\" , \"service_desc\" : \"vmware hardware\" , \"service_param\" : \"-H 192.168.1.11 -U USER -P PASS -p\" , \"service_ignore\" : \"0\" , \"service_status\" : \"0\" , \"service_changed\" : \"1471702206\" , \"service_message\" : \"OK - Server: Supermicro X9SCL/X9SCM s/n: 0123456789 System BIOS: 2.2 2015-02-20\" , \"service_disabled\" : \"0\" , \"service_ds\" : \"{\\\"P2Vol_0_Processor_1_Vcore\\\":\\\"\\\",\\\"P2Vol_1_System_Board_1_-12V\\\":\\\"\\\",\\\"P2Vol_2_System_Board_1_12V\\\":\\\"\\\",\\\"P2Vol_3_System_Board_1_3.3VCC\\\":\\\"\\\",\\\"P2Vol_4_System_Board_1_5VCC\\\":\\\"\\\",\\\"P2Vol_5_System_Board_1_AVCC\\\":\\\"\\\",\\\"P2Vol_6_System_Board_1_VBAT\\\":\\\"\\\",\\\"P2Vol_7_System_Board_1_\" } ] ] }","title":"get_service_for_host"},{"location":"API/Services/#add_service_for_host","text":"Add a service for device Route: /api/v0/services/:hostname id or hostname is the specific device Input: type: service type ip: ip of the service desc: description for the service param: parameters for the service ignore: ignore the service for checks Example: curl -X POST -d '{\"type\":\"ping\",\"ip\": \"192.168.1.10\",\"desc\":\"test ping\",\"param\": \"-t 10 -c 5\"}' -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/services/192.168.1.10 Output: { \"status\" : \"ok\" , \"message\" : \"Service ping has been added to device 192.168.1.10 (#10)\" }","title":"add_service_for_host"},{"location":"API/Services/#edit_service_from_host","text":"Edits a service Route: /api/v0/services/:service_id service id Input: id: service id Example: curl -X PATCH -d '{\"service_disabled\":\"1\"}' 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/services/5 Output: { \"status\" : \"ok\" , \"message\" : \"Service updated successfully\" }","title":"edit_service_from_host"},{"location":"API/Services/#delete_service_from_host","text":"Deletes service from device Route: /api/v0/services/:service_id service id Input: id: service id Example: curl -X DELETE -H 'X-Auth-Token:YOUR-API-TOKEN' https://librenms.org/api/v0/services/35 Output: { \"status\" : \"ok\" , \"message\" : \"Service has been deleted successfully\" }","title":"delete_service_from_host"},{"location":"API/Switching/","text":"list_vlans Get a list of all VLANs. Route: /api/v0/resources/vlans Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/vlans Output: { \"status\" : \"ok\" , \"vlans\" : [ { \"vlan_id\" : \"31\" , \"device_id\" : \"10\" , \"vlan_vlan\" : \"1\" , \"vlan_domain\" : \"1\" , \"vlan_name\" : \"default\" , \"vlan_type\" : \"ethernet\" , \"vlan_mtu\" : null }, ... ], \"count\" : 100 } get_vlans Get a list of all VLANs for a given device. Route: /api/v0/devices/:hostname/vlans hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/vlans Output: { \"status\" : \"ok\" , \"count\" : 0 , \"vlans\" : [ { \"vlan_vlan\" : \"1\" , \"vlan_domain\" : \"1\" , \"vlan_name\" : \"default\" , \"vlan_type\" : \"ethernet\" , \"vlan_mtu\" : null } ] } list_links Get a list of all Links. Route: /api/v0/resources/links Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/links Output: { \"status\" : \"ok\" , \"links\" : [ { \"id\" : 10 , \"local_port_id\" : 100 , \"local_device_id\" : 1 , \"remote_port_id\" : 200 , \"active\" : 1 , \"protocol\" : \"lldp\" , \"remote_hostname\" : \"host2.example.com\" , \"remote_device_id\" : 2 , \"remote_port\" : \"xe-0/0/1\" , \"remote_platform\" : null , \"remote_version\" : \"Example Router v.1.0\" }, ... ], \"count\" : 100 } get_links Get a list of Links per giver device. Route: /api/v0/devices/:hostname/links hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/links Output: { \"status\" : \"ok\" , \"links\" : [ { \"id\" : 10 , \"local_port_id\" : 100 , \"local_device_id\" : 1 , \"remote_port_id\" : 200 , \"active\" : 1 , \"protocol\" : \"lldp\" , \"remote_hostname\" : \"host2.example.com\" , \"remote_device_id\" : 2 , \"remote_port\" : \"xe-0/0/1\" , \"remote_platform\" : null , \"remote_version\" : \"Example Router v.1.0\" }, ... ], \"count\" : 10 } get_link Retrieves Link by ID Route: /api/v0/resources/links/:id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/links/10 Output: { \"status\" : \"ok\" , \"links\" : [ { \"id\" : 10 , \"local_port_id\" : 100 , \"local_device_id\" : 1 , \"remote_port_id\" : 200 , \"active\" : 1 , \"protocol\" : \"lldp\" , \"remote_hostname\" : \"host2.example.com\" , \"remote_device_id\" : 2 , \"remote_port\" : \"xe-0/0/1\" , \"remote_platform\" : null , \"remote_version\" : \"Example Router v.1.0\" } ], \"count\" : 1 } list_fdb Get a list of all ports FDB. Route: /api/v0/resources/fdb/:mac mac is the specific MAC address you would like to query Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/fdb curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/fdb/1aaa2bbb3ccc Output: { \"status\" : \"ok\" , \"ports_fdb\" : [ { \"ports_fdb_id\" : 10 , \"port_id\" : 10000 , \"mac_address\" : \"1aaa2bbb3ccc\" , \"vlan_id\" : 20000 , \"device_id\" : 1 , \"created_at\" : \"2019-01-1 01:01:01\" , \"updated_at\" : \"2019-01-1 01:01:01\" }, ... ], \"count\" : 100 } list_fdb_detail Get a list of all ports FDB with human readable device and interface names. Route: /api/v0/resources/fdb/:mac/detail mac is the specific MAC address you would like to query Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/fdb/1aaa2bbb3ccc/detail Output: { 'cou nt ' : 7 , 'mac' : ' 9 c : 93 : aa : bb : cc : dd' , 'mac_oui' : 'Xerox Corpora t io n ' , 'por ts _ f db' : [ { 'hos tna me' : 'hq - core 1 ' , 'i f Name' : 'ae 10 ' , 'las t _see n ' : ' 2 hours ago' , 'upda te d_a t ' : ' 2023-05-17 03 : 19 : 15 ' }, { 'hos tna me' : 'hq - sw 1 ' , 'i f Name' : 'ge -0 / 0 / 0 ' , 'las t _see n ' : ' 3 hours ago' , 'upda te d_a t ' : ' 2023-05-17 02 : 02 : 06 ' }, ... ], 's tatus ' : 'ok' }","title":"Switching"},{"location":"API/Switching/#list_vlans","text":"Get a list of all VLANs. Route: /api/v0/resources/vlans Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/vlans Output: { \"status\" : \"ok\" , \"vlans\" : [ { \"vlan_id\" : \"31\" , \"device_id\" : \"10\" , \"vlan_vlan\" : \"1\" , \"vlan_domain\" : \"1\" , \"vlan_name\" : \"default\" , \"vlan_type\" : \"ethernet\" , \"vlan_mtu\" : null }, ... ], \"count\" : 100 }","title":"list_vlans"},{"location":"API/Switching/#get_vlans","text":"Get a list of all VLANs for a given device. Route: /api/v0/devices/:hostname/vlans hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/vlans Output: { \"status\" : \"ok\" , \"count\" : 0 , \"vlans\" : [ { \"vlan_vlan\" : \"1\" , \"vlan_domain\" : \"1\" , \"vlan_name\" : \"default\" , \"vlan_type\" : \"ethernet\" , \"vlan_mtu\" : null } ] }","title":"get_vlans"},{"location":"API/Switching/#list_links","text":"Get a list of all Links. Route: /api/v0/resources/links Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/links Output: { \"status\" : \"ok\" , \"links\" : [ { \"id\" : 10 , \"local_port_id\" : 100 , \"local_device_id\" : 1 , \"remote_port_id\" : 200 , \"active\" : 1 , \"protocol\" : \"lldp\" , \"remote_hostname\" : \"host2.example.com\" , \"remote_device_id\" : 2 , \"remote_port\" : \"xe-0/0/1\" , \"remote_platform\" : null , \"remote_version\" : \"Example Router v.1.0\" }, ... ], \"count\" : 100 }","title":"list_links"},{"location":"API/Switching/#get_links","text":"Get a list of Links per giver device. Route: /api/v0/devices/:hostname/links hostname can be either the device hostname or id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/devices/localhost/links Output: { \"status\" : \"ok\" , \"links\" : [ { \"id\" : 10 , \"local_port_id\" : 100 , \"local_device_id\" : 1 , \"remote_port_id\" : 200 , \"active\" : 1 , \"protocol\" : \"lldp\" , \"remote_hostname\" : \"host2.example.com\" , \"remote_device_id\" : 2 , \"remote_port\" : \"xe-0/0/1\" , \"remote_platform\" : null , \"remote_version\" : \"Example Router v.1.0\" }, ... ], \"count\" : 10 }","title":"get_links"},{"location":"API/Switching/#get_link","text":"Retrieves Link by ID Route: /api/v0/resources/links/:id Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/links/10 Output: { \"status\" : \"ok\" , \"links\" : [ { \"id\" : 10 , \"local_port_id\" : 100 , \"local_device_id\" : 1 , \"remote_port_id\" : 200 , \"active\" : 1 , \"protocol\" : \"lldp\" , \"remote_hostname\" : \"host2.example.com\" , \"remote_device_id\" : 2 , \"remote_port\" : \"xe-0/0/1\" , \"remote_platform\" : null , \"remote_version\" : \"Example Router v.1.0\" } ], \"count\" : 1 }","title":"get_link"},{"location":"API/Switching/#list_fdb","text":"Get a list of all ports FDB. Route: /api/v0/resources/fdb/:mac mac is the specific MAC address you would like to query Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/fdb curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/fdb/1aaa2bbb3ccc Output: { \"status\" : \"ok\" , \"ports_fdb\" : [ { \"ports_fdb_id\" : 10 , \"port_id\" : 10000 , \"mac_address\" : \"1aaa2bbb3ccc\" , \"vlan_id\" : 20000 , \"device_id\" : 1 , \"created_at\" : \"2019-01-1 01:01:01\" , \"updated_at\" : \"2019-01-1 01:01:01\" }, ... ], \"count\" : 100 }","title":"list_fdb"},{"location":"API/Switching/#list_fdb_detail","text":"Get a list of all ports FDB with human readable device and interface names. Route: /api/v0/resources/fdb/:mac/detail mac is the specific MAC address you would like to query Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/resources/fdb/1aaa2bbb3ccc/detail Output: { 'cou nt ' : 7 , 'mac' : ' 9 c : 93 : aa : bb : cc : dd' , 'mac_oui' : 'Xerox Corpora t io n ' , 'por ts _ f db' : [ { 'hos tna me' : 'hq - core 1 ' , 'i f Name' : 'ae 10 ' , 'las t _see n ' : ' 2 hours ago' , 'upda te d_a t ' : ' 2023-05-17 03 : 19 : 15 ' }, { 'hos tna me' : 'hq - sw 1 ' , 'i f Name' : 'ge -0 / 0 / 0 ' , 'las t _see n ' : ' 3 hours ago' , 'upda te d_a t ' : ' 2023-05-17 02 : 02 : 06 ' }, ... ], 's tatus ' : 'ok' }","title":"list_fdb_detail"},{"location":"API/System/","text":"system Display Librenms instance information. Route: /api/v0/system Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/system Output: { \"status\" : \"ok\" , \"system\" : [ { \"local_ver\" : \"1.37-234-g19103ee\" , \"local_sha\" : \"19103ee36f68f009272c15be22e5a7e10a8b0b85\" , \"local_date\" : \"1526480966\" , \"local_branch\" : \"master\" , \"db_schema\" : 249 , \"php_ver\" : \"7.2.2\" , \"database_ver\" : \"MariaDB 5.5.56-MariaDB\" , \"rrdtool_ver\" : \"1.4.8\" , \"netsnmp_ver\" : \"NET-SNMP 5.7.2\" } ], \"count\" : 1 }","title":"System"},{"location":"API/System/#system","text":"Display Librenms instance information. Route: /api/v0/system Input: - Example: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/system Output: { \"status\" : \"ok\" , \"system\" : [ { \"local_ver\" : \"1.37-234-g19103ee\" , \"local_sha\" : \"19103ee36f68f009272c15be22e5a7e10a8b0b85\" , \"local_date\" : \"1526480966\" , \"local_branch\" : \"master\" , \"db_schema\" : 249 , \"php_ver\" : \"7.2.2\" , \"database_ver\" : \"MariaDB 5.5.56-MariaDB\" , \"rrdtool_ver\" : \"1.4.8\" , \"netsnmp_ver\" : \"NET-SNMP 5.7.2\" } ], \"count\" : 1 }","title":"system"},{"location":"Alerting/","text":"Introduction To get started, you first need some alert rules which will react to changes with your devices before raising an alert. Creating alert rules After that you also need to tell LibreNMS how to notify you when an alert is raised, this is done using Alert Transports . Configuring alert transports The next step is not strictly required but most people find it useful. Creating custom alert templates will help you get the benefit out of the alert system in general. Whilst we include a default template, it is limited in the data that you will receive in the alerts. Configuring alert templates Managing alerts When an alert has triggered you will see these in the Alerts -> Notifications page within the Web UI. This list has a couple of options available to it and we'll explain what these are here. ACK This column provides you visibility on the status of the alert: This alert is currently active and sending alerts. Click this icon to acknowledge the alert. This alert is currently acknowledged until the alert clears. Click this icon to un-acknowledge the alert. This alert is currently acknowledged until the alert worsens or gets better, at which stage it will be automatically unacknowledged and alerts will resume. Click this icon to un-acknowledge the alert. Notes This column will allow you access to the acknowledge/unacknowledge notes for this alert.","title":"Introduction"},{"location":"Alerting/#introduction","text":"To get started, you first need some alert rules which will react to changes with your devices before raising an alert. Creating alert rules After that you also need to tell LibreNMS how to notify you when an alert is raised, this is done using Alert Transports . Configuring alert transports The next step is not strictly required but most people find it useful. Creating custom alert templates will help you get the benefit out of the alert system in general. Whilst we include a default template, it is limited in the data that you will receive in the alerts. Configuring alert templates","title":"Introduction"},{"location":"Alerting/#managing-alerts","text":"When an alert has triggered you will see these in the Alerts -> Notifications page within the Web UI. This list has a couple of options available to it and we'll explain what these are here.","title":"Managing alerts"},{"location":"Alerting/#ack","text":"This column provides you visibility on the status of the alert: This alert is currently active and sending alerts. Click this icon to acknowledge the alert. This alert is currently acknowledged until the alert clears. Click this icon to un-acknowledge the alert. This alert is currently acknowledged until the alert worsens or gets better, at which stage it will be automatically unacknowledged and alerts will resume. Click this icon to un-acknowledge the alert.","title":"ACK"},{"location":"Alerting/#notes","text":"This column will allow you access to the acknowledge/unacknowledge notes for this alert.","title":"Notes"},{"location":"Alerting/Creating-Transport/","text":"Creating a new Transport File location All transports are located in LibreNMS\\Alert\\Transport and the files are named after the Transport name. I.e Discord.php for Discord. Transport structure The following functions are required for a new transport to pass the unit tests: deliverAlert() - This is function called within alerts to invoke the transport. Here you should do any post processing of the transport config to get it ready for use. contact$Transport() - This is named after the transport so for Discord it would be contactDiscord() . This is what actually interacts with the 3rd party API, invokes the mail command or whatever you want your alert to do. configTemplate() - This is used to define the form that will accept the transport config in the webui and then what data should be validated and how. Validation is done using Laravel validation The following function is not required for new Transports and is for legacy reasons only. deliverAlertOld() . Documentation Please don't forget to update the Transport file to include details of your new transport. A table should be provided to indicate the form values that we ask for and examples. I.e: Config Example Discord URL https://discordapp.com/api/webhooks/4515489001665127664/82-sf4385ysuhfn34u2fhfsdePGLrg8K7cP9wl553Fg6OlZuuxJGaa1d54fe Options username=myname","title":"Creating Transports"},{"location":"Alerting/Creating-Transport/#creating-a-new-transport","text":"","title":"Creating a new Transport"},{"location":"Alerting/Creating-Transport/#file-location","text":"All transports are located in LibreNMS\\Alert\\Transport and the files are named after the Transport name. I.e Discord.php for Discord.","title":"File location"},{"location":"Alerting/Creating-Transport/#transport-structure","text":"The following functions are required for a new transport to pass the unit tests: deliverAlert() - This is function called within alerts to invoke the transport. Here you should do any post processing of the transport config to get it ready for use. contact$Transport() - This is named after the transport so for Discord it would be contactDiscord() . This is what actually interacts with the 3rd party API, invokes the mail command or whatever you want your alert to do. configTemplate() - This is used to define the form that will accept the transport config in the webui and then what data should be validated and how. Validation is done using Laravel validation The following function is not required for new Transports and is for legacy reasons only. deliverAlertOld() .","title":"Transport structure"},{"location":"Alerting/Creating-Transport/#documentation","text":"Please don't forget to update the Transport file to include details of your new transport. A table should be provided to indicate the form values that we ask for and examples. I.e: Config Example Discord URL https://discordapp.com/api/webhooks/4515489001665127664/82-sf4385ysuhfn34u2fhfsdePGLrg8K7cP9wl553Fg6OlZuuxJGaa1d54fe Options username=myname","title":"Documentation"},{"location":"Alerting/Device-Dependencies/","text":"Device Dependencies It is possible to set one or more parents for a device. The aim for that is, if all parent devices are down, alert contacts will not receive redundant alerts for dependent devices. This is very useful when you have an outage, say in a branch office, where normally you'd receive hundreds of alerts, but when this is properly configured, you'd only receive an alert for the parent hosts. There are three ways to configure this feature. First one is from general settings of a device. The other two can be done in the 'Device Dependencies' item under 'Devices' menu. In this page, you can see all devices and with its parents. Clicking on the 'bin' icon will clear the dependency setting. Clicking on the 'pen' icon will let you edit or change the current setting for chosen device. There's also a 'Manage Device Dependencies' button on the top. This will let you set parents for multiple devices at once. For an intro on getting started with Device Dependencies, take a look at our Youtube video","title":"Device Dependencies"},{"location":"Alerting/Device-Dependencies/#device-dependencies","text":"It is possible to set one or more parents for a device. The aim for that is, if all parent devices are down, alert contacts will not receive redundant alerts for dependent devices. This is very useful when you have an outage, say in a branch office, where normally you'd receive hundreds of alerts, but when this is properly configured, you'd only receive an alert for the parent hosts. There are three ways to configure this feature. First one is from general settings of a device. The other two can be done in the 'Device Dependencies' item under 'Devices' menu. In this page, you can see all devices and with its parents. Clicking on the 'bin' icon will clear the dependency setting. Clicking on the 'pen' icon will let you edit or change the current setting for chosen device. There's also a 'Manage Device Dependencies' button on the top. This will let you set parents for multiple devices at once. For an intro on getting started with Device Dependencies, take a look at our Youtube video","title":"Device Dependencies"},{"location":"Alerting/Entities/","text":"Entities Entities as described earlier are based on the table and column names within the database, if you are unsure of what the entity is you want then have a browse around inside MySQL using show tables and desc . Below are some common entities that you can use within the alerting system. This list is not exhaustive and you should look at the MySQL database schema for the full list. Devices Entity Description devices.hostname The device hostname devices.sysName The device sysName devices.sysDescr The device sysDescr devices.hardware The device hardware devices.version The device os version devices.location The device location devices.status The status of the device, 1 devices.status_reason The reason the device was detected as down (icmp or snmp) devices.ignore If the device is ignored this will be set to 1 devices.disabled If the device is disabled this will be set to 1 devices.last_polled The the last polled datetime (yyyy-mm-dd hh:mm:ss) devices.type The device type such as network, server, firewall, etc. BGP Peers Entity Description bgpPeers.astext This is the description of the BGP Peer bgpPeers.bgpPeerIdentifier The IP address of the BGP Peer bgpPeers.bgpPeerRemoteAs The AS number of the BGP Peer bgpPeers.bgpPeerState The operational state of the BGP session bgpPeers.bgpPeerAdminStatus The administrative state of the BGP session bgpPeers.bgpLocalAddr The local address of the BGP session. IPSec Tunnels Entity Description ipsec_tunnels.peer_addr The remote VPN peer address ipsec_tunnels.local_addr The local VPN address ipsec_tunnels.tunnel_status The VPN tunnels operational status. Memory pools Entity | Description |---|---| mempools.mempool_type | The memory pool type such as hrstorage, cmp and cemp mempools.mempool_descr | The description of the pool such as Physical memory, Virtual memory and System memory mempools.mempool_perc | The used percentage of the memory pool. Ports Entity Description ports.ifDescr The interface description ports.ifName The interface name ports.ifSpeed The port speed in bps ports.ifHighSpeed The port speed in mbps ports.ifOperStatus The operational status of the port (up or down) ports.ifAdminStatus The administrative status of the port (up or down) ports.ifDuplex Duplex setting of the port ports.ifMtu The MTU setting of the port. Processors Entity Description processors.processor_usage The usage of the processor as a percentage processors.processor_descr The description of the processor. Storage Entity Description storage.storage_descr The description of the storage storage.storage_perc The usage of the storage as a percentage. Health / Sensors Entity Description sensors.sensor_desc The sensors description. sensors.sensor_current The current sensors value. sensors.sensor_prev The previous sensor value. sensors.lastupdate The sensors last updated datetime stamp.","title":"Entities"},{"location":"Alerting/Entities/#entities","text":"Entities as described earlier are based on the table and column names within the database, if you are unsure of what the entity is you want then have a browse around inside MySQL using show tables and desc . Below are some common entities that you can use within the alerting system. This list is not exhaustive and you should look at the MySQL database schema for the full list.","title":"Entities"},{"location":"Alerting/Entities/#devices","text":"Entity Description devices.hostname The device hostname devices.sysName The device sysName devices.sysDescr The device sysDescr devices.hardware The device hardware devices.version The device os version devices.location The device location devices.status The status of the device, 1 devices.status_reason The reason the device was detected as down (icmp or snmp) devices.ignore If the device is ignored this will be set to 1 devices.disabled If the device is disabled this will be set to 1 devices.last_polled The the last polled datetime (yyyy-mm-dd hh:mm:ss) devices.type The device type such as network, server, firewall, etc.","title":"Devices"},{"location":"Alerting/Entities/#bgp-peers","text":"Entity Description bgpPeers.astext This is the description of the BGP Peer bgpPeers.bgpPeerIdentifier The IP address of the BGP Peer bgpPeers.bgpPeerRemoteAs The AS number of the BGP Peer bgpPeers.bgpPeerState The operational state of the BGP session bgpPeers.bgpPeerAdminStatus The administrative state of the BGP session bgpPeers.bgpLocalAddr The local address of the BGP session.","title":"BGP Peers"},{"location":"Alerting/Entities/#ipsec-tunnels","text":"Entity Description ipsec_tunnels.peer_addr The remote VPN peer address ipsec_tunnels.local_addr The local VPN address ipsec_tunnels.tunnel_status The VPN tunnels operational status.","title":"IPSec Tunnels"},{"location":"Alerting/Entities/#memory-pools","text":"Entity | Description |---|---| mempools.mempool_type | The memory pool type such as hrstorage, cmp and cemp mempools.mempool_descr | The description of the pool such as Physical memory, Virtual memory and System memory mempools.mempool_perc | The used percentage of the memory pool.","title":"Memory pools"},{"location":"Alerting/Entities/#ports","text":"Entity Description ports.ifDescr The interface description ports.ifName The interface name ports.ifSpeed The port speed in bps ports.ifHighSpeed The port speed in mbps ports.ifOperStatus The operational status of the port (up or down) ports.ifAdminStatus The administrative status of the port (up or down) ports.ifDuplex Duplex setting of the port ports.ifMtu The MTU setting of the port.","title":"Ports"},{"location":"Alerting/Entities/#processors","text":"Entity Description processors.processor_usage The usage of the processor as a percentage processors.processor_descr The description of the processor.","title":"Processors"},{"location":"Alerting/Entities/#storage","text":"Entity Description storage.storage_descr The description of the storage storage.storage_perc The usage of the storage as a percentage.","title":"Storage"},{"location":"Alerting/Entities/#health-sensors","text":"Entity Description sensors.sensor_desc The sensors description. sensors.sensor_current The current sensors value. sensors.sensor_prev The previous sensor value. sensors.lastupdate The sensors last updated datetime stamp.","title":"Health / Sensors"},{"location":"Alerting/Macros/","text":"Macros Macros are shorthands to either portion of rules or pure SQL enhanced with placeholders. You can define your own macros in your config.php . Example macro-implementation of Debian-Devices $config [ 'alert' ][ 'macros' ][ 'rule' ][ 'is_debian' ] = 'devices.features ~ \"@debian@\"' ; And in the Rule: ... macros.is_debian = 1 ... This Example-macro is a Boolean-macro, it applies a form of filter to the set of results defined by the rule. All macros that are not unary should return Boolean. Device (Boolean) Entity: macros.device Description: Only select devices that aren't deleted, ignored or disabled. Source: (devices.disabled = 0 AND devices.ignore = 0) Device is up (Boolean) Entity: macros.device_up Description: Only select devices that are up. Implies: macros.device Source: (devices.status = 1 AND macros.device) Device is down (Boolean) Entity: macros.device_down Description: Only select devices that are down. Implies: macros.device Source: (devices.status = 0 AND macros.device) Port (Boolean) Entity: macros.port Description: Only select ports that aren't deleted, ignored or disabled. Source: (ports.deleted = 0 AND ports.ignore = 0 AND ports.disabled = 0) Port is up (Boolean) Entity: macros.port_up Description: Only select ports that are up and also should be up. Implies: macros.port Source: (ports.ifOperStatus = up AND ports.ifAdminStatus = up AND macros.port) Port is down (Boolean) Entity: macros.port_down Description: Only select ports that are down. Implies: macros.port Source: (ports.ifOperStatus != \"up\" AND ports.ifAdminStatus != \"down\" AND macros.port) Port-Usage in Percent (Decimal) Entity: macros.port_usage_perc Description: Return port-usage (max value of in and out) in percent. Source: ((SELECT IF(ports.ifOutOctets_rate>ports.ifInOctets_rate, ports.ifOutOctets_rate, ports.ifInOctets_rate)*8) / ports.ifSpeed)*100 Time Now (Datetime) Entity: macros.now Description: Alias of MySQL's NOW() Source: NOW() Past N Minutes (Datetime) Entity: macros.past_$m Description: Returns a MySQL Timestamp dated $ Minutes in the past. $ can only be a supported Resolution. Example: macros.past_5m is Last 5 Minutes. Resolution: 5,10,15,30,60 Source: DATE_SUB(NOW(),INTERVAL $ MINUTE) Sensors (Boolean) Entity: macros.sensor Description: Only select sensors that aren't ignored. Source: (sensors.sensor_alert = 1) Entity: macros.sensor_port_link = 1 Description: Only selects sensors that have a port linked to them, the port is up and the device is up. Source: (sensors.entity_link_type = \"port\" AND sensors.entity_link_index = ports.ifIndex AND macros.port_up AND macros.device_up)) State Sensors (Boolean) Entity: macros.state_sensor_ok , macros.state_sensor_warning , macros.state_sensor_critical , macros.state_sensor_unknown Description: Select state sensors by their generic status ok (0), warning (1), critical (2), unknown (3) Source: (sensors.sensor_current = state_translations.state_value AND state_translations.state_generic_value = 2) Misc (Boolean) Packet Loss Entity: (macros.packet_loss_5m) Description: Packet loss % value for the device within the last 5 minutes. Example: macros.packet_loss_5m > 50 Entity: (macros.packet_loss_15m) Description: Packet loss % value for the device within the last 15 minutes. Example: macros.packet_loss_15m > 50 Ports in usage perc (Int) Entity: ((ports.ifInOctets_rate*8)/ports.ifSpeed)*100 Description: Port in used more than 50% Example: `macros.port_in_usage_perc > 50 Ports out usage perc (Int) Entity: ((ports.ifOutOctets_rate*8)/ports.ifSpeed)*100 Description: Port out used more than 50% Example: `macros.port_out_usage_perc > 50 Ports now down (Boolean) Entity: ports.ifOperStatus != ports.ifOperStatus_prev AND ports.ifOperStatus_prev = \"up\" AND ports.ifAdminStatus = \"up\" Description: Ports that were previously up and have now gone down. Example: macros.port_now_down = 1 Port has xDP neighbour (Boolean) Entity: %macros.port AND %links.local_port_id = %ports.port_id Description: Ports that have an xDP (lldp, cdp, etc) neighbour. Example: macros.port_has_xdp_neighbours = 1 Port has xDP neighbour already known in LibreNMS (Boolean) Entity: %macros.port_has_neighbours AND (%links.remote_port_id IS NOT NULL) Description: Ports that have an xDP (lldp, cdp, etc) neighbour that is already known in libreNMS. Example: macros.port_has_xdp_neighbours_device = 1 Device component down [JunOS] Entity: sensors.sensor_class = \"state\" AND sensors.sensor_current != \"6\" AND sensors.sensor_type = \"jnxFruState\" AND sensors.sensor_current != \"2\" Description: Device component is down such as Fan, PSU, etc for JunOS devices. Example: macros.device_component_down_junos = 1 Device component down [Cisco] Entity: sensors.sensor_current != 1 AND sensors.sensor_current != 5 AND sensors.sensor_type ~ \"^cisco.*State$\" Description: Device component is down such as Fan, PSU, etc for Cisco devices. Example: macros.device_component_down_cisco = 1 PDU over amperage [APC] Entity: sensors.sensor_class = \"current\" AND sensors.sensor_descr = \"Bank Total\" AND sensors.sensor_current > sensors.sensor_limit AND devices.os = \"apc\" Description: APC PDU over amperage Example: macros.pdu_over_amperage_apc = 1","title":"Macros"},{"location":"Alerting/Macros/#macros","text":"Macros are shorthands to either portion of rules or pure SQL enhanced with placeholders. You can define your own macros in your config.php . Example macro-implementation of Debian-Devices $config [ 'alert' ][ 'macros' ][ 'rule' ][ 'is_debian' ] = 'devices.features ~ \"@debian@\"' ; And in the Rule: ... macros.is_debian = 1 ... This Example-macro is a Boolean-macro, it applies a form of filter to the set of results defined by the rule. All macros that are not unary should return Boolean.","title":"Macros"},{"location":"Alerting/Macros/#device-boolean","text":"Entity: macros.device Description: Only select devices that aren't deleted, ignored or disabled. Source: (devices.disabled = 0 AND devices.ignore = 0)","title":"Device (Boolean)"},{"location":"Alerting/Macros/#device-is-up-boolean","text":"Entity: macros.device_up Description: Only select devices that are up. Implies: macros.device Source: (devices.status = 1 AND macros.device)","title":"Device is up (Boolean)"},{"location":"Alerting/Macros/#device-is-down-boolean","text":"Entity: macros.device_down Description: Only select devices that are down. Implies: macros.device Source: (devices.status = 0 AND macros.device)","title":"Device is down (Boolean)"},{"location":"Alerting/Macros/#port-boolean","text":"Entity: macros.port Description: Only select ports that aren't deleted, ignored or disabled. Source: (ports.deleted = 0 AND ports.ignore = 0 AND ports.disabled = 0)","title":"Port (Boolean)"},{"location":"Alerting/Macros/#port-is-up-boolean","text":"Entity: macros.port_up Description: Only select ports that are up and also should be up. Implies: macros.port Source: (ports.ifOperStatus = up AND ports.ifAdminStatus = up AND macros.port)","title":"Port is up (Boolean)"},{"location":"Alerting/Macros/#port-is-down-boolean","text":"Entity: macros.port_down Description: Only select ports that are down. Implies: macros.port Source: (ports.ifOperStatus != \"up\" AND ports.ifAdminStatus != \"down\" AND macros.port)","title":"Port is down (Boolean)"},{"location":"Alerting/Macros/#port-usage-in-percent-decimal","text":"Entity: macros.port_usage_perc Description: Return port-usage (max value of in and out) in percent. Source: ((SELECT IF(ports.ifOutOctets_rate>ports.ifInOctets_rate, ports.ifOutOctets_rate, ports.ifInOctets_rate)*8) / ports.ifSpeed)*100","title":"Port-Usage in Percent (Decimal)"},{"location":"Alerting/Macros/#time","text":"","title":"Time"},{"location":"Alerting/Macros/#now-datetime","text":"Entity: macros.now Description: Alias of MySQL's NOW() Source: NOW()","title":"Now (Datetime)"},{"location":"Alerting/Macros/#past-n-minutes-datetime","text":"Entity: macros.past_$m Description: Returns a MySQL Timestamp dated $ Minutes in the past. $ can only be a supported Resolution. Example: macros.past_5m is Last 5 Minutes. Resolution: 5,10,15,30,60 Source: DATE_SUB(NOW(),INTERVAL $ MINUTE)","title":"Past N Minutes (Datetime)"},{"location":"Alerting/Macros/#sensors-boolean","text":"Entity: macros.sensor Description: Only select sensors that aren't ignored. Source: (sensors.sensor_alert = 1) Entity: macros.sensor_port_link = 1 Description: Only selects sensors that have a port linked to them, the port is up and the device is up. Source: (sensors.entity_link_type = \"port\" AND sensors.entity_link_index = ports.ifIndex AND macros.port_up AND macros.device_up))","title":"Sensors (Boolean)"},{"location":"Alerting/Macros/#state-sensors-boolean","text":"Entity: macros.state_sensor_ok , macros.state_sensor_warning , macros.state_sensor_critical , macros.state_sensor_unknown Description: Select state sensors by their generic status ok (0), warning (1), critical (2), unknown (3) Source: (sensors.sensor_current = state_translations.state_value AND state_translations.state_generic_value = 2)","title":"State Sensors (Boolean)"},{"location":"Alerting/Macros/#misc-boolean","text":"","title":"Misc (Boolean)"},{"location":"Alerting/Macros/#packet-loss","text":"Entity: (macros.packet_loss_5m) Description: Packet loss % value for the device within the last 5 minutes. Example: macros.packet_loss_5m > 50 Entity: (macros.packet_loss_15m) Description: Packet loss % value for the device within the last 15 minutes. Example: macros.packet_loss_15m > 50","title":"Packet Loss"},{"location":"Alerting/Macros/#ports-in-usage-perc-int","text":"Entity: ((ports.ifInOctets_rate*8)/ports.ifSpeed)*100 Description: Port in used more than 50% Example: `macros.port_in_usage_perc > 50","title":"Ports in usage perc (Int)"},{"location":"Alerting/Macros/#ports-out-usage-perc-int","text":"Entity: ((ports.ifOutOctets_rate*8)/ports.ifSpeed)*100 Description: Port out used more than 50% Example: `macros.port_out_usage_perc > 50","title":"Ports out usage perc (Int)"},{"location":"Alerting/Macros/#ports-now-down-boolean","text":"Entity: ports.ifOperStatus != ports.ifOperStatus_prev AND ports.ifOperStatus_prev = \"up\" AND ports.ifAdminStatus = \"up\" Description: Ports that were previously up and have now gone down. Example: macros.port_now_down = 1","title":"Ports now down (Boolean)"},{"location":"Alerting/Macros/#port-has-xdp-neighbour-boolean","text":"Entity: %macros.port AND %links.local_port_id = %ports.port_id Description: Ports that have an xDP (lldp, cdp, etc) neighbour. Example: macros.port_has_xdp_neighbours = 1","title":"Port has xDP neighbour (Boolean)"},{"location":"Alerting/Macros/#port-has-xdp-neighbour-already-known-in-librenms-boolean","text":"Entity: %macros.port_has_neighbours AND (%links.remote_port_id IS NOT NULL) Description: Ports that have an xDP (lldp, cdp, etc) neighbour that is already known in libreNMS. Example: macros.port_has_xdp_neighbours_device = 1","title":"Port has xDP neighbour already known in LibreNMS (Boolean)"},{"location":"Alerting/Macros/#device-component-down-junos","text":"Entity: sensors.sensor_class = \"state\" AND sensors.sensor_current != \"6\" AND sensors.sensor_type = \"jnxFruState\" AND sensors.sensor_current != \"2\" Description: Device component is down such as Fan, PSU, etc for JunOS devices. Example: macros.device_component_down_junos = 1","title":"Device component down [JunOS]"},{"location":"Alerting/Macros/#device-component-down-cisco","text":"Entity: sensors.sensor_current != 1 AND sensors.sensor_current != 5 AND sensors.sensor_type ~ \"^cisco.*State$\" Description: Device component is down such as Fan, PSU, etc for Cisco devices. Example: macros.device_component_down_cisco = 1","title":"Device component down [Cisco]"},{"location":"Alerting/Macros/#pdu-over-amperage-apc","text":"Entity: sensors.sensor_class = \"current\" AND sensors.sensor_descr = \"Bank Total\" AND sensors.sensor_current > sensors.sensor_limit AND devices.os = \"apc\" Description: APC PDU over amperage Example: macros.pdu_over_amperage_apc = 1","title":"PDU over amperage [APC]"},{"location":"Alerting/Rules/","text":"Rules Rules are defined using a logical language. The GUI provides a simple way of creating rules. Creating more complicated rules which may include maths calculations and MySQL queries can be done using macros Syntax Rules must consist of at least 3 elements: An Entity , a Condition and a Value . Rules can contain braces and Glues . Entities are provided from Table and Field from the database. For Example: ports.ifOperStatus . Conditions can be any of: Equals = Not Equals != In IN Not In NOT IN Begins with LIKE ('...%') Doesn't begin with NOT LIKE ('...%') Contains LIKE ('%...%') Doesn't Contain NOT LIKE ('%...%') Ends with LIKE ('%...') Doesn't end with NOT LIKE ('%...') Between BETWEEN Not Between NOT BETWEEN Is Empty = '' Is Not Empty != ''' Is Null IS NULL Is Not Null IS NOT NULL Greater > Greater or Equal >= Less < Less or Equal <= Regex REGEXP Values can be an entity or any data. If using macros as value you must include the macro name into backticks. i.e. `macros.past_60m` Note : Regex supports MySQL Regular expressions. Arithmetics are allowed as well. Options Here are some of the other options available when adding an alerting rule: Rule name: The name associated with the rule. Severity: How \"important\" the rule is. Max alerts: The maximum number of alerts sent for the event. -1 means unlimited. Delay: The amount of time in seconds to wait after a rule is matched before sending an alert out transport. Interval: The interval of time in seconds between alerts for an event until Max alert is reached. Mute alerts: Disables sending alert rule through alert transport. But will still show the alert in the Web UI. Invert match: Invert the matching rule (ie. alert on items that _don't match the rule). Recovery alerts: This will disable the recovery notification from being sent if turned off. Advanced On the Advanced tab, you can specify some additional options for the alert rule: Override SQL: Enable this if you using a custom query Query: The query to be used for the alert. An example of this would be an average rule for all CPUs over 10% SELECT devices . device_id , devices . status , devices . disabled , devices . ignore , AVG ( processors . processor_usage ) AS cpu_avg FROM devices INNER JOIN processors ON devices . device_id = processors . device_id WHERE devices . device_id = ? AND devices . status = 1 AND devices . disabled = 0 AND devices . ignore = 0 GROUP BY devices . device_id , devices . status , devices . disabled , devices . ignore HAVING AVG ( processors . processor_usage ) > 10 The 10 would then contain the average CPU usage value, you can change this value to be whatever you like. You will to need copy and paste this into the Alert Rule under Advanced then paste into Query box and switch the Override SQL. Procedure You can associate a rule to a procedure by giving the URL of the procedure when creating the rule. Only links like \"http://\" are supported, otherwise an error will be returned. Once configured, procedure can be opened from the Alert widget through the \"Open\" button, which can be shown/hidden from the widget configuration box. Examples Alert when: Device goes down: devices.status != 1 Any port changes: ports.ifOperStatus != 'up' Root-directory gets too full: storage.storage_descr = '/' AND storage.storage_perc >= '75' Any storage gets fuller than the 'warning': storage.storage_perc >= storage_perc_warn If device is a server and the used storage is above the warning level, but ignore /boot partitions: storage.storage_perc > storage.storage_perc_warn AND devices.type = \"server\" AND storage.storage_descr != \"/boot\" VMware LAG is not using \"Source ip address hash\" load balancing: devices.os = \"vmware\" AND ports.ifType = \"ieee8023adLag\" AND ports.ifDescr REGEXP \"Link Aggregation .*, load balancing algorithm: Source ip address hash\" Syslog, authentication failure during the last 5m: syslog.timestamp >= macros.past_5m AND syslog.msg REGEXP \".*authentication failure.*\" High memory usage: macros.device_up = 1 AND mempools.mempool_perc >= 90 AND mempools.mempool_descr REGEXP \"Virtual.*\" High CPU usage(per core usage, not overall): macros.device_up = 1 AND processors.processor_usage >= 90 High port usage, where description is not client & ifType is not softwareLoopback: macros.port_usage_perc >= 80 AND port.port_descr_type != \"client\" AND ports.ifType != \"softwareLoopback\" Alert when mac address is located on your network ipv4_mac.mac_address = \"2c233a756912\" Alert Rules Collection You can also select Alert Rule from the Alerts Collection. These Alert Rules are submitted by users in the community :) If would like to submit your alert rules to the collection, please submit them here Alert Rules Collection","title":"Rules"},{"location":"Alerting/Rules/#rules","text":"Rules are defined using a logical language. The GUI provides a simple way of creating rules. Creating more complicated rules which may include maths calculations and MySQL queries can be done using macros","title":"Rules"},{"location":"Alerting/Rules/#syntax","text":"Rules must consist of at least 3 elements: An Entity , a Condition and a Value . Rules can contain braces and Glues . Entities are provided from Table and Field from the database. For Example: ports.ifOperStatus . Conditions can be any of: Equals = Not Equals != In IN Not In NOT IN Begins with LIKE ('...%') Doesn't begin with NOT LIKE ('...%') Contains LIKE ('%...%') Doesn't Contain NOT LIKE ('%...%') Ends with LIKE ('%...') Doesn't end with NOT LIKE ('%...') Between BETWEEN Not Between NOT BETWEEN Is Empty = '' Is Not Empty != ''' Is Null IS NULL Is Not Null IS NOT NULL Greater > Greater or Equal >= Less < Less or Equal <= Regex REGEXP Values can be an entity or any data. If using macros as value you must include the macro name into backticks. i.e. `macros.past_60m` Note : Regex supports MySQL Regular expressions. Arithmetics are allowed as well.","title":"Syntax"},{"location":"Alerting/Rules/#options","text":"Here are some of the other options available when adding an alerting rule: Rule name: The name associated with the rule. Severity: How \"important\" the rule is. Max alerts: The maximum number of alerts sent for the event. -1 means unlimited. Delay: The amount of time in seconds to wait after a rule is matched before sending an alert out transport. Interval: The interval of time in seconds between alerts for an event until Max alert is reached. Mute alerts: Disables sending alert rule through alert transport. But will still show the alert in the Web UI. Invert match: Invert the matching rule (ie. alert on items that _don't match the rule). Recovery alerts: This will disable the recovery notification from being sent if turned off.","title":"Options"},{"location":"Alerting/Rules/#advanced","text":"On the Advanced tab, you can specify some additional options for the alert rule: Override SQL: Enable this if you using a custom query Query: The query to be used for the alert. An example of this would be an average rule for all CPUs over 10% SELECT devices . device_id , devices . status , devices . disabled , devices . ignore , AVG ( processors . processor_usage ) AS cpu_avg FROM devices INNER JOIN processors ON devices . device_id = processors . device_id WHERE devices . device_id = ? AND devices . status = 1 AND devices . disabled = 0 AND devices . ignore = 0 GROUP BY devices . device_id , devices . status , devices . disabled , devices . ignore HAVING AVG ( processors . processor_usage ) > 10 The 10 would then contain the average CPU usage value, you can change this value to be whatever you like. You will to need copy and paste this into the Alert Rule under Advanced then paste into Query box and switch the Override SQL.","title":"Advanced"},{"location":"Alerting/Rules/#procedure","text":"You can associate a rule to a procedure by giving the URL of the procedure when creating the rule. Only links like \"http://\" are supported, otherwise an error will be returned. Once configured, procedure can be opened from the Alert widget through the \"Open\" button, which can be shown/hidden from the widget configuration box.","title":"Procedure"},{"location":"Alerting/Rules/#examples","text":"Alert when: Device goes down: devices.status != 1 Any port changes: ports.ifOperStatus != 'up' Root-directory gets too full: storage.storage_descr = '/' AND storage.storage_perc >= '75' Any storage gets fuller than the 'warning': storage.storage_perc >= storage_perc_warn If device is a server and the used storage is above the warning level, but ignore /boot partitions: storage.storage_perc > storage.storage_perc_warn AND devices.type = \"server\" AND storage.storage_descr != \"/boot\" VMware LAG is not using \"Source ip address hash\" load balancing: devices.os = \"vmware\" AND ports.ifType = \"ieee8023adLag\" AND ports.ifDescr REGEXP \"Link Aggregation .*, load balancing algorithm: Source ip address hash\" Syslog, authentication failure during the last 5m: syslog.timestamp >= macros.past_5m AND syslog.msg REGEXP \".*authentication failure.*\" High memory usage: macros.device_up = 1 AND mempools.mempool_perc >= 90 AND mempools.mempool_descr REGEXP \"Virtual.*\" High CPU usage(per core usage, not overall): macros.device_up = 1 AND processors.processor_usage >= 90 High port usage, where description is not client & ifType is not softwareLoopback: macros.port_usage_perc >= 80 AND port.port_descr_type != \"client\" AND ports.ifType != \"softwareLoopback\" Alert when mac address is located on your network ipv4_mac.mac_address = \"2c233a756912\"","title":"Examples"},{"location":"Alerting/Rules/#alert-rules-collection","text":"You can also select Alert Rule from the Alerts Collection. These Alert Rules are submitted by users in the community :) If would like to submit your alert rules to the collection, please submit them here Alert Rules Collection","title":"Alert Rules Collection"},{"location":"Alerting/Templates/","text":"Templates This page is for installs running version 1.42 or later. You can find the older docs here Templates can be assigned to a single or a group of rules and can contain any kind of text. There is also a default template which is used for any rule that isn't associated with a template. This template can be found under Alert Templates page and can be edited. It also has an option revert it back to its default content. To attach a template to a rule just open the Alert Templates settings page, choose the template to assign and click the yellow button in the Actions column. In the appearing popupbox select the rule(s) you want the template to be assigned to and click the Attach button. You might hold down the CTRL key to select multiple rules at once. The templating engine in use is Laravel Blade. We will cover some of the basics here, however the official Laravel docs will have more information here Syntax Controls: if-else (Else can be omitted): @if ($alert->placeholder == 'value') Some Text @else Other Text @endif foreach-loop: @foreach ($alert->faults as $key => $value) Key: $key Value: $value @endforeach Placeholders: Placeholders are special variables that if used within the template will be replaced with the relevant data, I.e: The device {{ $alert->hostname }} has been up for {{ $alert->uptime }} seconds would result in the following The device localhost has been up for 30344 seconds . When using placeholders to echo data, you need to wrap the placeholder in {{ }} . I.e {{ $alert->hostname }} . Device ID: $alert->device_id Hostname of the Device: $alert->hostname sysName of the Device: $alert->sysName sysDescr of the Device: $alert->sysDescr display name of the Device: $alert->display sysContact of the Device: $alert->sysContact OS of the Device: $alert->os Type of Device: $alert->type IP of the Device: $alert->ip Hardware of the Device: $alert->hardware Software version of the Device: $alert->version Features of the Device: $alert->features Serial number of the Device: $alert->serial Location of the Device: $alert->location uptime of the Device (in seconds): $alert->uptime Short uptime of the Device (28d 22h 30m 7s): $alert->uptime_short Long uptime of the Device (28 days, 22h 30m 7s): $alert->uptime_long Description (purpose db field) of the Device: $alert->description Notes of the Device: $alert->notes Notes of the alert (ack notes): $alert->alert_notes ping timestamp (if icmp enabled): $alert->ping_timestamp ping loss (if icmp enabled): $alert->ping_loss ping min (if icmp enabled): $alert->ping_min ping max (if icmp enabled): $alert->ping_max ping avg (if icmp enabled): $alert->ping_avg debug (array) poller_name - name of poller (for distributed setups) If $config['debug']['run_trace] = true; is set then this will contain: traceroute (if enabled you will receive traceroute output): $alert->debug['traceroute'] traceroute_output (if the traceroute fails this will contain why): $alert->debug['traceroute_output'] Title for the Alert: $alert->title Time Elapsed, Only available on recovery ( $alert->state == 0 ): $alert->elapsed Rule Builder (the actual rule) (use {!! $alert->builder !!} ): $alert->builder Alert-ID: $alert->id Unique-ID: $alert->uid Faults, Only available on alert ( $alert->state != 0 ), must be iterated in a foreach ( @foreach ($alert->faults as $key => $value) @endforeach ). Holds all available information about the Fault, accessible in the format $value['Column'] , for example: $value['ifDescr'] . Special field $value['string'] has most Identification-information (IDs, Names, Descrs) as single string, this is the equivalent of the default used and must be encased in {{ }} State: $alert->state Severity: $alert->severity Rule: $alert->rule Rule-Name: $alert->name Procedure URL: $alert->proc Timestamp: $alert->timestamp Transport type: $alert->transport Transport name: $alert->transport_name Contacts, must be iterated in a foreach, $key holds email and $value holds name: $alert->contacts Placeholders can be used within the subjects for templates as well although $faults is most likely going to be worthless. The Default Template is a 'one-size-fit-all'. We highly recommend defining your own templates for your rules to include more specific information. Base Templates If you'd like to reuse a common template for your alerts follow below A default file is located in resources/views/alerts/templates/default.blade.php Displays the following: LibreNMS Alert
            @yield('content')
            The important part being the @yield('content') You can use plain text or html as per Alert templates and this will form the basis of your common template, feel free to make as many templates in the directory as needed. In your alert template just use @extends('alerts.templates.default') @section('content') {{ $alert->title }} Severity: {{ $alert->severity }} ... @endsection More info: https://laravel.com/docs/blade#extending-a-layout Examples Default Template {{ $alert->title }} Severity: {{ $alert->severity }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Unique-ID: {{ $alert->uid }} Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif @if ($alert->faults) Faults: @foreach ($alert->faults as $key => $value) {{ $key }}: {{ $value['string'] }} @endforeach @endif Alert sent to: @foreach ($alert->contacts as $key => $value) {{ $value }} <{{ $key }}> @endforeach Ports Utilization Template {{ $alert->title }} Device Name: {{ $alert->hostname }} Severity: {{ $alert->severity }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif @foreach ($alert->faults as $key => $value) Physical Interface: {{ $value['ifDescr'] }} Interface Description: {{ $value['ifAlias'] }} Interface Speed: {{ ($value['ifSpeed']/1000000000) }} Gbs Inbound Utilization: {{ (($value['ifInOctets_rate']*8)/$value['ifSpeed'])*100 }} Outbound Utilization: {{ (($value['ifOutOctets_rate']*8)/$value['ifSpeed'])*100 }} @endforeach Storage {{ $alert->title }} Device Name: {{ $alert->hostname }} Severity: {{ $alert->severity }} Uptime: {{ $alert->uptime_short }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Location: {{ $alert->location }} Description: {{ $alert->description }} Features: {{ $alert->features }} Notes: {{ $alert->notes }} Server: {{ $alert->sysName }} @foreach ($alert->faults as $key => $value) Mount Point: {{ $value['storage_descr'] }} Percent Utilized: {{ $value['storage_perc'] }} @endforeach Value Sensors (Temperature, Humidity, Fanspeed, ...) {{ $alert->title }} Device Name: {{ $alert->hostname }} Severity: {{ $alert->severity }} Timestamp: {{ $alert->timestamp }} Uptime: {{ $alert->uptime_short }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Location: {{ $alert->location }} Description: {{ $alert->description }} Features: {{ $alert->features }} Notes: {{ $alert->notes }} Rule: {{ $alert->name ?? $alert->rule }} @if ($alert->faults) Faults: @foreach ($alert->faults as $key => $value) @php($unit = __(\"sensors.${value[\"sensor_class\"]}.unit\")) #{{ $key }}: {{ $value['sensor_descr'] ?? 'Sensor' }} Current: {{ $value['sensor_current'].$unit }} Previous: {{ $value['sensor_prev'].$unit }} Limit: {{ $value['sensor_limit'].$unit }} Over Limit: {{ round($value['sensor_current']-$value['sensor_limit'], 2).$unit }} @endforeach @endif Memory Alert {{ $alert->title }} Device Name: {{ $alert->hostname }} Severity: {{ $alert->severity }} Uptime: {{ $alert->uptime_short }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Location: {{ $alert->location }} Description: {{ $alert->description }} Notes: {{ $alert->notes }} Server: {{ $alert->hostname }} @foreach ($alert->faults as $key => $value) Memory Description: {{ $value['mempool_descr'] }} Percent Utilized: {{ $value['mempool_perc'] }} @endforeach Advanced options Conditional formatting Conditional formatting example, will display a link to the host in email or just the hostname in any other transport: @if ($alert->transport == 'mail')hostname }}/\">{{ $alert->hostname }} @else {{ $alert->hostname }} @endif Traceroute debugs @if ($alert->status == 0) @if ($alert->status_reason == 'icmp') {{ $alert->debug['traceroute'] }} @endif @endif Examples HTML Note: To use HTML emails you must set HTML email to Yes in the WebUI under Global Settings > Alerting Settings > Email transport > Use HTML emails Graphs There are two helpers for graphs that will use a signed url to allow secure external access. Anyone using the signed url will be able to view the graph. Your LibreNMS web must be accessible from the location where the graph is viewed. Some alert transports require publicly accessible urls. APP_URL must be set in .env to use signed graphs. Changing APP_KEY will invalidate all previously issued singed urls. You may specify the graph one of two ways, a php array of parameters, or a direct url to a graph. Note that to and from can be specified either as timestamps with time() or as relative time -3d or -36h . When using relative time, the graph will show based on when the user views the graph, not when the event happened. Sharing a graph image with a relative time will always give the recipient access to current data, where a specific timestamp will only allow access to that timeframe. @signedGraphTag This will insert a specially formatted html img tag linking to the graph. Some transports may search the template for this tag to attach images properly for that transport. @signedGraphTag([ 'id' => $value['port_id'], 'type' => 'port_bits', 'from' => time() - 43200, 'to' => time(), 'width' => 700, 'height' => 250 ]) Output: < img class = \"librenms-graph\" src = \"https://librenms.org/graph?from=1662176216&height=250&id=20425&to=1662219416&type=port_bits&width=700&signature=f6e516e8fd893c772eeaba165d027cb400e15a515254de561a05b63bc6f360a4\" > Specific graph using url input: @signedGraphTag('https://librenms.org/graph.php?type=device_processor&from=-2d&device=2&legend=no&height=400&width=1200') @signedGraphUrl This is used when you need the url directly. One example is using the API Transport, you may want to include the url only instead of a html tag. @signedGraphUrl([ 'id' => $value['port_id'], 'type' => 'port_bits', 'from' => time() - 43200, 'to' => time(), ]) Using models for optional data If some value does not exist within the $faults[] -array, you may query fields from the database using Laravel models. You may use models to query additional values and use them on the template by placing the model and the value to search for within the braces. For example, ISIS-alerts do have a port_id value associated with the alert but ifName is not directly accessible from the $faults[] -array. If the name of the port was needed, it's value could be queried using a template such as: {{ $alert->title }} Severity: {{ $alert->severity }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif @if ($alert->faults) Faults: @foreach ($alert->faults as $key => $value) Local interface: {{ \\App\\Models\\Port::find($value['port_id'])->ifName }} Adjacent IP: {{ $value['isisISAdjIPAddrAddress'] }} Adjacent state: {{ $value['isisISAdjState'] }} @endforeach @endif Service Alert

            @if ($alert->state == 1) {{ $alert->severity }} @endif @if ($alert->state == 2) acknowledged @endif @if ($alert->state == 3) recovering @endif @if ($alert->state == 0) recovered @endif

            Host: {{ $alert->hostname }}
            Duration: {{ $alert->elapsed }}

            @if ($alert->faults) @foreach ($alert->faults as $key => $value) {{ $value['service_desc'] }} - {{ $value['service_type'] }}
            {{ $value['service_message'] }}

            @endforeach @endif
            Processor Alert with Graph {{ $alert->title }}
            Severity: {{ $alert->severity }}
            @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }}
            Alert-ID: {{ $alert->id }}
            Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif
            @if ($alert->faults) Faults: @foreach ($alert->faults as $key => $value) {{ $key }}: {{ $value['string'] }}
            @endforeach @if ($alert->faults) Faults:
            @foreach ($alert->faults as $key => $value) @signedGraphTag(['device' => $value['device_id'], 'type' => 'device_processor', 'width' => 459, 'height' => 213, 'from' => time() - 259200])
            https://server/graphs/device={{ $value['device_id'] }}/type=device_processor/
            @endforeach Template: CPU alert
            @endif @endif Included We include a few templates for you to use, these are specific to the type of alert rules you are creating. For example if you create a rule that would alert on BGP sessions then you can assign the BGP template to this rule to provide more information. The included templates apart from the default template are: BGP Sessions Ports Temperature Other Examples Microsoft Teams - Markdown [{{ $alert->title }}](https://your.librenms.url/device/device={{ $alert->device_id }}/) **Device name:** {{ $alert->sysName }} **Severity:** {{ $alert->severity }} @if ($alert->state == 0) **Time elapsed:** {{ $alert->elapsed }} @endif **Timestamp:** {{ $alert->timestamp }} **Unique-ID:** {{ $alert->uid }} @if ($alert->name) **Rule:** {{ $alert->name }} @else **Rule:** {{ $alert->rule }} @endif @if ($alert->faults) **Faults:**@foreach ($alert->faults as $key => $value) {{ $key }}: {{ $value['string'] }} @endforeach @endif Microsoft Teams - JSON { \"@context\": \"https://schema.org/extensions\", \"@type\": \"MessageCard\", \"title\": \"{{ $alert->title }}\", @if ($alert->state === 0) \"themeColor\": \"00FF00\", @elseif ($alert->state === 1) \"themeColor\": \"FF0000\", @elseif ($alert->state === 2) \"themeColor\": \"337AB7\", @elseif ($alert->state === 3) \"themeColor\": \"FF0000\", @elseif ($alert->state === 4) \"themeColor\": \"F0AD4E\", @else \"themeColor\": \"337AB7\", @endif \"summary\": \"LibreNMS\", \"sections\": [ { @if ($alert->name) \"facts\": [ { \"name\": \"Rule:\", \"value\": \"[{{ $alert->name }}](https://your.librenms.url/device/device={{ $alert->device_id }}/tab=alert/)\" }, @else { \"name\": \"Rule:\", \"value\": \"[{{ $alert->rule }}](https://your.librenms.url/device/device={{ $alert->device_id }}/tab=alert/)\" }, @endif { \"name\": \"Severity:\", \"value\": \"{{ $alert->severity }}\" }, { \"name\": \"Unique-ID:\", \"value\": \"{{ $alert->uid }}\" }, { \"name\": \"Timestamp:\", \"value\": \"{{ $alert->timestamp }}\" }, @if ($alert->state == 0) { \"name\": \"Time elapsed:\", \"value\": \"{{ $alert->elapsed }}\" }, @endif { \"name\": \"Hostname:\", \"value\": \"[{{ $alert->hostname }}](https://your.librenms.url/device/device={{ $alert->device_id }}/)\" }, { \"name\": \"Hardware:\", \"value\": \"{{ $alert->hardware }}\" }, { \"name\": \"IP:\", \"value\": \"{{ $alert->ip }}\" }, { \"name\": \"Faults:\", \"value\": \" \" } ] @if ($alert->faults) @foreach ($alert->faults as $key => $value) }, { \"facts\": [ { \"name\": \"Port:\", \"value\": \"[{{ $value['ifName'] }}](https://your.librenms.url/device/device={{ $alert->device_id }}/tab=port/port={{ $value['port_id'] }}/)\" }, { \"name\": \"Description:\", \"value\": \"{{ $value['ifAlias'] }}\" }, @if ($alert->state != 0) { \"name\": \"Status:\", \"value\": \"down\" } ] @else { \"name\": \"Status:\", \"value\": \"up\" } ] @endif @endforeach @endif } ] }","title":"Templates"},{"location":"Alerting/Templates/#templates","text":"This page is for installs running version 1.42 or later. You can find the older docs here Templates can be assigned to a single or a group of rules and can contain any kind of text. There is also a default template which is used for any rule that isn't associated with a template. This template can be found under Alert Templates page and can be edited. It also has an option revert it back to its default content. To attach a template to a rule just open the Alert Templates settings page, choose the template to assign and click the yellow button in the Actions column. In the appearing popupbox select the rule(s) you want the template to be assigned to and click the Attach button. You might hold down the CTRL key to select multiple rules at once. The templating engine in use is Laravel Blade. We will cover some of the basics here, however the official Laravel docs will have more information here","title":"Templates"},{"location":"Alerting/Templates/#syntax","text":"Controls: if-else (Else can be omitted): @if ($alert->placeholder == 'value') Some Text @else Other Text @endif foreach-loop: @foreach ($alert->faults as $key => $value) Key: $key Value: $value @endforeach Placeholders: Placeholders are special variables that if used within the template will be replaced with the relevant data, I.e: The device {{ $alert->hostname }} has been up for {{ $alert->uptime }} seconds would result in the following The device localhost has been up for 30344 seconds . When using placeholders to echo data, you need to wrap the placeholder in {{ }} . I.e {{ $alert->hostname }} . Device ID: $alert->device_id Hostname of the Device: $alert->hostname sysName of the Device: $alert->sysName sysDescr of the Device: $alert->sysDescr display name of the Device: $alert->display sysContact of the Device: $alert->sysContact OS of the Device: $alert->os Type of Device: $alert->type IP of the Device: $alert->ip Hardware of the Device: $alert->hardware Software version of the Device: $alert->version Features of the Device: $alert->features Serial number of the Device: $alert->serial Location of the Device: $alert->location uptime of the Device (in seconds): $alert->uptime Short uptime of the Device (28d 22h 30m 7s): $alert->uptime_short Long uptime of the Device (28 days, 22h 30m 7s): $alert->uptime_long Description (purpose db field) of the Device: $alert->description Notes of the Device: $alert->notes Notes of the alert (ack notes): $alert->alert_notes ping timestamp (if icmp enabled): $alert->ping_timestamp ping loss (if icmp enabled): $alert->ping_loss ping min (if icmp enabled): $alert->ping_min ping max (if icmp enabled): $alert->ping_max ping avg (if icmp enabled): $alert->ping_avg debug (array) poller_name - name of poller (for distributed setups) If $config['debug']['run_trace] = true; is set then this will contain: traceroute (if enabled you will receive traceroute output): $alert->debug['traceroute'] traceroute_output (if the traceroute fails this will contain why): $alert->debug['traceroute_output'] Title for the Alert: $alert->title Time Elapsed, Only available on recovery ( $alert->state == 0 ): $alert->elapsed Rule Builder (the actual rule) (use {!! $alert->builder !!} ): $alert->builder Alert-ID: $alert->id Unique-ID: $alert->uid Faults, Only available on alert ( $alert->state != 0 ), must be iterated in a foreach ( @foreach ($alert->faults as $key => $value) @endforeach ). Holds all available information about the Fault, accessible in the format $value['Column'] , for example: $value['ifDescr'] . Special field $value['string'] has most Identification-information (IDs, Names, Descrs) as single string, this is the equivalent of the default used and must be encased in {{ }} State: $alert->state Severity: $alert->severity Rule: $alert->rule Rule-Name: $alert->name Procedure URL: $alert->proc Timestamp: $alert->timestamp Transport type: $alert->transport Transport name: $alert->transport_name Contacts, must be iterated in a foreach, $key holds email and $value holds name: $alert->contacts Placeholders can be used within the subjects for templates as well although $faults is most likely going to be worthless. The Default Template is a 'one-size-fit-all'. We highly recommend defining your own templates for your rules to include more specific information.","title":"Syntax"},{"location":"Alerting/Templates/#base-templates","text":"If you'd like to reuse a common template for your alerts follow below A default file is located in resources/views/alerts/templates/default.blade.php Displays the following: LibreNMS Alert
            @yield('content')
            The important part being the @yield('content') You can use plain text or html as per Alert templates and this will form the basis of your common template, feel free to make as many templates in the directory as needed. In your alert template just use @extends('alerts.templates.default') @section('content') {{ $alert->title }} Severity: {{ $alert->severity }} ... @endsection More info: https://laravel.com/docs/blade#extending-a-layout","title":"Base Templates"},{"location":"Alerting/Templates/#examples","text":"","title":"Examples"},{"location":"Alerting/Templates/#default-template","text":"{{ $alert->title }} Severity: {{ $alert->severity }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Unique-ID: {{ $alert->uid }} Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif @if ($alert->faults) Faults: @foreach ($alert->faults as $key => $value) {{ $key }}: {{ $value['string'] }} @endforeach @endif Alert sent to: @foreach ($alert->contacts as $key => $value) {{ $value }} <{{ $key }}> @endforeach","title":"Default Template"},{"location":"Alerting/Templates/#ports-utilization-template","text":"{{ $alert->title }} Device Name: {{ $alert->hostname }} Severity: {{ $alert->severity }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif @foreach ($alert->faults as $key => $value) Physical Interface: {{ $value['ifDescr'] }} Interface Description: {{ $value['ifAlias'] }} Interface Speed: {{ ($value['ifSpeed']/1000000000) }} Gbs Inbound Utilization: {{ (($value['ifInOctets_rate']*8)/$value['ifSpeed'])*100 }} Outbound Utilization: {{ (($value['ifOutOctets_rate']*8)/$value['ifSpeed'])*100 }} @endforeach","title":"Ports Utilization Template"},{"location":"Alerting/Templates/#storage","text":"{{ $alert->title }} Device Name: {{ $alert->hostname }} Severity: {{ $alert->severity }} Uptime: {{ $alert->uptime_short }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Location: {{ $alert->location }} Description: {{ $alert->description }} Features: {{ $alert->features }} Notes: {{ $alert->notes }} Server: {{ $alert->sysName }} @foreach ($alert->faults as $key => $value) Mount Point: {{ $value['storage_descr'] }} Percent Utilized: {{ $value['storage_perc'] }} @endforeach","title":"Storage"},{"location":"Alerting/Templates/#value-sensors-temperature-humidity-fanspeed","text":"{{ $alert->title }} Device Name: {{ $alert->hostname }} Severity: {{ $alert->severity }} Timestamp: {{ $alert->timestamp }} Uptime: {{ $alert->uptime_short }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Location: {{ $alert->location }} Description: {{ $alert->description }} Features: {{ $alert->features }} Notes: {{ $alert->notes }} Rule: {{ $alert->name ?? $alert->rule }} @if ($alert->faults) Faults: @foreach ($alert->faults as $key => $value) @php($unit = __(\"sensors.${value[\"sensor_class\"]}.unit\")) #{{ $key }}: {{ $value['sensor_descr'] ?? 'Sensor' }} Current: {{ $value['sensor_current'].$unit }} Previous: {{ $value['sensor_prev'].$unit }} Limit: {{ $value['sensor_limit'].$unit }} Over Limit: {{ round($value['sensor_current']-$value['sensor_limit'], 2).$unit }} @endforeach @endif","title":"Value Sensors (Temperature, Humidity, Fanspeed, ...)"},{"location":"Alerting/Templates/#memory-alert","text":"{{ $alert->title }} Device Name: {{ $alert->hostname }} Severity: {{ $alert->severity }} Uptime: {{ $alert->uptime_short }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Location: {{ $alert->location }} Description: {{ $alert->description }} Notes: {{ $alert->notes }} Server: {{ $alert->hostname }} @foreach ($alert->faults as $key => $value) Memory Description: {{ $value['mempool_descr'] }} Percent Utilized: {{ $value['mempool_perc'] }} @endforeach","title":"Memory Alert"},{"location":"Alerting/Templates/#advanced-options","text":"","title":"Advanced options"},{"location":"Alerting/Templates/#conditional-formatting","text":"Conditional formatting example, will display a link to the host in email or just the hostname in any other transport: @if ($alert->transport == 'mail')hostname }}/\">{{ $alert->hostname }} @else {{ $alert->hostname }} @endif","title":"Conditional formatting"},{"location":"Alerting/Templates/#traceroute-debugs","text":"@if ($alert->status == 0) @if ($alert->status_reason == 'icmp') {{ $alert->debug['traceroute'] }} @endif @endif","title":"Traceroute debugs"},{"location":"Alerting/Templates/#examples-html","text":"Note: To use HTML emails you must set HTML email to Yes in the WebUI under Global Settings > Alerting Settings > Email transport > Use HTML emails","title":"Examples HTML"},{"location":"Alerting/Templates/#graphs","text":"There are two helpers for graphs that will use a signed url to allow secure external access. Anyone using the signed url will be able to view the graph. Your LibreNMS web must be accessible from the location where the graph is viewed. Some alert transports require publicly accessible urls. APP_URL must be set in .env to use signed graphs. Changing APP_KEY will invalidate all previously issued singed urls. You may specify the graph one of two ways, a php array of parameters, or a direct url to a graph. Note that to and from can be specified either as timestamps with time() or as relative time -3d or -36h . When using relative time, the graph will show based on when the user views the graph, not when the event happened. Sharing a graph image with a relative time will always give the recipient access to current data, where a specific timestamp will only allow access to that timeframe.","title":"Graphs"},{"location":"Alerting/Templates/#signedgraphtag","text":"This will insert a specially formatted html img tag linking to the graph. Some transports may search the template for this tag to attach images properly for that transport. @signedGraphTag([ 'id' => $value['port_id'], 'type' => 'port_bits', 'from' => time() - 43200, 'to' => time(), 'width' => 700, 'height' => 250 ]) Output: < img class = \"librenms-graph\" src = \"https://librenms.org/graph?from=1662176216&height=250&id=20425&to=1662219416&type=port_bits&width=700&signature=f6e516e8fd893c772eeaba165d027cb400e15a515254de561a05b63bc6f360a4\" > Specific graph using url input: @signedGraphTag('https://librenms.org/graph.php?type=device_processor&from=-2d&device=2&legend=no&height=400&width=1200')","title":"@signedGraphTag"},{"location":"Alerting/Templates/#signedgraphurl","text":"This is used when you need the url directly. One example is using the API Transport, you may want to include the url only instead of a html tag. @signedGraphUrl([ 'id' => $value['port_id'], 'type' => 'port_bits', 'from' => time() - 43200, 'to' => time(), ])","title":"@signedGraphUrl"},{"location":"Alerting/Templates/#using-models-for-optional-data","text":"If some value does not exist within the $faults[] -array, you may query fields from the database using Laravel models. You may use models to query additional values and use them on the template by placing the model and the value to search for within the braces. For example, ISIS-alerts do have a port_id value associated with the alert but ifName is not directly accessible from the $faults[] -array. If the name of the port was needed, it's value could be queried using a template such as: {{ $alert->title }} Severity: {{ $alert->severity }} @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }} Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif @if ($alert->faults) Faults: @foreach ($alert->faults as $key => $value) Local interface: {{ \\App\\Models\\Port::find($value['port_id'])->ifName }} Adjacent IP: {{ $value['isisISAdjIPAddrAddress'] }} Adjacent state: {{ $value['isisISAdjState'] }} @endforeach @endif","title":"Using models for optional data"},{"location":"Alerting/Templates/#service-alert","text":"

            @if ($alert->state == 1) {{ $alert->severity }} @endif @if ($alert->state == 2) acknowledged @endif @if ($alert->state == 3) recovering @endif @if ($alert->state == 0) recovered @endif

            Host: {{ $alert->hostname }}
            Duration: {{ $alert->elapsed }}

            @if ($alert->faults) @foreach ($alert->faults as $key => $value) {{ $value['service_desc'] }} - {{ $value['service_type'] }}
            {{ $value['service_message'] }}

            @endforeach @endif
            ","title":"Service Alert"},{"location":"Alerting/Templates/#processor-alert-with-graph","text":"{{ $alert->title }}
            Severity: {{ $alert->severity }}
            @if ($alert->state == 0) Time elapsed: {{ $alert->elapsed }} @endif Timestamp: {{ $alert->timestamp }}
            Alert-ID: {{ $alert->id }}
            Rule: @if ($alert->name) {{ $alert->name }} @else {{ $alert->rule }} @endif
            @if ($alert->faults) Faults: @foreach ($alert->faults as $key => $value) {{ $key }}: {{ $value['string'] }}
            @endforeach @if ($alert->faults) Faults:
            @foreach ($alert->faults as $key => $value) @signedGraphTag(['device' => $value['device_id'], 'type' => 'device_processor', 'width' => 459, 'height' => 213, 'from' => time() - 259200])
            https://server/graphs/device={{ $value['device_id'] }}/type=device_processor/
            @endforeach Template: CPU alert
            @endif @endif","title":"Processor Alert with Graph"},{"location":"Alerting/Templates/#included","text":"We include a few templates for you to use, these are specific to the type of alert rules you are creating. For example if you create a rule that would alert on BGP sessions then you can assign the BGP template to this rule to provide more information. The included templates apart from the default template are: BGP Sessions Ports Temperature","title":"Included"},{"location":"Alerting/Templates/#other-examples","text":"","title":"Other Examples"},{"location":"Alerting/Templates/#microsoft-teams-markdown","text":"[{{ $alert->title }}](https://your.librenms.url/device/device={{ $alert->device_id }}/) **Device name:** {{ $alert->sysName }} **Severity:** {{ $alert->severity }} @if ($alert->state == 0) **Time elapsed:** {{ $alert->elapsed }} @endif **Timestamp:** {{ $alert->timestamp }} **Unique-ID:** {{ $alert->uid }} @if ($alert->name) **Rule:** {{ $alert->name }} @else **Rule:** {{ $alert->rule }} @endif @if ($alert->faults) **Faults:**@foreach ($alert->faults as $key => $value) {{ $key }}: {{ $value['string'] }} @endforeach @endif","title":"Microsoft Teams - Markdown"},{"location":"Alerting/Templates/#microsoft-teams-json","text":"{ \"@context\": \"https://schema.org/extensions\", \"@type\": \"MessageCard\", \"title\": \"{{ $alert->title }}\", @if ($alert->state === 0) \"themeColor\": \"00FF00\", @elseif ($alert->state === 1) \"themeColor\": \"FF0000\", @elseif ($alert->state === 2) \"themeColor\": \"337AB7\", @elseif ($alert->state === 3) \"themeColor\": \"FF0000\", @elseif ($alert->state === 4) \"themeColor\": \"F0AD4E\", @else \"themeColor\": \"337AB7\", @endif \"summary\": \"LibreNMS\", \"sections\": [ { @if ($alert->name) \"facts\": [ { \"name\": \"Rule:\", \"value\": \"[{{ $alert->name }}](https://your.librenms.url/device/device={{ $alert->device_id }}/tab=alert/)\" }, @else { \"name\": \"Rule:\", \"value\": \"[{{ $alert->rule }}](https://your.librenms.url/device/device={{ $alert->device_id }}/tab=alert/)\" }, @endif { \"name\": \"Severity:\", \"value\": \"{{ $alert->severity }}\" }, { \"name\": \"Unique-ID:\", \"value\": \"{{ $alert->uid }}\" }, { \"name\": \"Timestamp:\", \"value\": \"{{ $alert->timestamp }}\" }, @if ($alert->state == 0) { \"name\": \"Time elapsed:\", \"value\": \"{{ $alert->elapsed }}\" }, @endif { \"name\": \"Hostname:\", \"value\": \"[{{ $alert->hostname }}](https://your.librenms.url/device/device={{ $alert->device_id }}/)\" }, { \"name\": \"Hardware:\", \"value\": \"{{ $alert->hardware }}\" }, { \"name\": \"IP:\", \"value\": \"{{ $alert->ip }}\" }, { \"name\": \"Faults:\", \"value\": \" \" } ] @if ($alert->faults) @foreach ($alert->faults as $key => $value) }, { \"facts\": [ { \"name\": \"Port:\", \"value\": \"[{{ $value['ifName'] }}](https://your.librenms.url/device/device={{ $alert->device_id }}/tab=port/port={{ $value['port_id'] }}/)\" }, { \"name\": \"Description:\", \"value\": \"{{ $value['ifAlias'] }}\" }, @if ($alert->state != 0) { \"name\": \"Status:\", \"value\": \"down\" } ] @else { \"name\": \"Status:\", \"value\": \"up\" } ] @endif @endforeach @endif } ] }","title":"Microsoft Teams - JSON"},{"location":"Alerting/Testing/","text":"Rules The simplest way of testing if an alert rule will match a device is by going to the device, clicking edit (the cog), select Capture. From this new screen choose Alerts and click run. The output will cycle through all alerts applicable to this device and show you the Rule name, rule, MySQL query and if the rule matches. See Device Troubleshooting Transports You can test your transports by forcing an actual active alert to run regardless of the interval or delay values. ./scripts/test-alert.php . This script accepts -r for the rule id, -h for the device id or hostname and -d for debug. Templates It's possible to test your new template before assigning it to a rule. To do so you can run ./scripts/test-template.php . The script will provide the help info when ran without any parameters. As an example, if you wanted to test template ID 10 against localhost running rule ID 2 then you would run: ./scripts/test-template.php -t 10 -d -h localhost -r 2 If the rule is currently alerting for localhost then you will get the full template as expected to see on email, if it's not then you will just see the template without any fault information.","title":"Testing"},{"location":"Alerting/Testing/#rules","text":"The simplest way of testing if an alert rule will match a device is by going to the device, clicking edit (the cog), select Capture. From this new screen choose Alerts and click run. The output will cycle through all alerts applicable to this device and show you the Rule name, rule, MySQL query and if the rule matches. See Device Troubleshooting","title":"Rules"},{"location":"Alerting/Testing/#transports","text":"You can test your transports by forcing an actual active alert to run regardless of the interval or delay values. ./scripts/test-alert.php . This script accepts -r for the rule id, -h for the device id or hostname and -d for debug.","title":"Transports"},{"location":"Alerting/Testing/#templates","text":"It's possible to test your new template before assigning it to a rule. To do so you can run ./scripts/test-template.php . The script will provide the help info when ran without any parameters. As an example, if you wanted to test template ID 10 against localhost running rule ID 2 then you would run: ./scripts/test-template.php -t 10 -d -h localhost -r 2 If the rule is currently alerting for localhost then you will get the full template as expected to see on email, if it's not then you will just see the template without any fault information.","title":"Templates"},{"location":"Alerting/Transports/","text":"Transports Transports are located within LibreNMS/Alert/Transport/ and can be configured within the WebUI under Alerts -> Alert Transports. Contacts will be gathered automatically and passed to the configured transports. By default the Contacts will be only gathered when the alert triggers and will ignore future changes in contacts for the incident. If you want contacts to be re-gathered before each dispatch, please set 'Updates to contact email addresses not honored' to Off in the WebUI. The contacts will always include the SysContact defined in the Device's SNMP configuration and also every LibreNMS user that has at least read -permissions on the entity that is to be alerted. At the moment LibreNMS only supports Port or Device permissions. You can exclude the SysContact by toggling 'Issue alerts to sysContact'. To include users that have Global-Read , Administrator or Normal-User permissions it is required to toggle the options: Issue alerts to admins. Issue alerts to read only users Issue alerts to normal users. Using a Proxy Proxy Configuration Using a AMQP based Transport You need to install an additional php module : bcmath Alerta The alerta monitoring system is a tool used to consolidate and de-duplicate alerts from multiple sources for quick \u2018at-a-glance\u2019 visualisation. With just one system you can monitor alerts from many other monitoring tools on a single screen. Example: Config Example API Endpoint http://alerta.example.com/api/alert Environment Production Apy key api key with write permission Alert state critical Recover state cleared Alertmanager Alertmanager is an alert handling software, initially developed for alert processing sent by Prometheus. It has built-in functionality for deduplicating, grouping and routing alerts based on configurable criteria. LibreNMS uses alert grouping by alert rule, which can produce an array of alerts of similar content for an array of hosts, whereas Alertmanager can group them by alert meta, ideally producing one single notice in case an issue occurs. It is possible to configure as many label values as required in Alertmanager Options section. Every label and its value should be entered as a new line. Labels can be a fixed string or a dynamic variable from the alert. To set a dynamic variable your label must start with extra_ then complete with the name of your label (only characters, figures and underscore are allowed here). The value must be the name of the variable you want to get (you can see all the variables in Alerts->Notifications by clicking on the Details icon of your alert when it is pending). If the variable's name does not match with an existing value the label's value will be the string you provided just as it was a fixed string. Multiple Alertmanager URLs (comma separated) are supported. Each URL will be tried and the search will stop at the first success. Basic HTTP authentication with a username and a password is supported. If you let those value blank, no authentication will be used. Alertmanager Docs Example: Config Example Alertmanager URL(s) http://alertmanager1.example.com,http://alertmanager2.example.com Alertmanager Username myUsername Alertmanager Password myPassword Alertmanager Options: source=librenms customlabel=value extra_dynamic_value=variable_name API The API transport allows to reach any service provider using POST, PUT or GET URLs (Like SMS provider, etc). It can be used in multiple ways: The same text built from the Alert template is available in the variable $msg , which can then be sent as an option to the API. Be carefull that HTTP GET requests are usually limited in length. The API-Option fields can be directly built from the variables defined in Template-Syntax but without the 'alert->' prefix. For instance, $alert->uptime is available as $uptime in the API transport The API-Headers allows you to add the headers that the api endpoint requires. The API-body allow sending data in the format required by the API endpoint. A few variables commonly used : Variable Description {{ $hostname }} Hostname {{ $sysName }} SysName {{ $sysDescr }} SysDescr {{ $os }} OS of device (librenms defined) {{ $type }} Type of device (librenms defined) {{ $ip }} IP Address {{ $hardware }} Hardware {{ $version }} Version {{ $uptime }} Uptime in seconds {{ $uptime_short }} Uptime in human-readable format {{ $timestamp }} Timestamp of alert {{ $description }} Description of device {{ $title }} Title (as built from the Alert Template) {{ $msg }} Body text (as built from the Alert Template) Example: The example below will use the API named sms-api of my.example.com and send the title of the alert to the provided number using the provided service key. Refer to your service documentation to configure it properly. Config Example API Method GET API URL http://my.example.com/sms-api API Options rcpt=0123456789 key=0987654321abcdef msg=(LNMS) {{ $title }} API Username myUsername API Password myPassword The example below will use the API named wall-display of my.example.com and send the title and text of the alert to a screen in the Network Operation Center. Config Example API Method POST API URL http://my.example.com/wall-display API Options title={{ $title }} msg={{ $msg }} The example below will use the API named component of my.example.com with id 1, body as json status value and headers send token authentication and content type required. Config Example API Method PUT API URL http://my.example.com/comonent/1 API Headers X-Token=HASH Content-Type=application/json API Body { \"status\": 2 } aspSMS aspSMS is a SMS provider that can be configured by using the generic API Transport. You need a token you can find on your personnal space. aspSMS docs Example: Config Example Transport type Api API Method POST API URL https://soap.aspsms.com/aspsmsx.asmx/SimpleTextSMS Options UserKey=USERKEY Password=APIPASSWORD Recipient=RECIPIENT Originator=ORIGINATOR MessageText={{ $msg }} Browser Push Browser push notifications can send a notification to the user's device even when the browser is not open. This requires HTTPS, the PHP GMP extension, Push API support, and permissions on each device to send alerts. Simply configure an alert transport and allow notification permission on the device(s) you wish to receive alerts on. You may disable alerts on a browser on the user preferences page. Canopsis Canopsis is a hypervision tool. LibreNMS can send alerts to Canopsis which are then converted to canopsis events. Canopsis Docs Example: Config Example Hostname www.xxx.yyy.zzz Port Number 5672 User admin Password my_password Vhost canopsis Cisco Spark (aka Webex Teams) Cisco Spark (now known as Webex Teams). LibreNMS can send alerts to a Cisco Spark room. To make this possible you need to have a RoomID and a token. You can also choose to send alerts using Markdown syntax. Enabling this option provides for more richly formatted alerts, but be sure to adjust your alert template to account for the Markdown syntax. For more information about Cisco Spark RoomID and token, take a look here : Getting started Rooms Example: Config Example API Token ASd23r23edewda RoomID 34243243251 Use Markdown? x Clickatell Clickatell provides a REST-API requiring an Authorization-Token and at least one Cellphone number. Clickatell Docs Here an example using 3 numbers, any amount of numbers is supported: Example: Config Example Token dsaWd3rewdwea Mobile Numbers +1234567890,+1234567891,+1234567892 Discord The Discord transport will POST the alert message to your Discord Incoming WebHook. Simple html tags are stripped from the message. The only required value is for url, without this no call to Discord will be made. The Options field supports the JSON/Form Params listed in the Discord Docs below. Discord Docs Example: Config Example Discord URL https://discordapp.com/api/webhooks/4515489001665127664/82-sf4385ysuhfn34u2fhfsdePGLrg8K7cP9wl553Fg6OlZuuxJGaa1d54fe Options username=myname Elasticsearch You can have LibreNMS send alerts to an elasticsearch database. Each fault will be sent as a separate document. Example: Config Example Host 127.0.0.1 Port 9200 Index Pattern \\l\\i\\b\\r\\e\\n\\m\\s-Y.m.d GitLab LibreNMS will create issues for warning and critical level alerts however only title and description are set. Uses Personal access tokens to authenticate with GitLab and will store the token in cleartext. Example: Config Example Host http://gitlab.host.tld Project ID 1 Personal Access Token AbCdEf12345 Grafana Oncall Send alerts to Grafana Oncall using a Formatted Webhook Example: Config Example Webhook URL https://a-prod-us-central-0.grafana.net/integrations/v1/formatted_webhook/m12xmIjOcgwH74UF8CN4dk0Dh/ HipChat See the HipChat API Documentation for rooms/message for details on acceptable values. You may notice that the link points at the \"deprecated\" v1 API. This is because the v2 API is still in beta. Example: Config Example API URL https://api.hipchat.com/v1/rooms/message?auth_token=109jawregoaihj Room ID 7654321 From Name LibreNMS Options color=red At present the following options are supported: color . Note: The default message format for HipChat messages is HTML. It is recommended that you specify the text message format to prevent unexpected results, such as HipChat attempting to interpret angled brackets ( < and > ). IRC The IRC transports only works together with the LibreNMS IRC-Bot. Configuration of the LibreNMS IRC-Bot is described here . Example: Config Example IRC enabled JIRA You can have LibreNMS create issues on a Jira instance for critical and warning alerts using either the Jira REST API or webhooks. Custom fields allow you to add any required fields beyond summary and description fields in case mandatory fields are required by your Jira project/issue type configuration. Custom fields are defined in JSON format but ustom fields allow you to add any required fields beyond summary and description fields in case mandatory fields are required by your Jira project/issue type configuration. Custom fields are defined in JSON format. Currently http authentication is used to access Jira and Jira username and password will be stored as cleartext in the LibreNMS database. REST API The config fields that need to set for Jira REST API are: Jira Open URL, Jira username, Jira password, Project key, and issue type. Note: REST API is that it is only able to open new tickets. Webhooks The config fields that need to set for webhooks are: Jira Open URL, Jira Close URL, Jira username, Jira password and webhook ID. Note: Webhooks allow more control over how alerts are handled in Jira. With webhooks, recovery messages can be sent to a different URL than alerts. Additionally, a custom conditional logic can be built using the webhook payload and ID to automatically close an open ticket if predefined conditions are met. Jira Issue Types Jira Webhooks Example: Config Example Project Key JIRAPROJECTKEY Issue Type Myissuetype Open URL https://myjira.mysite.com / https://webhook-open-url Close URL https://webhook-close-url Jira Username myjirauser Jira Password myjirapass Enable webhook ON/OFF Webhook ID alert_id Custom Fileds {\"components\":[{\"id\":\"00001\"}], \"source\": \"LibrenNMS\"} Jira Service Management Using Jira Service Management LibreNMS integration, LibreNMS forwards alerts to Jira Service Management with detailed information. Jira Service Management acts as a dispatcher for LibreNMS alerts, determines the right people to notify based on on-call schedules and notifies via email, text messages (SMS), phone calls and iOS & Android push notifications. Then escalates alerts until the alert is acknowledged or closed. :warning: If the feature isn\u2019t available on your site, keep checking Jira Service Management for updates. Example: Config Example WebHook URL https://url/path/to/webhook LINE Messaging API LINE Messaging API Docs Here is the step for setup a LINE bot and using it in LibreNMS. Use your real LINE account register in developer protal . Add a new channel, choose Messaging API and continue fill up the forms, note that Channel name cannot edit later. Go to \"Messaging API\" tab of your channel, here listing some important value. Bot basic ID and QR code is your LINE bot's ID and QR code. Channel access token (long-lived) , will use it in LibreNMS, keep it safe. Use your real Line account add your LINE bot as a friend. Recipient ID can be groupID , userID or roomID , it will be used in LibreNMS to send message to a group or a user. Use the following NodeJS program and ngrok for temporally https webhook to listen it. LINE-bot-RecipientFetcher Run the program and using ngrok expose port to public $ node index.js $ ngrok http 3000 Go to \"Messaging API\" tab of your channel, fill up Webhook URL to https:///webhook If you want to let LINE bot send message to a yourself, use your real account to send a message to your LINE bot. Program will print out the userID in console. sample value: {\"type\":\"user\",\"userId\":\"U527xxxxxxxxxxxxxxxxxxxxxxxxxc0ee\"} If you want to let LINE bot send message to a group, do the following steps. Add your LINE bot into group Use your real account to send a message to group Program will print out the groupID in console, it will be Recipient ID, keep it safe. sample value: {\"type\":\"group\",\"groupId\":\"Ce51xxxxxxxxxxxxxxxxxxxxxxxxxx6ef\",\"userId\":\"U527xxxxxxxxxxxxxxxxxxxxxxxxxc0ee\"} ``` Example: Config Example Access token fhJ9vH2fsxxxxxxxxxxxxxxxxxxxxlFU= Recipient (groupID, userID or roomID) Ce51xxxxxxxxxxxxxxxxxxxxxxxxxx6ef LINE Notify LINE Notify LINE Notify API Document Example: Config Example Token AbCdEf12345 Mail The E-Mail transports uses the same email-configuration as the rest of LibreNMS. As a small reminder, here is its configuration directives including defaults: Emails will attach all graphs included with the @signedGraphTag directive. If the email format is set to html, they will be embedded. To disable attaching images, set email_attach_graphs to false. alerting/email lnms config:set email_html true lnms config:set email_attach_graphs false Example: Config Example Email me@example.com Matrix For using the Matrix transports, you have to create a room on the Matrix-server. The provided Auth_token belongs to an user, which is member of this room. The Message, sent to the matrix-room can be built from the variables defined in Template-Syntax but without the 'alert->' prefix. See API-Transport. The variable $msg is contains the result of the Alert template.The Matrix-Server URL is cutted before the beginning of the _matrix/client/r0/... API-part. Example: Config Example Matrix-Server URL https://matrix.example.com/ Room !ajPbbPalmVbNuQoBDK:example.com Auth_token: MDAyYmxvY2F0aW9uI...z1DCn6lz_uOhtW3XRICg Message: Alert: {{ $msg }} https://librenms.example.com Messagebird LibreNMS can send text messages through Messagebird Rest API transport. Config Example Api Key Api rest key given in the messagebird dashboard Originator E.164 formatted originator Recipient E.164 formatted recipient for multi recipents comma separated Character limit Range 1..480 (max 3 split messages) Messagebird Voice LibreNMS can send messages through Messagebird voice Rest API transport (text to speech). Config Example Api Key Api rest key given in the messagebird dashboard Originator E.164 formatted originator Recipient E.164 formatted recipient for multi recipents comma separated Language Select box for options Spoken voice Female or Male Repeat X times the message is repeated Microsoft Teams LibreNMS can send alerts to Microsoft Teams Incoming Webhooks which are then posted to a specific channel. Microsoft recommends using markdown formatting for connector cards. Administrators can opt to compose the MessageCard themselves using JSON to get the full functionality. Example: Config Example WebHook URL https://outlook.office365.com/webhook/123456789 Use JSON? x Nagios Compatible The nagios transport will feed a FIFO at the defined location with the same format that nagios would. This allows you to use other alerting systems with LibreNMS, for example Flapjack . Example: Config Example Nagios FIFO /path/to/my.fifo OpsGenie Using OpsGenie LibreNMS integration, LibreNMS forwards alerts to OpsGenie with detailed information. OpsGenie acts as a dispatcher for LibreNMS alerts, determines the right people to notify based on on-call schedules and notifies via email, text messages (SMS), phone calls and iOS & Android push notifications. Then escalates alerts until the alert is acknowledged or closed. Create a LibreNMS Integration from the integrations page once you signup. Then copy the API key from OpsGenie to LibreNMS. If you want to automatically ack and close alerts, leverage Marid integration. More detail with screenshots is available in OpsGenie LibreNMS Integration page . Example: Config Example WebHook URL https://url/path/to/webhook osTicket LibreNMS can send alerts to osTicket API which are then converted to osTicket tickets. Example: Config Example API URL http://osticket.example.com/api/http.php/tickets.json API Token 123456789 PagerDuty LibreNMS can make use of PagerDuty, this is done by utilizing an API key and Integraton Key. API Keys can be found under 'API Access' in the PagerDuty portal. Integration Keys can be found under 'Integration' for the particular Service you have created in the PagerDuty portal. Example: Config Example API Key randomsample Integration Key somerandomstring Philips Hue Want to spice up your noc life? LibreNMS will flash all lights connected to your philips hue bridge whenever an alert is triggered. To setup, go to the you http:// your-bridge-ip /debug/clip.html Update the \"URL:\" field to /api Paste this in the \"Message Body\" {\"devicetype\":\"librenms\"} Press the round button on your philips Hue Bridge Click on POST In the Command Response You should see output with your username. Copy this without the quotes More Info: Philips Hue Documentation Example: Config Example Host http://your-bridge-ip Hue User username Duration 1 Second PlaySMS PlaySMS is an open source SMS-Gateway that can be used via their HTTP API using a Username and WebService Token. Please consult PlaySMS's documentation regarding number formatting. PlaySMS Docs Here an example using 3 numbers, any amount of numbers is supported: Example: Config Example PlaySMS https://localhost/index.php User user1 Token MYFANCYACCESSTOKEN From My Name Mobiles +1234567892,+1234567890,+1234567891 Pushbullet Get your Access Token from your Pushbullet's settings page and set it in your transport: Example: Config Example Access Token MYFANCYACCESSTOKEN Pushover If you want to change the default notification sound for all notifications then you can add the following in Pushover Options: sound=falling You also have the possibility to change sound per severity: sound_critical=falling sound_warning=siren sound_ok=magic Enabling Pushover support is fairly easy, there are only two required parameters. Firstly you need to create a new Application (called LibreNMS, for example) in your account on the Pushover website ( https://pushover.net/apps ). Now copy your API Key and obtain your User Key from the newly created Application and setup the transport. Pushover Docs Example: Config Example Api Key APPLICATIONAPIKEYGOESHERE User Key USERKEYGOESHERE Pushover Options sound_critical=falling sound_warning=siren sound_ok=magic Rocket.chat The Rocket.chat transport will POST the alert message to your Rocket.chat Incoming WebHook using the attachments option. Simple html tags are stripped from the message. All options are optional, the only required value is for url, without this then no call to Rocket.chat will be made. Rocket.chat Docs Example: Config Example Webhook URL https://rocket.url/api/v1/chat.postMessage Rocket.chat Options channel=#Alerting username=myname icon_url=http://someurl/image.gif icon_emoji=:smirk: Sensu The Sensu transport will POST an Event to the Agent API upon an alert being generated. It will be categorised (ok, warning or critical), and if you configure the alert to send recovery notifications, Sensu will also clear the alert automatically. No configuration is required - as long as you are running the Sensu Agent on your poller with the HTTP socket enabled on tcp/3031, LibreNMS will start generating Sensu events as soon as you create the transport. Acknowledging alerts within LibreNMS is not directly supported, but an annotation ( acknowledged ) is set, so a mutator or silence, or even the handler could be written to look for it directly in the handler. There is also an annotation ( generated-by ) set, to allow you to treat LibreNMS events differently from agent events. The 'shortname' option is a simple way to reduce the length of device names in configs. It replaces the last 3 domain components with single letters (e.g. websrv08.dc4.eu.corp.example.net gets shortened to websrv08.dc4.eu.cen). Limitations Only a single namespace is supported Sensu will reject rules with special characters - the Transport will attempt to fix up rule names, but it's best to stick to letters, numbers and spaces The transport only deals in absolutes - it ignores the got worse/got better states The agent will buffer alerts, but LibreNMS will not - if your agent is offline, alerts will be dropped There is no backchannel between Sensu and LibreNMS - if you make changes in Sensu to LibreNMS alerts, they'll be lost on the next event (silences will work) Example: Config Example Sensu Endpoint http://localhost:3031 Sensu Namespace eu-west Check Prefix lnms Source Key hostname Slack The Slack transport will POST the alert message to your Slack Incoming WebHook using the attachments option, you are able to specify multiple webhooks along with the relevant options to go with it. Simple html tags are stripped from the message. All options are optional, the only required value is for url, without this then no call to Slack will be made. We currently support the following attachment options: author_name Slack docs Example: Config Example Webhook URL https://slack.com/url/somehook Slack Options author_name=Me SMSEagle SMSEagle is a hardware SMS Gateway that can be used via their HTTP API using a Username and password. Destination numbers are one per line, with no spaces. They can be in either local or international dialling format. SMSEagle Docs Example: Config Example SMSEagle Host ip.add.re.ss User smseagle_user Password smseagle_user_password Mobiles +3534567890 0834567891 SMSmode SMSmode is a SMS provider that can be configured by using the generic API Transport. You need a token you can find on your personnal space. SMSmode docs Example: Config Example Transport type Api API Method POST API URL http://api.smsmode.com/http/1.6/sendSMS.do Options accessToken= PUT_HERE_YOUR_TOKEN numero= PUT_HERE_DESTS_NUMBER_COMMA_SEPARATED message={{ $msg }} Splunk LibreNMS can send alerts to a Splunk instance and provide all device and alert details. Example output: Feb 21 15:21:52 nms hostname=\"localhost\", sysName=\"localhost\", sysDescr=\"\", sysContact=\"\", os=\"fortigate\", type=\"firewall\", ip=\"localhost\", hardware=\"FGT_50E\", version=\"v5.6.9\", serial=\"\", features=\"\", location=\"\", uptime=\"387\", uptime_short=\" 6m 27s\", uptime_long=\" 6 minutes 27 seconds\", description=\"\", notes=\"\", alert_notes=\"\", device_id=\"0\", rule_id=\"0\", id=\"0\", proc=\"\", status=\"1\", status_reason=\"\", ping_timestamp=\"\", ping_loss=\"0\", ping_min=\"25.6\", ping_max=\"26.8\", ping_avg=\"26.3\", title=\"localhost recovered from Device up/down \", elapsed=\"14m 54s\", uid=\"0\", alert_id=\"0\", severity=\"critical\", name=\"Device up/down\", timestamp=\"2020-02-21 15:21:33\", state=\"0\", device_device_id=\"0\", device_inserted=\"\", device_hostname=\"localhost\", device_sysName=\"localhost\", device_ip=\"localhost\", device_overwrite_ip=\"\", device_timeout=\"\", device_retries=\"\", device_snmp_disable=\"0\", device_bgpLocalAs=\"0\", device_sysObjectID=\"\", device_sysDescr=\"\", device_sysContact=\"\", device_version=\"v5.6.9\", device_hardware=\"FGT_50E\", device_features=\"build1673\", device_location_id=\"\", device_os=\"fortigate\", device_status=\"1\", device_status_reason=\"\", device_ignore=\"0\", device_disabled=\"0\", device_uptime=\"387\", device_agent_uptime=\"0\", device_last_polled=\"2020-02-21 15:21:33\", device_last_poll_attempted=\"\", device_last_polled_timetaken=\"7.9\", device_last_discovered_timetaken=\"11.77\", device_last_discovered=\"2020-02-21 13:16:42\", device_last_ping=\"2020-02-21 15:21:33\", device_last_ping_timetaken=\"26.3\", device_purpose=\"\", device_type=\"firewall\", device_serial=\"FGT50EXXX\", device_icon=\"images/os/fortinet.svg\", device_poller_group=\"0\", device_override_sysLocation=\"0\", device_notes=\"\", device_port_association_mode=\"1\", device_max_depth=\"0\", device_disable_notify=\"0\", device_location=\"\", device_vrf_lites=\"Array\", device_lat=\"\", device_lng=\"\", - sysObjectID => \"\"; ` Each alert will be sent as a separate message. Example: Config Example Host 127.0.0.1 UDP Port 514 Syslog You can have LibreNMS emit alerts as syslogs complying with RFC 3164. More information on RFC 3164 can be found here: https://tools.ietf.org/html/rfc3164 Example output: <26> Mar 22 00:59:03 librenms.host.net librenms[233]: [Critical] network.device.net: Port Down - port_id => 98939; ifDescr => xe-1/1/0; Each fault will be sent as a separate syslog. Example: Config Example Host 127.0.0.1 Port 514 Facility 3 Telegram Thank you to snis for these instructions. First you must create a telegram account and add BotFather to you list. To do this click on the following url: https://telegram.me/botfather Generate a new bot with the command \"/newbot\" BotFather is then asking for a username and a normal name. After that your bot is created and you get a HTTP token. (for more options for your bot type \"/help\") Add your bot to telegram with the following url: http://telegram.me/ to use app or https://web.telegram.org/ to use in web, and send some text to the bot. The BotFather should have responded with a token, copy your token code and go to the following page in chrome: https://api.telegram.org/bot/getUpdates (this could take a while so continue to refresh until you see something similar to below) You see a json code with the message you sent to the bot. Copy the Chat id. In this example that is \u201c-9787468\u201d within this example: \"message\":{\"message_id\":7,\"from\":\"id\":656556,\"first_name\":\"Joo\",\"last_name\":\"Doo\",\"username\":\"JohnDoo\"},\"chat\":{\"id\":-9787468,\"title\":\"Telegram Group\"},\"date\":1435216924,\"text\":\"Hi\"}}]} . Now create a new \"Telegram transport\" in LibreNMS (Global Settings -> Alerting Settings -> Telegram transport). Click on 'Add Telegram config' and put your chat id and token into the relevant box. If want to use a group to receive alerts, you need to pick the Chat ID of the group chat, and not of the Bot itself. Telegram Docs Example: Config Example Chat ID 34243432 Token 3ed32wwf235234 Format HTML or MARKDOWN Twilio SMS Twilio will send your alert via SMS. From your Twilio account you will need your account SID, account token and your Twilio SMS phone number that you would like to send the alerts from. Twilio's APIs are located at: https://www.twilio.com/docs/api?filter-product=sms Example: Config Example SID ACxxxxxxxxxxxxxxxxxxxxxxxxxxxx Token 7xxxx573acxxxbc2xxx308d6xxx652d32 Twilio SMS Number 8888778660 UKFast PSS UKFast PSS tickets can be raised from alerts using the UKFastPSS transport. This required an API key with PSS write permissions Example: Config Example API Key ABCDefgfg12 Author 5423 Priority Critical Secure true VictorOps VictorOps provide a webHook url to make integration extremely simple. To get the URL required login to your VictorOps account and go to: Settings -> Integrations -> REST Endpoint -> Enable Integration. The URL provided will have $routing_key at the end, you need to change this to something that is unique to the system sending the alerts such as librenms. I.e: https://alert.victorops.com/integrations/generic/20132414/alert/2f974ce1-08fc-4dg8-a4f4-9aee6cf35c98/librenms Example: Config Example Post URL https://alert.victorops.com/integrations/generic/20132414/alert/2f974ce1-08fc-4dg8-a4f4-9aee6cf35c98/librenms Kayako Classic LibreNMS can send alerts to Kayako Classic API which are then converted to tickets. To use this module, you need REST API feature enabled in Kayako Classic and configured email account at LibreNMS. To enable this, do this: AdminCP -> REST API -> Settings -> Enable API (Yes) Also you need to know the department id to provide tickets to appropriate department and a user email to provide, which is used as ticket author. To get department id: navigate to appropriate department name at the departments list page in Admin CP and watch the number at the end of url. Example: http://servicedesk.example.com/admin/Base/Department/Edit/17 . Department ID is 17 As a requirement, you have to know API Url, API Key and API Secret to connect to servicedesk Kayako REST API Docs Example: Config Example Kayako URL http://servicedesk.example.com/api/ Kayako API Key 8cc02f38-7465-4a0c-8730-bb3af122167b Kayako API Secret Y2NhZDIxNDMtNjVkMi0wYzE0LWExYTUtZGUwMjJiZDI0ZWEzMmRhOGNiYWMtNTU2YS0yODk0LTA1MTEtN2VhN2YzYzgzZjk5 Kayako Department 1 Signal CLI Use the Signal Mesenger for Alerts. Run the Signal CLI with the D-Bus option. GitHub Project Example: Config Example Path /opt/signal-cli/bin/signal-cli Recipient type Group Recipient dfgjsdkgljior4345== SMSFeedback SMSFeedback is a SAAS service, which can be used to deliver Alerts via API, using API url, Username & Password. They can be in international dialling format only. SMSFeedback Api Docs Example: Config Example User smsfeedback_user Password smsfeedback_password Mobiles 71234567890 Sender name CIA Zenduty Leveraging LibreNMS<>Zenduty Integration, users can send new LibreNMS alerts to the right team and notify them based on on-call schedules via email, SMS, Phone Calls, Slack, Microsoft Teams and mobile push notifications. Zenduty provides engineers with detailed context around the LibreNMS alert along with playbooks and a complete incident command framework to triage, remediate and resolve incidents with speed. Create a LibreNMS Integration from inside Zenduty , then copy the Webhook URL from Zenduty to LibreNMS. For a detailed guide with screenshots, refer to the LibreNMS documentation at Zenduty . Example: Config Example WebHook URL https://www.zenduty.com/api/integration/librenms/integration-key/","title":"Transports"},{"location":"Alerting/Transports/#transports","text":"Transports are located within LibreNMS/Alert/Transport/ and can be configured within the WebUI under Alerts -> Alert Transports. Contacts will be gathered automatically and passed to the configured transports. By default the Contacts will be only gathered when the alert triggers and will ignore future changes in contacts for the incident. If you want contacts to be re-gathered before each dispatch, please set 'Updates to contact email addresses not honored' to Off in the WebUI. The contacts will always include the SysContact defined in the Device's SNMP configuration and also every LibreNMS user that has at least read -permissions on the entity that is to be alerted. At the moment LibreNMS only supports Port or Device permissions. You can exclude the SysContact by toggling 'Issue alerts to sysContact'. To include users that have Global-Read , Administrator or Normal-User permissions it is required to toggle the options: Issue alerts to admins. Issue alerts to read only users Issue alerts to normal users.","title":"Transports"},{"location":"Alerting/Transports/#using-a-proxy","text":"Proxy Configuration","title":"Using a Proxy"},{"location":"Alerting/Transports/#using-a-amqp-based-transport","text":"You need to install an additional php module : bcmath","title":"Using a AMQP based Transport"},{"location":"Alerting/Transports/#alerta","text":"The alerta monitoring system is a tool used to consolidate and de-duplicate alerts from multiple sources for quick \u2018at-a-glance\u2019 visualisation. With just one system you can monitor alerts from many other monitoring tools on a single screen. Example: Config Example API Endpoint http://alerta.example.com/api/alert Environment Production Apy key api key with write permission Alert state critical Recover state cleared","title":"Alerta"},{"location":"Alerting/Transports/#alertmanager","text":"Alertmanager is an alert handling software, initially developed for alert processing sent by Prometheus. It has built-in functionality for deduplicating, grouping and routing alerts based on configurable criteria. LibreNMS uses alert grouping by alert rule, which can produce an array of alerts of similar content for an array of hosts, whereas Alertmanager can group them by alert meta, ideally producing one single notice in case an issue occurs. It is possible to configure as many label values as required in Alertmanager Options section. Every label and its value should be entered as a new line. Labels can be a fixed string or a dynamic variable from the alert. To set a dynamic variable your label must start with extra_ then complete with the name of your label (only characters, figures and underscore are allowed here). The value must be the name of the variable you want to get (you can see all the variables in Alerts->Notifications by clicking on the Details icon of your alert when it is pending). If the variable's name does not match with an existing value the label's value will be the string you provided just as it was a fixed string. Multiple Alertmanager URLs (comma separated) are supported. Each URL will be tried and the search will stop at the first success. Basic HTTP authentication with a username and a password is supported. If you let those value blank, no authentication will be used. Alertmanager Docs Example: Config Example Alertmanager URL(s) http://alertmanager1.example.com,http://alertmanager2.example.com Alertmanager Username myUsername Alertmanager Password myPassword Alertmanager Options: source=librenms customlabel=value extra_dynamic_value=variable_name","title":"Alertmanager"},{"location":"Alerting/Transports/#api","text":"The API transport allows to reach any service provider using POST, PUT or GET URLs (Like SMS provider, etc). It can be used in multiple ways: The same text built from the Alert template is available in the variable $msg , which can then be sent as an option to the API. Be carefull that HTTP GET requests are usually limited in length. The API-Option fields can be directly built from the variables defined in Template-Syntax but without the 'alert->' prefix. For instance, $alert->uptime is available as $uptime in the API transport The API-Headers allows you to add the headers that the api endpoint requires. The API-body allow sending data in the format required by the API endpoint. A few variables commonly used : Variable Description {{ $hostname }} Hostname {{ $sysName }} SysName {{ $sysDescr }} SysDescr {{ $os }} OS of device (librenms defined) {{ $type }} Type of device (librenms defined) {{ $ip }} IP Address {{ $hardware }} Hardware {{ $version }} Version {{ $uptime }} Uptime in seconds {{ $uptime_short }} Uptime in human-readable format {{ $timestamp }} Timestamp of alert {{ $description }} Description of device {{ $title }} Title (as built from the Alert Template) {{ $msg }} Body text (as built from the Alert Template) Example: The example below will use the API named sms-api of my.example.com and send the title of the alert to the provided number using the provided service key. Refer to your service documentation to configure it properly. Config Example API Method GET API URL http://my.example.com/sms-api API Options rcpt=0123456789 key=0987654321abcdef msg=(LNMS) {{ $title }} API Username myUsername API Password myPassword The example below will use the API named wall-display of my.example.com and send the title and text of the alert to a screen in the Network Operation Center. Config Example API Method POST API URL http://my.example.com/wall-display API Options title={{ $title }} msg={{ $msg }} The example below will use the API named component of my.example.com with id 1, body as json status value and headers send token authentication and content type required. Config Example API Method PUT API URL http://my.example.com/comonent/1 API Headers X-Token=HASH Content-Type=application/json API Body { \"status\": 2 }","title":"API"},{"location":"Alerting/Transports/#aspsms","text":"aspSMS is a SMS provider that can be configured by using the generic API Transport. You need a token you can find on your personnal space. aspSMS docs Example: Config Example Transport type Api API Method POST API URL https://soap.aspsms.com/aspsmsx.asmx/SimpleTextSMS Options UserKey=USERKEY Password=APIPASSWORD Recipient=RECIPIENT Originator=ORIGINATOR MessageText={{ $msg }}","title":"aspSMS"},{"location":"Alerting/Transports/#browser-push","text":"Browser push notifications can send a notification to the user's device even when the browser is not open. This requires HTTPS, the PHP GMP extension, Push API support, and permissions on each device to send alerts. Simply configure an alert transport and allow notification permission on the device(s) you wish to receive alerts on. You may disable alerts on a browser on the user preferences page.","title":"Browser Push"},{"location":"Alerting/Transports/#canopsis","text":"Canopsis is a hypervision tool. LibreNMS can send alerts to Canopsis which are then converted to canopsis events. Canopsis Docs Example: Config Example Hostname www.xxx.yyy.zzz Port Number 5672 User admin Password my_password Vhost canopsis","title":"Canopsis"},{"location":"Alerting/Transports/#cisco-spark-aka-webex-teams","text":"Cisco Spark (now known as Webex Teams). LibreNMS can send alerts to a Cisco Spark room. To make this possible you need to have a RoomID and a token. You can also choose to send alerts using Markdown syntax. Enabling this option provides for more richly formatted alerts, but be sure to adjust your alert template to account for the Markdown syntax. For more information about Cisco Spark RoomID and token, take a look here : Getting started Rooms Example: Config Example API Token ASd23r23edewda RoomID 34243243251 Use Markdown? x","title":"Cisco Spark (aka Webex Teams)"},{"location":"Alerting/Transports/#clickatell","text":"Clickatell provides a REST-API requiring an Authorization-Token and at least one Cellphone number. Clickatell Docs Here an example using 3 numbers, any amount of numbers is supported: Example: Config Example Token dsaWd3rewdwea Mobile Numbers +1234567890,+1234567891,+1234567892","title":"Clickatell"},{"location":"Alerting/Transports/#discord","text":"The Discord transport will POST the alert message to your Discord Incoming WebHook. Simple html tags are stripped from the message. The only required value is for url, without this no call to Discord will be made. The Options field supports the JSON/Form Params listed in the Discord Docs below. Discord Docs Example: Config Example Discord URL https://discordapp.com/api/webhooks/4515489001665127664/82-sf4385ysuhfn34u2fhfsdePGLrg8K7cP9wl553Fg6OlZuuxJGaa1d54fe Options username=myname","title":"Discord"},{"location":"Alerting/Transports/#elasticsearch","text":"You can have LibreNMS send alerts to an elasticsearch database. Each fault will be sent as a separate document. Example: Config Example Host 127.0.0.1 Port 9200 Index Pattern \\l\\i\\b\\r\\e\\n\\m\\s-Y.m.d","title":"Elasticsearch"},{"location":"Alerting/Transports/#gitlab","text":"LibreNMS will create issues for warning and critical level alerts however only title and description are set. Uses Personal access tokens to authenticate with GitLab and will store the token in cleartext. Example: Config Example Host http://gitlab.host.tld Project ID 1 Personal Access Token AbCdEf12345","title":"GitLab"},{"location":"Alerting/Transports/#grafana-oncall","text":"Send alerts to Grafana Oncall using a Formatted Webhook Example: Config Example Webhook URL https://a-prod-us-central-0.grafana.net/integrations/v1/formatted_webhook/m12xmIjOcgwH74UF8CN4dk0Dh/","title":"Grafana Oncall"},{"location":"Alerting/Transports/#hipchat","text":"See the HipChat API Documentation for rooms/message for details on acceptable values. You may notice that the link points at the \"deprecated\" v1 API. This is because the v2 API is still in beta. Example: Config Example API URL https://api.hipchat.com/v1/rooms/message?auth_token=109jawregoaihj Room ID 7654321 From Name LibreNMS Options color=red At present the following options are supported: color . Note: The default message format for HipChat messages is HTML. It is recommended that you specify the text message format to prevent unexpected results, such as HipChat attempting to interpret angled brackets ( < and > ).","title":"HipChat"},{"location":"Alerting/Transports/#irc","text":"The IRC transports only works together with the LibreNMS IRC-Bot. Configuration of the LibreNMS IRC-Bot is described here . Example: Config Example IRC enabled","title":"IRC"},{"location":"Alerting/Transports/#jira","text":"You can have LibreNMS create issues on a Jira instance for critical and warning alerts using either the Jira REST API or webhooks. Custom fields allow you to add any required fields beyond summary and description fields in case mandatory fields are required by your Jira project/issue type configuration. Custom fields are defined in JSON format but ustom fields allow you to add any required fields beyond summary and description fields in case mandatory fields are required by your Jira project/issue type configuration. Custom fields are defined in JSON format. Currently http authentication is used to access Jira and Jira username and password will be stored as cleartext in the LibreNMS database.","title":"JIRA"},{"location":"Alerting/Transports/#rest-api","text":"The config fields that need to set for Jira REST API are: Jira Open URL, Jira username, Jira password, Project key, and issue type. Note: REST API is that it is only able to open new tickets.","title":"REST API"},{"location":"Alerting/Transports/#webhooks","text":"The config fields that need to set for webhooks are: Jira Open URL, Jira Close URL, Jira username, Jira password and webhook ID. Note: Webhooks allow more control over how alerts are handled in Jira. With webhooks, recovery messages can be sent to a different URL than alerts. Additionally, a custom conditional logic can be built using the webhook payload and ID to automatically close an open ticket if predefined conditions are met. Jira Issue Types Jira Webhooks Example: Config Example Project Key JIRAPROJECTKEY Issue Type Myissuetype Open URL https://myjira.mysite.com / https://webhook-open-url Close URL https://webhook-close-url Jira Username myjirauser Jira Password myjirapass Enable webhook ON/OFF Webhook ID alert_id Custom Fileds {\"components\":[{\"id\":\"00001\"}], \"source\": \"LibrenNMS\"}","title":"Webhooks"},{"location":"Alerting/Transports/#jira-service-management","text":"Using Jira Service Management LibreNMS integration, LibreNMS forwards alerts to Jira Service Management with detailed information. Jira Service Management acts as a dispatcher for LibreNMS alerts, determines the right people to notify based on on-call schedules and notifies via email, text messages (SMS), phone calls and iOS & Android push notifications. Then escalates alerts until the alert is acknowledged or closed. :warning: If the feature isn\u2019t available on your site, keep checking Jira Service Management for updates. Example: Config Example WebHook URL https://url/path/to/webhook","title":"Jira Service Management"},{"location":"Alerting/Transports/#line-messaging-api","text":"LINE Messaging API Docs Here is the step for setup a LINE bot and using it in LibreNMS. Use your real LINE account register in developer protal . Add a new channel, choose Messaging API and continue fill up the forms, note that Channel name cannot edit later. Go to \"Messaging API\" tab of your channel, here listing some important value. Bot basic ID and QR code is your LINE bot's ID and QR code. Channel access token (long-lived) , will use it in LibreNMS, keep it safe. Use your real Line account add your LINE bot as a friend. Recipient ID can be groupID , userID or roomID , it will be used in LibreNMS to send message to a group or a user. Use the following NodeJS program and ngrok for temporally https webhook to listen it. LINE-bot-RecipientFetcher Run the program and using ngrok expose port to public $ node index.js $ ngrok http 3000 Go to \"Messaging API\" tab of your channel, fill up Webhook URL to https:///webhook If you want to let LINE bot send message to a yourself, use your real account to send a message to your LINE bot. Program will print out the userID in console. sample value: {\"type\":\"user\",\"userId\":\"U527xxxxxxxxxxxxxxxxxxxxxxxxxc0ee\"} If you want to let LINE bot send message to a group, do the following steps. Add your LINE bot into group Use your real account to send a message to group Program will print out the groupID in console, it will be Recipient ID, keep it safe. sample value: {\"type\":\"group\",\"groupId\":\"Ce51xxxxxxxxxxxxxxxxxxxxxxxxxx6ef\",\"userId\":\"U527xxxxxxxxxxxxxxxxxxxxxxxxxc0ee\"} ``` Example: Config Example Access token fhJ9vH2fsxxxxxxxxxxxxxxxxxxxxlFU= Recipient (groupID, userID or roomID) Ce51xxxxxxxxxxxxxxxxxxxxxxxxxx6ef","title":"LINE Messaging API"},{"location":"Alerting/Transports/#line-notify","text":"LINE Notify LINE Notify API Document Example: Config Example Token AbCdEf12345","title":"LINE Notify"},{"location":"Alerting/Transports/#mail","text":"The E-Mail transports uses the same email-configuration as the rest of LibreNMS. As a small reminder, here is its configuration directives including defaults: Emails will attach all graphs included with the @signedGraphTag directive. If the email format is set to html, they will be embedded. To disable attaching images, set email_attach_graphs to false. alerting/email lnms config:set email_html true lnms config:set email_attach_graphs false Example: Config Example Email me@example.com","title":"Mail"},{"location":"Alerting/Transports/#matrix","text":"For using the Matrix transports, you have to create a room on the Matrix-server. The provided Auth_token belongs to an user, which is member of this room. The Message, sent to the matrix-room can be built from the variables defined in Template-Syntax but without the 'alert->' prefix. See API-Transport. The variable $msg is contains the result of the Alert template.The Matrix-Server URL is cutted before the beginning of the _matrix/client/r0/... API-part. Example: Config Example Matrix-Server URL https://matrix.example.com/ Room !ajPbbPalmVbNuQoBDK:example.com Auth_token: MDAyYmxvY2F0aW9uI...z1DCn6lz_uOhtW3XRICg Message: Alert: {{ $msg }} https://librenms.example.com","title":"Matrix"},{"location":"Alerting/Transports/#messagebird","text":"LibreNMS can send text messages through Messagebird Rest API transport. Config Example Api Key Api rest key given in the messagebird dashboard Originator E.164 formatted originator Recipient E.164 formatted recipient for multi recipents comma separated Character limit Range 1..480 (max 3 split messages)","title":"Messagebird"},{"location":"Alerting/Transports/#messagebird-voice","text":"LibreNMS can send messages through Messagebird voice Rest API transport (text to speech). Config Example Api Key Api rest key given in the messagebird dashboard Originator E.164 formatted originator Recipient E.164 formatted recipient for multi recipents comma separated Language Select box for options Spoken voice Female or Male Repeat X times the message is repeated","title":"Messagebird Voice"},{"location":"Alerting/Transports/#microsoft-teams","text":"LibreNMS can send alerts to Microsoft Teams Incoming Webhooks which are then posted to a specific channel. Microsoft recommends using markdown formatting for connector cards. Administrators can opt to compose the MessageCard themselves using JSON to get the full functionality. Example: Config Example WebHook URL https://outlook.office365.com/webhook/123456789 Use JSON? x","title":"Microsoft Teams"},{"location":"Alerting/Transports/#nagios-compatible","text":"The nagios transport will feed a FIFO at the defined location with the same format that nagios would. This allows you to use other alerting systems with LibreNMS, for example Flapjack . Example: Config Example Nagios FIFO /path/to/my.fifo","title":"Nagios Compatible"},{"location":"Alerting/Transports/#opsgenie","text":"Using OpsGenie LibreNMS integration, LibreNMS forwards alerts to OpsGenie with detailed information. OpsGenie acts as a dispatcher for LibreNMS alerts, determines the right people to notify based on on-call schedules and notifies via email, text messages (SMS), phone calls and iOS & Android push notifications. Then escalates alerts until the alert is acknowledged or closed. Create a LibreNMS Integration from the integrations page once you signup. Then copy the API key from OpsGenie to LibreNMS. If you want to automatically ack and close alerts, leverage Marid integration. More detail with screenshots is available in OpsGenie LibreNMS Integration page . Example: Config Example WebHook URL https://url/path/to/webhook","title":"OpsGenie"},{"location":"Alerting/Transports/#osticket","text":"LibreNMS can send alerts to osTicket API which are then converted to osTicket tickets. Example: Config Example API URL http://osticket.example.com/api/http.php/tickets.json API Token 123456789","title":"osTicket"},{"location":"Alerting/Transports/#pagerduty","text":"LibreNMS can make use of PagerDuty, this is done by utilizing an API key and Integraton Key. API Keys can be found under 'API Access' in the PagerDuty portal. Integration Keys can be found under 'Integration' for the particular Service you have created in the PagerDuty portal. Example: Config Example API Key randomsample Integration Key somerandomstring","title":"PagerDuty"},{"location":"Alerting/Transports/#philips-hue","text":"Want to spice up your noc life? LibreNMS will flash all lights connected to your philips hue bridge whenever an alert is triggered. To setup, go to the you http:// your-bridge-ip /debug/clip.html Update the \"URL:\" field to /api Paste this in the \"Message Body\" {\"devicetype\":\"librenms\"} Press the round button on your philips Hue Bridge Click on POST In the Command Response You should see output with your username. Copy this without the quotes More Info: Philips Hue Documentation Example: Config Example Host http://your-bridge-ip Hue User username Duration 1 Second","title":"Philips Hue"},{"location":"Alerting/Transports/#playsms","text":"PlaySMS is an open source SMS-Gateway that can be used via their HTTP API using a Username and WebService Token. Please consult PlaySMS's documentation regarding number formatting. PlaySMS Docs Here an example using 3 numbers, any amount of numbers is supported: Example: Config Example PlaySMS https://localhost/index.php User user1 Token MYFANCYACCESSTOKEN From My Name Mobiles +1234567892,+1234567890,+1234567891","title":"PlaySMS"},{"location":"Alerting/Transports/#pushbullet","text":"Get your Access Token from your Pushbullet's settings page and set it in your transport: Example: Config Example Access Token MYFANCYACCESSTOKEN","title":"Pushbullet"},{"location":"Alerting/Transports/#pushover","text":"If you want to change the default notification sound for all notifications then you can add the following in Pushover Options: sound=falling You also have the possibility to change sound per severity: sound_critical=falling sound_warning=siren sound_ok=magic Enabling Pushover support is fairly easy, there are only two required parameters. Firstly you need to create a new Application (called LibreNMS, for example) in your account on the Pushover website ( https://pushover.net/apps ). Now copy your API Key and obtain your User Key from the newly created Application and setup the transport. Pushover Docs Example: Config Example Api Key APPLICATIONAPIKEYGOESHERE User Key USERKEYGOESHERE Pushover Options sound_critical=falling sound_warning=siren sound_ok=magic","title":"Pushover"},{"location":"Alerting/Transports/#rocketchat","text":"The Rocket.chat transport will POST the alert message to your Rocket.chat Incoming WebHook using the attachments option. Simple html tags are stripped from the message. All options are optional, the only required value is for url, without this then no call to Rocket.chat will be made. Rocket.chat Docs Example: Config Example Webhook URL https://rocket.url/api/v1/chat.postMessage Rocket.chat Options channel=#Alerting username=myname icon_url=http://someurl/image.gif icon_emoji=:smirk:","title":"Rocket.chat"},{"location":"Alerting/Transports/#sensu","text":"The Sensu transport will POST an Event to the Agent API upon an alert being generated. It will be categorised (ok, warning or critical), and if you configure the alert to send recovery notifications, Sensu will also clear the alert automatically. No configuration is required - as long as you are running the Sensu Agent on your poller with the HTTP socket enabled on tcp/3031, LibreNMS will start generating Sensu events as soon as you create the transport. Acknowledging alerts within LibreNMS is not directly supported, but an annotation ( acknowledged ) is set, so a mutator or silence, or even the handler could be written to look for it directly in the handler. There is also an annotation ( generated-by ) set, to allow you to treat LibreNMS events differently from agent events. The 'shortname' option is a simple way to reduce the length of device names in configs. It replaces the last 3 domain components with single letters (e.g. websrv08.dc4.eu.corp.example.net gets shortened to websrv08.dc4.eu.cen).","title":"Sensu"},{"location":"Alerting/Transports/#limitations","text":"Only a single namespace is supported Sensu will reject rules with special characters - the Transport will attempt to fix up rule names, but it's best to stick to letters, numbers and spaces The transport only deals in absolutes - it ignores the got worse/got better states The agent will buffer alerts, but LibreNMS will not - if your agent is offline, alerts will be dropped There is no backchannel between Sensu and LibreNMS - if you make changes in Sensu to LibreNMS alerts, they'll be lost on the next event (silences will work) Example: Config Example Sensu Endpoint http://localhost:3031 Sensu Namespace eu-west Check Prefix lnms Source Key hostname","title":"Limitations"},{"location":"Alerting/Transports/#slack","text":"The Slack transport will POST the alert message to your Slack Incoming WebHook using the attachments option, you are able to specify multiple webhooks along with the relevant options to go with it. Simple html tags are stripped from the message. All options are optional, the only required value is for url, without this then no call to Slack will be made. We currently support the following attachment options: author_name Slack docs Example: Config Example Webhook URL https://slack.com/url/somehook Slack Options author_name=Me","title":"Slack"},{"location":"Alerting/Transports/#smseagle","text":"SMSEagle is a hardware SMS Gateway that can be used via their HTTP API using a Username and password. Destination numbers are one per line, with no spaces. They can be in either local or international dialling format. SMSEagle Docs Example: Config Example SMSEagle Host ip.add.re.ss User smseagle_user Password smseagle_user_password Mobiles +3534567890 0834567891","title":"SMSEagle"},{"location":"Alerting/Transports/#smsmode","text":"SMSmode is a SMS provider that can be configured by using the generic API Transport. You need a token you can find on your personnal space. SMSmode docs Example: Config Example Transport type Api API Method POST API URL http://api.smsmode.com/http/1.6/sendSMS.do Options accessToken= PUT_HERE_YOUR_TOKEN numero= PUT_HERE_DESTS_NUMBER_COMMA_SEPARATED message={{ $msg }}","title":"SMSmode"},{"location":"Alerting/Transports/#splunk","text":"LibreNMS can send alerts to a Splunk instance and provide all device and alert details. Example output: Feb 21 15:21:52 nms hostname=\"localhost\", sysName=\"localhost\", sysDescr=\"\", sysContact=\"\", os=\"fortigate\", type=\"firewall\", ip=\"localhost\", hardware=\"FGT_50E\", version=\"v5.6.9\", serial=\"\", features=\"\", location=\"\", uptime=\"387\", uptime_short=\" 6m 27s\", uptime_long=\" 6 minutes 27 seconds\", description=\"\", notes=\"\", alert_notes=\"\", device_id=\"0\", rule_id=\"0\", id=\"0\", proc=\"\", status=\"1\", status_reason=\"\", ping_timestamp=\"\", ping_loss=\"0\", ping_min=\"25.6\", ping_max=\"26.8\", ping_avg=\"26.3\", title=\"localhost recovered from Device up/down \", elapsed=\"14m 54s\", uid=\"0\", alert_id=\"0\", severity=\"critical\", name=\"Device up/down\", timestamp=\"2020-02-21 15:21:33\", state=\"0\", device_device_id=\"0\", device_inserted=\"\", device_hostname=\"localhost\", device_sysName=\"localhost\", device_ip=\"localhost\", device_overwrite_ip=\"\", device_timeout=\"\", device_retries=\"\", device_snmp_disable=\"0\", device_bgpLocalAs=\"0\", device_sysObjectID=\"\", device_sysDescr=\"\", device_sysContact=\"\", device_version=\"v5.6.9\", device_hardware=\"FGT_50E\", device_features=\"build1673\", device_location_id=\"\", device_os=\"fortigate\", device_status=\"1\", device_status_reason=\"\", device_ignore=\"0\", device_disabled=\"0\", device_uptime=\"387\", device_agent_uptime=\"0\", device_last_polled=\"2020-02-21 15:21:33\", device_last_poll_attempted=\"\", device_last_polled_timetaken=\"7.9\", device_last_discovered_timetaken=\"11.77\", device_last_discovered=\"2020-02-21 13:16:42\", device_last_ping=\"2020-02-21 15:21:33\", device_last_ping_timetaken=\"26.3\", device_purpose=\"\", device_type=\"firewall\", device_serial=\"FGT50EXXX\", device_icon=\"images/os/fortinet.svg\", device_poller_group=\"0\", device_override_sysLocation=\"0\", device_notes=\"\", device_port_association_mode=\"1\", device_max_depth=\"0\", device_disable_notify=\"0\", device_location=\"\", device_vrf_lites=\"Array\", device_lat=\"\", device_lng=\"\", - sysObjectID => \"\"; ` Each alert will be sent as a separate message. Example: Config Example Host 127.0.0.1 UDP Port 514","title":"Splunk"},{"location":"Alerting/Transports/#syslog","text":"You can have LibreNMS emit alerts as syslogs complying with RFC 3164. More information on RFC 3164 can be found here: https://tools.ietf.org/html/rfc3164 Example output: <26> Mar 22 00:59:03 librenms.host.net librenms[233]: [Critical] network.device.net: Port Down - port_id => 98939; ifDescr => xe-1/1/0; Each fault will be sent as a separate syslog. Example: Config Example Host 127.0.0.1 Port 514 Facility 3","title":"Syslog"},{"location":"Alerting/Transports/#telegram","text":"Thank you to snis for these instructions. First you must create a telegram account and add BotFather to you list. To do this click on the following url: https://telegram.me/botfather Generate a new bot with the command \"/newbot\" BotFather is then asking for a username and a normal name. After that your bot is created and you get a HTTP token. (for more options for your bot type \"/help\") Add your bot to telegram with the following url: http://telegram.me/ to use app or https://web.telegram.org/ to use in web, and send some text to the bot. The BotFather should have responded with a token, copy your token code and go to the following page in chrome: https://api.telegram.org/bot/getUpdates (this could take a while so continue to refresh until you see something similar to below) You see a json code with the message you sent to the bot. Copy the Chat id. In this example that is \u201c-9787468\u201d within this example: \"message\":{\"message_id\":7,\"from\":\"id\":656556,\"first_name\":\"Joo\",\"last_name\":\"Doo\",\"username\":\"JohnDoo\"},\"chat\":{\"id\":-9787468,\"title\":\"Telegram Group\"},\"date\":1435216924,\"text\":\"Hi\"}}]} . Now create a new \"Telegram transport\" in LibreNMS (Global Settings -> Alerting Settings -> Telegram transport). Click on 'Add Telegram config' and put your chat id and token into the relevant box. If want to use a group to receive alerts, you need to pick the Chat ID of the group chat, and not of the Bot itself. Telegram Docs Example: Config Example Chat ID 34243432 Token 3ed32wwf235234 Format HTML or MARKDOWN","title":"Telegram"},{"location":"Alerting/Transports/#twilio-sms","text":"Twilio will send your alert via SMS. From your Twilio account you will need your account SID, account token and your Twilio SMS phone number that you would like to send the alerts from. Twilio's APIs are located at: https://www.twilio.com/docs/api?filter-product=sms Example: Config Example SID ACxxxxxxxxxxxxxxxxxxxxxxxxxxxx Token 7xxxx573acxxxbc2xxx308d6xxx652d32 Twilio SMS Number 8888778660","title":"Twilio SMS"},{"location":"Alerting/Transports/#ukfast-pss","text":"UKFast PSS tickets can be raised from alerts using the UKFastPSS transport. This required an API key with PSS write permissions Example: Config Example API Key ABCDefgfg12 Author 5423 Priority Critical Secure true","title":"UKFast PSS"},{"location":"Alerting/Transports/#victorops","text":"VictorOps provide a webHook url to make integration extremely simple. To get the URL required login to your VictorOps account and go to: Settings -> Integrations -> REST Endpoint -> Enable Integration. The URL provided will have $routing_key at the end, you need to change this to something that is unique to the system sending the alerts such as librenms. I.e: https://alert.victorops.com/integrations/generic/20132414/alert/2f974ce1-08fc-4dg8-a4f4-9aee6cf35c98/librenms Example: Config Example Post URL https://alert.victorops.com/integrations/generic/20132414/alert/2f974ce1-08fc-4dg8-a4f4-9aee6cf35c98/librenms","title":"VictorOps"},{"location":"Alerting/Transports/#kayako-classic","text":"LibreNMS can send alerts to Kayako Classic API which are then converted to tickets. To use this module, you need REST API feature enabled in Kayako Classic and configured email account at LibreNMS. To enable this, do this: AdminCP -> REST API -> Settings -> Enable API (Yes) Also you need to know the department id to provide tickets to appropriate department and a user email to provide, which is used as ticket author. To get department id: navigate to appropriate department name at the departments list page in Admin CP and watch the number at the end of url. Example: http://servicedesk.example.com/admin/Base/Department/Edit/17 . Department ID is 17 As a requirement, you have to know API Url, API Key and API Secret to connect to servicedesk Kayako REST API Docs Example: Config Example Kayako URL http://servicedesk.example.com/api/ Kayako API Key 8cc02f38-7465-4a0c-8730-bb3af122167b Kayako API Secret Y2NhZDIxNDMtNjVkMi0wYzE0LWExYTUtZGUwMjJiZDI0ZWEzMmRhOGNiYWMtNTU2YS0yODk0LTA1MTEtN2VhN2YzYzgzZjk5 Kayako Department 1","title":"Kayako Classic"},{"location":"Alerting/Transports/#signal-cli","text":"Use the Signal Mesenger for Alerts. Run the Signal CLI with the D-Bus option. GitHub Project Example: Config Example Path /opt/signal-cli/bin/signal-cli Recipient type Group Recipient dfgjsdkgljior4345==","title":"Signal CLI"},{"location":"Alerting/Transports/#smsfeedback","text":"SMSFeedback is a SAAS service, which can be used to deliver Alerts via API, using API url, Username & Password. They can be in international dialling format only. SMSFeedback Api Docs Example: Config Example User smsfeedback_user Password smsfeedback_password Mobiles 71234567890 Sender name CIA","title":"SMSFeedback"},{"location":"Alerting/Transports/#zenduty","text":"Leveraging LibreNMS<>Zenduty Integration, users can send new LibreNMS alerts to the right team and notify them based on on-call schedules via email, SMS, Phone Calls, Slack, Microsoft Teams and mobile push notifications. Zenduty provides engineers with detailed context around the LibreNMS alert along with playbooks and a complete incident command framework to triage, remediate and resolve incidents with speed. Create a LibreNMS Integration from inside Zenduty , then copy the Webhook URL from Zenduty to LibreNMS. For a detailed guide with screenshots, refer to the LibreNMS documentation at Zenduty . Example: Config Example WebHook URL https://www.zenduty.com/api/integration/librenms/integration-key/","title":"Zenduty"},{"location":"Developing/Application-Notes/","text":"Notes On Application Development LibreNMS JSON SNMP Extends The polling function json_app_get makes it easy to poll complex data using SNMP extends and JSON. The following exceptions are provided by it. It takes three parameters, in order in the list below. Integer :: Device ID to fetch it for. String :: The extend name. For example, if 'zfs' is passed it will be converted to 'nsExtendOutputFull.3.122.102.115'. Integer :: Minimum expected version of the JSON return. The required keys for the returned JSON are as below. version :: The version of the snmp extend script. Should be numeric and at least 1. error :: Error code from the snmp extend script. Should be > 0 (0 will be ignored and negatives are reserved) errorString :: Text to describe the error. data :: An key with an array with the data to be used. The supported exceptions are as below. JsonAppPollingFailedException :: Empty return from SNMP. JsonAppParsingFailedException :: Could not parse the JSON JsonAppBlankJsonException :: Blank JSON. JsonAppMissingKeysException :: Missing required keys. JsonAppWrongVersionException :: Older version than supported. JsonAppExtendErroredException :: Polling and parsing was good, but the returned data has an error set. This may be checked via $e->getParsedJson() and then checking the keys error and errorString. The error value can be accessed via $e->getCode(). The output can be accessed via $->getOutput() Only returned JsonAppParsingFailedException. The parsed JSON can be access via $e->getParsedJson(). An example below from includes/polling/applications/zfs.inc.php ... try { $zfs = json_app_get ( $device , $name , 1 )[ 'data' ]; } catch ( JsonAppMissingKeysException $e ) { //old version with out the data key $zfs = $e -> getParsedJson (); } catch ( JsonAppException $e ) { echo PHP_EOL . $name . ':' . $e -> getCode () . ':' . $e -> getMessage () . PHP_EOL ; update_application ( $app , $e -> getCode () . ':' . $e -> getMessage (), []); return ; } Compression Also worth noting that json_app_get supports compressed data via base64 encoded gzip. If base64 encoding is detected on the the SNMP return, it will be gunzipped and then parsed. https://github.com/librenms/librenms-agent/blob/master/utils/librenms_return_optimizer may be used to optimize JSON returns. Application Data Storage The $app model is supplied for each application poller and graph. You may access and update the $app->data field to store arrays of data the Application model. When you call update_application() the $app model will be saved along with any changes to the data field. // set the varaible data to $foo $app->data = [ 'item_A' => 123, 'item_B' => 4.5, 'type' => 'foo', 'other_items' => [ 'a', 'b', 'c' ], ]; // save the change $app->save(); // var_dump the contents of the variable var_dump($app->data);","title":"Applications"},{"location":"Developing/Application-Notes/#notes-on-application-development","text":"","title":"Notes On Application Development"},{"location":"Developing/Application-Notes/#librenms-json-snmp-extends","text":"The polling function json_app_get makes it easy to poll complex data using SNMP extends and JSON. The following exceptions are provided by it. It takes three parameters, in order in the list below. Integer :: Device ID to fetch it for. String :: The extend name. For example, if 'zfs' is passed it will be converted to 'nsExtendOutputFull.3.122.102.115'. Integer :: Minimum expected version of the JSON return. The required keys for the returned JSON are as below. version :: The version of the snmp extend script. Should be numeric and at least 1. error :: Error code from the snmp extend script. Should be > 0 (0 will be ignored and negatives are reserved) errorString :: Text to describe the error. data :: An key with an array with the data to be used. The supported exceptions are as below. JsonAppPollingFailedException :: Empty return from SNMP. JsonAppParsingFailedException :: Could not parse the JSON JsonAppBlankJsonException :: Blank JSON. JsonAppMissingKeysException :: Missing required keys. JsonAppWrongVersionException :: Older version than supported. JsonAppExtendErroredException :: Polling and parsing was good, but the returned data has an error set. This may be checked via $e->getParsedJson() and then checking the keys error and errorString. The error value can be accessed via $e->getCode(). The output can be accessed via $->getOutput() Only returned JsonAppParsingFailedException. The parsed JSON can be access via $e->getParsedJson(). An example below from includes/polling/applications/zfs.inc.php ... try { $zfs = json_app_get ( $device , $name , 1 )[ 'data' ]; } catch ( JsonAppMissingKeysException $e ) { //old version with out the data key $zfs = $e -> getParsedJson (); } catch ( JsonAppException $e ) { echo PHP_EOL . $name . ':' . $e -> getCode () . ':' . $e -> getMessage () . PHP_EOL ; update_application ( $app , $e -> getCode () . ':' . $e -> getMessage (), []); return ; }","title":"LibreNMS JSON SNMP Extends"},{"location":"Developing/Application-Notes/#compression","text":"Also worth noting that json_app_get supports compressed data via base64 encoded gzip. If base64 encoding is detected on the the SNMP return, it will be gunzipped and then parsed. https://github.com/librenms/librenms-agent/blob/master/utils/librenms_return_optimizer may be used to optimize JSON returns.","title":"Compression"},{"location":"Developing/Application-Notes/#application-data-storage","text":"The $app model is supplied for each application poller and graph. You may access and update the $app->data field to store arrays of data the Application model. When you call update_application() the $app model will be saved along with any changes to the data field. // set the varaible data to $foo $app->data = [ 'item_A' => 123, 'item_B' => 4.5, 'type' => 'foo', 'other_items' => [ 'a', 'b', 'c' ], ]; // save the change $app->save(); // var_dump the contents of the variable var_dump($app->data);","title":"Application Data Storage"},{"location":"Developing/Code-Structure/","text":"Code structure This document will try and provide a good overview of how the code is structured within LibreNMS. We will go through the main directories and provide information on how and when they are used. LibreNMS now uses Laravel for much of it's frontend (webui) and database code. Much of the Laravel documentation applies: https://laravel.com/docs/structure Directories from the (filtered) structure tree below are some of the directories that will be most interesting during development: . \u251c\u2500 app \u251c\u2500 database \u2502 \u2514\u2500 migrations \u251c\u2500 doc \u251c\u2500 html \u2502 \u251c\u2500 css \u2502 \u2502 \u2514\u2500 custom \u2502 \u2514\u2500 js \u251c\u2500 includes \u2502 \u251c\u2500 definitions \u2502 \u251c\u2500 discovery \u2502 \u251c\u2500 html \u2502 \u2502 \u251c\u2500 forms \u2502 \u2502 \u251c\u2500 graphs \u2502 \u2502 \u251c\u2500 pages \u2502 \u2502 \u2514\u2500 reports \u2502 \u2514\u2500 polling \u251c\u2500 LibreNMS \u251c\u2500 logs \u251c\u2500 mibs \u2514\u2500 rrd doc/ This is the location of all the documentation for LibreNMS, this is in GitHub markdown format and can be viewed online app/ Most Laravel and Eloquent classes should be under this directory. LibreNMS/ Classes that don't belong to the Laravel application belong in this directory, with a directory structure that matches the namespace. One class per file. See PSR-0 for details. html/ All legacy web accessible files are located here. New pages should follow the Laravel conventions. html/api_v0.php This is the API routing file which directs users to the correct API function based on the API endpoint call. html/index.php This is the main file which all links within LibreNMS are parsed through. It loads the majority of the relevant includes needed for the control panel to function. CSS and JS files are also loaded here. html/css/ All used CSS files are located here. html/css/custom/ This is a directory you can put custom css files into that won't interfere with auto updates html/js/ All used JS files are located here. includes/ This directory is quite big and contains all the files to make the cli and polling / discovery to work. This code is not currently accessible from Laravel code (intentionally). includes/discovery/, includes/polling/ All the discovery and polling code. The format is usually quite similar between discovery and polling. Both are made up of modules and the files within the relevant directories will match that module. So for instance if you want to update the os detection for a device, you would look in includes/discovery/os/ for a file named after the operating system such as linux: includes/discovery/linux.inc.php . Within here you would update or add support for newer OS'. This is the same for polling as well. includes/html/ This is where the majority of the website core files are located. These tend to be files that contain functions or often used code segments that can be included where needed rather than duplicating code. includes/html/forms/ This directory contains all of the files that are dynamically included from an ajax call to ajax/form. includes/html/api_functions.inc.php All of the functions and calls for the API are located here. includes/html/functions.inc.php This contains the majority of functions used throughout the standard web ui. includes/html/graphs/ This directory contains global and OS specific graph definitions. includes/html/reports/ In here is a list of of files that generate PDF reports available to the user. These are dynamically called in from html/pdf.php based on the report the user requests. includes/html/table/ This directory contains all of the ajax calls when generating the table of data. Most have been converted over so if you are planning to add a new table of data then you will do so here for all of the back end data calls. includes/html/pages/ This directory contains the URL structure when browsing the Web UI. So for example /devices/ is actually a call to includes/html/pages/devices.inc.php , /device/tab=ports/ is includes/html/pages/device/ports.inc.php . logs/ Contains the main librenms.log file by default, but can also contain your web server's logs, poller logs, and other items. mibs/ Here is where all of the mibs are located. Generally standard mibs should be in the root directory and specific vendor mibs should be in their own subdirectory. rrd/ Simple enough, this is where all of the rrd files are created. They are stored in directory based on the device hostname. database/migrations Contains all the database migrations. See Laravel docs for additional info: https://laravel.com/docs/migrations In general to create a new table you should run: php artisan make:model ModelName -m -c -r","title":"Code Structure"},{"location":"Developing/Code-Structure/#code-structure","text":"This document will try and provide a good overview of how the code is structured within LibreNMS. We will go through the main directories and provide information on how and when they are used. LibreNMS now uses Laravel for much of it's frontend (webui) and database code. Much of the Laravel documentation applies: https://laravel.com/docs/structure Directories from the (filtered) structure tree below are some of the directories that will be most interesting during development: . \u251c\u2500 app \u251c\u2500 database \u2502 \u2514\u2500 migrations \u251c\u2500 doc \u251c\u2500 html \u2502 \u251c\u2500 css \u2502 \u2502 \u2514\u2500 custom \u2502 \u2514\u2500 js \u251c\u2500 includes \u2502 \u251c\u2500 definitions \u2502 \u251c\u2500 discovery \u2502 \u251c\u2500 html \u2502 \u2502 \u251c\u2500 forms \u2502 \u2502 \u251c\u2500 graphs \u2502 \u2502 \u251c\u2500 pages \u2502 \u2502 \u2514\u2500 reports \u2502 \u2514\u2500 polling \u251c\u2500 LibreNMS \u251c\u2500 logs \u251c\u2500 mibs \u2514\u2500 rrd","title":"Code structure"},{"location":"Developing/Code-Structure/#doc","text":"This is the location of all the documentation for LibreNMS, this is in GitHub markdown format and can be viewed online","title":"doc/"},{"location":"Developing/Code-Structure/#app","text":"Most Laravel and Eloquent classes should be under this directory.","title":"app/"},{"location":"Developing/Code-Structure/#librenms","text":"Classes that don't belong to the Laravel application belong in this directory, with a directory structure that matches the namespace. One class per file. See PSR-0 for details.","title":"LibreNMS/"},{"location":"Developing/Code-Structure/#html","text":"All legacy web accessible files are located here. New pages should follow the Laravel conventions.","title":"html/"},{"location":"Developing/Code-Structure/#htmlapi_v0php","text":"This is the API routing file which directs users to the correct API function based on the API endpoint call.","title":"html/api_v0.php"},{"location":"Developing/Code-Structure/#htmlindexphp","text":"This is the main file which all links within LibreNMS are parsed through. It loads the majority of the relevant includes needed for the control panel to function. CSS and JS files are also loaded here.","title":"html/index.php"},{"location":"Developing/Code-Structure/#htmlcss","text":"All used CSS files are located here.","title":"html/css/"},{"location":"Developing/Code-Structure/#htmlcsscustom","text":"This is a directory you can put custom css files into that won't interfere with auto updates","title":"html/css/custom/"},{"location":"Developing/Code-Structure/#htmljs","text":"All used JS files are located here.","title":"html/js/"},{"location":"Developing/Code-Structure/#includes","text":"This directory is quite big and contains all the files to make the cli and polling / discovery to work. This code is not currently accessible from Laravel code (intentionally).","title":"includes/"},{"location":"Developing/Code-Structure/#includesdiscovery-includespolling","text":"All the discovery and polling code. The format is usually quite similar between discovery and polling. Both are made up of modules and the files within the relevant directories will match that module. So for instance if you want to update the os detection for a device, you would look in includes/discovery/os/ for a file named after the operating system such as linux: includes/discovery/linux.inc.php . Within here you would update or add support for newer OS'. This is the same for polling as well.","title":"includes/discovery/, includes/polling/"},{"location":"Developing/Code-Structure/#includeshtml","text":"This is where the majority of the website core files are located. These tend to be files that contain functions or often used code segments that can be included where needed rather than duplicating code.","title":"includes/html/"},{"location":"Developing/Code-Structure/#includeshtmlforms","text":"This directory contains all of the files that are dynamically included from an ajax call to ajax/form.","title":"includes/html/forms/"},{"location":"Developing/Code-Structure/#includeshtmlapi_functionsincphp","text":"All of the functions and calls for the API are located here.","title":"includes/html/api_functions.inc.php"},{"location":"Developing/Code-Structure/#includeshtmlfunctionsincphp","text":"This contains the majority of functions used throughout the standard web ui.","title":"includes/html/functions.inc.php"},{"location":"Developing/Code-Structure/#includeshtmlgraphs","text":"This directory contains global and OS specific graph definitions.","title":"includes/html/graphs/"},{"location":"Developing/Code-Structure/#includeshtmlreports","text":"In here is a list of of files that generate PDF reports available to the user. These are dynamically called in from html/pdf.php based on the report the user requests.","title":"includes/html/reports/"},{"location":"Developing/Code-Structure/#includeshtmltable","text":"This directory contains all of the ajax calls when generating the table of data. Most have been converted over so if you are planning to add a new table of data then you will do so here for all of the back end data calls.","title":"includes/html/table/"},{"location":"Developing/Code-Structure/#includeshtmlpages","text":"This directory contains the URL structure when browsing the Web UI. So for example /devices/ is actually a call to includes/html/pages/devices.inc.php , /device/tab=ports/ is includes/html/pages/device/ports.inc.php .","title":"includes/html/pages/"},{"location":"Developing/Code-Structure/#logs","text":"Contains the main librenms.log file by default, but can also contain your web server's logs, poller logs, and other items.","title":"logs/"},{"location":"Developing/Code-Structure/#mibs","text":"Here is where all of the mibs are located. Generally standard mibs should be in the root directory and specific vendor mibs should be in their own subdirectory.","title":"mibs/"},{"location":"Developing/Code-Structure/#rrd","text":"Simple enough, this is where all of the rrd files are created. They are stored in directory based on the device hostname.","title":"rrd/"},{"location":"Developing/Code-Structure/#databasemigrations","text":"Contains all the database migrations. See Laravel docs for additional info: https://laravel.com/docs/migrations In general to create a new table you should run: php artisan make:model ModelName -m -c -r","title":"database/migrations"},{"location":"Developing/Creating-Documentation/","text":"Creating Documentation One of the goals of the LibreNMS project is to enable users to get all of the help they need from our documentation. The documentation uses the markdown markup language and is generated with mkdocs . To edit or create markdown you only need a text editor, but it is recommended to build your docs before submitting, in order to check them visually. The section on this page has instructions for this step. Writing docs When you are adding a new feature or extension, we need to have full documentation to go along with it. It's quite simple to do this: Find the relevant directory to store your new document in, General, Support and Extensions are the most likely choices. Think of a descriptive name that's not too long, it should match what they may be looking for or describes the feature. Add the new document into the nav section of mkdocs.yml if it needs to appear in the table of contents Ensure the first line contains: source: path/to/file.md - don't include the initial doc/ . In the body of the document, be descriptive but keep things simple. Some tips: If the document could cover different distros like CentOS and Ubuntu please try and include the information for them all. If that's not possible then at least put a placeholder in asking for contributions. Ensure you use the correct formatting for commands and code blocks by wrapping one liners in backticks or blocks in ```. Put content into sub-headings where possible to organise the content. If you rename a file, please add a redirect for the old file in mkdocs.yml like so: - redirects : redirect_maps : 'old/page.md' : 'new/page.md' Please ensure you add the document to the relevant section within pages of mkdocs.yml so that it's in the correct menu and is built. Forgetting this step will result in your document never seeing the light of day :) Formatting docs Our docs are based on Markdown using mkdocs which adheres to markdown specs and nothing more, because of that we also import a couple of extra libraries: pymdownx.tasklist pymdownx.tilde This means you can use: ~~strikethrough~~ to perform strikethrough - [X] List items Url's can be made [like this](https://www.librenms.org) like this Code can be placed in `` for single line or ``` for multiline. # Can be used for main headings which translates to a

            tag, increasing the # 's will increase the hX tags. ### Can be used for sub-headings which will appear in the TOC to the left. Settings should be prefixed with !!! setting \"\" Markdown CheatSheet Link Building docs This is achieved with mkdocs , a python package. Install the required packages. pip install mkdocs mkdocs-exclude mkdocs-material mkdocs-macros-plugin mkdocs-minify-plugin mkdocs-redirects If you encounter permissions issues, these might be reoslved by using the user option, with whatever user you are building as, e.g. -u librenms A configuration file for building LibreNMS docs is already included in the distribution: /opt/librenms/mkdocs.yml . The various configuration directives are documented here . Build from the librenms base directory: cd /opt/librenms . Building is simple: mkdocs build This will output all the documentation in html format to /opt/librenms/out (this folder will be ignored from any commits). Viewing docs mkdocs includes it's own light-weight webserver for this purpose. Viewing is as simple as running the following command: $ mkdocs serve INFO - Building documentation... <..> INFO - Documentation built in 12.54 seconds <..> INFO - Serving on http://127.0.0.1:8000 <..> INFO - Start watching changes Now you will find the complete set of LibreNMS documentation by opening your browser to localhost:8000 . Note it is not necessary to build before viewing as the serve command will do this for you. Also the server will update the documents it is serving whenever changes to the markdown are made, such as in another terminal. Viewing docs from another machine By default the server will only listen for connections from the local machine. If you are building on a different machine you can use the following directive to listen on all interfaces: mkdocs serve --dev-addr=0.0.0.0:8000 WARNING: this is not a secure webserver, do this at your own risk, with appropriate host security and do not leave the server running.","title":"Creating Documentation"},{"location":"Developing/Creating-Documentation/#creating-documentation","text":"One of the goals of the LibreNMS project is to enable users to get all of the help they need from our documentation. The documentation uses the markdown markup language and is generated with mkdocs . To edit or create markdown you only need a text editor, but it is recommended to build your docs before submitting, in order to check them visually. The section on this page has instructions for this step.","title":"Creating Documentation"},{"location":"Developing/Creating-Documentation/#writing-docs","text":"When you are adding a new feature or extension, we need to have full documentation to go along with it. It's quite simple to do this: Find the relevant directory to store your new document in, General, Support and Extensions are the most likely choices. Think of a descriptive name that's not too long, it should match what they may be looking for or describes the feature. Add the new document into the nav section of mkdocs.yml if it needs to appear in the table of contents Ensure the first line contains: source: path/to/file.md - don't include the initial doc/ . In the body of the document, be descriptive but keep things simple. Some tips: If the document could cover different distros like CentOS and Ubuntu please try and include the information for them all. If that's not possible then at least put a placeholder in asking for contributions. Ensure you use the correct formatting for commands and code blocks by wrapping one liners in backticks or blocks in ```. Put content into sub-headings where possible to organise the content. If you rename a file, please add a redirect for the old file in mkdocs.yml like so: - redirects : redirect_maps : 'old/page.md' : 'new/page.md' Please ensure you add the document to the relevant section within pages of mkdocs.yml so that it's in the correct menu and is built. Forgetting this step will result in your document never seeing the light of day :)","title":"Writing docs"},{"location":"Developing/Creating-Documentation/#formatting-docs","text":"Our docs are based on Markdown using mkdocs which adheres to markdown specs and nothing more, because of that we also import a couple of extra libraries: pymdownx.tasklist pymdownx.tilde This means you can use: ~~strikethrough~~ to perform strikethrough - [X] List items Url's can be made [like this](https://www.librenms.org) like this Code can be placed in `` for single line or ``` for multiline. # Can be used for main headings which translates to a

            tag, increasing the # 's will increase the hX tags. ### Can be used for sub-headings which will appear in the TOC to the left. Settings should be prefixed with !!! setting \"\" Markdown CheatSheet Link","title":"Formatting docs"},{"location":"Developing/Creating-Documentation/#building-docs","text":"This is achieved with mkdocs , a python package. Install the required packages. pip install mkdocs mkdocs-exclude mkdocs-material mkdocs-macros-plugin mkdocs-minify-plugin mkdocs-redirects If you encounter permissions issues, these might be reoslved by using the user option, with whatever user you are building as, e.g. -u librenms A configuration file for building LibreNMS docs is already included in the distribution: /opt/librenms/mkdocs.yml . The various configuration directives are documented here . Build from the librenms base directory: cd /opt/librenms . Building is simple: mkdocs build This will output all the documentation in html format to /opt/librenms/out (this folder will be ignored from any commits).","title":"Building docs"},{"location":"Developing/Creating-Documentation/#viewing-docs","text":"mkdocs includes it's own light-weight webserver for this purpose. Viewing is as simple as running the following command: $ mkdocs serve INFO - Building documentation... <..> INFO - Documentation built in 12.54 seconds <..> INFO - Serving on http://127.0.0.1:8000 <..> INFO - Start watching changes Now you will find the complete set of LibreNMS documentation by opening your browser to localhost:8000 . Note it is not necessary to build before viewing as the serve command will do this for you. Also the server will update the documents it is serving whenever changes to the markdown are made, such as in another terminal.","title":"Viewing docs"},{"location":"Developing/Creating-Documentation/#viewing-docs-from-another-machine","text":"By default the server will only listen for connections from the local machine. If you are building on a different machine you can use the following directive to listen on all interfaces: mkdocs serve --dev-addr=0.0.0.0:8000 WARNING: this is not a secure webserver, do this at your own risk, with appropriate host security and do not leave the server running.","title":"Viewing docs from another machine"},{"location":"Developing/Creating-Release/","text":"Creating a release GitHub You can create a new release on GitHub . Enter the tag version that month, i.e for September 2016 you would enter 201609 . Enter a title, we usually use August 2016 Release Enter a placeholder for the body, we will edit this later. Create changelog For this, we assume you are using the master branch to create the release against. We now generate the changelog using the GitHub API itself so it shouldn't matter what state your local branch is in so long as it has the code to generate the changelog itself. Using the GitHub API means we can use the labels associated with merged pull requests to categorise the changelog. We also then record who made the pull request to thank them in the changelog itself. You will be asked for a GitHub personal access token. You can generate this here . No permissions should be needed so just give it a name and click Generate Token . You can then export the token as an environment variable GH_TOKEN or place it in your .env file. The basic command to run is by using artisan . Here you pass new tag (1.41) and previous tag (1.40). For further help run php artisan release:tag --help . This will generate a changelog up to the latest master branch, if you want it to be done against something else then pass the latest pull request number with --pr $PR_NUMBER . php artisan release:tag 1 .41 1 .40 Now commit and push the change that has been made to doc/General/Changelog.md . Once the pull request has been merged in for the Changelog, you can create a new release on GitHub . Create two threads on the community site: A changelog thread example An info thread example Tweet it Facebook it Google Plus it LinkedIn it","title":"Creating Release"},{"location":"Developing/Creating-Release/#creating-a-release","text":"","title":"Creating a release"},{"location":"Developing/Creating-Release/#github","text":"You can create a new release on GitHub . Enter the tag version that month, i.e for September 2016 you would enter 201609 . Enter a title, we usually use August 2016 Release Enter a placeholder for the body, we will edit this later.","title":"GitHub"},{"location":"Developing/Creating-Release/#create-changelog","text":"For this, we assume you are using the master branch to create the release against. We now generate the changelog using the GitHub API itself so it shouldn't matter what state your local branch is in so long as it has the code to generate the changelog itself. Using the GitHub API means we can use the labels associated with merged pull requests to categorise the changelog. We also then record who made the pull request to thank them in the changelog itself. You will be asked for a GitHub personal access token. You can generate this here . No permissions should be needed so just give it a name and click Generate Token . You can then export the token as an environment variable GH_TOKEN or place it in your .env file. The basic command to run is by using artisan . Here you pass new tag (1.41) and previous tag (1.40). For further help run php artisan release:tag --help . This will generate a changelog up to the latest master branch, if you want it to be done against something else then pass the latest pull request number with --pr $PR_NUMBER . php artisan release:tag 1 .41 1 .40 Now commit and push the change that has been made to doc/General/Changelog.md . Once the pull request has been merged in for the Changelog, you can create a new release on GitHub . Create two threads on the community site: A changelog thread example An info thread example Tweet it Facebook it Google Plus it LinkedIn it","title":"Create changelog"},{"location":"Developing/Dynamic-Config/","text":"Adding new config settings Adding support for users to update a new config option via the WebUI is now a lot easier for general options. This document shows you how to add a new config option and even section to the WebUI. Config settings are defined in misc/config_definitions.json You should give a little thought to the name of your config setting. For example: a good setting for snmp community, would be snmp.community . The dot notation is path and when the config is hydrated, it is converted to a nested array. If the user is overriding the option in config.php it would use the format $config['snmp']['community'] Translation The config definition system inherently supports translation. You must add the English names in the resoures/lang/en/settings.php file (and other languages if you can). To update the javascript translation files, run: ./lnms translation:generate Definition Format For snmp.community, this is the definition: \"snmp.community\" : { \"group\" : \"poller\" , \"section\" : \"snmp\" , \"order\" : 2 , \"type\" : \"array\" , \"default\" : [ \"public\" ] } Fields All fields are optional. To show in the web ui, group and section are required, order is recommended. type : Defines the type, there are a few predefined types and custom types can be defined and implemented in a vue.js component default : the default value for this setting options : the options for the select type. An object with {\"value1\": \"display string\", \"value2\": \"display string\"} validate : Defines more complex validation than the default simple type check. Uses Laravel validation syntax. group : The web ui tab this is under section : A panel grouping settings in the web ui order : The order to display this setting within the section Predefined Types string : A string integer : A number boolean : A simple toggle switch array : A list of values that can be added, removed, and re-ordered. select : A dropdown box with predefined options. Requires the option field. email : Will validate the input is the correct format for an email password : Will mask the value of the input (but does not keep it fully private) Custom Types You may set the type field to a custom type and define a Vue.js component to display it to the user. The Vue.js component should be named as \"SettingType\" where type is the custom type entered with the first letter capitalized. Vue.js components exist in the resources/js/components directory. Here is an empty component named SettingType (make sure to rename it). It pulls in BaseSetting mixin for basic setting code to reuse. You should review the BaseSetting component. Using Vue.js is beyond the scope of this document. Documentation can be found at vuejs.org .","title":"Dynamic Config"},{"location":"Developing/Dynamic-Config/#adding-new-config-settings","text":"Adding support for users to update a new config option via the WebUI is now a lot easier for general options. This document shows you how to add a new config option and even section to the WebUI. Config settings are defined in misc/config_definitions.json You should give a little thought to the name of your config setting. For example: a good setting for snmp community, would be snmp.community . The dot notation is path and when the config is hydrated, it is converted to a nested array. If the user is overriding the option in config.php it would use the format $config['snmp']['community']","title":"Adding new config settings"},{"location":"Developing/Dynamic-Config/#translation","text":"The config definition system inherently supports translation. You must add the English names in the resoures/lang/en/settings.php file (and other languages if you can). To update the javascript translation files, run: ./lnms translation:generate","title":"Translation"},{"location":"Developing/Dynamic-Config/#definition-format","text":"For snmp.community, this is the definition: \"snmp.community\" : { \"group\" : \"poller\" , \"section\" : \"snmp\" , \"order\" : 2 , \"type\" : \"array\" , \"default\" : [ \"public\" ] }","title":"Definition Format"},{"location":"Developing/Dynamic-Config/#fields","text":"All fields are optional. To show in the web ui, group and section are required, order is recommended. type : Defines the type, there are a few predefined types and custom types can be defined and implemented in a vue.js component default : the default value for this setting options : the options for the select type. An object with {\"value1\": \"display string\", \"value2\": \"display string\"} validate : Defines more complex validation than the default simple type check. Uses Laravel validation syntax. group : The web ui tab this is under section : A panel grouping settings in the web ui order : The order to display this setting within the section","title":"Fields"},{"location":"Developing/Dynamic-Config/#predefined-types","text":"string : A string integer : A number boolean : A simple toggle switch array : A list of values that can be added, removed, and re-ordered. select : A dropdown box with predefined options. Requires the option field. email : Will validate the input is the correct format for an email password : Will mask the value of the input (but does not keep it fully private)","title":"Predefined Types"},{"location":"Developing/Dynamic-Config/#custom-types","text":"You may set the type field to a custom type and define a Vue.js component to display it to the user. The Vue.js component should be named as \"SettingType\" where type is the custom type entered with the first letter capitalized. Vue.js components exist in the resources/js/components directory. Here is an empty component named SettingType (make sure to rename it). It pulls in BaseSetting mixin for basic setting code to reuse. You should review the BaseSetting component. Using Vue.js is beyond the scope of this document. Documentation can be found at vuejs.org .","title":"Custom Types"},{"location":"Developing/Getting-Started/","text":"Get ready to contribute to LibreNMS This document is intended to help you get your local environment set up to contribute code to the LibreNMS project. Setting up a development environment When starting to develop, it may be tempting to just make changes on your production server, but that will make things harder for you. Taking a little time to set up somewhere to work on code changes can really help. Possible options: A Linux computer, VM, or container Another directory on your LibreNMS server Windows Subsystem for Linux Set up your development git clone Follow the documentation on using git Install development dependencies ./scripts/composer_wrapper.php install Set variables in .env , including database settings. Which could be a local or remote MySQL server including your production DB. APP_ENV=local APP_DEBUG=true ... Start a development webserver ./lnms serve Access the Web UI at http://localhost:8000 Automated testing LibreNMS uses continuous integration to test code changes to help reduce bugs. This also helps guarantee the changes you contribute won't be broken in the future. You can find out more in our Validating Code Documentation The default database connection for automated testing is testing . To override the database parameters for unit tests, configure your .env file accordingly. The defaults (from config/database.php ) are: DB_TEST_DRIVER=\"mysql\" # PDO driver DB_TEST_HOST=\"localhost\" # hostname or IP address DB_TEST_PORT=\"\" # port DB_TEST_DATABASE=\"librenms_phpunit_78hunjuybybh\" # database DB_TEST_USERNAME=\"root\" # username DB_TEST_PASSWORD=\"\" # password DB_TEST_SOCKET=\"\" # unix socket path Polling debug output You can see detailed info by running your polling code in debug mode by adding a -d flag. ./discovery.php -d -h HOSTNAME lnms device:poll HOSTNAME -vv Inspecting variables Sometimes you want to find out what a variable contains (such as the data return from an snmpwalk). You can dump one or more variables and halt execution with the dd() function. dd ( $variable1 , $variable2 ); Inspecting web pages Installing the development dependencies and setting APP_DEBUG enables the Laravel Debugbar This will allow you to inspect page generation and errors right in your web browser. Better code completion in IDEs and editors You can generate some files to improve code completion. (These file are not updated automatically, so you may need to re-run these command periodically) ./lnms ide-helper:generate ./lnms ide-helper:models -N Emulating devices You can capture and emulate devices using Snmpsim . LibreNMS has a set of scripts to make it easier to work with snmprec files. LibreNMS Snmpsim helpers Laravel documentation You can find a lot of how LibreNMS works by following the Laravel Documentation","title":"Getting Started"},{"location":"Developing/Getting-Started/#get-ready-to-contribute-to-librenms","text":"This document is intended to help you get your local environment set up to contribute code to the LibreNMS project.","title":"Get ready to contribute to LibreNMS"},{"location":"Developing/Getting-Started/#setting-up-a-development-environment","text":"When starting to develop, it may be tempting to just make changes on your production server, but that will make things harder for you. Taking a little time to set up somewhere to work on code changes can really help. Possible options: A Linux computer, VM, or container Another directory on your LibreNMS server Windows Subsystem for Linux","title":"Setting up a development environment"},{"location":"Developing/Getting-Started/#set-up-your-development-git-clone","text":"Follow the documentation on using git Install development dependencies ./scripts/composer_wrapper.php install Set variables in .env , including database settings. Which could be a local or remote MySQL server including your production DB. APP_ENV=local APP_DEBUG=true ... Start a development webserver ./lnms serve Access the Web UI at http://localhost:8000","title":"Set up your development git clone"},{"location":"Developing/Getting-Started/#automated-testing","text":"LibreNMS uses continuous integration to test code changes to help reduce bugs. This also helps guarantee the changes you contribute won't be broken in the future. You can find out more in our Validating Code Documentation The default database connection for automated testing is testing . To override the database parameters for unit tests, configure your .env file accordingly. The defaults (from config/database.php ) are: DB_TEST_DRIVER=\"mysql\" # PDO driver DB_TEST_HOST=\"localhost\" # hostname or IP address DB_TEST_PORT=\"\" # port DB_TEST_DATABASE=\"librenms_phpunit_78hunjuybybh\" # database DB_TEST_USERNAME=\"root\" # username DB_TEST_PASSWORD=\"\" # password DB_TEST_SOCKET=\"\" # unix socket path","title":"Automated testing"},{"location":"Developing/Getting-Started/#polling-debug-output","text":"You can see detailed info by running your polling code in debug mode by adding a -d flag. ./discovery.php -d -h HOSTNAME lnms device:poll HOSTNAME -vv","title":"Polling debug output"},{"location":"Developing/Getting-Started/#inspecting-variables","text":"Sometimes you want to find out what a variable contains (such as the data return from an snmpwalk). You can dump one or more variables and halt execution with the dd() function. dd ( $variable1 , $variable2 );","title":"Inspecting variables"},{"location":"Developing/Getting-Started/#inspecting-web-pages","text":"Installing the development dependencies and setting APP_DEBUG enables the Laravel Debugbar This will allow you to inspect page generation and errors right in your web browser.","title":"Inspecting web pages"},{"location":"Developing/Getting-Started/#better-code-completion-in-ides-and-editors","text":"You can generate some files to improve code completion. (These file are not updated automatically, so you may need to re-run these command periodically) ./lnms ide-helper:generate ./lnms ide-helper:models -N","title":"Better code completion in IDEs and editors"},{"location":"Developing/Getting-Started/#emulating-devices","text":"You can capture and emulate devices using Snmpsim . LibreNMS has a set of scripts to make it easier to work with snmprec files. LibreNMS Snmpsim helpers","title":"Emulating devices"},{"location":"Developing/Getting-Started/#laravel-documentation","text":"You can find a lot of how LibreNMS works by following the Laravel Documentation","title":"Laravel documentation"},{"location":"Developing/Merging-Pull-Requests/","text":"Merging Pull Requests GitHub We will now build the monthly change log from our GitHub commits. When merging a commit, please ensure you: Click the Merge pull request button Give the merge a descriptive but short title For the commit message prepend it with one of the following tags for the pull request to appear in the changelog: devices: or newdevice: For new device support. feature: or feat: To indicate this is a new or updated feature webui: or web: To indicate this is an update to the WebUI fix: or bugfix: To show this is a bug fix. refactoring: or refactor: When the changes are refactoring a large portion of code You can reference an issue number with #xyz , i.e #1234 Use the Confirm squash and merge button to merge. Example commits Feature feature: Added new availability map #4401 New device newdevice: Added support for Cisco ASA #4402","title":"Merging Pull Requests"},{"location":"Developing/Merging-Pull-Requests/#merging-pull-requests","text":"","title":"Merging Pull Requests"},{"location":"Developing/Merging-Pull-Requests/#github","text":"We will now build the monthly change log from our GitHub commits. When merging a commit, please ensure you: Click the Merge pull request button Give the merge a descriptive but short title For the commit message prepend it with one of the following tags for the pull request to appear in the changelog: devices: or newdevice: For new device support. feature: or feat: To indicate this is a new or updated feature webui: or web: To indicate this is an update to the WebUI fix: or bugfix: To show this is a bug fix. refactoring: or refactor: When the changes are refactoring a large portion of code You can reference an issue number with #xyz , i.e #1234 Use the Confirm squash and merge button to merge.","title":"GitHub"},{"location":"Developing/Merging-Pull-Requests/#example-commits","text":"","title":"Example commits"},{"location":"Developing/Merging-Pull-Requests/#feature","text":"feature: Added new availability map #4401","title":"Feature"},{"location":"Developing/Merging-Pull-Requests/#new-device","text":"newdevice: Added support for Cisco ASA #4402","title":"New device"},{"location":"Developing/SNMP-Traps/","text":"Creating snmp trap handlers You must have a working snmptrapd. See SNMP TRAP HANDLER Make sure the MIB is loaded from the trap you are adding. Edit /etc/systemd/system/snmptrapd.service.d/mibs.conf to add it then restart snmptrapd. MIBDIRS option is not recursive, so you need to specify each directory individually. Create a new class in LibreNMS\\Snmptrap\\Handlers that implements the LibreNMS\\Interfaces\\SnmptrapHandler interface. For example: . * * @package LibreNMS * @link https://www.librenms.org */ namespace LibreNMS\\Snmptrap\\Handlers ; use App\\Models\\Device ; use LibreNMS\\Enum\\Severity ; use LibreNMS\\Interfaces\\SnmptrapHandler ; use LibreNMS\\Snmptrap\\Trap ; class ColdBoot implements SnmptrapHandler { /** * Handle snmptrap. * Data is pre-parsed and delivered as a Trap. * * @param Device $device * @param Trap $trap * @return void */ public function handle ( Device $device , Trap $trap ) { $trap -> log ( 'SNMP Trap: Device ' . $device -> displayName () . ' cold booted' , $device -> device_id , 'reboot' , Severity :: Warning ); } } where number on the end means color of the eventlog: Severity::Ok = green Severity::Info = cyan Severity::Notice = blue Severity::Warning = yellow Severity::Error = red Register the mapping in the config/snmptraps.php file. Make sure to use the full trap OID and correct class. 'SNMPv2-MIB::coldStart' => \\LibreNMS\\Snmptrap\\Handlers\\ColdBoot :: class , The handle function inside your new class will receive a LibreNMS/Snmptrap/Trap object containing the parsed trap. It is common to update the database and create event log entries within the handle function. Getting information from the Trap Source information $trap -> getDevice (); // gets Device model for the device associated with this trap $trap -> ip ; // gets source IP of this trap $trap -> getTrapOid (); // returns the string you registered your class with Retrieving data from the Trap $trap -> getOidData ( 'IF-MIB::ifDescr.114' ); getOidData() requires the full name including any additional index. You can use these functions to search the OID keys. $trap -> findOid ( 'ifDescr' ); // returns the first oid key that contains the string $trap -> findOids ( 'ifDescr' ); // returns all oid keys containing the string Advanced If the above isn't adequate, you can get the entire trap text: $trap -> raw ; Tests Submitting new traps requires them to be fully tested. You can find many examples in the tests/Feature/SnmpTraps/ directory. Here is a basic example of a test that trap handler only creates a log message. If your trap modifies the database, you should also test that it does so. assertTrapLogsMessage ( rawTrap : <<< 'TRAP' {{ hostname }} UDP : [{{ ip }}] : 44298 -> [ 192.168 . 5.5 ] : 162 DISMAN - EVENT - MIB :: sysUpTimeInstance 0 : 0 : 1 : 12.7 SNMPv2 - MIB :: snmpTrapOID . 0 SNMPv2 - MIB :: coldStart TRAP , log : 'SNMP Trap: Device {{ hostname }} cold booted' , // The log message sent failureMessage : 'Failed to handle SNMPv2-MIB::coldStart' , // an informative message to let user know what failed args : [ 4 , 'reboot' ], // the additional arguments to the log method ); } }","title":"SNMP Traps"},{"location":"Developing/SNMP-Traps/#creating-snmp-trap-handlers","text":"You must have a working snmptrapd. See SNMP TRAP HANDLER Make sure the MIB is loaded from the trap you are adding. Edit /etc/systemd/system/snmptrapd.service.d/mibs.conf to add it then restart snmptrapd. MIBDIRS option is not recursive, so you need to specify each directory individually. Create a new class in LibreNMS\\Snmptrap\\Handlers that implements the LibreNMS\\Interfaces\\SnmptrapHandler interface. For example: . * * @package LibreNMS * @link https://www.librenms.org */ namespace LibreNMS\\Snmptrap\\Handlers ; use App\\Models\\Device ; use LibreNMS\\Enum\\Severity ; use LibreNMS\\Interfaces\\SnmptrapHandler ; use LibreNMS\\Snmptrap\\Trap ; class ColdBoot implements SnmptrapHandler { /** * Handle snmptrap. * Data is pre-parsed and delivered as a Trap. * * @param Device $device * @param Trap $trap * @return void */ public function handle ( Device $device , Trap $trap ) { $trap -> log ( 'SNMP Trap: Device ' . $device -> displayName () . ' cold booted' , $device -> device_id , 'reboot' , Severity :: Warning ); } } where number on the end means color of the eventlog: Severity::Ok = green Severity::Info = cyan Severity::Notice = blue Severity::Warning = yellow Severity::Error = red Register the mapping in the config/snmptraps.php file. Make sure to use the full trap OID and correct class. 'SNMPv2-MIB::coldStart' => \\LibreNMS\\Snmptrap\\Handlers\\ColdBoot :: class , The handle function inside your new class will receive a LibreNMS/Snmptrap/Trap object containing the parsed trap. It is common to update the database and create event log entries within the handle function.","title":"Creating snmp trap handlers"},{"location":"Developing/SNMP-Traps/#getting-information-from-the-trap","text":"","title":"Getting information from the Trap"},{"location":"Developing/SNMP-Traps/#source-information","text":"$trap -> getDevice (); // gets Device model for the device associated with this trap $trap -> ip ; // gets source IP of this trap $trap -> getTrapOid (); // returns the string you registered your class with","title":"Source information"},{"location":"Developing/SNMP-Traps/#retrieving-data-from-the-trap","text":"$trap -> getOidData ( 'IF-MIB::ifDescr.114' ); getOidData() requires the full name including any additional index. You can use these functions to search the OID keys. $trap -> findOid ( 'ifDescr' ); // returns the first oid key that contains the string $trap -> findOids ( 'ifDescr' ); // returns all oid keys containing the string","title":"Retrieving data from the Trap"},{"location":"Developing/SNMP-Traps/#advanced","text":"If the above isn't adequate, you can get the entire trap text: $trap -> raw ;","title":"Advanced"},{"location":"Developing/SNMP-Traps/#tests","text":"Submitting new traps requires them to be fully tested. You can find many examples in the tests/Feature/SnmpTraps/ directory. Here is a basic example of a test that trap handler only creates a log message. If your trap modifies the database, you should also test that it does so. assertTrapLogsMessage ( rawTrap : <<< 'TRAP' {{ hostname }} UDP : [{{ ip }}] : 44298 -> [ 192.168 . 5.5 ] : 162 DISMAN - EVENT - MIB :: sysUpTimeInstance 0 : 0 : 1 : 12.7 SNMPv2 - MIB :: snmpTrapOID . 0 SNMPv2 - MIB :: coldStart TRAP , log : 'SNMP Trap: Device {{ hostname }} cold booted' , // The log message sent failureMessage : 'Failed to handle SNMPv2-MIB::coldStart' , // an informative message to let user know what failed args : [ 4 , 'reboot' ], // the additional arguments to the log method ); } }","title":"Tests"},{"location":"Developing/Sensor-State-Support/","text":"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 are 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 For YAML based state discovery: mib : NETBOTZV2-MIB modules : sensors : state : data : - oid : dryContactSensorTable value : dryContactSensorValue num_oid : '.1.3.6.1.4.1.5528.100.4.2.1.1.2.{{ $index }}' descr : dryContactSensorLabel group : Contact Sensors index : 'dryContactSensor.{{ $index }}' state_name : dryContactSensor states : - { value : -1 , generic : 3 , graph : 0 , descr : 'null' } - { value : 0 , generic : 0 , graph : 0 , descr : open } - { value : 1 , generic : 2 , graph : 0 , descr : closed } - oid : doorSwitchSensorTable value : doorSwitchSensorValue num_oid : '.1.3.6.1.4.1.5528.100.4.2.2.1.2.{{ $index }}' descr : doorSwitchSensorLabel group : Switch Sensors index : 'doorSwitchSensor.{{ $index }}' state_name : doorSwitchSensor states : - { value : -1 , generic : 3 , graph : 0 , descr : 'null' } - { value : 0 , generic : 0 , graph : 0 , descr : open } - { value : 1 , generic : 2 , graph : 0 , descr : closed } - oid : cameraMotionSensorTable value : cameraMotionSensorValue num_oid : '.1.3.6.1.4.1.5528.100.4.2.3.1.2.{{ $index }}' descr : cameraMotionSensorLabel group : Camera Motion Sensors index : 'cameraMotionSensor.{{ $index }}' state_name : cameraMotionSensor states : - { value : -1 , generic : 3 , graph : 0 , descr : 'null' } - { value : 0 , generic : 0 , graph : 0 , descr : noMotion } - { value : 1 , generic : 2 , graph : 0 , descr : motionDetected } - oid : otherStateSensorTable value : otherStateSensorErrorStatus num_oid : '.1.3.6.1.4.1.5528.100.4.2.10.1.3.{{ $index }}' descr : otherStateSensorLabel index : '{{ $index }}' state_name : otherStateSensorErrorStatus states : - { value : 0 , generic : 0 , graph : 0 , descr : normal } - { value : 1 , generic : 1 , graph : 0 , descr : info } - { value : 2 , generic : 1 , graph : 0 , descr : warning } - { value : 3 , generic : 2 , graph : 0 , descr : error } - { value : 4 , generic : 2 , graph : 0 , descr : critical } - { value : 5 , generic : 2 , graph : 0 , descr : failure } Advanced Example For advanced state discovery: This example will be based on a Cisco power supply sensor and is all it takes to have sensor state support for Cisco power supplies in Cisco switches. The file should be located in /includes/discovery/sensors/state/cisco.inc.php. 1 , 'generic' => 0 , 'graph' => 0 , 'descr' => 'normal' ], [ 'value' => 2 , 'generic' => 1 , 'graph' => 0 , 'descr' => 'warning' ], [ 'value' => 3 , 'generic' => 2 , 'graph' => 0 , 'descr' => 'critical' ], [ 'value' => 4 , 'generic' => 3 , 'graph' => 0 , 'descr' => 'shutdown' ], [ 'value' => 5 , 'generic' => 3 , 'graph' => 0 , 'descr' => 'notPresent' ], [ 'value' => 6 , 'generic' => 2 , 'graph' => 0 , 'descr' => 'notFunctioning' ], ]; create_state_index ( $state_name , $states ); $num_oid = '.1.3.6.1.4.1.9.9.13.1.5.1.3.' ; foreach ( $oids as $index => $entry ) { //Discover Sensors discover_sensor ( $valid [ 'sensor' ], 'state' , $device , $num_oid . $index , $index , $state_name , $entry [ 'ciscoEnvMonSupplyStatusDescr' ], '1' , '1' , null , null , null , null , $entry [ 'ciscoEnvMonSupplyState' ], 'snmp' , $index ); //Create Sensor To State Index create_sensor_to_state_index ( $device , $state_name , $index ); } }","title":"Sensor State Support"},{"location":"Developing/Sensor-State-Support/#sensor-state-support","text":"","title":"Sensor State Support"},{"location":"Developing/Sensor-State-Support/#introduction","text":"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.","title":"Introduction"},{"location":"Developing/Sensor-State-Support/#logic","text":"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.","title":"Logic"},{"location":"Developing/Sensor-State-Support/#sensors","text":"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.","title":"Sensors"},{"location":"Developing/Sensor-State-Support/#state_indexes","text":"Is where we keep track of which state sensors we monitor.","title":"state_indexes"},{"location":"Developing/Sensor-State-Support/#state_translations","text":"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 are derived from Nagios: 0 = OK 1 = Warning 2 = Critical 3 = Unknown","title":"state_translations"},{"location":"Developing/Sensor-State-Support/#sensors_to_state_indexes","text":"Is as you might have guessed, where the sensor_id is mapped to a state_index_id.","title":"sensors_to_state_indexes"},{"location":"Developing/Sensor-State-Support/#example","text":"For YAML based state discovery: mib : NETBOTZV2-MIB modules : sensors : state : data : - oid : dryContactSensorTable value : dryContactSensorValue num_oid : '.1.3.6.1.4.1.5528.100.4.2.1.1.2.{{ $index }}' descr : dryContactSensorLabel group : Contact Sensors index : 'dryContactSensor.{{ $index }}' state_name : dryContactSensor states : - { value : -1 , generic : 3 , graph : 0 , descr : 'null' } - { value : 0 , generic : 0 , graph : 0 , descr : open } - { value : 1 , generic : 2 , graph : 0 , descr : closed } - oid : doorSwitchSensorTable value : doorSwitchSensorValue num_oid : '.1.3.6.1.4.1.5528.100.4.2.2.1.2.{{ $index }}' descr : doorSwitchSensorLabel group : Switch Sensors index : 'doorSwitchSensor.{{ $index }}' state_name : doorSwitchSensor states : - { value : -1 , generic : 3 , graph : 0 , descr : 'null' } - { value : 0 , generic : 0 , graph : 0 , descr : open } - { value : 1 , generic : 2 , graph : 0 , descr : closed } - oid : cameraMotionSensorTable value : cameraMotionSensorValue num_oid : '.1.3.6.1.4.1.5528.100.4.2.3.1.2.{{ $index }}' descr : cameraMotionSensorLabel group : Camera Motion Sensors index : 'cameraMotionSensor.{{ $index }}' state_name : cameraMotionSensor states : - { value : -1 , generic : 3 , graph : 0 , descr : 'null' } - { value : 0 , generic : 0 , graph : 0 , descr : noMotion } - { value : 1 , generic : 2 , graph : 0 , descr : motionDetected } - oid : otherStateSensorTable value : otherStateSensorErrorStatus num_oid : '.1.3.6.1.4.1.5528.100.4.2.10.1.3.{{ $index }}' descr : otherStateSensorLabel index : '{{ $index }}' state_name : otherStateSensorErrorStatus states : - { value : 0 , generic : 0 , graph : 0 , descr : normal } - { value : 1 , generic : 1 , graph : 0 , descr : info } - { value : 2 , generic : 1 , graph : 0 , descr : warning } - { value : 3 , generic : 2 , graph : 0 , descr : error } - { value : 4 , generic : 2 , graph : 0 , descr : critical } - { value : 5 , generic : 2 , graph : 0 , descr : failure }","title":"Example"},{"location":"Developing/Sensor-State-Support/#advanced-example","text":"For advanced state discovery: This example will be based on a Cisco power supply sensor and is all it takes to have sensor state support for Cisco power supplies in Cisco switches. The file should be located in /includes/discovery/sensors/state/cisco.inc.php. 1 , 'generic' => 0 , 'graph' => 0 , 'descr' => 'normal' ], [ 'value' => 2 , 'generic' => 1 , 'graph' => 0 , 'descr' => 'warning' ], [ 'value' => 3 , 'generic' => 2 , 'graph' => 0 , 'descr' => 'critical' ], [ 'value' => 4 , 'generic' => 3 , 'graph' => 0 , 'descr' => 'shutdown' ], [ 'value' => 5 , 'generic' => 3 , 'graph' => 0 , 'descr' => 'notPresent' ], [ 'value' => 6 , 'generic' => 2 , 'graph' => 0 , 'descr' => 'notFunctioning' ], ]; create_state_index ( $state_name , $states ); $num_oid = '.1.3.6.1.4.1.9.9.13.1.5.1.3.' ; foreach ( $oids as $index => $entry ) { //Discover Sensors discover_sensor ( $valid [ 'sensor' ], 'state' , $device , $num_oid . $index , $index , $state_name , $entry [ 'ciscoEnvMonSupplyStatusDescr' ], '1' , '1' , null , null , null , null , $entry [ 'ciscoEnvMonSupplyState' ], 'snmp' , $index ); //Create Sensor To State Index create_sensor_to_state_index ( $device , $state_name , $index ); } }","title":"Advanced Example"},{"location":"Developing/Support-New-OS/","text":"This document is broken down into the relevant sections depending on what support you are adding. During all of these examples we will be using the OS of pulse as the example OS we will add. Adding the initial detection. Adding Memory and CPU information. Adding Health / Sensor information. Adding Wireless Sensor information. Adding custom graphs. Adding Unit tests (required). Optional Settings We currently have a script in pre-beta stages that can help speed up the process of deploying a new OS. It has support for add sensors in a basic form (except state sensors). In this example, we will add a new OS called test-os using the device ID 101 that has already been added. It will be of the type network and belongs to the vendor, Cisco: ./scripts/new-os.php -h 101 -o test-os -t network -v cisco The process will then step you through the process with some more questions. Please be warned, this is currently pre-beta and may cause some issues. Please let us know of any on Discord .","title":"Intro"},{"location":"Developing/Using-Git/","text":"Git can have a bit of a steep learning curve, stick with it as it is worth learning the basics 2 at least. If you want to help develop LibreNMS and haven't really used Git before then this quick primer will help you get started. Some assumptions: Work is being done on a Linux box. LibreNMS is to be installed in /opt/librenms You have git installed. You have a GitHub Account . You are using ssh to connect to GitHub (If not, replace git@github.com:/yourusername/librenms.git with https://github.com/yourusername/librenms.git . Replace yourusername with your GitHub username. Fork LibreNMS repo You do this directly within GitHub , click the 'Fork' button near the top right. If you are associated with multiple organisations within GitHub then you might need to select which account you want to push the fork to. Prepare your git environment These are the defaults that are recommended. git config branch.autosetupmerge true git config --global user.name \"John Doe\" git config --global user.email johndoe@example.com Clone the repo Ok so now that you have forked the repo, you now need to clone it to your local install where you can then make the changes you need and submit them back. cd /opt/ git clone git@github.com:/yourusername/librenms.git Add Upstream repo To be able to pull in changes from the master LibreNMS repo you need to have it setup on your system. git remote add upstream https://github.com/librenms/librenms.git Now you have two configured remotes: origin: This is your repository, you can push and pull changes here. upstream: This is the main LibreNMS repository and you can only pull changes. Workflow guide As you become more familiar you may find a better workflow that fits your needs, until then this should be a safe workflow for you to follow. Before you start work on a new branch / feature. Make sure you are up to date. cd /opt/librenms git checkout master git pull upstream master git push origin master At this stage it's worth pointing out that we have some standard checks that are performed when you submit a pull request, you can run these checks yourself to be sure no issues are present in your pull request. Now, create a new branch to do you work on. It's important that you do this as you are then able to work on more than one feature at a time and submit them as pull requests individually. If you did all your work in the master branch then it gets a bit messy! You need to give your branch a name. If an issue is open (or closed on GitHub) then you can use that, in this example if the issue number is 123 then we will use issue-123. If a post exists on the community forum then you can use the post id like community-123. You're also welcome to use any arbitrary name for your branch but try and make it relevant to what the branch is. git checkout -b issue-123 Now, code away. Make the changes you need, test, change and test again :) When you are ready to submit the updates as a pull request then commit away. git add path/to/new/files/or/folders git commit -a -m 'Added feature to do X, Y and Z' git push origin issue-123 If you need to rebase against master then you can do this with: git pull upstream master git push origin issue-123 If after do this you get some merge conflicts then you need to resolve these before carrying on. Please try to squash all commits into one, this isn't essential as we can do this when we merge but it would be helpful to do this before you submit your pull request. Now you will be ready to submit a pull request from within GitHub. To do this, go to your GitHub page for the LibreNMS repo. Now select the branch you have just been working on (issue-123) from the drop down to the left and then click 'Pull Request'. Fill in the details to describe the work you have done and click 'Create pull request'. Thanks for your first pull request :) Ok, that should get you started on the contributing path. If you have any other questions then stop by our Discord Server Hints and tips Undo last commit git reset --soft 'HEAD^' Remove specific commit git revert Restore deleted file git checkout $(git rev-list -n 1 HEAD -- \"$file\")^ -- \"$file\" Merge last two commits git rebase --interactive HEAD~2 In the text file that opens, change the last commit to squash from pick then save an exit. For more tips take a look at Oh shit, git!","title":"Using Git"},{"location":"Developing/Using-Git/#fork-librenms-repo","text":"You do this directly within GitHub , click the 'Fork' button near the top right. If you are associated with multiple organisations within GitHub then you might need to select which account you want to push the fork to.","title":"Fork LibreNMS repo"},{"location":"Developing/Using-Git/#prepare-your-git-environment","text":"These are the defaults that are recommended. git config branch.autosetupmerge true git config --global user.name \"John Doe\" git config --global user.email johndoe@example.com","title":"Prepare your git environment"},{"location":"Developing/Using-Git/#clone-the-repo","text":"Ok so now that you have forked the repo, you now need to clone it to your local install where you can then make the changes you need and submit them back. cd /opt/ git clone git@github.com:/yourusername/librenms.git","title":"Clone the repo"},{"location":"Developing/Using-Git/#add-upstream-repo","text":"To be able to pull in changes from the master LibreNMS repo you need to have it setup on your system. git remote add upstream https://github.com/librenms/librenms.git Now you have two configured remotes: origin: This is your repository, you can push and pull changes here. upstream: This is the main LibreNMS repository and you can only pull changes.","title":"Add Upstream repo"},{"location":"Developing/Using-Git/#workflow-guide","text":"As you become more familiar you may find a better workflow that fits your needs, until then this should be a safe workflow for you to follow. Before you start work on a new branch / feature. Make sure you are up to date. cd /opt/librenms git checkout master git pull upstream master git push origin master At this stage it's worth pointing out that we have some standard checks that are performed when you submit a pull request, you can run these checks yourself to be sure no issues are present in your pull request. Now, create a new branch to do you work on. It's important that you do this as you are then able to work on more than one feature at a time and submit them as pull requests individually. If you did all your work in the master branch then it gets a bit messy! You need to give your branch a name. If an issue is open (or closed on GitHub) then you can use that, in this example if the issue number is 123 then we will use issue-123. If a post exists on the community forum then you can use the post id like community-123. You're also welcome to use any arbitrary name for your branch but try and make it relevant to what the branch is. git checkout -b issue-123 Now, code away. Make the changes you need, test, change and test again :) When you are ready to submit the updates as a pull request then commit away. git add path/to/new/files/or/folders git commit -a -m 'Added feature to do X, Y and Z' git push origin issue-123 If you need to rebase against master then you can do this with: git pull upstream master git push origin issue-123 If after do this you get some merge conflicts then you need to resolve these before carrying on. Please try to squash all commits into one, this isn't essential as we can do this when we merge but it would be helpful to do this before you submit your pull request. Now you will be ready to submit a pull request from within GitHub. To do this, go to your GitHub page for the LibreNMS repo. Now select the branch you have just been working on (issue-123) from the drop down to the left and then click 'Pull Request'. Fill in the details to describe the work you have done and click 'Create pull request'. Thanks for your first pull request :) Ok, that should get you started on the contributing path. If you have any other questions then stop by our Discord Server","title":"Workflow guide"},{"location":"Developing/Using-Git/#hints-and-tips","text":"Undo last commit git reset --soft 'HEAD^' Remove specific commit git revert Restore deleted file git checkout $(git rev-list -n 1 HEAD -- \"$file\")^ -- \"$file\" Merge last two commits git rebase --interactive HEAD~2 In the text file that opens, change the last commit to squash from pick then save an exit. For more tips take a look at Oh shit, git!","title":"Hints and tips"},{"location":"Developing/Validating-Code/","text":"Validating Code As part of the pull request process with GitHub we run some automated build tests to ensure that the code is error free, standards compliant and our test suite builds successfully. Rather than submit a pull request and wait for the results, you can run these checks yourself to ensure a more seamless merge. All of these commands should be run from within the librenms directory and can be run as the librenms user unless otherwise noted. Install composer (you can skip this if composer is already installed). curl -sS https://getcomposer.org/installer | php Composer will now be installed into /opt/librenms/composer.phar. Now install the dependencies we require: ./composer.phar install Once composer is installed you can now run the code validation script: ./lnms dev:check If you see Tests ok, submit away :) then all is well. If you see other output then it should contain what you need to resolve the issues and re-test. Git Hooks Git has a hook system which you can use to trigger checks at various stages. Utilising the ./lnms dev:check you can make this part of your commit process. Add ./lnms dev:check to your .git/hooks/pre-commit : echo \"/opt/librenms/lnms dev:check\" >> /opt/librenms/.git/hooks/pre-commit chmod +x /opt/librenms/.git/hooks/pre-commit","title":"Validating Code"},{"location":"Developing/Validating-Code/#validating-code","text":"As part of the pull request process with GitHub we run some automated build tests to ensure that the code is error free, standards compliant and our test suite builds successfully. Rather than submit a pull request and wait for the results, you can run these checks yourself to ensure a more seamless merge. All of these commands should be run from within the librenms directory and can be run as the librenms user unless otherwise noted. Install composer (you can skip this if composer is already installed). curl -sS https://getcomposer.org/installer | php Composer will now be installed into /opt/librenms/composer.phar. Now install the dependencies we require: ./composer.phar install Once composer is installed you can now run the code validation script: ./lnms dev:check If you see Tests ok, submit away :) then all is well. If you see other output then it should contain what you need to resolve the issues and re-test.","title":"Validating Code"},{"location":"Developing/Validating-Code/#git-hooks","text":"Git has a hook system which you can use to trigger checks at various stages. Utilising the ./lnms dev:check you can make this part of your commit process. Add ./lnms dev:check to your .git/hooks/pre-commit : echo \"/opt/librenms/lnms dev:check\" >> /opt/librenms/.git/hooks/pre-commit chmod +x /opt/librenms/.git/hooks/pre-commit","title":"Git Hooks"},{"location":"Developing/os/Custom-Graphs/","text":"First we define our graphs in includes/definitions.inc.php to share our work and contribute in the development of LibreNMS. :-) (or place in config.php if you don't plan to contribute) // Pulse Secure Graphs $config [ 'graph_types' ][ 'device' ][ 'pulse_sessions' ] = [ 'section' => 'firewall' , 'order' => 0 , 'descr' => 'Active Sessions' ]; $config [ 'graph_types' ][ 'device' ][ 'pulse_users' ] = [ 'section' => 'firewall' , 'order' => 0 , 'descr' => 'Active Users' ]; Polling OS OS polling is not necessarily where custom polling should be done, please speak to one of the core devs in Discord for guidance. Let's update our example file to add additional polling: includes/polling/os/pulse.inc.php We declare two specific graphs for users and sessions numbers. Theses two graphs will be displayed on the firewall section of the graphs tab as it was written in the definition include file. addDataset ( 'users' , 'GAUGE' , 0 ); $fields = array ( 'users' => $users , ); $tags = compact ( 'rrd_def' ); data_update ( $device , 'pulse_users' , $tags , $fields ); $os -> enableGraph ( 'pulse_users' ); } $sessions = snmp_get ( $device , 'iveConcurrentUsers.0' , '-OQv' , 'PULSESECURE-PSG-MIB' ); if ( is_numeric ( $sessions )) { $rrd_def = RrdDefinition :: make () -> addDataset ( 'sessions' , 'GAUGE' , 0 ); $fields = array ( 'sessions' => $sessions , ); $tags = compact ( 'rrd_def' ); data_update ( $device , 'pulse_sessions' , $tags , $fields ); $os -> enableGraph ( 'pulse_sessions' ); } Displaying The specific graphs are not displayed automatically so we need to write the following PHP code: Pulse Sessions includes/html/graphs/device/pulse_sessions.inc.php addDataset ( 'users' , 'GAUGE' , 0 ); $fields = array ( 'users' => $users , ); $tags = compact ( 'rrd_def' ); data_update ( $device , 'pulse_users' , $tags , $fields ); $os -> enableGraph ( 'pulse_users' ); } $sessions = snmp_get ( $device , 'iveConcurrentUsers.0' , '-OQv' , 'PULSESECURE-PSG-MIB' ); if ( is_numeric ( $sessions )) { $rrd_def = RrdDefinition :: make () -> addDataset ( 'sessions' , 'GAUGE' , 0 ); $fields = array ( 'sessions' => $sessions , ); $tags = compact ( 'rrd_def' ); data_update ( $device , 'pulse_sessions' , $tags , $fields ); $os -> enableGraph ( 'pulse_sessions' ); }","title":"Polling OS"},{"location":"Developing/os/Custom-Graphs/#displaying","text":"The specific graphs are not displayed automatically so we need to write the following PHP code: Pulse Sessions includes/html/graphs/device/pulse_sessions.inc.php =, <, >, starts, ends, contains, regex, in_array, not_starts, not_ends, not_contains, not_regex, not_in_array, exists Example: skip_values : - oid : sensorName op : 'not_in_array' value : [ 'sensor1' , 'sensor2' ] skip_values : - oid : sensorOptionalOID op : 'exists' value : false temperature : data : - oid : hwOpticalModuleInfoTable value : hwEntityOpticalTemperature descr : '{{ $entPhysicalName }}' index : '{{ $index }}' skip_values : - oid : hwEntityOpticalMode op : '=' value : '1' If you aren't able to use yaml to perform the sensor discovery, you will most likely need to use Advanced health discovery. Advanced health discovery If you can't use the yaml files as above, then you will need to create the discovery code in php. If it is possible to create via yaml, php discovery will likely be rejected due to the much higher chance of later problems, so it is highly suggested to use yaml. The directory structure for sensor information is includes/discovery/sensors/$class/$os.inc.php . The format of all the sensors follows the same code format which is to collect sensor information via SNMP and then call the discover_sensor() function; except state sensors which requires additional code. Sensor information is commonly found in an ENTITY mib supplied by device's vendor in the form of a table. Other mib tables may be used as well. Sensor information is first collected by includes/discovery/sensors/pre_cache/$os.inc.php . This program will pull in data from mib tables into a $pre_cache array that can then be used in includes/discovery/sensors/$class/$os.inc.php to extract specific values which are then passed to discover_sensor() . discover_sensor() Accepts the following arguments: &$valid = This is always $valid['sensor'], do not pass any other values. $class = Required. This is the sensor class from the table above (i.e humidity). $device = Required. This is the $device array. $oid = Required. This must be the numerical OID for where the data can be found, i.e .1.2.3.4.5.6.7.0 $index = Required. This must be unique for this sensor class, device and type. Typically it's the index from the table being walked, or it could be the name of the OID if it's a single value. $type = Required. This should be the OS name, i.e. pulse. $descr = Required. This is a descriptive value for the sensor. Some devices will provide names to use. $divisor = Defaults to 1. This is used to divide the returned value. $multiplier = Defaults to 1. This is used to multiply the returned value. $low_limit = Defaults to null. Sets the low threshold limit for the sensor, used in alerting to report out range sensors. $low_warn_limit = Defaults to null. Sets the low warning limit for the sensor, used in alerting to report near out of range sensors. $warn_limit = Defaults to null. Sets the high warning limit for the sensor, used in alerting to report near out of range sensors. $high_limit = Defaults to null. Sets the high limit for the sensor, used in alerting to report out range sensors. $current = Defaults to null. Can be used to set the current value on discovery. Poller will update this on the next poll cycle anyway. $poller_type = Defaults to snmp. Things like the unix-agent can set different values but for the most part this should be left as snmp. $entPhysicalIndex = Defaults to null. Sets the entPhysicalIndex to be used to look up further hardware if available. $entPhysicalIndex_measured = Defaults to null. Sets the type of entPhysicalIndex used, i.e ports. $user_func = Defaults to null. You can provide a function name for the sensors value to be processed through (i.e. Convert fahrenheit to celsius use fahrenheit_to_celsius ) $group = Defaults to null. Groups sensors together under in the webui, displaying this text. $rrd_type = Default to 'GAUGE'. Allows to change the type of the RRD file created for this sensor. More details can be found here in the RRD documentation: https://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html For the majority of devices, this is all that's required to add support for a sensor. Polling is done based on the data gathered using discover_sensor() . If custom polling is needed then the file format is similar to discovery: includes/polling/sensors/$class/$os.inc.php . Whilst it's possible to perform additional snmp queries within polling this should be avoided where possible. The value for the OID is already available as $sensor_value . Graphing is performed automatically for sensors, no custom graphing is required or supported. Adding a new sensor class You will need to add code for your new sensor class in the following existing files: app/Models/Sensor.php : add a free icon from Font Awesome in the $icons array. doc/Developing/os/Health-Information.md : documentation for every sensor class is mandatory. includes/discovery/sensors.inc.php : add the sensor class to the $run_sensors array. includes/discovery/functions.inc.php : optional - if sensible low_limit and high_limit values are guessable when a SNMP-retrievable threshold is not available, add a case for the sensor class to the sensor_limit() and/or sensor_low_limit() functions. LibreNMS/Util/ObjectCache.php : optional - choose menu grouping for the sensor class. includes/html/pages/device/health.inc.php : add a dbFetchCell(), $datas[], and $type_text[] entry for the sensor class. includes/html/pages/device/overview.inc.php : add require 'overview/sensors/$class.inc.php' in the desired order for the device overview page. includes/html/pages/health.inc.php : add a $type_text[] entry for the sensor class. lang/en/sensors.php : add human-readable names and units for the sensor class in English, feel free to do so for other languages as well. Create and populate new files for the sensor class in the following places: includes/discovery/sensors/$class/ : create the folder where advanced php-based discovery files are stored. Not used for yaml discovery. ======= includes/html/pages/device/health.inc.php : add a dbFetchCell(), $datas[], and $type_text[] entry for the sensor class. includes/html/pages/device/overview.inc.php : add require 'overview/sensors/$class.inc.php' in the desired order for the device overview page. includes/html/pages/health.inc.php : add a $type_text[] entry for the sensor class. lang/en/sensors.php : add human-readable names and units for the sensor class in English, feel free to do so for other languages as well. Create and populate new files for the sensor class in the following places: includes/discovery/sensors/$class/ : create the folder where advanced php-based discovery files are stored. Not used for yaml discovery. includes/html/graphs/device/$class.inc.php : define unit names used in RRDtool graphs. includes/html/graphs/sensor/$class.inc.php : define various parameters for RRDtool graphs. includes/html/pages/device/health/$class.inc.php includes/html/pages/device/overview/sensors/$class.inc.php includes/html/pages/health/$class.inc.php Advanced health sensor example This example shows how to build sensors using the advanced method. In this example we will be collecting optical power level (dBm) from Adva FSP150CC family MetroE devices. This example will assume an understanding of SNMP and MIBs. First we setup includes/discovery/sensors/pre_cache/adva_fsp150.inc as shown below. The first line walks the cmEntityObject table to get information about the chassis and line cards. From this information we extract the model type which will identify which tables in the CM-Facility-Mib the ports are populated in. The program then reads the appropriate table into the $pre_cache array adva_fsp150_ports . This array will have OID indexies for each port, which we will use later to identify our sensor OIDs. $pre_cache['adva_fsp150'] = snmpwalk_cache_multi_oid($device, 'cmEntityObjects', [], 'CM-ENTITY-MIB', null, '-OQUbs'); $neType = $pre_cache['adva_fsp150'][1]['neType']; if ($neType == 'ccxg116pro') { $pre_cache['adva_fsp150_ports'] = snmpwalk_cache_multi_oid($device, 'cmEthernetTrafficPortTable', $pre_cache['adva_fsp150_ports'], 'CM-FACILITY-MIB', null, '-OQUbs'); } else { $pre_cache['adva_fsp150_ports'] = snmpwalk_cache_multi_oid($device, 'cmEthernetNetPortTable', $pre_cache['adva_fsp150_ports'], 'CM-FACILITY-MIB', null, '-OQUbs'); $pre_cache['adva_fsp150_ports'] = snmpwalk_cache_multi_oid($device, 'cmEthernetAccPortTable', $pre_cache['adva_fsp150_ports'], 'CM-FACILITY-MIB', null, '-OQUbs'); } Next we are going to build our sensor discovery code. These are optical readings, so the file will be created as the dBm sensor type in includes/discover/sensors/dbm/adva_fsp150.inc.php . Below is a snippet of the code: foreach ($pre_cache['adva_fsp150_ports'] as $index => $entry) { if ($entry['cmEthernetTrafficPortMediaType'] == 'fiber') { //Discover received power level $oidRx = '.1.3.6.1.4.1.2544.1.12.5.1.21.1.34.' . $index . '.3'; $oidTx = '.1.3.6.1.4.1.2544.1.12.5.1.21.1.33.' . $index . '.3'; $currentRx = snmp_get($device, $oidRx, '-Oqv', 'CM-PERFORMANCE-MIB', '/opt/librenms/mibs/adva'); $currentTx = snmp_get($device, $oidTx, '-Oqv', 'CM-PERFORMANCE-MIB', '/opt/librenms/mibs/adva'); if ($currentRx != 0 || $currentTx != 0) { $entPhysicalIndex = $entry['cmEthernetTrafficPortIfIndex']; $entPhysicalIndex_measured = 'ports'; $descrRx = dbFetchCell('SELECT `ifName` FROM `ports` WHERE `ifIndex`= ? AND `device_id` = ?', [$entry['cmEthernetTrafficPortIfIndex'], $device['device_id']]) . ' Rx Power'; discover_sensor( $valid['sensor'], 'dbm', $device, $oidRx, 'cmEthernetTrafficPortStatsOPR.' . $index, 'adva_fsp150', $descrRx, $divisor, $multiplier, null, null, null, null, $currentRx, 'snmp', $entPhysicalIndex, $entPhysicalIndex_measured ); $descrTx = dbFetchCell('SELECT `ifName` FROM `ports` WHERE `ifIndex`= ? AND `device_id` = ?', [$entry['cmEthernetTrafficPortIfIndex'], $device['device_id']]) . ' Tx Power'; discover_sensor( $valid['sensor'], 'dbm', $device, $oidTx, 'cmEthernetTrafficPortStatsOPT.' . $index, 'adva_fsp150', $descrTx, $divisor, $multiplier, null, null, null, null, $currentTx, 'snmp', $entPhysicalIndex, $entPhysicalIndex_measured ); } } } First the program will loop through each port's index value. In the case of Advas, the ports are names Ethernet 1-1-1-1, 1-1-1-2, etc, and they are indexed as oid.1.1.1.1, oid.1.1.1.2, etc in the mib. Next the program checks which table the port exists in and that the connector type is 'fiber'. There are other port tables in the full code that were ommitted from the example for brevity. Copper media won't have optical readings, so if the media type isn't fiber we skip discovery for that port. The next two lines build the OIDs for getting the optical receive and transmit values using the $index for the port. Using the OIDs the program gets the current receive and transmit values ($currentRx and $currentTx repectively) to verify the values are not 0. Not all SFPs collect digital optical monitoring (DOM) data, in the case of Adva the value of both transmit and recieve will be 0 if DOM is not available. While 0 is a valid value for optical power, its extremely unlikely that both will be 0 if DOM is present. If DOM is not available, then the program stops discovery for that port. Note that while this is the case with Adva, other vendors may differ in how they handle optics that do not supply DOM. Please check your vendor's mibs. Next the program assigns the values of $entPhysicalIndex and $entPhysicalIndex_measured. In this case $entPhysicalIndex is set to the value of the cmEthernetTrafficPortIfIndex so that it is associated with port. This will also allow the sensor graphs to show up on the associated port's page in the GUI in addition to the Health page. Following that the program uses a database call to get the description of the port which will be used as the title for the graph in the GUI. Lastly the program calls discover_sensor() and passes the information collected in the previous steps. The null values are for low, low warning, high, and high warning values, which are not collected in the Adva's MIB. You can manually run discovery to verify the code works by running ./discovery.php -h $device_id -m sensors . You can use -v to see what calls are being used during discovery and -d to see debug output. In the output under #### Load disco module sensors #### you can see a list of sensors types. If there is a + a sensor is added, if there is a - one was deleted, and a . means no change. If there is nothing next to the sensor type then the sensor was not discovered. There is is also information about changes to the database and RRD files at the bottom. [librenms@nms-test ~]$ ./discovery.php -h 2 -m sensors LibreNMS Discovery 164.113.194.250 2 adva_fsp150 #### Load disco module core #### >> Runtime for discovery module 'core': 0.0240 seconds with 66536 bytes >> SNMP: [2/0.06s] MySQL: [3/0.00s] RRD: [0/0.00s] #### Unload disco module core #### #### Load disco module sensors #### Pre-cache adva_fsp150: ENTITY-SENSOR: Caching OIDs: entPhysicalDescr entPhysicalName entPhySensorType entPhySensorScale entPhySensorPrecision entPhySensorValue entPhySensorOperStatus Airflow: Current: . Charge: Dbm: Adva FSP-150 dBm.. Fanspeed: Frequency: Humidity: Load: Power: Power_consumed: Power_factor: Runtime: Signal: State: Count: Temperature: .. Tv_signal: Bitrate: Voltage: . Snr: Pressure: Cooling: Delay: Quality_factor: Chromatic_dispersion: Ber: Eer: Waterflow: Percent: >> Runtime for discovery module 'sensors': 3.9340 seconds with 190024 bytes >> SNMP: [16/3.89s] MySQL: [36/0.03s] RRD: [0/0.00s] #### Unload disco module sensors #### Discovered in 5.521 seconds SNMP [18/3.96s]: Get[8/0.81s] Getnext[0/0.00s] Walk[10/3.15s] MySQL [41/0.03s]: Cell[10/0.01s] Row[-4/-0.00s] Rows[31/0.02s] Column[0/0.00s] Update[2/0.00s] Insert[2/0.00s] Delete[0/0.00s] RRD [0/0.00s]: Update[0/0.00s] Create [0/0.00s] Other[0/0.00s]","title":"Health Information"},{"location":"Developing/os/Health-Information/#sensors","text":"This document will guide you through adding health / sensor information for your new device. Currently, we have support for the following health metrics along with the values we expect to see the data in: Class Measurement airflow cfm ber ratio charge % chromatic_dispersion ps/nm cooling W count # current A dbm dBm delay s eer eer fanspeed rpm frequency Hz humidity % load % loss % power W power_consumed kWh power_factor ratio pressure kPa quality_factor dB runtime Min signal dBm snr SNR state # temperature C tv_signal dBmV bitrate bps voltage V waterflow l/m percent %","title":"Sensors"},{"location":"Developing/os/Health-Information/#simple-health-discovery","text":"We have support for defining health / sensor discovery using YAML files so that you don't need to know how to write PHP. Please note that DISPLAY-HINTS are disabled so ensure you use the correct divisor / multiplier if applicable. All yaml files are located in includes/definitions/discovery/$os.yaml . Defining the information here is not always possible and is heavily reliant on vendors being sensible with the MIBs they generate. Only snmp walks are supported, and you must provide a sane table that can be traversed and contains all the data you need. We will use netbotz as an example here. includes/definitions/discovery/netbotz.yaml mib : NETBOTZV2-MIB modules : sensors : airflow : options : skip_value_lt : 0 data : - oid : airFlowSensorTable value : airFlowSensorValue divisor : 10 num_oid : '.1.3.6.1.4.1.5528.100.4.1.5.1.2.{{ $index }}' descr : '{{ $airFlowSensorLabel }}' index : 'airFlowSensorValue.{{ $index }}' At the top you can define one or more mibs to be used in the lookup of data: mib: NETBOTZV2-MIB For use of multiple MIB files separate them with a colon: mib: NETBOTZV2-MIB:SECOND-MIB For data: you have the following options: The only sensor we have defined here is airflow. The available options are as follows: oid (required): This is the name of the table you want to snmp walk for data. value (optional): This is the key within the table that contains the value. If not provided will use oid num_oid (required for PullRequests): If not provided, this parameter should be computed automatically by discovery process. This parameter is still required to submit a pull request. This is the numerical OID that contains value . This should usually include {{ $index }} . In case the index is a string, {{ $index_string }} can be used instead. divisor (optional): This is the divisor to use against the returned value . multiplier (optional): This is the multiplier to use against the returned value . low_limit (optional): This is the critical low threshold that value should be (used in alerting). If an OID is specified then divisor / multiplier are used. low_warn_limit (optional): This is the warning low threshold that value should be (used in alerting). If an OID is specified then divisor / multiplier are used. warn_limit (optional): This is the warning high threshold that value should be (used in alerting). If an OID is specified then divisor / multiplier are used. high_limit (optional): This is the critical high threshold that value should be (used in alerting). If an OID is specified then divisor / multiplier are used. descr (required): The visible label for this sensor. It can be a key with in the table or a static string, optionally using {{ index }} . group (optional): Groups sensors together under in the webui, displaying this text. Not specifying this will put the sensors in the default group. index (optional): This is the index value we use to uniquely identify this sensor. {{ $index }} will be replaced by the index from the snmp walk. skip_values (optional): This is an array of values we should skip over (see note below). skip_value_lt (optional): If sensor value is less than this, skip the discovery. skip_value_gt (optional): If sensor value is greater than this, skip the discovery. entPhysicalIndex (optional): If the sensor belongs to a physical entity then you can specify the index here. entPhysicalIndex_measured (optional): If the sensor belongs to a physical entity then you can specify the entity type here. user_func (optional): You can provide a function name for the sensors value to be processed through (i.e. Convert fahrenheit to celsius use fahrenheit_to_celsius ) snmp_flags (optional): this sets the flags to be sent to snmpwalk, it overrides flags set on the sensor type and os. The default is '-OQUb' . A common issue is dealing with string indexes, setting '-OQUsbe' will change them to numeric oids. Setting ['-OQUsbe', '-Pu'] will also allow _ in oid names. You can find more in the Man Page rrd_type (optional): You can change the type of the RRD file that will be created to store the data. By default, type GAUGE is used. More details can be found here: https://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html For options: you have the following available: divisor : This is the divisor to use against the returned value . multiplier : This is the multiplier to use against the returned value . skip_values : This is an array of values we should skip over (see note below). skip_value_lt : If sensor value is less than this, skip the discovery. skip_value_gt : If sensor value is greater than this, skip the discovery. Multiple variables can be used in the sensor's definition. The syntax is {{ $variable }} . Any oid in the current table can be used, as well as pre_cached data. The index ($index) and the sub_indexes (in case the oid is indexed multiple times) are also available: if $index=\"1.20\", then $subindex0=\"1\" and $subindex1=\"20\". When referencing an oid in another table the full index will be used to match the other table. If this is undesirable, you may use a single sub index by appending the sub index after a colon to the variable name. Example {{ $ifName:2 }} skip_values can also compare items within the OID table against values. The index of the sensor is used to retrieve the value from the OID, unless a target index is appended to the OID. Additionally, you may check fields from the device. Comparisons behave on a logical OR basis when chained, so only one of them needs to be matched for that particular sensor to be skipped during discovery. An example of this is below: skip_values : - oid : sensUnit op : '!=' value : 4 - oid : sensConfig.0 op : '!=' value : 1 - device : hardware op : 'contains' value : 'rev2' op can be any of the following operators : =, !=, ==, !==, <=, >=, <, >, starts, ends, contains, regex, in_array, not_starts, not_ends, not_contains, not_regex, not_in_array, exists Example: skip_values : - oid : sensorName op : 'not_in_array' value : [ 'sensor1' , 'sensor2' ] skip_values : - oid : sensorOptionalOID op : 'exists' value : false temperature : data : - oid : hwOpticalModuleInfoTable value : hwEntityOpticalTemperature descr : '{{ $entPhysicalName }}' index : '{{ $index }}' skip_values : - oid : hwEntityOpticalMode op : '=' value : '1' If you aren't able to use yaml to perform the sensor discovery, you will most likely need to use Advanced health discovery.","title":"Simple health discovery"},{"location":"Developing/os/Health-Information/#advanced-health-discovery","text":"If you can't use the yaml files as above, then you will need to create the discovery code in php. If it is possible to create via yaml, php discovery will likely be rejected due to the much higher chance of later problems, so it is highly suggested to use yaml. The directory structure for sensor information is includes/discovery/sensors/$class/$os.inc.php . The format of all the sensors follows the same code format which is to collect sensor information via SNMP and then call the discover_sensor() function; except state sensors which requires additional code. Sensor information is commonly found in an ENTITY mib supplied by device's vendor in the form of a table. Other mib tables may be used as well. Sensor information is first collected by includes/discovery/sensors/pre_cache/$os.inc.php . This program will pull in data from mib tables into a $pre_cache array that can then be used in includes/discovery/sensors/$class/$os.inc.php to extract specific values which are then passed to discover_sensor() . discover_sensor() Accepts the following arguments: &$valid = This is always $valid['sensor'], do not pass any other values. $class = Required. This is the sensor class from the table above (i.e humidity). $device = Required. This is the $device array. $oid = Required. This must be the numerical OID for where the data can be found, i.e .1.2.3.4.5.6.7.0 $index = Required. This must be unique for this sensor class, device and type. Typically it's the index from the table being walked, or it could be the name of the OID if it's a single value. $type = Required. This should be the OS name, i.e. pulse. $descr = Required. This is a descriptive value for the sensor. Some devices will provide names to use. $divisor = Defaults to 1. This is used to divide the returned value. $multiplier = Defaults to 1. This is used to multiply the returned value. $low_limit = Defaults to null. Sets the low threshold limit for the sensor, used in alerting to report out range sensors. $low_warn_limit = Defaults to null. Sets the low warning limit for the sensor, used in alerting to report near out of range sensors. $warn_limit = Defaults to null. Sets the high warning limit for the sensor, used in alerting to report near out of range sensors. $high_limit = Defaults to null. Sets the high limit for the sensor, used in alerting to report out range sensors. $current = Defaults to null. Can be used to set the current value on discovery. Poller will update this on the next poll cycle anyway. $poller_type = Defaults to snmp. Things like the unix-agent can set different values but for the most part this should be left as snmp. $entPhysicalIndex = Defaults to null. Sets the entPhysicalIndex to be used to look up further hardware if available. $entPhysicalIndex_measured = Defaults to null. Sets the type of entPhysicalIndex used, i.e ports. $user_func = Defaults to null. You can provide a function name for the sensors value to be processed through (i.e. Convert fahrenheit to celsius use fahrenheit_to_celsius ) $group = Defaults to null. Groups sensors together under in the webui, displaying this text. $rrd_type = Default to 'GAUGE'. Allows to change the type of the RRD file created for this sensor. More details can be found here in the RRD documentation: https://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html For the majority of devices, this is all that's required to add support for a sensor. Polling is done based on the data gathered using discover_sensor() . If custom polling is needed then the file format is similar to discovery: includes/polling/sensors/$class/$os.inc.php . Whilst it's possible to perform additional snmp queries within polling this should be avoided where possible. The value for the OID is already available as $sensor_value . Graphing is performed automatically for sensors, no custom graphing is required or supported.","title":"Advanced health discovery"},{"location":"Developing/os/Health-Information/#adding-a-new-sensor-class","text":"You will need to add code for your new sensor class in the following existing files: app/Models/Sensor.php : add a free icon from Font Awesome in the $icons array. doc/Developing/os/Health-Information.md : documentation for every sensor class is mandatory. includes/discovery/sensors.inc.php : add the sensor class to the $run_sensors array. includes/discovery/functions.inc.php : optional - if sensible low_limit and high_limit values are guessable when a SNMP-retrievable threshold is not available, add a case for the sensor class to the sensor_limit() and/or sensor_low_limit() functions. LibreNMS/Util/ObjectCache.php : optional - choose menu grouping for the sensor class. includes/html/pages/device/health.inc.php : add a dbFetchCell(), $datas[], and $type_text[] entry for the sensor class. includes/html/pages/device/overview.inc.php : add require 'overview/sensors/$class.inc.php' in the desired order for the device overview page. includes/html/pages/health.inc.php : add a $type_text[] entry for the sensor class. lang/en/sensors.php : add human-readable names and units for the sensor class in English, feel free to do so for other languages as well. Create and populate new files for the sensor class in the following places: includes/discovery/sensors/$class/ : create the folder where advanced php-based discovery files are stored. Not used for yaml discovery. ======= includes/html/pages/device/health.inc.php : add a dbFetchCell(), $datas[], and $type_text[] entry for the sensor class. includes/html/pages/device/overview.inc.php : add require 'overview/sensors/$class.inc.php' in the desired order for the device overview page. includes/html/pages/health.inc.php : add a $type_text[] entry for the sensor class. lang/en/sensors.php : add human-readable names and units for the sensor class in English, feel free to do so for other languages as well. Create and populate new files for the sensor class in the following places: includes/discovery/sensors/$class/ : create the folder where advanced php-based discovery files are stored. Not used for yaml discovery. includes/html/graphs/device/$class.inc.php : define unit names used in RRDtool graphs. includes/html/graphs/sensor/$class.inc.php : define various parameters for RRDtool graphs. includes/html/pages/device/health/$class.inc.php includes/html/pages/device/overview/sensors/$class.inc.php includes/html/pages/health/$class.inc.php","title":"Adding a new sensor class"},{"location":"Developing/os/Health-Information/#advanced-health-sensor-example","text":"This example shows how to build sensors using the advanced method. In this example we will be collecting optical power level (dBm) from Adva FSP150CC family MetroE devices. This example will assume an understanding of SNMP and MIBs. First we setup includes/discovery/sensors/pre_cache/adva_fsp150.inc as shown below. The first line walks the cmEntityObject table to get information about the chassis and line cards. From this information we extract the model type which will identify which tables in the CM-Facility-Mib the ports are populated in. The program then reads the appropriate table into the $pre_cache array adva_fsp150_ports . This array will have OID indexies for each port, which we will use later to identify our sensor OIDs. $pre_cache['adva_fsp150'] = snmpwalk_cache_multi_oid($device, 'cmEntityObjects', [], 'CM-ENTITY-MIB', null, '-OQUbs'); $neType = $pre_cache['adva_fsp150'][1]['neType']; if ($neType == 'ccxg116pro') { $pre_cache['adva_fsp150_ports'] = snmpwalk_cache_multi_oid($device, 'cmEthernetTrafficPortTable', $pre_cache['adva_fsp150_ports'], 'CM-FACILITY-MIB', null, '-OQUbs'); } else { $pre_cache['adva_fsp150_ports'] = snmpwalk_cache_multi_oid($device, 'cmEthernetNetPortTable', $pre_cache['adva_fsp150_ports'], 'CM-FACILITY-MIB', null, '-OQUbs'); $pre_cache['adva_fsp150_ports'] = snmpwalk_cache_multi_oid($device, 'cmEthernetAccPortTable', $pre_cache['adva_fsp150_ports'], 'CM-FACILITY-MIB', null, '-OQUbs'); } Next we are going to build our sensor discovery code. These are optical readings, so the file will be created as the dBm sensor type in includes/discover/sensors/dbm/adva_fsp150.inc.php . Below is a snippet of the code: foreach ($pre_cache['adva_fsp150_ports'] as $index => $entry) { if ($entry['cmEthernetTrafficPortMediaType'] == 'fiber') { //Discover received power level $oidRx = '.1.3.6.1.4.1.2544.1.12.5.1.21.1.34.' . $index . '.3'; $oidTx = '.1.3.6.1.4.1.2544.1.12.5.1.21.1.33.' . $index . '.3'; $currentRx = snmp_get($device, $oidRx, '-Oqv', 'CM-PERFORMANCE-MIB', '/opt/librenms/mibs/adva'); $currentTx = snmp_get($device, $oidTx, '-Oqv', 'CM-PERFORMANCE-MIB', '/opt/librenms/mibs/adva'); if ($currentRx != 0 || $currentTx != 0) { $entPhysicalIndex = $entry['cmEthernetTrafficPortIfIndex']; $entPhysicalIndex_measured = 'ports'; $descrRx = dbFetchCell('SELECT `ifName` FROM `ports` WHERE `ifIndex`= ? AND `device_id` = ?', [$entry['cmEthernetTrafficPortIfIndex'], $device['device_id']]) . ' Rx Power'; discover_sensor( $valid['sensor'], 'dbm', $device, $oidRx, 'cmEthernetTrafficPortStatsOPR.' . $index, 'adva_fsp150', $descrRx, $divisor, $multiplier, null, null, null, null, $currentRx, 'snmp', $entPhysicalIndex, $entPhysicalIndex_measured ); $descrTx = dbFetchCell('SELECT `ifName` FROM `ports` WHERE `ifIndex`= ? AND `device_id` = ?', [$entry['cmEthernetTrafficPortIfIndex'], $device['device_id']]) . ' Tx Power'; discover_sensor( $valid['sensor'], 'dbm', $device, $oidTx, 'cmEthernetTrafficPortStatsOPT.' . $index, 'adva_fsp150', $descrTx, $divisor, $multiplier, null, null, null, null, $currentTx, 'snmp', $entPhysicalIndex, $entPhysicalIndex_measured ); } } } First the program will loop through each port's index value. In the case of Advas, the ports are names Ethernet 1-1-1-1, 1-1-1-2, etc, and they are indexed as oid.1.1.1.1, oid.1.1.1.2, etc in the mib. Next the program checks which table the port exists in and that the connector type is 'fiber'. There are other port tables in the full code that were ommitted from the example for brevity. Copper media won't have optical readings, so if the media type isn't fiber we skip discovery for that port. The next two lines build the OIDs for getting the optical receive and transmit values using the $index for the port. Using the OIDs the program gets the current receive and transmit values ($currentRx and $currentTx repectively) to verify the values are not 0. Not all SFPs collect digital optical monitoring (DOM) data, in the case of Adva the value of both transmit and recieve will be 0 if DOM is not available. While 0 is a valid value for optical power, its extremely unlikely that both will be 0 if DOM is present. If DOM is not available, then the program stops discovery for that port. Note that while this is the case with Adva, other vendors may differ in how they handle optics that do not supply DOM. Please check your vendor's mibs. Next the program assigns the values of $entPhysicalIndex and $entPhysicalIndex_measured. In this case $entPhysicalIndex is set to the value of the cmEthernetTrafficPortIfIndex so that it is associated with port. This will also allow the sensor graphs to show up on the associated port's page in the GUI in addition to the Health page. Following that the program uses a database call to get the description of the port which will be used as the title for the graph in the GUI. Lastly the program calls discover_sensor() and passes the information collected in the previous steps. The null values are for low, low warning, high, and high warning values, which are not collected in the Adva's MIB. You can manually run discovery to verify the code works by running ./discovery.php -h $device_id -m sensors . You can use -v to see what calls are being used during discovery and -d to see debug output. In the output under #### Load disco module sensors #### you can see a list of sensors types. If there is a + a sensor is added, if there is a - one was deleted, and a . means no change. If there is nothing next to the sensor type then the sensor was not discovered. There is is also information about changes to the database and RRD files at the bottom. [librenms@nms-test ~]$ ./discovery.php -h 2 -m sensors LibreNMS Discovery 164.113.194.250 2 adva_fsp150 #### Load disco module core #### >> Runtime for discovery module 'core': 0.0240 seconds with 66536 bytes >> SNMP: [2/0.06s] MySQL: [3/0.00s] RRD: [0/0.00s] #### Unload disco module core #### #### Load disco module sensors #### Pre-cache adva_fsp150: ENTITY-SENSOR: Caching OIDs: entPhysicalDescr entPhysicalName entPhySensorType entPhySensorScale entPhySensorPrecision entPhySensorValue entPhySensorOperStatus Airflow: Current: . Charge: Dbm: Adva FSP-150 dBm.. Fanspeed: Frequency: Humidity: Load: Power: Power_consumed: Power_factor: Runtime: Signal: State: Count: Temperature: .. Tv_signal: Bitrate: Voltage: . Snr: Pressure: Cooling: Delay: Quality_factor: Chromatic_dispersion: Ber: Eer: Waterflow: Percent: >> Runtime for discovery module 'sensors': 3.9340 seconds with 190024 bytes >> SNMP: [16/3.89s] MySQL: [36/0.03s] RRD: [0/0.00s] #### Unload disco module sensors #### Discovered in 5.521 seconds SNMP [18/3.96s]: Get[8/0.81s] Getnext[0/0.00s] Walk[10/3.15s] MySQL [41/0.03s]: Cell[10/0.01s] Row[-4/-0.00s] Rows[31/0.02s] Column[0/0.00s] Update[2/0.00s] Insert[2/0.00s] Delete[0/0.00s] RRD [0/0.00s]: Update[0/0.00s] Create [0/0.00s] Other[0/0.00s]","title":"Advanced health sensor example"},{"location":"Developing/os/Initial-Detection/","text":"This document will provide the information you should need to add basic detection for a new OS. Discovery OS discovery is how LibreNMS detects which OS should be used for a device. Generally detection should use sysObjectID or sysDescr, but you can also snmpget an oid and check for a value. snmpget is discouraged because it slows down all os detections, not just the added os. To begin, create the new OS file which should be called includes/definitions/pulse.yaml . Here is a working example: os : pulse text : 'Pulse Secure' type : firewall icon : pulse over : - { graph : device_bits , text : 'Device Traffic' } - { graph : device_processor , text : 'CPU Usage' } - { graph : device_mempool , text : 'Memory Usage' } discovery : - sysObjectID : - .1.3.6.1.4.1.12532. over : This is a list of the graphs which will be shown within the device header bar (mini graphs top right). discovery : Here we are detecting this new OS using sysObjectID, this is the preferred method for detection. Other options are available: sysObjectID The preferred operator. Checks if the sysObjectID starts with one of the strings under this item sysDescr Use this in addition to sysObjectID if required. Check that the sysDescr contains one of the strings under this item sysObjectID_regex Please avoid use of this. Checks if the sysObjectID matches one of the regex statements under this item sysDescr_regex Please avoid use of this. Checks if the sysDescr matches one of the regex statements under this item snmpget Do not use this unless none of the other methods work. Fetch an oid and compare it against a value. discovery : - snmpget : - oid : - op : <[\"=\",\"!=\",\"==\",\"!==\",\"<=\",\">=\",\"<\",\">\",\"starts\",\"ends\",\"contains\",\"regex\",\"not_starts\",\"not_ends\",\"not_contains\",\"not_regex\",\"in_array\",\"not_in_array\",\"exists\"]> - value : <'string' | boolean> _except You can add this to any of the above to exclude that element. As an example: discovery : - sysObjectID : - .1.3.6.1.4.1.12532. sysDescr_except : - 'Not some pulse' group : You can group certain OS' together by using group, for instance ios, nx-os, iosxr are all within a group called cisco. bad_ifXEntry : This is a list of models for which to tell LibreNMS that the device doesn't support ifXEntry and to ignore it: bad_ifXEntry : - cisco1941 - cisco886Va - cisco2811 mib_dir : You can use this to specify an additional directory to look in for MIBs. An array is not accepted, only one directory may be specified. mib_dir : juniper poller_modules : This is a list of poller modules to either enable (1) or disable (0). Check misc/config_definitions.json to see which modules are enabled/disabled by default. poller_modules : cisco-ace-serverfarms : false cisco-ace-loadbalancer : false discovery_modules : This is the list of discovery modules to either enable (1) or disable (0). Check misc/config_definitions.json to see which modules are enabled/disabled by default. discovery_modules : cisco-cef : true slas : true cisco-mac-accounting : false Discovery Logic YAML is converted to an array in PHP. Consider the following YAML: discovery : - sysObjectID : foo - sysDescr : [ snafu , exodar ] sysObjectID : bar This is how the discovery array would look in PHP: [ [ \"sysObjectID\" => \"foo\" , ], [ \"sysDescr\" => [ \"snafu\" , \"exodar\" , ], \"sysObjectID\" => \"bar\" , ] ] The logic for the discovery is as follows: One of the first level items must match ALL of the second level items must match (sysObjectID, sysDescr) One of the third level items (foo, [snafu,exodar], bar) must match So, considering the example: sysObjectID: foo, sysDescr: ANYTHING matches sysObjectID: bar, sysDescr: ANYTHING does not match sysObjectID: bar, sysDescr: exodar matches sysObjectID: bar, sysDescr: snafu matches OS discovery OS discovery collects additional standardized data about the OS. These are specified in the discovery yaml includes/definitions/discovery/.yaml or LibreNMS/OS/.php if more complex collection is required. version The version of the OS running on the device. hardware The hardware version for the device. For example: 'WS-C3560X-24T-S' features Features for the device, for example a list of enabled software features. serial The main serial number of the device. Yaml based OS discovery sysDescr_regex apply a regex or list of regexes to the sysDescr to extract named groups, this data has the lowest precedence specify an oid or list of oids to attempt to pull the data from, the first non-empty response will be used _regex parse the value out of the returned oid data, must use a named group _template combine multiple oid results together to create a final string value. The result is trimmed. _replace An array of replacements ['search regex', 'replace'] or regex to remove hardware_mib MIB used to translate sysObjectID to get hardware. hardware_regex can process the result. modules : os : sysDescr_regex : '/(?MSM\\S+) .* Serial number (?\\S+) - Firmware version (?\\S+)/' features : UPS-MIB::upsIdentAttachedDevices.0 hardware : - ENTITY-MIB::entPhysicalName.1 - ENTITY-MIB::entPhysicalHardwareRev.1 hardware_template : '{{ ENTITY-MIB::entPhysicalName.1 }} {{ ENTITY-MIB::entPhysicalHardwareRev.1 }}' serial : ENTITY-MIB::entPhysicalSerialNum.1 version : ENTITY-MIB::entPhysicalSoftwareRev.1 version_regex : '/V(?.*)/' PHP based OS discovery public function discoverOS ( \\App\\Models\\Device $device ) : void { $info = snmp_getnext_multi ( $this -> getDeviceArray (), [ 'enclosureModel' , 'enclosureSerialNum' , 'entPhysicalFirmwareRev' ], '-OQUs' , 'NAS-MIB:ENTITY-MIB' ); $device -> version = $info [ 'entPhysicalFirmwareRev' ]; $device -> hardware = $info [ 'enclosureModel' ]; $device -> serial = $info [ 'enclosureSerialNum' ]; } MIBs If the device has MIBs available and you use it in the detection then you can add these in. It is highly recommended that you add mibs to a vendor specific directory. For instance HP mibs are in mibs/hp . Please ensure that these directories are specified in the yaml detection file, see mib_dir above. Icon and Logo It is highly recommended to use SVG images where possible, these scale and provide a nice visual image for users with HiDPI screens. If you can't find SVG images then please use png. Create an SVG image of the icon and logo. Legacy PNG bitmaps are also supported but look bad on HiDPI. A vector image should not contain padding. The file should not be larger than 20 Kb. Simplify paths to reduce large files. Use plain SVG without gzip compression. The SVG root element must not contain length and width attributes, only viewBox. Icon Save the icon SVG to html/images/os/$os.svg . Icons should look good when viewed at 32x32 px. Square icons are preferred to full logos with text. Remove small ornaments that are almost not visible when displayed with 32px width (e.g. \u00ae or \u2122). Logo Save the logo SVG to html/images/logos/$os.svg . Logos can be any dimension, but often are wide and contain the company name. If a logo is not present, the icon will be used. Hints Hints for Inkscape : You can open a PDF or EPS to extract the logo. Ungroup elements to isolate the logo. Use Path -> Simplify to simplify paths of large files. Use File -> Document Properties\u2026 -> Resize page to content\u2026 to remove padding. Use File -> Clean up document to remove unused gradients, patterns, or markers. Use File -> Save As -> Plain SVG to save the final image. By optimizing the SVG you can shrink the file size in some cases to less than 20 %. SVG Optimizer does a great job. There is also an online version . The final check Discovery ./discovery.php -d -h HOSTNAME Polling lnms device:poll HOSTNAME At this step we should see all the values retrieved in LibreNMS. Note: If you have made a number of changes to either the OS's Discovery files, it's possible earlier edits have been cached. As such, if you do not get expected behaviour when completing the final check above, try removing the cache file first: rm -f cache/os_defs.cache","title":"Initial Detection"},{"location":"Developing/os/Initial-Detection/#discovery","text":"OS discovery is how LibreNMS detects which OS should be used for a device. Generally detection should use sysObjectID or sysDescr, but you can also snmpget an oid and check for a value. snmpget is discouraged because it slows down all os detections, not just the added os. To begin, create the new OS file which should be called includes/definitions/pulse.yaml . Here is a working example: os : pulse text : 'Pulse Secure' type : firewall icon : pulse over : - { graph : device_bits , text : 'Device Traffic' } - { graph : device_processor , text : 'CPU Usage' } - { graph : device_mempool , text : 'Memory Usage' } discovery : - sysObjectID : - .1.3.6.1.4.1.12532. over : This is a list of the graphs which will be shown within the device header bar (mini graphs top right). discovery : Here we are detecting this new OS using sysObjectID, this is the preferred method for detection. Other options are available: sysObjectID The preferred operator. Checks if the sysObjectID starts with one of the strings under this item sysDescr Use this in addition to sysObjectID if required. Check that the sysDescr contains one of the strings under this item sysObjectID_regex Please avoid use of this. Checks if the sysObjectID matches one of the regex statements under this item sysDescr_regex Please avoid use of this. Checks if the sysDescr matches one of the regex statements under this item snmpget Do not use this unless none of the other methods work. Fetch an oid and compare it against a value. discovery : - snmpget : - oid : - op : <[\"=\",\"!=\",\"==\",\"!==\",\"<=\",\">=\",\"<\",\">\",\"starts\",\"ends\",\"contains\",\"regex\",\"not_starts\",\"not_ends\",\"not_contains\",\"not_regex\",\"in_array\",\"not_in_array\",\"exists\"]> - value : <'string' | boolean> _except You can add this to any of the above to exclude that element. As an example: discovery : - sysObjectID : - .1.3.6.1.4.1.12532. sysDescr_except : - 'Not some pulse' group : You can group certain OS' together by using group, for instance ios, nx-os, iosxr are all within a group called cisco. bad_ifXEntry : This is a list of models for which to tell LibreNMS that the device doesn't support ifXEntry and to ignore it: bad_ifXEntry : - cisco1941 - cisco886Va - cisco2811 mib_dir : You can use this to specify an additional directory to look in for MIBs. An array is not accepted, only one directory may be specified. mib_dir : juniper poller_modules : This is a list of poller modules to either enable (1) or disable (0). Check misc/config_definitions.json to see which modules are enabled/disabled by default. poller_modules : cisco-ace-serverfarms : false cisco-ace-loadbalancer : false discovery_modules : This is the list of discovery modules to either enable (1) or disable (0). Check misc/config_definitions.json to see which modules are enabled/disabled by default. discovery_modules : cisco-cef : true slas : true cisco-mac-accounting : false","title":"Discovery"},{"location":"Developing/os/Initial-Detection/#discovery-logic","text":"YAML is converted to an array in PHP. Consider the following YAML: discovery : - sysObjectID : foo - sysDescr : [ snafu , exodar ] sysObjectID : bar This is how the discovery array would look in PHP: [ [ \"sysObjectID\" => \"foo\" , ], [ \"sysDescr\" => [ \"snafu\" , \"exodar\" , ], \"sysObjectID\" => \"bar\" , ] ] The logic for the discovery is as follows: One of the first level items must match ALL of the second level items must match (sysObjectID, sysDescr) One of the third level items (foo, [snafu,exodar], bar) must match So, considering the example: sysObjectID: foo, sysDescr: ANYTHING matches sysObjectID: bar, sysDescr: ANYTHING does not match sysObjectID: bar, sysDescr: exodar matches sysObjectID: bar, sysDescr: snafu matches","title":"Discovery Logic"},{"location":"Developing/os/Initial-Detection/#os-discovery","text":"OS discovery collects additional standardized data about the OS. These are specified in the discovery yaml includes/definitions/discovery/.yaml or LibreNMS/OS/.php if more complex collection is required. version The version of the OS running on the device. hardware The hardware version for the device. For example: 'WS-C3560X-24T-S' features Features for the device, for example a list of enabled software features. serial The main serial number of the device.","title":"OS discovery"},{"location":"Developing/os/Initial-Detection/#yaml-based-os-discovery","text":"sysDescr_regex apply a regex or list of regexes to the sysDescr to extract named groups, this data has the lowest precedence specify an oid or list of oids to attempt to pull the data from, the first non-empty response will be used _regex parse the value out of the returned oid data, must use a named group _template combine multiple oid results together to create a final string value. The result is trimmed. _replace An array of replacements ['search regex', 'replace'] or regex to remove hardware_mib MIB used to translate sysObjectID to get hardware. hardware_regex can process the result. modules : os : sysDescr_regex : '/(?MSM\\S+) .* Serial number (?\\S+) - Firmware version (?\\S+)/' features : UPS-MIB::upsIdentAttachedDevices.0 hardware : - ENTITY-MIB::entPhysicalName.1 - ENTITY-MIB::entPhysicalHardwareRev.1 hardware_template : '{{ ENTITY-MIB::entPhysicalName.1 }} {{ ENTITY-MIB::entPhysicalHardwareRev.1 }}' serial : ENTITY-MIB::entPhysicalSerialNum.1 version : ENTITY-MIB::entPhysicalSoftwareRev.1 version_regex : '/V(?.*)/'","title":"Yaml based OS discovery"},{"location":"Developing/os/Initial-Detection/#php-based-os-discovery","text":"public function discoverOS ( \\App\\Models\\Device $device ) : void { $info = snmp_getnext_multi ( $this -> getDeviceArray (), [ 'enclosureModel' , 'enclosureSerialNum' , 'entPhysicalFirmwareRev' ], '-OQUs' , 'NAS-MIB:ENTITY-MIB' ); $device -> version = $info [ 'entPhysicalFirmwareRev' ]; $device -> hardware = $info [ 'enclosureModel' ]; $device -> serial = $info [ 'enclosureSerialNum' ]; }","title":"PHP based OS discovery"},{"location":"Developing/os/Initial-Detection/#mibs","text":"If the device has MIBs available and you use it in the detection then you can add these in. It is highly recommended that you add mibs to a vendor specific directory. For instance HP mibs are in mibs/hp . Please ensure that these directories are specified in the yaml detection file, see mib_dir above.","title":"MIBs"},{"location":"Developing/os/Initial-Detection/#icon-and-logo","text":"It is highly recommended to use SVG images where possible, these scale and provide a nice visual image for users with HiDPI screens. If you can't find SVG images then please use png. Create an SVG image of the icon and logo. Legacy PNG bitmaps are also supported but look bad on HiDPI. A vector image should not contain padding. The file should not be larger than 20 Kb. Simplify paths to reduce large files. Use plain SVG without gzip compression. The SVG root element must not contain length and width attributes, only viewBox.","title":"Icon and Logo"},{"location":"Developing/os/Initial-Detection/#icon","text":"Save the icon SVG to html/images/os/$os.svg . Icons should look good when viewed at 32x32 px. Square icons are preferred to full logos with text. Remove small ornaments that are almost not visible when displayed with 32px width (e.g. \u00ae or \u2122).","title":"Icon"},{"location":"Developing/os/Initial-Detection/#logo","text":"Save the logo SVG to html/images/logos/$os.svg . Logos can be any dimension, but often are wide and contain the company name. If a logo is not present, the icon will be used.","title":"Logo"},{"location":"Developing/os/Initial-Detection/#hints","text":"Hints for Inkscape : You can open a PDF or EPS to extract the logo. Ungroup elements to isolate the logo. Use Path -> Simplify to simplify paths of large files. Use File -> Document Properties\u2026 -> Resize page to content\u2026 to remove padding. Use File -> Clean up document to remove unused gradients, patterns, or markers. Use File -> Save As -> Plain SVG to save the final image. By optimizing the SVG you can shrink the file size in some cases to less than 20 %. SVG Optimizer does a great job. There is also an online version .","title":"Hints"},{"location":"Developing/os/Initial-Detection/#the-final-check","text":"Discovery ./discovery.php -d -h HOSTNAME Polling lnms device:poll HOSTNAME At this step we should see all the values retrieved in LibreNMS. Note: If you have made a number of changes to either the OS's Discovery files, it's possible earlier edits have been cached. As such, if you do not get expected behaviour when completing the final check above, try removing the cache file first: rm -f cache/os_defs.cache","title":"The final check"},{"location":"Developing/os/Mem-CPU-Information/","text":"This document will guide you through adding detection for Memory / Processor for your new device. Memory LibreNMS will attempt to detect memory statistics using the standard HOST-RESOURCES-MIB and UCD-SNMP-MIB MIBs. To detect non-standard MIBs, they can be defined via Yaml. YAML In order to successfully detect memory amount and usage, two of the for keys below are required. Some OS only provide a usage percentage, which will work, but a total RAM amount will not be displayed. total used free percent_used includes/definitions/discovery/mempools/arubaos.yaml mempools : data : - total : WLSX-SWITCH-MIB::sysXMemorySize used : WLSX-SWITCH-MIB::sysXMemoryUsed precision : 1024 The code can also interpret table based OIDs and supports many of the same features as Health Sensors including {{ }} parsing, skip_values, and precache. Valid data entry keys: oid oid to walk to collect processor data total oid or integer total memory size in bytes (or precision) used oid memory used in bytes (or precision) free oid memory free in bytes (or precision) percent_used oid of percentage of used memory descr A visible description of the memory measurement defaults to \"Memory\" warn_percent Usage percentage to used for alert purposes precision precision for all byte values, typically a power of 2 (1024 for example) class used to generate rrd filename, defaults to system. If system, buffers, and cached exist they will be combined to calculate available memory. type used to generate rrd filename, defaults to the os name index used to generate rrd filename, defaults to the oid index skip_values skip values see Health Sensors for specification snmp_flags additional net-snmp flags Custom Processor Discovery and Polling If you need to implement custom discovery or polling you can implement the MempoolsDiscovery interface and the MempoolsPolling interface in the OS class. MempoolsPolling is optional, standard polling will be used based on OIDs stored in the database. OS Class files reside under LibreNMS\\OS , this will add more data to the snmprec file Review data. If you modified the snmprec (don't modify json manually) run ./scripts/save-test-data.php -o example-os -m Run lnms dev:check unit --db --snmpsim If the tests succeed submit a pull request JSON Application Test Writing Using ./scripts/json-app-tool.php First you will need a good example JSON output produced via SNMP extend in question. Read the help via ./scripts/json-app-tool.php -h . Generate the SNMPrec data via ./scripts/json-app-tool.php -a appName -s > ./tests/snmpsim/linux_appName-v1.snmprec . If the SNMP extend name OID different than the application name, then you will need to pass the -S flag for over riding that. Generate the test JSON data via ./scripts/json-app-tool.php -a appName -t > ./tests/data/linux_appName-v1.json . Update the generated './tests/data/linux_appName-v1.json' making sure that all the expected metrics are present. This assumes that everything under .data in the JSON will be collapsed and used. During test runs if it does not appear to be detecting the app and it has a different app name and SNMP extend name OID, make sure that -S is set properly and that 'includes/discovery/applications.inc.php' has been updated.","title":"Test Units"},{"location":"Developing/os/Test-Units/#tests","text":"Tests ensure LibreNMS works as expected, now and in the future. New OS should provide as much test data as needed and added test data for existing OS is welcome. Saved snmp data can be found in tests/snmpsim/*.snmprec and saved database data can be found in tests/data/*.json . Please review this for any sensitive data before submitting. When replacing data, make sure it is modified in a consistent manner. We utilise snmpsim to do unit testing. For OS discovery, we can mock snmpsim, but for other tests you will need it installed and functioning. We run snmpsim during our integration tests, but not by default when running lnms dev:check . You can install snmpsim with the command pip3 install snmpsim .","title":"Tests"},{"location":"Developing/os/Test-Units/#capturing-test-data","text":"If test data already exists If test data already exists, but is for a different device/configuration with the same OS. Then you should use the --variant (-v) option to specify a different variant of the OS, this will be tested completely separate from other variants. If there is only one variant, please do not specify one.","title":"Capturing test data"},{"location":"Developing/os/Test-Units/#1-collect-snmp-data","text":"./scripts/collect-snmp-data.php is provided to make it easy to collect data for tests. Running collect-snmp-data.php with the --hostname (-h) allows you to capture all data used to discover and poll a device already added to LibreNMS. Make sure to re-run the script if you add additional support. Check the command-line help for more options.","title":"1. Collect SNMP data"},{"location":"Developing/os/Test-Units/#2-save-test-data","text":"After you have collected snmp data, run ./scripts/save-test-data.php with the --os (-o) option to dump the post discovery and post poll database entries to json files. This step requires snmpsim, if you are having issues, the maintainers may help you generate it from the snmprec you created in the previous step. Generally, you will only need to collect data once. After you have the data you need in the snmprec file, you can just use save-test-data.php to update the database dump (json) after that.","title":"2. Save test data"},{"location":"Developing/os/Test-Units/#running-tests","text":"Note: To run tests, ensure you have executed ./scripts/composer_wrapper.php install from your LibreNMS root directory. This will read composer.json and install any dependencies required. After you have saved your test data, you should run lnms dev:check verify they pass. To run the full suite of tests enable database and snmpsim reliant tests: lnms dev:check unit --db --snmpsim","title":"Running tests"},{"location":"Developing/os/Test-Units/#specific-os","text":"lnms dev:check unit -o osname","title":"Specific OS"},{"location":"Developing/os/Test-Units/#specific-module","text":"lnms dev:check unit -m modulename","title":"Specific Module"},{"location":"Developing/os/Test-Units/#using-snmpsim-for-testing","text":"You can run snmpsim to access test data by running lnms dev:simulate You may then run snmp queries against it using the os (and variant) as the community and 127.1.6.1:1161 as the host. snmpget -v 2c -c ios_c3560e 127 .1.6.1:1161 sysDescr.0","title":"Using snmpsim for testing"},{"location":"Developing/os/Test-Units/#snmprec-format","text":"Snmprec files are simple files that store the snmp data. The data format is simple with three columns: numeric oid, type code, and data. Here is an example snippet. 1.3.6.1.2.1.1.1.0|4|Pulse Secure,LLC,MAG-2600,8.0R14 (build 41869) 1.3.6.1.2.1.1.2.0|6|1.3.6.1.4.1.12532.254.1.1 During testing LibreNMS will use any info in the snmprec file for snmp calls. This one provides sysDescr ( .1.3.6.1.2.1.1.1.0 , 4 = Octet String) and sysObjectID ( .1.3.6.1.2.1.1.2.0 , 6 = Object Identifier), which is the minimum that should be provided for new snmprec files. To look up the numeric OID and type of an string OID with snmptranslate: snmptranslate -On -Td SNMPv2-MIB::sysDescr.0 List of SNMP data types: Type Value OCTET STRING 4 HEX STRING 4x Integer32 2 NULL 5 OBJECT IDENTIFIER 6 IpAddress 64 Counter32 65 Gauge32 66 TimeTicks 67 Opaque 68 Counter64 70 Hex encoded strings (4x) should be used for any strings that contain line returns.","title":"Snmprec format"},{"location":"Developing/os/Test-Units/#new-discoverypoller-modules","text":"New discovery or poller modules should define database capture parameters in /tests/module_tables.yaml .","title":"New discovery/poller modules"},{"location":"Developing/os/Test-Units/#example-workflow","text":"If the base os ( .snmprec) already contains test data for the module you are testing or that data conflicts with your new data, you must use a variant to store your test data (-v).","title":"Example workflow"},{"location":"Developing/os/Test-Units/#add-initial-detection","text":"Add device to LibreNMS. It is generic and device_id = 42 Run ./scripts/collect-snmp-data.php -h 42 , initial snmprec will be created Add initial detection for example-os Run discovery to make sure it detects properly ./discovery.php -h 42 Add any additional os items like version, hardware, features, or serial. If there is additional snmp data required, run ./scripts/collect-snmp-data.php -h 42 Run ./scripts/save-test-data.php -o example-os to update the dumped database data. Review data. If you modified the snmprec or code (don't modify json manually) run ./scripts/save-test-data.php -o example-os -m os Run lnms dev:check unit --db --snmpsim If the tests succeed submit a pull request","title":"Add initial detection"},{"location":"Developing/os/Test-Units/#additional-module-support-or-test-data","text":"Add code to support module or support already exists. ./scripts/collect-snmp-data.php -h 42 -m , this will add more data to the snmprec file Review data. If you modified the snmprec (don't modify json manually) run ./scripts/save-test-data.php -o example-os -m Run lnms dev:check unit --db --snmpsim If the tests succeed submit a pull request","title":"Additional module support or test data"},{"location":"Developing/os/Test-Units/#json-application-test-writing-using-scriptsjson-app-toolphp","text":"First you will need a good example JSON output produced via SNMP extend in question. Read the help via ./scripts/json-app-tool.php -h . Generate the SNMPrec data via ./scripts/json-app-tool.php -a appName -s > ./tests/snmpsim/linux_appName-v1.snmprec . If the SNMP extend name OID different than the application name, then you will need to pass the -S flag for over riding that. Generate the test JSON data via ./scripts/json-app-tool.php -a appName -t > ./tests/data/linux_appName-v1.json . Update the generated './tests/data/linux_appName-v1.json' making sure that all the expected metrics are present. This assumes that everything under .data in the JSON will be collapsed and used. During test runs if it does not appear to be detecting the app and it has a different app name and SNMP extend name OID, make sure that -S is set properly and that 'includes/discovery/applications.inc.php' has been updated.","title":"JSON Application Test Writing Using ./scripts/json-app-tool.php"},{"location":"Developing/os/Wireless-Sensors/","text":"This document will guide you through adding wireless sensors for your new wireless device. Currently we have support for the following wireless metrics along with the values we expect to see the data in: Type Measurement Interface Description ap-count % WirelessApCountDiscovery The number of APs attached to this controller capacity % WirelessCapacityDiscovery The % of operating rate vs theoretical max ccq % WirelessCcqDiscovery The Client Connection Quality channel count WirelessChannelDiscovery The channel, use of frequency is preferred cell count WirelessCellDiscovery The cell in a multicell technology clients count WirelessClientsDiscovery The number of clients connected to/managed by this device distance km WirelessDistanceDiscovery The distance of a radio link in Kilometers error-rate bps WirelessErrorRateDiscovery The rate of errored packets or bits, etc error-ratio % WirelessErrorRatioDiscovery The percent of errored packets or bits, etc errors count WirelessErrorsDiscovery The total bits of errored packets or bits, etc frequency MHz WirelessFrequencyDiscovery The frequency of the radio in MHz, channels can be converted mse dB WirelessMseDiscovery The Mean Square Error noise-floor dBm WirelessNoiseFloorDiscovery The amount of noise received by the radio power dBm WirelessPowerDiscovery The power of transmit or receive, including signal level quality % WirelessQualityDiscovery The % of quality of the link, 100% = perfect link rate bps WirelessRateDiscovery The negotiated rate of the connection (not data transfer) rssi dBm WirelessRssiDiscovery The Received Signal Strength Indicator snr dB WirelessSnrDiscovery The Signal to Noise ratio, which is signal - noise floor sinr dB WirelessSinrDiscovery The Signal-to-Interference-plus-Noise Ratio rsrq dB WirelessRsrqDiscovery The Reference Signal Received Quality rsrp dBm WirelessRsrpDiscovery The Reference Signals Received Power xpi dBm WirelessXpiDiscovery The Cross Polar Interference values ssr dB WirelessSsrDiscovery The Signal strength ratio, the ratio(or difference) of Vertical rx power to Horizontal rx power utilization % WirelessUtilizationDiscovery The % of utilization compared to the current rate You will need to create a new OS class for your os if one doesn't exist under LibreNMS/OS . The name of this file should be the os name in camel case for example airos -> Airos , ios-wlc -> IosWlc . Your new OS class should extend LibreNMS\\OS and implement the interfaces for the sensors your os supports. namespace LibreNMS\\OS ; use LibreNMS\\Device\\WirelessSensor ; use LibreNMS\\Interfaces\\Discovery\\Sensors\\WirelessClientsDiscovery ; use LibreNMS\\OS ; class Airos extends OS implements WirelessClientsDiscovery { public function discoverWirelessClients () { $oid = '.1.3.6.1.4.1.41112.1.4.5.1.15.1' ; //UBNT-AirMAX-MIB::ubntWlStatStaCount.1 return array ( new WirelessSensor ( 'clients' , $this -> getDeviceId (), $oid , 'airos' , 1 , 'Clients' ) ); } } All discovery interfaces will require you to return an array of WirelessSensor objects. new WirelessSensor() Accepts the following arguments: $type = Required. This is the sensor class from the table above (i.e humidity). $device_id = Required. You can get this value with $this->getDeviceId() $oids = Required. This must be the numerical OID for where the data can be found, i.e .1.2.3.4.5.6.7.0. If this is an array of oids, you should probably specify an $aggregator. $subtype = Required. This should be the OS name, i.e airos. $index = Required. This must be unique for this sensor type, device and subtype. Typically it's the index from the table being walked or it could be the name of the OID if it's a single value. $description = Required. This is a descriptive value for the sensor. Shown to the user, if this is a per-ssid statistic, using SSID: $ssid here is appropriate $current = Defaults to null. Can be used to set the current value on discovery. If this is null the values will be polled right away and if they do not return valid value(s), the sensor will not be discovered. Supplying a value here implies you have already verified this sensor is valid. $multiplier = Defaults to 1. This is used to multiply the returned value. $divisor = Defaults to 1. This is used to divided the returned value. $aggregator = Defaults to sum. Valid values: sum, avg. This will combine multiple values from multiple oids into one. $access_point_id = Defaults to null. If this is a wireless controller, you can link sensors to entries in the access_points table. $high_limit = Defaults to null. Sets the high limit for the sensor, used in alerting to report out range sensors. $low_limit = Defaults to null. Sets the low threshold limit for the sensor, used in alerting to report out range sensors. $high_warn = Defaults to null. Sets the high warning limit for the sensor, used in alerting to report near out of range sensors. $low_warn = Defaults to null. Sets the low warning limit for the sensor, used in alerting to report near out of range sensors. $entPhysicalIndex = Defaults to null. Sets the entPhysicalIndex to be used to look up further hardware if available. $entPhysicalIndexMeasured = Defaults to null. Sets the type of entPhysicalIndex used, i.e ports. Polling is done automatically based on the discovered data. If for some reason you need to override polling, you can implement the required polling interface in LibreNMS/Interfaces/Polling/Sensors . Using the polling interfaces should be avoided if possible. Graphing is performed automatically for wireless sensors, no custom graphing is required or supported.","title":"Wireless Sensors"},{"location":"Extensions/Agent-Setup/","text":"Check_MK Setup The agent can be used to gather data from remote systems you can use LibreNMS in combination with check_mk (found here ). The agent can be extended to include data about applications on the remote system. Installation Linux / BSD Make sure that systemd or xinetd is installed on the host you want to run the agent on. The agent uses TCP-Port 6556, please allow access from the LibreNMS host and poller nodes if you're using the Distributed Polling setup. On each of the hosts you would like to use the agent on, you need to do the following: 1: Clone the librenms-agent repository: cd /opt/ git clone https://github.com/librenms/librenms-agent.git cd librenms-agent 2: Copy the relevant check_mk_agent to /usr/bin : linux freebsd cp check_mk_agent /usr/bin/check_mk_agent cp check_mk_agent_freebsd /usr/bin/check_mk_agent chmod +x /usr/bin/check_mk_agent 3: Copy the service file(s) into place. xinetd systemd cp check_mk_xinetd /etc/xinetd.d/check_mk cp check_mk@.service check_mk.socket /etc/systemd/system 4: Create the relevant directories. mkdir -p /usr/lib/check_mk_agent/plugins /usr/lib/check_mk_agent/local 5: Copy each of the scripts from agent-local/ into /usr/lib/check_mk_agent/local that you require to be graphed. You can find detail setup instructions for specific applications above. 6: Make each one executable that you want to use with chmod +x /usr/lib/check_mk_agent/local/$script 7: Enable the check_mk service xinetd systemd /etc/init.d/xinetd restart systemctl enable check_mk.socket && systemctl start check_mk.socket 8: Login to the LibreNMS web interface and edit the device you want to monitor. Under the modules section, ensure that unix-agent is enabled. 9: Then under Applications, enable the apps that you plan to monitor. 10: Wait for around 10 minutes and you should start seeing data in your graphs under Apps for the device. Restrict the devices on which the agent listens: Linux systemd If you want to restrict which network adapter the agent listens on, do the following: 1: Edit /etc/systemd/system/check_mk.socket 2: Under the [Socket] section, add a new line BindToDevice= and the name of your network adapter. 3: If the script has already been enabled in systemd, you may need to issue a systemctl daemon-reload and then systemctl restart check_mk.socket Windows Grab version 1.2.6b5 of the check_mk agent from the check_mk github repo (exe/msi or compile it yourself depending on your usage): https://github.com/tribe29/checkmk/tree/v1.2.6b5/agents/windows Run the msi / exe Make sure your LibreNMS instance can reach TCP port 6556 on your target.","title":"Check_MK Setup"},{"location":"Extensions/Agent-Setup/#check_mk-setup","text":"The agent can be used to gather data from remote systems you can use LibreNMS in combination with check_mk (found here ). The agent can be extended to include data about applications on the remote system.","title":"Check_MK Setup"},{"location":"Extensions/Agent-Setup/#installation","text":"","title":"Installation"},{"location":"Extensions/Agent-Setup/#linux-bsd","text":"Make sure that systemd or xinetd is installed on the host you want to run the agent on. The agent uses TCP-Port 6556, please allow access from the LibreNMS host and poller nodes if you're using the Distributed Polling setup. On each of the hosts you would like to use the agent on, you need to do the following: 1: Clone the librenms-agent repository: cd /opt/ git clone https://github.com/librenms/librenms-agent.git cd librenms-agent 2: Copy the relevant check_mk_agent to /usr/bin : linux freebsd cp check_mk_agent /usr/bin/check_mk_agent cp check_mk_agent_freebsd /usr/bin/check_mk_agent chmod +x /usr/bin/check_mk_agent 3: Copy the service file(s) into place. xinetd systemd cp check_mk_xinetd /etc/xinetd.d/check_mk cp check_mk@.service check_mk.socket /etc/systemd/system 4: Create the relevant directories. mkdir -p /usr/lib/check_mk_agent/plugins /usr/lib/check_mk_agent/local 5: Copy each of the scripts from agent-local/ into /usr/lib/check_mk_agent/local that you require to be graphed. You can find detail setup instructions for specific applications above. 6: Make each one executable that you want to use with chmod +x /usr/lib/check_mk_agent/local/$script 7: Enable the check_mk service xinetd systemd /etc/init.d/xinetd restart systemctl enable check_mk.socket && systemctl start check_mk.socket 8: Login to the LibreNMS web interface and edit the device you want to monitor. Under the modules section, ensure that unix-agent is enabled. 9: Then under Applications, enable the apps that you plan to monitor. 10: Wait for around 10 minutes and you should start seeing data in your graphs under Apps for the device.","title":"Linux / BSD"},{"location":"Extensions/Agent-Setup/#restrict-the-devices-on-which-the-agent-listens-linux-systemd","text":"If you want to restrict which network adapter the agent listens on, do the following: 1: Edit /etc/systemd/system/check_mk.socket 2: Under the [Socket] section, add a new line BindToDevice= and the name of your network adapter. 3: If the script has already been enabled in systemd, you may need to issue a systemctl daemon-reload and then systemctl restart check_mk.socket","title":"Restrict the devices on which the agent listens: Linux systemd"},{"location":"Extensions/Agent-Setup/#windows","text":"Grab version 1.2.6b5 of the check_mk agent from the check_mk github repo (exe/msi or compile it yourself depending on your usage): https://github.com/tribe29/checkmk/tree/v1.2.6b5/agents/windows Run the msi / exe Make sure your LibreNMS instance can reach TCP port 6556 on your target.","title":"Windows"},{"location":"Extensions/Applications/","text":"Applications You can use Application support to graph performance statistics of many applications. Different applications support a variety of ways to collect data: By direct connection to the application snmpd extend The agent . The monitoring of applications could be added before or after the hosts have been added to LibreNMS. If multiple methods of collection are listed you only need to enable one. SNMP Extend When using the snmp extend method, the application discovery module will pick up which applications you have set up for monitoring automatically, even if the device is already in LibreNMS. The application discovery module is enabled by default for most *nix operating systems, but in some cases you will need to manually enable the application discovery module. SUDO One major thing to keep in mind when using SNMP extend is these run as the snmpd user that can be an unprivileged user. In these situations you need to use sudo. To test if you need sudo, first check the user snmpd is running as. Then test if you can run the extend script as that user without issue. For example if snmpd is running as 'Debian-snmp' and we want to run the extend for proxmox, we check that the following run without error: sudo -u Debian-snmp /usr/local/bin/proxmox If it doesn't work, then you will need to use sudo with the extend command. For the example above, that would mean adding the line below to the sudoers file: Debian-snmp ALL = NOPASSWD: /usr/local/bin/proxmox Finally we would need to add sudo to the extend command, which would look like that for proxmox: extend proxmox /usr/bin/sudo /usr/local/bin/proxmox JSON Return Optimization Using librenms_return_optimizer While the json_app_get does allow for more complex and larger data to be easily returned by a extend and the data to then be worked with, this can also sometimes result in large returns that occasionally don't play nice with SNMP on some networks. librenms_return_optimizer fixes this via taking the extend output piped to it, gzipping it, and then converting it to base64. The later is needed as net-snmp does not play that nice with binary data, converting most of the non-printable characters to . . This does add a bit of additional overhead to the gzipped data, but still tends to be result in a return that is usually a third of the size for JSONs items. The change required is fairly simply. So for the portactivity example below... extend portactivity /etc/snmp/extends/portactivity smtps,http,imap,imaps,postgresql,https,ldap,ldaps,nfsd,syslog-conn,ssh,matrix,gitea Would become this... extend portactivity /usr/local/bin/lnms_return_optimizer -- /etc/snmp/extends/portactivity smtps,http,imap,imaps,postgresql,https,ldap,ldaps,nfsd,syslog-conn,ssh,matrix,gitea The requirements for this are Perl, MIME::Base64, and Gzip::Faster. Installing on FreeBSD... pkg install p5-MIME-Base64 p5-Gzip-Faster wget wget https://raw.githubusercontent.com/librenms/librenms-agent/master/utils/librenms_return_optimizer -O /usr/local/bin/librenms_return_optimizer chmod +x /usr/local/bin/librenms_return_optimizer Installing on Debian... apt-get install zlib1g-dev cpanminus wget cpanm Gzip::Faster cpanm MIME::Base64 wget https://raw.githubusercontent.com/librenms/librenms-agent/master/utils/librenms_return_optimizer -O /usr/local/bin/librenms_return_optimizer chmod +x /usr/local/bin/librenms_return_optimizer Currently supported applications as are below. backupninja certificate chronyd dhcp-stats docker fail2ban fbsd-nfs-client fbsd-nfs-server gpsd mailcow-postfix mdadm ntp-client ntp-server portactivity powerdns powermon puppet-agent pureftpd redis seafile supervisord ups-apcups zfs The following apps have extends that have native support for this, if congiured to do so. suricata Enable the application discovery module Edit the device for which you want to add this support Click on the Modules tab and enable the applications module. This will be automatically saved, and you should get a green confirmation pop-up message. After you have enabled the application module, it would be wise to then also enable which applications you want to monitor, in the rare case where LibreNMS does not automatically detect it. Note : Only do this if an application was not auto-discovered by LibreNMS during discovery and polling. Enable the application(s) to be discovered Go to the device you have just enabled the application module for. Click on the Applications tab and select the applications you want to monitor. This will also be automatically saved, and you should get a green confirmation pop-up message. Agent The unix-agent does not have a discovery module, only a poller module. That poller module is always disabled by default. It needs to be manually enabled if using the agent. Some applications will be automatically enabled by the unix-agent poller module. It is better to ensure that your application is enabled for monitoring. You can check by following the steps under the SNMP Extend heading. Apache Either use SNMP extend or use the agent. Note that you need to install and configure the Apache mod_status module before trying the script. SNMP Extend Download the script onto the desired host (the host must be added to LibreNMS devices) wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/apache-stats.py -O /etc/snmp/apache-stats.py Make the script executable chmod +x /etc/snmp/apache-stats.py Create the cache directory, '/var/cache/librenms/' and make sure that it is owned by the user running the SNMP daemon. mkdir -p /var/cache/librenms/ Verify it is working by running /etc/snmp/apache-stats.py Package urllib3 for python3 needs to be installed. In Debian-based systems for example you can achieve this by issuing: apt-get install python3-urllib3 Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend apache /etc/snmp/apache-stats.py Restart snmpd on your host Test by running snmpwalk localhost NET-SNMP-EXTEND-MIB::nsExtendOutput2Table Agent Install the agent on this device if it isn't already and copy the apache script to /usr/lib/check_mk_agent/local/ Verify it is working by running /usr/lib/check_mk_agent/local/apache (If you get error like \"Can't locate LWP/Simple.pm\". libwww-perl needs to be installed: apt-get install libwww-perl) Create the cache directory, '/var/cache/librenms/' and make sure that it is owned by the user running the SNMP daemon. mkdir -p /var/cache/librenms/ On the device page in Librenms, edit your host and check the Apache under the Applications tab. Asterisk A small shell script that reports various Asterisk call status. SNMP Extend Download the asterisk script to /etc/snmp/ on your asterisk server. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/asterisk -O /etc/snmp/asterisk Make the script executable chmod +x /etc/snmp/asterisk Configure ASCLI in the script. Verify it is working by running /etc/snmp/asterisk Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend asterisk /etc/snmp/asterisk Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. backupninja A small shell script that reports status of last backupninja backup. SNMP Extend Download the backupninja script to /etc/snmp/backupninja.py on your backuped server. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/backupninja.py -O /etc/snmp/backupninja.py` Make the script executable: chmod +x /etc/snmp/backupninja.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend backupninja /etc/snmp/backupninja.py Restart snmpd on your host BIND9 aka named Create stats file with appropriate permissions: touch /var/cache/bind/stats chown bind:bind /var/cache/bind/stats Change user:group to the user and group that's running bind/named. Bind/named configuration: options { ... statistics-file \"/var/cache/bind/stats\"; zone-statistics yes; ... }; Restart your bind9/named after changing the configuration. Verify that everything works by executing rndc stats && cat /var/cache/bind/stats . In case you get a Permission Denied error, make sure you changed the ownership correctly. Also be aware that this file is appended to each time rndc stats is called. Given this it is suggested you setup file rotation for it. Alternatively you can also set zero_stats to 1 in the config. The script for this also requires the Perl module File::ReadBackwards . FreeBSD => p5-File-ReadBackwards CentOS/RedHat => perl-File-ReadBackwards Debian/Ubuntu => libfile-readbackwards-perl If it is not available, it can be installed by cpan -i File::ReadBackwards . You may possibly need to configure the agent/extend script as well. The config file's path defaults to the same path as the script, but with .config appended. So if the script is located at /etc/snmp/bind , the config file will be /etc/snmp/bind.config . Alternatively you can also specify a config via -c $file . Anything starting with a # is comment. The format for variables are $variable=$value. Empty lines are ignored. Spaces and tabs at either the start or end of a line are ignored. Content of an example /etc/snmp/bind.config . Please edit with your own settings. rndc = The path to rndc. Default: /usr/bin/env rndc call_rndc = A 0/1 boolean on whether or not to call rndc stats. Suggest to set to 0 if using netdata. Default: 1 stats_file = The path to the named stats file. Default: /var/cache/bind/stats agent = A 0/1 boolean for if this is being used as a LibreNMS agent or not. Default: 0 zero_stats = A 0/1 boolean for if the stats file should be zeroed first. Default: 0 (1 if guessed) If you want to guess at the configuration, call the script with -g and it will print out what it thinks it should be. SNMP Extend Copy the bind shell script, to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/bind -O /etc/snmp/bind Make the script executable chmod +x /etc/snmp/bind Edit your snmpd.conf file and add: extend bind /etc/snmp/bind Restart snmpd on the host in question. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Agent Install the agent on this device if it isn't already and copy the script to /usr/lib/check_mk_agent/local/bind via wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/bind -O /usr/lib/check_mk_agent/local/bind Make the script executable chmod +x /usr/lib/check_mk_agent/local/bind Set the variable 'agent' to '1' in the config. BIRD2 The BIRD Internet Routing Daemon (BGP) Due to the lack of SNMP support in the BIRD daemon, this application extracts all configured BGP protocols and parses it into LibreNMS. This application supports both IPv4 and IPv6 Peer processing. SNMP Extend Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend bird2 '/usr/bin/sudo /usr/sbin/birdc -r show protocols all' Edit your sudo users (usually visudo ) and add at the bottom: Debian-snmp ALL=(ALL) NOPASSWD: /usr/sbin/birdc If your snmp daemon is running on a user that isnt Debian-snmp make sure that user has the correct permission to execute birdc Verify the time format for bird2 is defined. Otherwise iso short ms (hh:mm:ss) is the default value that will be used. Which is not compatible with the datetime parsing logic used to parse the output from the bird show command. timeformat protocol is the one important to be defibned for the bird2 app parsing logic to work. Example starting point using Bird2 shorthand iso long (YYYY-MM-DD hh:mm:ss): timeformat base iso long; timeformat log iso long; timeformat protocol iso long; timeformat route iso long; Timezone can be manually specified, example \"%F %T %z\" (YYYY-MM-DD hh:mm:ss +11:45). See the Bird 2 docs for more information Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Certificate A small python3 script that checks age and remaining validity of certificates This script needs following packages on Debian/Ubuntu Systems: python3 python3-openssl Content of an example /etc/snmp/certificate.json . Please edit with your own settings. {\"domains\": [ {\"fqdn\": \"www.mydomain.com\"}, {\"fqdn\": \"some.otherdomain.org\", \"port\": 8443}, {\"fqdn\": \"personal.domain.net\"}, {\"fqdn\": \"selfsignedcert_host.domain.com\", \"cert_location\": \"/etc/pki/tls/certs/localhost.pem\"} ] } a. (Required): Key 'domains' contains a list of domains to check. b. (Optional): You can define a port. By default it checks on port 443. c. (Optional): You may define a certificate location for self-signed certificates. SNMP Extend Copy the shell script to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/certificate.py -O /etc/snmp/certificate.py Make the script executable chmod +x /etc/snmp/certificate.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend certificate /etc/snmp/certificate.py Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. BorgBackup SNMP Extend Copy the shell script to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/borgbackup -O /etc/snmp/borgbackup Make the script executable chmod +x /etc/snmp/borgbackup Install depends. # FreeBSD pkg p5-Config-Tiny p5-JSON p5-File-Slurp p5-MIME-Base64 p5-String-ShellQuote # Debian apt-get install libconfig-tiny-perl libjson-perl libfile-slurp-perl libmime-base64-perl libstring-shellquote-perl # generic cpanm cpanm Config::Tiny File::Slurp JSON MIME::Base64 String::ShellQuote Set it up in cron. */5 * * * /etc/snmp/borgbackup 2> /dev/null > /dev/null Configure it. See further down below or /etc/snmp/borgbackup --help . Add the following to the SNMPD config. extend borgbackup /bin/cat /var/cache/borgbackup_extend/extend_return Restart SNMPD and wait for the device to rediscover or tell it to manually. Config The config file is a ini file and handled by Config::Tiny . - mode :: single or multi, for if this is a single repo or for multiple repos. - Default :: single - repo :: Directory for the borg backup repo. - Default :: undef - passphrase :: Passphrase for the borg backup repo. - Default :: undef - passcommand :: Passcommand for the borg backup repo. - Default :: undef For single repos all those variables are in the root section of the config, so lets the repo is at '/backup/borg' with a passphrase of '1234abc'. repo=/backup/borg repo=1234abc For multi, each section outside of the root represents a repo. So if there is '/backup/borg1' with a passphrase of 'foobar' and '/backup/derp' with a passcommand of 'pass show backup' it would be like below. mode=multi [borg1] repo=/backup/borg1 passphrase=foobar [derp] repo=/backup/derp passcommand=pass show backup If 'passphrase' and 'passcommand' are both specified, then passcommand is used. Metrics The metrics are all from .data.totals in the extend return. Value Type Description errored repos Total number of repos that info could not be fetched for. locked repos Total number of locked repos locked_for seconds Longest time any repo has been locked. time_since_last_modified seconds Largest time - mtime for the repo nonce total_chunks chunks Total number of chunks total_csize bytes Total compressed size of all archives in all repos. total_size byes Total uncompressed size of all archives in all repos. total_unique_chunks chunks Total number of unique chuckes in all repos. unique_csize bytes Total deduplicated size of all archives in all repos. unique_size chunks Total number of chunks in all repos. CAPEv2 Copy the shell script to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/cape -O /etc/snmp/cape Make the script executable chmod +x /etc/snmp/cape Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend cape /etc/snmp/cape Install the required packages. apt-get install libfile-readbackwards-perl libjson-perl libconfig-tiny-perl libdbi-perl libfile-slurp-perl libstatistics-lite-perl Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. C.H.I.P C.H.I.P. is a $9 R8 based tiny computer ideal for small projects. Further details: https://getchip.com/pages/chip Copy the shell script to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/chip.sh -O /etc/snmp/power-stat.sh Make the script executable chmod +x /etc/snmp/power-stat.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend power-stat /etc/snmp/power-stat.sh Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Docker Stats It gathers metrics about the docker containers, including: - cpu percentage - memory usage - container size - uptime - Totals per status This script requires python3 and the pip module python-dateutil SNMP Extend Install pip module pip3 install python-dateutil Copy the shell script to the desired host. By default, it will only show the status for containers that are running. To include all containers modify the constant in the script at the top of the file and change it to ONLY_RUNNING_CONTAINERS = False wget https://github.com/librenms/librenms-agent/raw/master/snmp/docker-stats.py -O /etc/snmp/docker-stats.py Make the script executable chmod +x /etc/snmp/docker-stats.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend docker /etc/snmp/docker-stats.py If your run Debian, you need to add the Debian-snmp user to the docker group usermod -a -G docker Debian-snmp Restart snmpd on your host systemctl restart snmpd Entropy A small shell script that checks your system's available random entropy. SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/entropy.sh -O /etc/snmp/entropy.sh Make the script executable chmod +x /etc/snmp/entropy.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend entropy /etc/snmp/entropy.sh Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. EXIM Stats SNMP extend script to get your exim stats data into your host. SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/exim-stats.sh -O /etc/snmp/exim-stats.sh Make the script executable chmod +x /etc/snmp/exim-stats.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend exim-stats /etc/snmp/exim-stats.sh If you are using sudo edit your sudo users (usually visudo ) and add at the bottom: snmp ALL=(ALL) NOPASSWD: /etc/snmp/exim-stats.sh, /usr/bin/exim* Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Fail2ban SNMP Extend Copy the shell script, fail2ban, to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/fail2ban -O /etc/snmp/fail2ban Make the script executable chmod +x /etc/snmp/fail2ban Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend fail2ban /etc/snmp/fail2ban If you want to use the cache, it is as below, by using the -c switch. extend fail2ban /etc/snmp/fail2ban -c If you want to use the cache and update it if needed, this can by using the -c and -U switches. extend fail2ban /etc/snmp/fail2ban -c -U If you need to specify a custom location for the fail2ban-client, that can be done via the -f switch. extend fail2ban /etc/snmp/fail2ban -f /foo/bin/fail2ban-client If not specified, \"/usr/bin/env fail2ban-client\" is used. Restart snmpd on your host If you wish to use caching, add the following to /etc/crontab and restart cron. */3 * * * * root /etc/snmp/fail2ban -u Restart or reload cron on your system. If you have more than a few jails configured, you may need to use caching as each jail needs to be polled and fail2ban-client can't do so in a timely manner for than a few. This can result in failure of other SNMP information being polled. For additional details of the switches, please see the POD in the script it self at the top. FreeBSD NFS Client SNMP Extend Copy the shell script, fbsdnfsserver, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/fbsdnfsclient -O /etc/snmp/fbsdnfsclient Make the script executable chmod +x /etc/snmp/fbsdnfsclient Edit your snmpd.conf file and add: extend fbsdnfsclient /etc/snmp/fbsdnfsclient Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. FreeBSD NFS Server SNMP Extend Copy the shell script, fbsdnfsserver, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/fbsdnfsserver -O /etc/snmp/fbsdnfsserver Make the script executable chmod +x /etc/snmp/fbsdnfsserver Edit your snmpd.conf file and add: extend fbsdnfsserver /etc/snmp/fbsdnfsserver Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. FreeRADIUS The FreeRADIUS application extension requires that status_server be enabled in your FreeRADIUS config. For more information see: https://wiki.freeradius.org/config/Status You should note that status requests increment the FreeRADIUS request stats. So LibreNMS polls will ultimately be reflected in your stats/charts. Go to your FreeRADIUS configuration directory (usually /etc/raddb or /etc/freeradius). cd sites-enabled ln -s ../sites-available/status status Restart FreeRADIUS. You should be able to test with the radclient as follows... echo \"Message-Authenticator = 0x00, FreeRADIUS-Statistics-Type = 31, Response-Packet-Type = Access-Accept\" | \\ radclient -x localhost:18121 status adminsecret Note that adminsecret is the default secret key in status_server. Change if you've modified this. SNMP Extend Copy the freeradius shell script, to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/freeradius.sh -O /etc/snmp/freeradius.sh Make the script executable chmod +x /etc/snmp/freeradius.sh If you've made any changes to the FreeRADIUS status_server config (secret key, port, etc.) edit freeradius.sh and adjust the config variable accordingly. Edit your snmpd.conf file and add: extend freeradius /etc/snmp/freeradius.sh Restart snmpd on the host in question. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Agent Install the script to your agent wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/freeradius.sh -O /usr/lib/check_mk_agent/local/freeradius.sh` Make the script executable chmod +x /usr/lib/check_mk_agent/local/freeradius.sh If you've made any changes to the FreeRADIUS status_server config (secret key, port, etc.) edit freeradius.sh and adjust the config variable accordingly. Edit the freeradius.sh script and set the variable 'AGENT' to '1' in the config. Freeswitch A small shell script that reports various Freeswitch call status. Agent Install the agent on this device if it isn't already and copy the freeswitch script to /usr/lib/check_mk_agent/local/ wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/freeswitch -O /usr/lib/check_mk_agent/local/freeswitch` Make the script executable chmod +x /usr/lib/check_mk_agent/local/freeswitch Configure FSCLI in the script. You may also have to create an /etc/fs_cli.conf file if your fs_cli command requires authentication. Verify it is working by running /usr/lib/check_mk_agent/local/freeswitch SNMP Extend Download the script onto the desired host wget https://github.com/librenms/librenms-agent/raw/master/agent-local/freeswitch -O /etc/snmp/freeswitch Make the script executable chmod +x /etc/snmp/freeswitch Configure FSCLI in the script. You may also have to create an /etc/fs_cli.conf file if your fs_cli command requires authentication. Verify it is working by running /etc/snmp/freeswitch Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend freeswitch /etc/snmp/freeswitch Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. GPSD SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/gpsd -O /etc/snmp/gpsd Make the script executable chmod +x /etc/snmp/gpsd Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend gpsd /etc/snmp/gpsd Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading at the top of the page. Agent Install the agent on this device if it isn't already and copy the gpsd script to /usr/lib/check_mk_agent/local/ You may need to configure $server or $port . Verify it is working by running /usr/lib/check_mk_agent/local/gpsd HV Monitor HV Monitor provides a generic way to monitor hypervisors. Currently CBSD+bhyve on FreeBSD and Libvirt+QEMU on Linux are support. For more information see HV::Monitor on Github or MetaCPAN . SNMP Extend Install the SNMP Extend. For Debian based systems this is as below. apt-get install zlib1g-dev cpanminus libjson-perl cpanm HV::Monitor And on FreeBSD as below. pkg install p5-App-cpanminus p5-JSON p5-MIME-Base64 p5-Gzip-Faster cpanm HV::Monitor Set it up to be be ran by cron by root. Yes, you can directly call this script from SNMPD, but be aware, especially with Libvirt, there is a very real possibility of the snmpget timing out, especially if a VM is spinning up/down as virsh domstats can block for a few seconds or so then. */5 * * * * /usr/local/bin/hv_monitor > /var/cache/hv_monitor.json -c 2> /dev/null Setup snmpd.conf as below. extend hv-monitor /bin/cat /var/cache/hv_monitor.json Restart SNMPD. Either wait for it to be re-discovered or manually enable it. Icecast Shell script that reports load average/memory/open-files stats of Icecast SNMP Extend Copy the shell script, icecast-stats.sh, to the desired host (the host must be added to LibreNMS devices) wget https://github.com/librenms/librenms-agent/raw/master/snmp/icecast-stats.sh -O /etc/snmp/icecast-stats.sh Make the script executable chmod +x /etc/snmp/icecast-stats.sh Verify it is working by running /etc/snmp/icecast-stats.sh Edit your snmpd.conf file (usually /etc/snmp/icecast-stats.sh ) and add: extend icecast /etc/snmp/icecast-stats.sh ISC DHCP Stats A small python3 script that reports current DHCP leases stats and pool usage of ISC DHCP Server. Also you have to install the dhcpd-pools and the required Perl modules. Under Ubuntu/Debian just run apt install cpanminus ; cpanm Net::ISC::DHCPd::Leases Mime::Base64 File::Slurp or under FreeBSD pkg install p5-JSON p5-MIME-Base64 p5-App-cpanminus p5-File-Slurp ; cpanm Net::ISC::DHCPd::Leases . SNMP Extend Copy the shell script to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/dhcp -O /etc/snmp/dhcp Make the script executable chmod +x /etc/snmp/dhcp Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: # without using cron extend dhcpstats /etc/snmp/dhcp -Z # using cron extend dhcpstats /bin/cat /var/cache/dhcp_extend If on a slow system running it via cron may be needed. */5 * * * * /etc/snmp/dhcp -Z -w /var/cache/dhcp_extend The following options are also supported. Option Description -c $file Path to dhcpd.conf. -l $file Path to lease file. -Z Enable GZip+Base64 compression. -d Do not de-dup. -w $file File to write it out to. Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Logsize SNMP Extend Download the script and make it executable. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/logsize -O /etc/snmp/logsize chmod +x /etc/snmp/logsize Install the requirements. # FreeBSD pkg install p5-File-Find-Rule p5-JSON p5-TOML p5-Time-Piece p5-MIME-Base64 p5-File-Slurp p5-Statistics-Lite # Debian apt-get install cpanminus cpanm File::Find::Rule JSON TOML Time::Piece MIME::Base64 File::Slurp Statistics::Lite Configure the config at /usr/local/etc/logsize.conf . You can find the documentation for the config file in the extend. Below is a small example. # monitor log sizes of logs directly udner /var/log [sets.var_log] dir=\"/var/log/\" # monitor remote logs from network devices [sets.remote_network] dir=\"/var/log/remote/network/\" # monitor remote logs from windows sources [sets.remote_windows] dir=\"/var/log/remote/windows/\" # monitor suricata flows logs sizes [sets.suricata_flows] dir=\"/var/log/suricata/flows/current\" If the directories all readable via SNMPD, this script can be ran via snmpd. Otherwise it needs setup in cron. Similarly is processing a large number of files, it may also need setup in cron if it takes the script awhile to run. */5 * * * * /etc/snmp/logsize -b 2> /dev/null > /dev/null Make sure that /var/cache/logsize_extend exists and is writable by the user running the extend. mkdir -p /var/cache/logsize_extend Configure it in the SNMPD config. # if not using cron extend logsize /etc/snmp/logsize -b # if using cron extend logsize /bin/cat /var/cache/logsize_extend/extend_return linux_config_files linux_config_files is an application intended to monitor a Linux distribution's configuration files via that distribution's configuration management tool/system. At this time, ONLY RPM-based (Fedora/RHEL) SYSTEMS ARE SUPPORTED utilizing the rpmconf tool. The linux_config_files application collects and graphs the total count of configuration files that are out of sync and graphs that number. Fedora/RHEL: Rpmconf is a utility that analyzes rpm configuration files using the RPM Package Manager. Rpmconf reports when a new configuration file standard has been issued for an upgraded/downgraded piece of software. Typically, rpmconf is used to provide a diff of the current configuration file versus the new, standard configuration file. The administrator can then choose to install the new configuration file or keep the old one. SNMP Extend Copy the python script, linux_config_files.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/linux_config_files.py -O /etc/snmp/linux_config_files.py Make the script executable chmod +x /etc/snmp/linux_config_files.py Edit your snmpd.conf file and add: extend linux_config_files /etc/snmp/linux_config_files.py (Optional on an RPM-based distribution) Create a /etc/snmp/linux_config_files.json file and specify the following: \"pkg_system\" - String designating the distribution name of the system. At the moment only \"rpm\" is supported [\"rpm\"] \"pkg_tool_cmd\" - String path to the package tool binary [\"/sbin/rpmconf\"] { \"pkg_system\": \"rpm\", \"pkg_tool_cmd\": \"/bin/rpmconf\", } Restart snmpd. Linux Softnet Stat SNMP Extend 1: Install the depends, which on a Debian based system would be as below. apt-get install -y cpanminus zlib1g-dev cpanm File::Slurp MIME::Base64 JSON Gzip::Faster Download the script into the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/linux_softnet_stat -O /etc/snmp/linux_softnet_stat Make the script executable chmod +x /etc/snmp/linux_softnet_stat Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend linux_softnet_stat /etc/snmp/linux_softnet_stat -b Then either enable the application Linux Softnet Stat or wait for it to be re-discovered. mailcow-dockerized postfix SNMP Extend Download the script into the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/mailcow-dockerized-postfix -O /etc/snmp/mailcow-dockerized-postfix Make the script executable chmod +x /etc/snmp/mailcow-dockerized-postfix Maybe you will need to install pflogsumm on debian based OS. Please check if you have package installed. Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend mailcow-postfix /etc/snmp/mailcow-dockerized-postfix Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Mailscanner SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/mailscanner.php -O /etc/snmp/mailscanner.php Make the script executable chmod +x /etc/snmp/mailscanner.php Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend mailscanner /etc/snmp/mailscanner.php Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Mdadm It allows you to checks mdadm health and array data This script require: jq SNMP Extend Install jq sudo apt install jq Download the script onto the desired host. sudo wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/mdadm -O /etc/snmp/mdadm Make the script executable sudo chmod +x /etc/snmp/mdadm Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend mdadm /etc/snmp/mdadm Verify it is working by running sudo /etc/snmp/mdadm Restart snmpd on your host sudo service snmpd restart The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. MegaRAID This software from Broadcom/LSI let you monitor MegaRAID controller. Download the external software and follow the included install instructions. Add the following line to your snmpd.conf file (usually /etc/snmp/snmpd.conf) pass .1.3.6.1.4.1.3582 /usr/sbin/lsi_mrdsnmpmain Restart snmpd on your host Memcached SNMP Extend Copy the memcached script to /etc/snmp/ on your remote server. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/memcached -O /etc/snmp/memcached Make the script executable: chmod +x /etc/snmp/memcached Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend memcached /etc/snmp/memcached Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Mojo CAPE Submit SNMP This assumes you've already configured mojo_cape_submit from CAPE::Utils. Add the following to snmpd.conf and restarted SNMPD extend mojo_cape_submit /usr/local/bin/mojo_cape_submit_extend Then just wait for the machine in question to be rediscovered or enabled it in the device settings app page. Munin Agent Install the script to your agent: wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/munin -O /usr/lib/check_mk_agent/local/munin Make the script executable chmod +x /usr/lib/check_mk_agent/local/munin Create the munin scripts dir: mkdir -p /usr/share/munin/munin-scripts Install your munin scripts into the above directory. To create your own custom munin scripts, please see this example: #!/bin/bash if [ \" $1 \" = \"config\" ] ; then echo 'graph_title Some title' echo 'graph_args --base 1000 -l 0' #not required echo 'graph_vlabel Some label' echo 'graph_scale no' #not required, can be yes/no echo 'graph_category system' #Choose something meaningful, can be anything echo 'graph_info This graph shows something awesome.' #Short desc echo 'foobar.label Label for your unit' # Repeat these two lines as much as you like echo 'foobar.info Desc for your unit.' exit 0 fi echo -n \"foobar.value \" $( date +%s ) #Populate a value, here unix-timestamp MySQL Create the cache directory, '/var/cache/librenms/' and make sure that it is owned by the user running the SNMP daemon. mkdir -p /var/cache/librenms/ The MySQL script requires PHP-CLI and the PHP MySQL extension, so please verify those are installed. CentOS (May vary based on PHP version) yum install php-cli php-mysql Debian (May vary based on PHP version) apt-get install php-cli php-mysql Unlike most other scripts, the MySQL script requires a configuration file mysql.cnf in the same directory as the extend or agent script with following content: snmpd_nginx.te module snmpd_nginx 1.0; require { type httpd_t; type http_port_t; type snmpd_t; class tcp_socket name_connect; } #============= snmpd_t ============== allow snmpd_t http_port_t:tcp_socket name_connect; EOF checkmodule -M -m -o snmpd_nginx.mod snmpd_nginx.te semodule_package -o snmpd_nginx.pp -m snmpd_nginx.mod semodule -i snmpd_nginx.pp Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Agent Install the agent on this device if it isn't already and copy the nginx script to /usr/lib/check_mk_agent/local/ NFS Server Export the NFS stats from as server. SNMP Extend Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add : extend nfs-server /bin/cat /proc/net/rpc/nfsd find out where cat is located using : which cat reload snmpd service to activate the configuration NTP Client A shell script that gets stats from ntp client. SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/ntp-client -O /etc/snmp/ntp-client Make the script executable chmod +x /etc/snmp/ntp-client Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ntp-client /etc/snmp/ntp-client Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. NTP Server aka NTPD A shell script that gets stats from ntp server (ntpd). SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/ntp-server.sh -O /etc/snmp/ntp-server.sh Make the script executable chmod +x /etc/snmp/ntp-server.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ntp-server /etc/snmp/ntp-server.sh Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Chronyd A shell script that gets the stats from chronyd and exports them with SNMP Extend. SNMP Extend Download the shell script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/chrony -O /etc/snmp/chrony Make the script executable chmod +x /etc/snmp/chrony Edit the snmpd.conf file to include the extend by adding the following line to the end of the config file: extend chronyd /etc/snmp/chrony Note: Some distributions need sudo-permissions for the script to work with SNMP Extend. See the instructions on the section SUDO for more information. Restart snmpd service on the host Application should be auto-discovered and its stats presented on the Apps-page on the host. Note: Applications module needs to be enabled on the host or globally for the statistics to work as intended. Nvidia GPU SNMP Extend Copy the shell script, nvidia, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/nvidia -O /etc/snmp/nvidia Make the script executable chmod +x /etc/snmp/nvidia Edit your snmpd.conf file and add: extend nvidia /etc/snmp/nvidia Restart snmpd on your host. Verify you have nvidia-smi installed, which it generally should be if you have the driver from Nvida installed. The GPU numbering on the graphs will correspond to how the nvidia-smi sees them as being. For questions about what the various values are/mean, please see the nvidia-smi man file under the section covering dmon. Opensearch\\Elasticsearch SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/opensearch -O /etc/snmp/opensearch Make it executable chmod +x /etc/snmp/opensearch Install the required Perl dependencies. # FreeBSD pkg install p5-JSON p5-libwww # Debian/Ubuntu apt-get install libjson-perl libwww-perl # cpanm cpanm JSON Libwww Update your snmpd.conf. extend opensearch /bin/cat /var/cache/opensearch.json Update root crontab with. This is required as it will this will likely time out otherwise. Use */1 if you want to have the most recent stats when polled or to */5 if you just want at exactly a 5 minute interval. */5 * * * * /etc/snmp/opensearch > /var/cache/opensearch.json Enable it or wait for the device to be re-disocvered. Open Grid Scheduler Shell script to track the OGS/GE jobs running on clusters. SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/rocks.sh -O /etc/snmp/rocks.sh Make the script executable chmod +x /etc/snmp/rocks.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ogs /etc/snmp/rocks.sh Restart snmpd. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Opensips Script that reports load-average/memory/open-files stats of Opensips SNMP Extend Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/opensips-stats.sh -O /etc/snmp/opensips-stats.sh Make the script executable: chmod +x /etc/snmp/opensips-stats.sh Verify it is working by running /etc/snmp/opensips-stats.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend opensips /etc/snmp/opensips-stats.sh OS Updates A small shell script that checks your system package manager for any available updates. Supports apt-get/pacman/yum/zypper package managers. For pacman users automatically refreshing the database, it is recommended you use an alternative database location --dbpath=/var/lib/pacman/checkupdate SNMP Extend Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/osupdate -O /etc/snmp/osupdate Make the script executable chmod +x /etc/snmp/osupdate Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend osupdate /etc/snmp/osupdate Restart snmpd on your host Note : apt-get depends on an updated package index. There are several ways to have your system run apt-get update automatically. The easiest is to create /etc/apt/apt.conf.d/10periodic and pasting the following in it: APT::Periodic::Update-Package-Lists \"1\"; . If you have apticron, cron-apt or apt-listchanges installed and configured, chances are that packages are already updated periodically . The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Agent Install the agent on this device if it isn't already and copy the osupdate script to /usr/lib/check_mk_agent/local/ Then uncomment the line towards the top marked to be uncommented if using it as a agent. PHP-FPM SNMP Extend Copy the shell script, phpfpmsp, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/phpfpmsp -O /etc/snmp/phpfpmsp Make the script executable chmod +x /etc/snmp/phpfpmsp Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend phpfpmsp /etc/snmp/phpfpmsp Edit /etc/snmp/phpfpmsp to include the status URL for the PHP-FPM pool you are monitoring. Restart snmpd on your host It is worth noting that this only monitors a single pool. If you want to monitor multiple pools, this won't do it. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Agent Install the agent on this device if it isn't already and copy the phpfpmsp script to /usr/lib/check_mk_agent/local/ Pi-hole SNMP Extend Copy the shell script, pi-hole, to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/pi-hole -O /etc/snmp/pi-hole Make the script executable chmod +x /etc/snmp/pi-hole Edit your snmpd.conf file and add: extend pi-hole /etc/snmp/pi-hole To get all data you must get your API auth token from Pi-hole server and change the API_AUTH_KEY entry inside the snmp script. Restard snmpd. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Portactivity SNMP Extend Install missing packages - Ubuntu is shown below. apt install libparse-netstat-perl apt install libjson-perl Copy the Perl script to the desired host (the host must be added to LibreNMS devices) wget https://github.com/librenms/librenms-agent/raw/master/snmp/portactivity -O /etc/snmp/portactivity Make the script executable chmod +x /etc/snmp/portactivity Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend portactivity /etc/snmp/portactivity -p http,ldap,imap Will monitor HTTP, LDAP, and IMAP. The -p switch specifies what ports to use. This is a comma seperated list. These must be found in '/etc/services' or where ever NSS is set to fetch it from. If not, it will throw an error. If you want to JSON returned by it to be printed in a pretty format use the -P flag. Restart snmpd on your host. Please note that for only TCP[46] services are supported. Postfix SNMP Extend Copy the shell script, postfix-queues, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/postfix-queues -O /etc/snmp/postfix-queues Copy the Perl script, postfixdetailed, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/postfixdetailed -O /etc/snmp/postfixdetailed Make both scripts executable chmod +x /etc/snmp/postfixdetailed /etc/snmp/postfix-queues Edit your snmpd.conf file and add: extend mailq /etc/snmp/postfix-queues extend postfixdetailed /etc/snmp/postfixdetailed Restart snmpd. Install pflogsumm for your OS. Make sure the cache file in /etc/snmp/postfixdetailed is some place that snmpd can write too. This file is used for tracking changes between various values between each time it is called by snmpd. Also make sure the path for pflogsumm is correct. Run /etc/snmp/postfixdetailed to create the initial cache file so you don't end up with some crazy initial starting value. Please note that each time /etc/snmp/postfixdetailed is ran, the cache file is updated, so if this happens in between LibreNMS doing it then the values will be thrown off for that polling period. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. NOTE: If using RHEL for your postfix server, qshape must be installed manually as it is not officially supported. CentOs 6 rpms seem to work without issues. Postgres SNMP Extend Copy the shell script, postgres, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/postgres -O /etc/snmp/postgres Make the script executable chmod +x /etc/snmp/postgres Edit your snmpd.conf file and add: extend postgres /etc/snmp/postgres Restart snmpd on your host Install the Nagios check check_postgres.pl on your system: https://github.com/bucardo/check_postgres Verify the path to check_postgres.pl in /etc/snmp/postgres is correct. (Optional) If you wish to change the DB username (default: pgsql), enable the postgres DB in totalling (e.g. set ignorePG to 0, default: 1), or set a hostname for check_postgres.pl to connect to (default: the Unix Socket postgresql is running on), then create the file /etc/snmp/postgres.config with the following contents (note that not all of them need be defined, just whichever you'd like to change): DBuser=monitoring ignorePG=0 DBhost=localhost Note that if you are using netdata or the like, you may wish to set ignorePG to 1 or otherwise that total will be very skewed on systems with light or moderate usage. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. PowerDNS An authoritative DNS server: https://www.powerdns.com/auth.html SNMP Extend Copy the shell script, powerdns.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/powerdns.py -O /etc/snmp/powerdns.py Make the script executable chmod +x /etc/snmp/powerdns.py Edit your snmpd.conf file and add: extend powerdns /etc/snmp/powerdns.py Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Agent Install the agent on this device if it isn't already and copy the powerdns script to /usr/lib/check_mk_agent/local/ PowerDNS Recursor A recursive DNS server: https://www.powerdns.com/recursor.html Direct The LibreNMS polling host must be able to connect to port 8082 on the monitored device. The web-server must be enabled, see the Recursor docs: https://doc.powerdns.com/md/recursor/settings/#webserver Variables $config['apps']['powerdns-recursor']['api-key'] required, this is defined in the Recursor config $config['apps']['powerdns-recursor']['port'] numeric, defines the port to connect to PowerDNS Recursor on. The default is 8082 $config['apps']['powerdns-recursor']['https'] true or false, defaults to use http. SNMP Extend Copy the shell script, powerdns-recursor, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/powerdns-recursor -O /etc/snmp/powerdns-recursor Make the script executable chmod +x /etc/snmp/powerdns-recursor Edit your snmpd.conf file and add: extend powerdns-recursor /etc/snmp/powerdns-recursor Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Agent Install the agent on this device if it isn't already and copy the powerdns-recursor script to /usr/lib/check_mk_agent/local/ This script uses rec_control get-all to collect stats. PowerDNS-dnsdist SNMP Extend Copy the BASH script to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/powerdns-dnsdist -O /etc/snmp/powerdns-dnsdist Make the script executable chmod +x /etc/snmp/powerdns-dnsdist Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend powerdns-dnsdist /etc/snmp/powerdns-dnsdist Restart snmpd on your host. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. PowerMon PowerMon tracks the power usage on your host and can report on both consumption and cost, using a python script installed on the host. PowerMon consumption graph Currently the script uses one of two methods to determine current power usage: ACPI via libsensors HP-Health (HP Proliant servers only) The ACPI method is quite unreliable as it is usually only implemented by battery-powered devices, e.g. laptops. YMMV. However, it's possible to support any method as long as it can return a power value, usually in Watts. TIP: You can achieve this by adding a method and a function for that method to the script. It should be called by getData() and return a dictionary. Because the methods are unreliable for all hardware, you need to declare to the script which method to use. The are several options to assist with testing, see --help . SNMP Extend Initial setup Download the python script onto the host: wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/powermon-snmp.py -O /usr/local/bin/powermon-snmp.py Make the script executable: chmod +x /usr/local/bin/powermon-snmp.py Edit the script and set the cost per kWh for your supply. You must uncomment this line for the script to work: vi /usr/local/bin/powermon-snmp.py #costPerkWh = 0.15 Choose you method below: Method 1. sensors Method 2. hpasmcli Install dependencies: dnf install lm_sensors pip install PySensors Test the script from the command-line. For example: $ /usr/local/bin/powermon-snmp.py -m sensors -n -p { \"meter\": { \"0\": { \"reading\": 0.0 } }, \"psu\": {}, \"supply\": { \"rate\": 0.15 }, \"reading\": \"0.0\" } If you see a reading of 0.0 it is likely this method is not supported for your system. If not, continue. Obtain the hp-health package for your system. Generally there are three options: Standalone package from HPE Support From the HP Management Component Pack (MCP). Included in the HP Service Pack for Proliant (SPP) If you've downloaded the standalone package, install it. For example: rpm -ivh hp-health-10.91-1878.11.rhel8.x86_64.rpm Check the service is running: systemctl status hp-health Test the script from the command-line. For example: $ /usr/local/bin/powermon-snmp.py -m hpasmcli -n -p { \"meter\": { \"1\": { \"reading\": 338.0 } }, \"psu\": { \"1\": { \"present\": \"Yes\", \"redundant\": \"No\", \"condition\": \"Ok\", \"hotplug\": \"Supported\", \"reading\": 315.0 }, \"2\": { \"present\": \"Yes\", \"redundant\": \"No\", \"condition\": \"FAILED\", \"hotplug\": \"Supported\" } }, \"supply\": { \"rate\": 0.224931 }, \"reading\": 338.0 } If you see a reading of 0.0 it is likely this method is not supported for your system. If not, continue. Finishing Up Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add the following: extend powermon /usr/local/bin/powermon-snmp.py -m hpasmcli NOTE: Avoid using other script options in the snmpd config as the results may not be interpreted correctly by LibreNMS. Reload your snmpd service: systemctl reload snmpd You're now ready to enable the application in LibreNMS. Privoxy For this to work, the following log items need enabled for Privoxy. debug 2 # show each connection status debug 512 # Common Log Format debug 1024 # Log the destination for requests Privoxy didn't let through, and the reason why. debug 4096 # Startup banner and warnings debug 8192 # Non-fatal errors SNMP Extend Download the extend and make sure it is executable. wget https://github.com/librenms/librenms-agent/raw/master/snmp/privoxy -O /etc/snmp/privoxy chmod +x /etc/snmp/privoxy Install the depdenencies. # FreeBSD pkg install p5-File-ReadBackwards p5-Time-Piece p5-JSON p5-IPC-Run3 p5-Gzip-Faster p5-MIME-Base64 # Debian apt-get install cpanminus zlib1g cpanm File::ReadBackwards Time::Piece JSON IPC::Run3 MIME::Base64 Gzip::Faster Add the extend to snmpd.conf and restart snmpd. extend privoxy /etc/snmp/privoxy If your logfile is not at /var/log/privoxy/logfile , that may be changed via the -f option. If privoxy-log-parser.pl is not found in your standard $PATH setting, you may will need up call the extend via /usr/bin/env with a $PATH set to something that includes it. Once that is done, just wait for the server to be rediscovered or just enable it manually. Pwrstatd Pwrstatd (commonly known as powerpanel) is an application/service available from CyberPower to monitor their PSUs over USB. It is currently capable of reading the status of only one PSU connected via USB at a time. The powerpanel software is available here: https://www.cyberpowersystems.com/products/software/power-panel-personal/ SNMP Extend Copy the python script, pwrstatd.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/pwrstatd.py -O /etc/snmp/pwrstatd.py Make the script executable chmod +x /etc/snmp/pwrstatd.py Edit your snmpd.conf file and add: extend pwrstatd /etc/snmp/pwrstatd.py (Optional) Create a /etc/snmp/pwrstatd.json file and specify the path to the pwrstat executable [the default path is /sbin/pwrstat]: { \"pwrstat_cmd\": \"/sbin/pwrstat\" } Restart snmpd. Proxmox For Proxmox 4.4+ install the libpve-apiclient-perl package apt install libpve-apiclient-perl Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/proxmox -O /usr/local/bin/proxmox Make the script executable chmod +x /usr/local/bin/proxmox Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend proxmox /usr/local/bin/proxmox Note: if your snmpd doesn't run as root, you might have to invoke the script using sudo and modify the \"extend\" line extend proxmox /usr/bin/sudo /usr/local/bin/proxmox after, edit your sudo users (usually visudo ) and add at the bottom: Debian-snmp ALL=(ALL) NOPASSWD: /usr/local/bin/proxmox Restart snmpd on your host Puppet Agent SNMP extend script to get your Puppet Agent data into your host. SNMP Extend Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/puppet_agent.py -O /etc/snmp/puppet_agent.py Make the script executable chmod +x /etc/snmp/puppet_agent.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend puppet-agent /etc/snmp/puppet_agent.py The Script needs python3-yaml package to be installed. Per default script searches for on of this files: /var/cache/puppet/state/last_run_summary.yaml /opt/puppetlabs/puppet/cache/state/last_run_summary.yaml optionally you can add a specific summary file with creating /etc/snmp/puppet.json { \"agent\": { \"summary_file\": \"/my/custom/path/to/summary_file\" } } custom summary file has highest priority Restart snmpd on the host PureFTPd SNMP extend script to monitor PureFTPd. SNMP Extend Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/pureftpd.py -O /etc/snmp/pureftpd.py Make the script executable chmod +x /etc/snmp/pureftpd.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend pureftpd sudo /etc/snmp/pureftpd.py Edit your sudo users (usually visudo ) and add at the bottom: snmp ALL=(ALL) NOPASSWD: /etc/snmp/pureftpd.py or the path where your pure-ftpwho is located If pure-ftpwho is not located in /usr/sbin you will also need to create a config file, which is named pureftpd.json. The file has to be located in /etc/snmp/. {\"pureftpwho_cmd\": \"/usr/sbin/pure-ftpwho\" } Restart snmpd on your host Raspberry PI SNMP extend script to get your PI data into your host. SNMP Extend Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/raspberry.sh -O /etc/snmp/raspberry.sh Make the script executable chmod +x /etc/snmp/raspberry.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend raspberry /usr/bin/sudo /bin/sh /etc/snmp/raspberry.sh Edit your sudo users (usually visudo ) and add at the bottom: snmp ALL=(ALL) NOPASSWD: /bin/sh /etc/snmp/raspberry.sh Note: If you are using Raspian, the default user is Debian-snmp . Change snmp above to Debian-snmp . You can verify the user snmpd is using with ps aux | grep snmpd Restart snmpd on PI host Raspberry Pi GPIO Monitor SNMP extend script to monitor your IO pins or sensor modules connected to your GPIO header. SNMP Extend 1: Make sure you have wiringpi installed on your Raspberry Pi. In Debian-based systems for example you can achieve this by issuing: apt-get install wiringpi 2: Download the script to your Raspberry Pi. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/rpigpiomonitor.php -O /etc/snmp/rpigpiomonitor.php 3: (optional) Download the example configuration to your Raspberry Pi. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/rpigpiomonitor.ini -O /etc/snmp/rpigpiomonitor.ini 4: Make the script executable: chmod +x /etc/snmp/rpigpiomonitor.php 5: Create or edit your rpigpiomonitor.ini file according to your needs. 6: Check your configuration with rpigpiomonitor.php -validate 7: Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend rpigpiomonitor /etc/snmp/rpigpiomonitor.php 8: Restart snmpd on your Raspberry Pi and, if your Raspberry Pi is already present in LibreNMS, perform a manual rediscover. Redis Script to monitor your Redis Server SNMP Extend Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/redis.py -O /etc/snmp/redis.py Make the script executable chmod +x /etc/snmp/redis.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend redis /etc/snmp/redis.py (Optional) If you have SELinux in Enforcing mode, you must add a module so the script can get redis informations and write them: cat << EOF > snmpd_redis.te module snmpd_redis 1.0; require { type tmp_t; type redis_port_t; type snmpd_t; class tcp_socket name_connect; class dir { add_name write }; } #============= snmpd_t ============== allow snmpd_t redis_port_t:tcp_socket name_connect; allow snmpd_t tmp_t:dir { write add_name }; EOF checkmodule -M -m -o snmpd_redis.mod snmpd_redis.te semodule_package -o snmpd_redis.pp -m snmpd_redis.mod semodule -i snmpd_redis.pp Agent Install the agent on this device if it isn't already and copy the redis script to /usr/lib/check_mk_agent/local/ RRDCached Install/Setup: For Install/Setup Local Librenms RRDCached: Please see RRDCached Will collect stats by: 1. Connecting directly to the associated device on port 42217 2. Monitor thru snmp with SNMP extend, as outlined below 3. Connecting to the rrdcached server specified by the rrdcached setting SNMP extend script to monitor your (remote) RRDCached via snmp SNMP Extend Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/rrdcached -O /etc/snmp/rrdcached Make the script executable chmod +x /etc/snmp/rrdcached Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend rrdcached /etc/snmp/rrdcached SDFS info A small shell script that exportfs SDFS volume info. SNMP Extend Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/sdfsinfo -O /etc/snmp/sdfsinfo Make the script executable chmod +x /etc/snmp/sdfsinfo Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend sdfsinfo /etc/snmp/sdfsinfo Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Seafile SNMP extend script to monitor your Seafile Server SNMP Extend Copy the Python script, seafile.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/seafile.py -O /etc/snmp/seafile.py Also you have to install the requests Package for Python3. Under Ubuntu/Debian just run apt install python3-requests Make the script executable chmod +x /etc/snmp/seafile.py Edit your snmpd.conf file and add: extend seafile /etc/snmp/seafile.py You will also need to create the config file, which is named seafile.json . The script has to be located at /etc/snmp/. {\"url\": \"https://seafile.mydomain.org\", \"username\": \"some_admin_login@mail.address\", \"password\": \"password\", \"account_identifier\": \"name\" \"hide_monitoring_account\": true } The variables are as below. url = Url how to get access to Seafile Server username = Login to Seafile Server. It is important that used Login has admin privileges. Otherwise most API calls will be denied. password = Password to the configured login. account_identifier = Defines how user accounts are listed in RRD Graph. Options are: name, email hide_monitoring_account = With this Boolean you can hide the Account which you use to access Seafile API Note: It is recommended to use a dedicated Administrator account for monitoring. SMART SNMP Extend Copy the Perl script, smart, to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/smart-v1 -O /etc/snmp/smart Install the depends. # FreeBSD pkg install p5-JSON p5-MIME-Base64 smartmontools # Debian apt-get install cpanminus smartmontools cpanm MIME::Base64 JSON # CentOS dnf install smartmontools perl-JSON perl-MIME-Base64 Make the script executable chmod +x /etc/snmp/smart Edit your snmpd.conf file and add: extend smart /etc/snmp/smart You will also need to create the config file, which defaults to the same path as the script, but with .config appended. So if the script is located at /etc/snmp/smart, the config file will be /etc/snmp/smart.config . Alternatively you can also specific a config via -c . Anything starting with a # is comment. The format for variables is $variable=$value. Empty lines are ignored. Spaces and tabes at either the start or end of a line are ignored. Any line with out a matched variable or # are treated as a disk. #This is a comment cache=/var/cache/smart smartctl=/usr/bin/env smartctl useSN=1 ada0 ada1 da5 /dev/da5 -d sat twl0,0 /dev/twl0 -d 3ware,0 twl0,1 /dev/twl0 -d 3ware,1 twl0,2 /dev/twl0 -d 3ware,2 The variables are as below. cache = The path to the cache file to use. Default: /var/cache/smart smartctl = The path to use for smartctl. Default: /usr/bin/env smartctl useSN = If set to 1, it will use the disks SN for reporting instead of the device name. 1 is the default. 0 will use the device name. A disk line is can be as simple as just a disk name under /dev/. Such as in the config above The line \"ada0\" would resolve to \"/dev/ada0\" and would be called with no special argument. If a line has a space in it, everything before the space is treated as the disk name and is what used for reporting and everything after that is used as the argument to be passed to smartctl. If you want to guess at the configuration, call it with -g and it will print out what it thinks it should be. Restart snmpd on your host If you have a large number of more than one or two disks on a system, you should consider adding this to cron. Also make sure the cache file is some place it can be written to. */5 * * * * /etc/snmp/smart -u If your snmp agent runs as user \"snmp\", edit your sudo users (usually visudo ) and add at the bottom: snmp ALL=(ALL) NOPASSWD: /etc/snmp/smart, /usr/bin/env smartctl and modify your snmpd.conf file accordingly, sudo can be excluded if running it via cron: extend smart /usr/bin/sudo /etc/snmp/smart The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Optionally setup nightly self tests for the disks. The exend will run the specified test on all configured disks if called with the -t flag and the name of the SMART test to run. 0 0 * * * /etc/snmp/smart -t long Sneck This is for replacing Nagios/Icinga or the LibreNMS service integration in regards to NRPE. This allows LibreNMS to query what checks were ran on the server and keep track of totals of OK, WARNING, CRITICAL, and UNKNOWN statuses. The big advantage over this compared to a NRPE are as below. It does not need to know what checks are configured on it. Also does not need to wait for the tests to run as sneck is meant to be ran via cron and the then return the cache when queried via SNMP, meaning a lot faster response time, especially if slow checks are being performed. Works over proxied SNMP connections. Included are alert examples. Although for setting up custom ones, the metrics below are provided. Metric Description ok Total OK checks warning Total WARNING checks critical Total CRITICAL checks unknown Total UNKNOWN checks errored Total checks that errored time_to_polling Differnce in seconds between when polling data was generated and when polled time_to_polling_abs The absolute value of time_to_polling. check_$CHECK Exit status of a specific check $CHECK is equal to the name of the check in question. So foo would be check_foo The standard Nagios/Icinga style exit codes are used and those are as below. Exit Meaning 0 okay 1 warning 2 critical 3+ unknown To use time_to_polling , it will need to enabled via setting the config item below. The default is false. Unless set to true, this value will default to 0. If enabling this, one will want to make sure that NTP is in use every were or it will alert if it goes over a difference of 540s. lnms config:set app.sneck.polling_time_diff true For more information on Sneck, check it out at MetaCPAN or Github . For poking systems using Sneck, also check out boop_snoot if one wants to query those systems via the CLI. Docs on it at MetaCPAN and Github . SNMP Extend Install the extend. # FreeBSD pkg install p5-JSON p5-File-Slurp p5-MIME-Base64 p5-Gzip-Faster p5-App-cpanminus cpanm Monitoring::Sneck # Debian based systems apt-get install zlib1g-dev cpanminus cpanm Monitoring::Sneck Configure any of the checks you want to run in /usr/local/etc/sneck.conf . You con find it documented here . Set it up in cron. This will mean you don't need to wait for all the checks to complete when polled via SNMP, which for like SMART or other long running checks will mean it timing out. Also means it does not need called via sudo as well. */5 * * * * /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin /usr/local/bin/sneck -u 2> /dev/null > /dev/null Set it up in the snmpd config and restart snmpd. The -c flag will tell read it to read from cache instead of rerunning the checks. extend sneck /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin /usr/local/bin/sneck -c In LibreNMS, enable the application for the server in question or wait for auto discovery to find it. Squid SNMP Proxy Enable SNMP for Squid like below, if you have not already, and restart it. acl snmppublic snmp_community public snmp_port 3401 snmp_access allow snmppublic localhost snmp_access deny all Restart squid on your host. Edit your snmpd.conf file and add, making sure you have the same community, host, and port as above: proxy -v 2c -Cc -c public 127.0.0.1:3401 1.3.6.1.4.1.3495 For more advanced information on Squid and SNMP or setting up proxying for net-snmp, please see the links below. http://wiki.squid-cache.org/Features/Snmp http://www.net-snmp.org/wiki/index.php/Snmpd_proxy Supervisord It shows you the totals per status and also the uptime per process. That way you can add alerts for instance when there are process in state FATAL . SNMP Extend Copy the python script to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/supervisord.py -O /etc/snmp/supervisord.py Notice that this will use the default unix socket path. Modify the unix_socket_path variable in the script if your path differs from the default. Make the script executable chmod +x /etc/snmp/supervisord.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend supervisord /etc/snmp/supervisord.py Restart snmpd on your host systemctl restart snmpd Sagan For metrics the stats are migrated as below from the stats JSON. f_drop_percent and drop_percent are computed based on the found data. Instance Key Stats JSON Key uptime .stats.uptime total .stats.captured.total drop .stats.captured.drop ignore .stats.captured.ignore threshold .stats.captured.theshold after .stats.captured.after match .stats.captured.match bytes .stats.captured.bytes_total bytes_ignored .stats.captured.bytes_ignored max_bytes_log_line .stats.captured.max_bytes_log_line eps .stats.captured.eps f_total .stats.flow.total f_dropped .stats.flow.dropped Those keys are appended with the name of the instance running with _ between the instance name and instance metric key. So uptime for ids would be ids_uptime . The default is named 'ids' unless otherwise specified via the extend. There is a special instance name of .total which is the total of all the instances. So if you want the total eps, the metric would be .total_eps . Also worth noting that the alert value is the highest one found among all the instances. SNMP Extend Install the extend. cpanm Sagan::Monitoring Setup cron. Below is a example. */5 * * * * /usr/local/bin/sagan_stat_check > /dev/null Configure snmpd.conf extend sagan-stats /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin sagan_stat_check -c Restart snmpd on your system. You will want to make sure that sagan is setup to with the values set below for stats-json processor, for a single instance setup.. enabled: yes time: 300 subtract_old_values: true filename: \"$LOG_PATH/stats.json\" Any configuration of sagan_stat_check should be done in the cron setup. If the default does not work, check the docs for it at MetaCPAN for sagan_stat_check Socket Statistics (ss) The Socket Statistics application polls ss and scrapes socket statuses. Individual sockets and address-families may be filtered out within the script's optional configuration JSON file. The following socket types are polled directly. Filtering a socket type will disable direct polling as-well-as indirect polling within any address-families that list the socket type as their child: dccp (also exists within address-families \"inet\" and \"inet6\") mptcp (also exists within address-families \"inet\" and \"inet6\") raw (also exists within address-families \"inet\" and \"inet6\") sctp (also exists within address-families \"inet\" and \"inet6\") tcp (also exists within address-families \"inet\" and \"inet6\") udp (also exists within address-families \"inet\" and \"inet6\") xdp The following socket types are polled within an address-family only: inet6 (within address-family \"inet6\") p_dgr (within address-family \"link\") p_raw (within address-family \"link\") ti_dg (within address-family \"tipc\") ti_rd (within address-family \"tipc\") ti_sq (within address-family \"tipc\") ti_st (within address-family \"tipc\") v_dgr (within address-family \"vsock\") v_str (within address-family \"vsock\") unknown (within address-families \"inet\", \"inet6\", \"link\", \"tipc\", and \"vsock\") The following address-families are polled directly and have their child socket types tab-indented below them. Filtering a socket type (see \"1\" above) will filter it from the address-family. Filtering an address-family will filter out all of its child socket types. However, if those socket types are not DIRECTLY filtered out (see \"1\" above), then they will continue to be monitored either directly or within other address-families in which they exist: inet dccp mptcp raw sctp tcp udp unknown inet6 dccp icmp6 mptcp raw sctp tcp udp unknown link p_dgr p_raw unknown netlink tipc ti_dg ti_rd ti_sq ti_st unknown unix u_dgr u_seq u_str vsock v_dgr v_str unknown SNMP Extend Copy the python script, ss.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/ss.py -O /etc/snmp/ss.py Make the script executable chmod +x /etc/snmp/ss.py Edit your snmpd.conf file and add: extend ss /etc/snmp/ss.py (Optional) Create a /etc/snmp/ss.json file and specify: \"ss_cmd\" - String path to the ss binary: [\"/sbin/ss\"] \"socket_types\" - A comma-delimited list of socket types to include. The following socket types are valid: dccp, icmp6, mptcp, p_dgr, p_raw, raw, sctp, tcp, ti_dg, ti_rd, ti_sq, ti_st, u_dgr, u_seq, u_str, udp, unknown, v_dgr, v_dgr, xdp. Please note that the \"unknown\" socket type is represented in /sbin/ss output with the netid \"???\". Please also note that the p_dgr and p_raw socket types are specific to the \"link\" address family; the ti_dg, ti_rd, ti_sq, and ti_st socket types are specific to the \"tipc\" address family; the u_dgr, u_seq, and u_str socket types are specific to the \"unix\" address family; and the v_dgr and v_str socket types are specific to the \"vsock\" address family. Filtering out the parent address families for the aforementioned will also filter out their specific socket types. Specifying \"all\" includes all of the socket types. For example: to include only tcp, udp, icmp6 sockets, you would specify \"tcp,udp,icmp6\": [\"all\"] \"addr_families\" - A comma-delimited list of address families to include. The following families are valid: inet, inet6, link, netlink, tipc, unix, vsock. As mentioned above under (b), filtering out the link, tipc, unix, or vsock address families will also filter out their respective socket types. Specifying \"all\" includes all of the families. For example: to include only inet and inet6 families, you would specify \"inet,inet6\": [\"all\"] { \"ss_cmd\": \"/sbin/ss\", \"socket_types\": \"all\" \"addr_families\": \"all\" } In order to filter out uncommon/unused socket types, the following JSON configuration is recommended: { \"ss_cmd\": \"/sbin/ss\", \"socket_types\": \"icmp6,p_dgr,p_raw,raw,tcp,u_dgr,u_seq,u_str,udp\", \"addr_families\": \"inet,inet6,link,netlink,unix\" } (Optional) If SELinux is in Enforcing mode, you must add a module so the script can poll sockets: cat << EOF > snmpd_ss.te module snmp_ss 1.0; require { type snmpd_t; class netlink_tcpdiag_socket { bind create getattr nlmsg_read read setopt write }; } #============= snmpd_t ============== allow snmpd_t self:netlink_tcpdiag_socket { bind create getattr nlmsg_read read setopt write }; EOF checkmodule -M -m -o snmpd_ss.mod snmpd_ss.te semodule_package -o snmpd_ss.pp -m snmpd_ss.mod semodule -i snmpd_ss.pp Restart snmpd. Suricata SNMP Extend Install the extend. cpanm Suricata::Monitoring Setup cron. Below is a example. */5 * * * * /usr/local/bin/suricata_stat_check > /dev/null Configure snmpd.conf extend suricata-stats /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin suricata_stat_check -c Or if you want to use try compressing the return via Base64+GZIP... extend suricata-stats /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin suricata_stat_check -c -b Restart snmpd on your system. You will want to make sure Suricata is set to output the stats to the eve file once a minute. This will help make sure that it won't be to far back in the file and will make sure it is recent when the cronjob runs. Any configuration of suricata_stat_check should be done in the cron setup. If the default does not work, check the docs for it at MetaCPAN for suricata_stat_check Suricata Extract SNMP Add the following to your snmpd config and restart. Path may have to be adjusted depending on where suricata_extract_submit_extend is installed to. extend suricata_extract /usr/local/bin/suricata_extract_submit_extend Then just wait for the system to be rediscovered or enable it manually for the server in question. Systemd The systemd application polls systemd and scrapes systemd units' load, activation, and sub states. SNMP Extend Copy the python script, systemd.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/systemd.py -O /etc/snmp/systemd.py Make the script executable chmod +x /etc/snmp/systemd.py Edit your snmpd.conf file and add: extend systemd /etc/snmp/systemd.py (Optional) Create a /etc/snmp/systemd.json file and specify: \"systemctl_cmd\" - String path to the systemctl binary [Default: \"/usr/bin/systemctl\"] \"include_inactive_units\" - True/False string to include inactive units in results [Default: \"False\"] { \"systemctl_cmd\": \"/bin/systemctl\", \"include_inactive_units\": \"True\" } (Optional) If you have SELinux in Enforcing mode, you must add a module so the script can access systemd state: cat << EOF > snmpd_systemctl.te module snmpd_systemctl 1.0; require { type snmpd_t; type systemd_systemctl_exec_t; type init_t; class file { execute execute_no_trans map open read }; class unix_stream_socket connectto; class system status; } #============= snmpd_t ============== allow snmpd_t init_t:system status; allow snmpd_t init_t:unix_stream_socket connectto; allow snmpd_t systemd_systemctl_exec_t:file { execute execute_no_trans map open read }; EOF checkmodule -M -m -o snmpd_systemctl.mod snmpd_systemctl.te semodule_package -o snmpd_systemctl.pp -m snmpd_systemctl.mod semodule -i snmpd_systemctl.pp Restart snmpd. TinyDNS aka djbdns Agent Install the agent on this device if it isn't already and copy the tinydns script to /usr/lib/check_mk_agent/local/ Note : We assume that you use DJB's Daemontools to start/stop tinydns. And that your tinydns instance is located in /service/dns , adjust this path if necessary. Replace your log 's run file, typically located in /service/dns/log/run with: #!/bin/sh exec setuidgid dnslog tinystats ./main/tinystats/ multilog t n3 s250000 ./main/ Create tinystats directory and chown: mkdir /service/dns/log/main/tinystats chown dnslog:nofiles /service/dns/log/main/tinystats Restart TinyDNS and Daemontools: /etc/init.d/svscan restart Note : Some say svc -t /service/dns is enough, on my install (Gentoo) it doesn't rehook the logging and I'm forced to restart it entirely. Unbound Unbound configuration: # Enable extended statistics. server: extended-statistics: yes statistics-cumulative: yes remote-control: control-enable: yes control-interface: 127.0.0.1 Restart your unbound after changing the configuration, verify it is working by running unbound-control stats . Option 1. SNMP Extend (Preferred and easiest method) Copy the shell script, unbound, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/unbound -O /etc/snmp/unbound Make the script executable chmod +x /etc/snmp/unbound Edit your snmpd.conf file and add: extend unbound /usr/bin/sudo /etc/snmp/unbound Restart snmpd. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Option 2. Agent Install the agent on this device if it isn't already and copy the unbound.sh script to /usr/lib/check_mk_agent/local/ UPS-nut A small shell script that exports nut ups status. SNMP Extend Copy the shell script, unbound, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/ups-nut.sh -O /etc/snmp/ups-nut.sh Make the script executable chmod +x /etc/snmp/ups-nut.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ups-nut /etc/snmp/ups-nut.sh Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Optionally if you have multiple UPS or your UPS is not named APCUPS you can specify its name as an argument into /etc/snmp/ups-nut.sh extend ups-nut /etc/snmp/ups-nut.sh ups1 extend ups-nut /etc/snmp/ups-nut.sh ups2 UPS-apcups A small shell script that exports apcacess ups status. SNMP Extend Copy the shell script, unbound, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/ups-apcups -O /etc/snmp/ups-apcups Make the script executable chmod +x /etc/snmp/ups-apcups Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ups-apcups /etc/snmp/ups-apcups If 'apcaccess' is not in the PATH enviromental variable snmpd is using, you may need to do something like below. extend ups-apcups/usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin /etc/snmp/ups-apcups Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Voip-monitor Shell script that reports cpu-load/memory/open-files files stats of Voip Monitor SNMP Extend Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/voipmon-stats.sh -O /etc/snmp/voipmon-stats.sh Make the script executable chmod +x /etc/snmp/voipmon-stats.sh Edit your snmpd.conf file (usually /etc/snmp/voipmon-stats.sh ) and add: extend voipmon /etc/snmp/voipmon-stats.sh Wireguard The Wireguard application polls the Wireguard service and scrapes all client statistics for all interfaces configured as Wireguard interfaces. SNMP Extend Copy the python script, wireguard.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/wireguard.py -O /etc/snmp/wireguard.py Make the script executable chmod +x /etc/snmp/wireguard.py Edit your snmpd.conf file and add: extend wireguard /etc/snmp/wireguard.py Create a /etc/snmp/wireguard.json file and specify: (optional) \"wg_cmd\" - String path to the wg binary [\"/usr/bin/wg\"] \"public_key_to_arbitrary_name\" - A dictionary to convert between the publickey assigned to the client (specified in the wireguard interface conf file) to an arbitrary, friendly name. The friendly names MUST be unique within each interface. Also note that the interface name and friendly names are used in the RRD filename, so using special characters is highly discouraged. { \"wg_cmd\": \"/bin/wg\", \"public_key_to_arbitrary_name\": { \"wg0\": { \"z1iSIymFEFi/PS8rR19AFBle7O4tWowMWuFzHO7oRlE=\": \"client1\", \"XqWJRE21Fw1ke47mH1yPg/lyWqCCfjkIXiS6JobuhTI=\": \"server.domain.com\" } } } Restart snmpd. ZFS SNMP Extend 1: Install the depends. ### FreeBSD pkg install p5-JSON p5-MIME-Base64 p5-Gzip-Faster ### Debian apt-get install -y cpanminus zlib1g-dev cpanm Mime::Base64 JSON Gzip::Faster 2: Fetch the script in question and make it executable. wget https://github.com/librenms/librenms-agent/raw/master/snmp/zfs -O /etc/snmp/zfs chmod +x /etc/snmp/zfs 3: Add the following to snmpd.conf and restart snmpd. extend zfs /etc/snmp/zfs","title":"Applications"},{"location":"Extensions/Applications/#applications","text":"You can use Application support to graph performance statistics of many applications. Different applications support a variety of ways to collect data: By direct connection to the application snmpd extend The agent . The monitoring of applications could be added before or after the hosts have been added to LibreNMS. If multiple methods of collection are listed you only need to enable one.","title":"Applications"},{"location":"Extensions/Applications/#snmp-extend","text":"When using the snmp extend method, the application discovery module will pick up which applications you have set up for monitoring automatically, even if the device is already in LibreNMS. The application discovery module is enabled by default for most *nix operating systems, but in some cases you will need to manually enable the application discovery module.","title":"SNMP Extend"},{"location":"Extensions/Applications/#sudo","text":"One major thing to keep in mind when using SNMP extend is these run as the snmpd user that can be an unprivileged user. In these situations you need to use sudo. To test if you need sudo, first check the user snmpd is running as. Then test if you can run the extend script as that user without issue. For example if snmpd is running as 'Debian-snmp' and we want to run the extend for proxmox, we check that the following run without error: sudo -u Debian-snmp /usr/local/bin/proxmox If it doesn't work, then you will need to use sudo with the extend command. For the example above, that would mean adding the line below to the sudoers file: Debian-snmp ALL = NOPASSWD: /usr/local/bin/proxmox Finally we would need to add sudo to the extend command, which would look like that for proxmox: extend proxmox /usr/bin/sudo /usr/local/bin/proxmox","title":"SUDO"},{"location":"Extensions/Applications/#json-return-optimization-using-librenms_return_optimizer","text":"While the json_app_get does allow for more complex and larger data to be easily returned by a extend and the data to then be worked with, this can also sometimes result in large returns that occasionally don't play nice with SNMP on some networks. librenms_return_optimizer fixes this via taking the extend output piped to it, gzipping it, and then converting it to base64. The later is needed as net-snmp does not play that nice with binary data, converting most of the non-printable characters to . . This does add a bit of additional overhead to the gzipped data, but still tends to be result in a return that is usually a third of the size for JSONs items. The change required is fairly simply. So for the portactivity example below... extend portactivity /etc/snmp/extends/portactivity smtps,http,imap,imaps,postgresql,https,ldap,ldaps,nfsd,syslog-conn,ssh,matrix,gitea Would become this... extend portactivity /usr/local/bin/lnms_return_optimizer -- /etc/snmp/extends/portactivity smtps,http,imap,imaps,postgresql,https,ldap,ldaps,nfsd,syslog-conn,ssh,matrix,gitea The requirements for this are Perl, MIME::Base64, and Gzip::Faster. Installing on FreeBSD... pkg install p5-MIME-Base64 p5-Gzip-Faster wget wget https://raw.githubusercontent.com/librenms/librenms-agent/master/utils/librenms_return_optimizer -O /usr/local/bin/librenms_return_optimizer chmod +x /usr/local/bin/librenms_return_optimizer Installing on Debian... apt-get install zlib1g-dev cpanminus wget cpanm Gzip::Faster cpanm MIME::Base64 wget https://raw.githubusercontent.com/librenms/librenms-agent/master/utils/librenms_return_optimizer -O /usr/local/bin/librenms_return_optimizer chmod +x /usr/local/bin/librenms_return_optimizer Currently supported applications as are below. backupninja certificate chronyd dhcp-stats docker fail2ban fbsd-nfs-client fbsd-nfs-server gpsd mailcow-postfix mdadm ntp-client ntp-server portactivity powerdns powermon puppet-agent pureftpd redis seafile supervisord ups-apcups zfs The following apps have extends that have native support for this, if congiured to do so. suricata","title":"JSON Return Optimization Using librenms_return_optimizer"},{"location":"Extensions/Applications/#enable-the-application-discovery-module","text":"Edit the device for which you want to add this support Click on the Modules tab and enable the applications module. This will be automatically saved, and you should get a green confirmation pop-up message. After you have enabled the application module, it would be wise to then also enable which applications you want to monitor, in the rare case where LibreNMS does not automatically detect it. Note : Only do this if an application was not auto-discovered by LibreNMS during discovery and polling.","title":"Enable the application discovery module"},{"location":"Extensions/Applications/#enable-the-applications-to-be-discovered","text":"Go to the device you have just enabled the application module for. Click on the Applications tab and select the applications you want to monitor. This will also be automatically saved, and you should get a green confirmation pop-up message.","title":"Enable the application(s) to be discovered"},{"location":"Extensions/Applications/#agent","text":"The unix-agent does not have a discovery module, only a poller module. That poller module is always disabled by default. It needs to be manually enabled if using the agent. Some applications will be automatically enabled by the unix-agent poller module. It is better to ensure that your application is enabled for monitoring. You can check by following the steps under the SNMP Extend heading.","title":"Agent"},{"location":"Extensions/Applications/#apache","text":"Either use SNMP extend or use the agent. Note that you need to install and configure the Apache mod_status module before trying the script.","title":"Apache"},{"location":"Extensions/Applications/#snmp-extend_1","text":"Download the script onto the desired host (the host must be added to LibreNMS devices) wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/apache-stats.py -O /etc/snmp/apache-stats.py Make the script executable chmod +x /etc/snmp/apache-stats.py Create the cache directory, '/var/cache/librenms/' and make sure that it is owned by the user running the SNMP daemon. mkdir -p /var/cache/librenms/ Verify it is working by running /etc/snmp/apache-stats.py Package urllib3 for python3 needs to be installed. In Debian-based systems for example you can achieve this by issuing: apt-get install python3-urllib3 Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend apache /etc/snmp/apache-stats.py Restart snmpd on your host Test by running snmpwalk localhost NET-SNMP-EXTEND-MIB::nsExtendOutput2Table","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_1","text":"Install the agent on this device if it isn't already and copy the apache script to /usr/lib/check_mk_agent/local/ Verify it is working by running /usr/lib/check_mk_agent/local/apache (If you get error like \"Can't locate LWP/Simple.pm\". libwww-perl needs to be installed: apt-get install libwww-perl) Create the cache directory, '/var/cache/librenms/' and make sure that it is owned by the user running the SNMP daemon. mkdir -p /var/cache/librenms/ On the device page in Librenms, edit your host and check the Apache under the Applications tab.","title":"Agent"},{"location":"Extensions/Applications/#asterisk","text":"A small shell script that reports various Asterisk call status.","title":"Asterisk"},{"location":"Extensions/Applications/#snmp-extend_2","text":"Download the asterisk script to /etc/snmp/ on your asterisk server. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/asterisk -O /etc/snmp/asterisk Make the script executable chmod +x /etc/snmp/asterisk Configure ASCLI in the script. Verify it is working by running /etc/snmp/asterisk Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend asterisk /etc/snmp/asterisk Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#backupninja","text":"A small shell script that reports status of last backupninja backup.","title":"backupninja"},{"location":"Extensions/Applications/#snmp-extend_3","text":"Download the backupninja script to /etc/snmp/backupninja.py on your backuped server. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/backupninja.py -O /etc/snmp/backupninja.py` Make the script executable: chmod +x /etc/snmp/backupninja.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend backupninja /etc/snmp/backupninja.py Restart snmpd on your host","title":"SNMP Extend"},{"location":"Extensions/Applications/#bind9-aka-named","text":"Create stats file with appropriate permissions: touch /var/cache/bind/stats chown bind:bind /var/cache/bind/stats Change user:group to the user and group that's running bind/named. Bind/named configuration: options { ... statistics-file \"/var/cache/bind/stats\"; zone-statistics yes; ... }; Restart your bind9/named after changing the configuration. Verify that everything works by executing rndc stats && cat /var/cache/bind/stats . In case you get a Permission Denied error, make sure you changed the ownership correctly. Also be aware that this file is appended to each time rndc stats is called. Given this it is suggested you setup file rotation for it. Alternatively you can also set zero_stats to 1 in the config. The script for this also requires the Perl module File::ReadBackwards . FreeBSD => p5-File-ReadBackwards CentOS/RedHat => perl-File-ReadBackwards Debian/Ubuntu => libfile-readbackwards-perl If it is not available, it can be installed by cpan -i File::ReadBackwards . You may possibly need to configure the agent/extend script as well. The config file's path defaults to the same path as the script, but with .config appended. So if the script is located at /etc/snmp/bind , the config file will be /etc/snmp/bind.config . Alternatively you can also specify a config via -c $file . Anything starting with a # is comment. The format for variables are $variable=$value. Empty lines are ignored. Spaces and tabs at either the start or end of a line are ignored. Content of an example /etc/snmp/bind.config . Please edit with your own settings. rndc = The path to rndc. Default: /usr/bin/env rndc call_rndc = A 0/1 boolean on whether or not to call rndc stats. Suggest to set to 0 if using netdata. Default: 1 stats_file = The path to the named stats file. Default: /var/cache/bind/stats agent = A 0/1 boolean for if this is being used as a LibreNMS agent or not. Default: 0 zero_stats = A 0/1 boolean for if the stats file should be zeroed first. Default: 0 (1 if guessed) If you want to guess at the configuration, call the script with -g and it will print out what it thinks it should be.","title":"BIND9 aka named"},{"location":"Extensions/Applications/#snmp-extend_4","text":"Copy the bind shell script, to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/bind -O /etc/snmp/bind Make the script executable chmod +x /etc/snmp/bind Edit your snmpd.conf file and add: extend bind /etc/snmp/bind Restart snmpd on the host in question. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_2","text":"Install the agent on this device if it isn't already and copy the script to /usr/lib/check_mk_agent/local/bind via wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/bind -O /usr/lib/check_mk_agent/local/bind Make the script executable chmod +x /usr/lib/check_mk_agent/local/bind Set the variable 'agent' to '1' in the config.","title":"Agent"},{"location":"Extensions/Applications/#bird2","text":"The BIRD Internet Routing Daemon (BGP) Due to the lack of SNMP support in the BIRD daemon, this application extracts all configured BGP protocols and parses it into LibreNMS. This application supports both IPv4 and IPv6 Peer processing.","title":"BIRD2"},{"location":"Extensions/Applications/#snmp-extend_5","text":"Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend bird2 '/usr/bin/sudo /usr/sbin/birdc -r show protocols all' Edit your sudo users (usually visudo ) and add at the bottom: Debian-snmp ALL=(ALL) NOPASSWD: /usr/sbin/birdc If your snmp daemon is running on a user that isnt Debian-snmp make sure that user has the correct permission to execute birdc Verify the time format for bird2 is defined. Otherwise iso short ms (hh:mm:ss) is the default value that will be used. Which is not compatible with the datetime parsing logic used to parse the output from the bird show command. timeformat protocol is the one important to be defibned for the bird2 app parsing logic to work. Example starting point using Bird2 shorthand iso long (YYYY-MM-DD hh:mm:ss): timeformat base iso long; timeformat log iso long; timeformat protocol iso long; timeformat route iso long; Timezone can be manually specified, example \"%F %T %z\" (YYYY-MM-DD hh:mm:ss +11:45). See the Bird 2 docs for more information Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#certificate","text":"A small python3 script that checks age and remaining validity of certificates This script needs following packages on Debian/Ubuntu Systems: python3 python3-openssl Content of an example /etc/snmp/certificate.json . Please edit with your own settings. {\"domains\": [ {\"fqdn\": \"www.mydomain.com\"}, {\"fqdn\": \"some.otherdomain.org\", \"port\": 8443}, {\"fqdn\": \"personal.domain.net\"}, {\"fqdn\": \"selfsignedcert_host.domain.com\", \"cert_location\": \"/etc/pki/tls/certs/localhost.pem\"} ] } a. (Required): Key 'domains' contains a list of domains to check. b. (Optional): You can define a port. By default it checks on port 443. c. (Optional): You may define a certificate location for self-signed certificates.","title":"Certificate"},{"location":"Extensions/Applications/#snmp-extend_6","text":"Copy the shell script to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/certificate.py -O /etc/snmp/certificate.py Make the script executable chmod +x /etc/snmp/certificate.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend certificate /etc/snmp/certificate.py Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#borgbackup","text":"","title":"BorgBackup"},{"location":"Extensions/Applications/#snmp-extend_7","text":"Copy the shell script to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/borgbackup -O /etc/snmp/borgbackup Make the script executable chmod +x /etc/snmp/borgbackup Install depends. # FreeBSD pkg p5-Config-Tiny p5-JSON p5-File-Slurp p5-MIME-Base64 p5-String-ShellQuote # Debian apt-get install libconfig-tiny-perl libjson-perl libfile-slurp-perl libmime-base64-perl libstring-shellquote-perl # generic cpanm cpanm Config::Tiny File::Slurp JSON MIME::Base64 String::ShellQuote Set it up in cron. */5 * * * /etc/snmp/borgbackup 2> /dev/null > /dev/null Configure it. See further down below or /etc/snmp/borgbackup --help . Add the following to the SNMPD config. extend borgbackup /bin/cat /var/cache/borgbackup_extend/extend_return Restart SNMPD and wait for the device to rediscover or tell it to manually.","title":"SNMP Extend"},{"location":"Extensions/Applications/#config","text":"The config file is a ini file and handled by Config::Tiny . - mode :: single or multi, for if this is a single repo or for multiple repos. - Default :: single - repo :: Directory for the borg backup repo. - Default :: undef - passphrase :: Passphrase for the borg backup repo. - Default :: undef - passcommand :: Passcommand for the borg backup repo. - Default :: undef For single repos all those variables are in the root section of the config, so lets the repo is at '/backup/borg' with a passphrase of '1234abc'. repo=/backup/borg repo=1234abc For multi, each section outside of the root represents a repo. So if there is '/backup/borg1' with a passphrase of 'foobar' and '/backup/derp' with a passcommand of 'pass show backup' it would be like below. mode=multi [borg1] repo=/backup/borg1 passphrase=foobar [derp] repo=/backup/derp passcommand=pass show backup If 'passphrase' and 'passcommand' are both specified, then passcommand is used.","title":"Config"},{"location":"Extensions/Applications/#metrics","text":"The metrics are all from .data.totals in the extend return. Value Type Description errored repos Total number of repos that info could not be fetched for. locked repos Total number of locked repos locked_for seconds Longest time any repo has been locked. time_since_last_modified seconds Largest time - mtime for the repo nonce total_chunks chunks Total number of chunks total_csize bytes Total compressed size of all archives in all repos. total_size byes Total uncompressed size of all archives in all repos. total_unique_chunks chunks Total number of unique chuckes in all repos. unique_csize bytes Total deduplicated size of all archives in all repos. unique_size chunks Total number of chunks in all repos.","title":"Metrics"},{"location":"Extensions/Applications/#capev2","text":"Copy the shell script to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/cape -O /etc/snmp/cape Make the script executable chmod +x /etc/snmp/cape Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend cape /etc/snmp/cape Install the required packages. apt-get install libfile-readbackwards-perl libjson-perl libconfig-tiny-perl libdbi-perl libfile-slurp-perl libstatistics-lite-perl Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"CAPEv2"},{"location":"Extensions/Applications/#chip","text":"C.H.I.P. is a $9 R8 based tiny computer ideal for small projects. Further details: https://getchip.com/pages/chip Copy the shell script to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/chip.sh -O /etc/snmp/power-stat.sh Make the script executable chmod +x /etc/snmp/power-stat.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend power-stat /etc/snmp/power-stat.sh Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"C.H.I.P"},{"location":"Extensions/Applications/#docker-stats","text":"It gathers metrics about the docker containers, including: - cpu percentage - memory usage - container size - uptime - Totals per status This script requires python3 and the pip module python-dateutil","title":"Docker Stats"},{"location":"Extensions/Applications/#snmp-extend_8","text":"Install pip module pip3 install python-dateutil Copy the shell script to the desired host. By default, it will only show the status for containers that are running. To include all containers modify the constant in the script at the top of the file and change it to ONLY_RUNNING_CONTAINERS = False wget https://github.com/librenms/librenms-agent/raw/master/snmp/docker-stats.py -O /etc/snmp/docker-stats.py Make the script executable chmod +x /etc/snmp/docker-stats.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend docker /etc/snmp/docker-stats.py If your run Debian, you need to add the Debian-snmp user to the docker group usermod -a -G docker Debian-snmp Restart snmpd on your host systemctl restart snmpd","title":"SNMP Extend"},{"location":"Extensions/Applications/#entropy","text":"A small shell script that checks your system's available random entropy.","title":"Entropy"},{"location":"Extensions/Applications/#snmp-extend_9","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/entropy.sh -O /etc/snmp/entropy.sh Make the script executable chmod +x /etc/snmp/entropy.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend entropy /etc/snmp/entropy.sh Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#exim-stats","text":"SNMP extend script to get your exim stats data into your host.","title":"EXIM Stats"},{"location":"Extensions/Applications/#snmp-extend_10","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/exim-stats.sh -O /etc/snmp/exim-stats.sh Make the script executable chmod +x /etc/snmp/exim-stats.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend exim-stats /etc/snmp/exim-stats.sh If you are using sudo edit your sudo users (usually visudo ) and add at the bottom: snmp ALL=(ALL) NOPASSWD: /etc/snmp/exim-stats.sh, /usr/bin/exim* Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#fail2ban","text":"","title":"Fail2ban"},{"location":"Extensions/Applications/#snmp-extend_11","text":"Copy the shell script, fail2ban, to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/fail2ban -O /etc/snmp/fail2ban Make the script executable chmod +x /etc/snmp/fail2ban Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend fail2ban /etc/snmp/fail2ban If you want to use the cache, it is as below, by using the -c switch. extend fail2ban /etc/snmp/fail2ban -c If you want to use the cache and update it if needed, this can by using the -c and -U switches. extend fail2ban /etc/snmp/fail2ban -c -U If you need to specify a custom location for the fail2ban-client, that can be done via the -f switch. extend fail2ban /etc/snmp/fail2ban -f /foo/bin/fail2ban-client If not specified, \"/usr/bin/env fail2ban-client\" is used. Restart snmpd on your host If you wish to use caching, add the following to /etc/crontab and restart cron. */3 * * * * root /etc/snmp/fail2ban -u Restart or reload cron on your system. If you have more than a few jails configured, you may need to use caching as each jail needs to be polled and fail2ban-client can't do so in a timely manner for than a few. This can result in failure of other SNMP information being polled. For additional details of the switches, please see the POD in the script it self at the top.","title":"SNMP Extend"},{"location":"Extensions/Applications/#freebsd-nfs-client","text":"","title":"FreeBSD NFS Client"},{"location":"Extensions/Applications/#snmp-extend_12","text":"Copy the shell script, fbsdnfsserver, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/fbsdnfsclient -O /etc/snmp/fbsdnfsclient Make the script executable chmod +x /etc/snmp/fbsdnfsclient Edit your snmpd.conf file and add: extend fbsdnfsclient /etc/snmp/fbsdnfsclient Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#freebsd-nfs-server","text":"","title":"FreeBSD NFS Server"},{"location":"Extensions/Applications/#snmp-extend_13","text":"Copy the shell script, fbsdnfsserver, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/fbsdnfsserver -O /etc/snmp/fbsdnfsserver Make the script executable chmod +x /etc/snmp/fbsdnfsserver Edit your snmpd.conf file and add: extend fbsdnfsserver /etc/snmp/fbsdnfsserver Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#freeradius","text":"The FreeRADIUS application extension requires that status_server be enabled in your FreeRADIUS config. For more information see: https://wiki.freeradius.org/config/Status You should note that status requests increment the FreeRADIUS request stats. So LibreNMS polls will ultimately be reflected in your stats/charts. Go to your FreeRADIUS configuration directory (usually /etc/raddb or /etc/freeradius). cd sites-enabled ln -s ../sites-available/status status Restart FreeRADIUS. You should be able to test with the radclient as follows... echo \"Message-Authenticator = 0x00, FreeRADIUS-Statistics-Type = 31, Response-Packet-Type = Access-Accept\" | \\ radclient -x localhost:18121 status adminsecret Note that adminsecret is the default secret key in status_server. Change if you've modified this.","title":"FreeRADIUS"},{"location":"Extensions/Applications/#snmp-extend_14","text":"Copy the freeradius shell script, to the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/freeradius.sh -O /etc/snmp/freeradius.sh Make the script executable chmod +x /etc/snmp/freeradius.sh If you've made any changes to the FreeRADIUS status_server config (secret key, port, etc.) edit freeradius.sh and adjust the config variable accordingly. Edit your snmpd.conf file and add: extend freeradius /etc/snmp/freeradius.sh Restart snmpd on the host in question. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_3","text":"Install the script to your agent wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/freeradius.sh -O /usr/lib/check_mk_agent/local/freeradius.sh` Make the script executable chmod +x /usr/lib/check_mk_agent/local/freeradius.sh If you've made any changes to the FreeRADIUS status_server config (secret key, port, etc.) edit freeradius.sh and adjust the config variable accordingly. Edit the freeradius.sh script and set the variable 'AGENT' to '1' in the config.","title":"Agent"},{"location":"Extensions/Applications/#freeswitch","text":"A small shell script that reports various Freeswitch call status.","title":"Freeswitch"},{"location":"Extensions/Applications/#agent_4","text":"Install the agent on this device if it isn't already and copy the freeswitch script to /usr/lib/check_mk_agent/local/ wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/freeswitch -O /usr/lib/check_mk_agent/local/freeswitch` Make the script executable chmod +x /usr/lib/check_mk_agent/local/freeswitch Configure FSCLI in the script. You may also have to create an /etc/fs_cli.conf file if your fs_cli command requires authentication. Verify it is working by running /usr/lib/check_mk_agent/local/freeswitch","title":"Agent"},{"location":"Extensions/Applications/#snmp-extend_15","text":"Download the script onto the desired host wget https://github.com/librenms/librenms-agent/raw/master/agent-local/freeswitch -O /etc/snmp/freeswitch Make the script executable chmod +x /etc/snmp/freeswitch Configure FSCLI in the script. You may also have to create an /etc/fs_cli.conf file if your fs_cli command requires authentication. Verify it is working by running /etc/snmp/freeswitch Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend freeswitch /etc/snmp/freeswitch Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#gpsd","text":"","title":"GPSD"},{"location":"Extensions/Applications/#snmp-extend_16","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/gpsd -O /etc/snmp/gpsd Make the script executable chmod +x /etc/snmp/gpsd Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend gpsd /etc/snmp/gpsd Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading at the top of the page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_5","text":"Install the agent on this device if it isn't already and copy the gpsd script to /usr/lib/check_mk_agent/local/ You may need to configure $server or $port . Verify it is working by running /usr/lib/check_mk_agent/local/gpsd","title":"Agent"},{"location":"Extensions/Applications/#hv-monitor","text":"HV Monitor provides a generic way to monitor hypervisors. Currently CBSD+bhyve on FreeBSD and Libvirt+QEMU on Linux are support. For more information see HV::Monitor on Github or MetaCPAN .","title":"HV Monitor"},{"location":"Extensions/Applications/#snmp-extend_17","text":"Install the SNMP Extend. For Debian based systems this is as below. apt-get install zlib1g-dev cpanminus libjson-perl cpanm HV::Monitor And on FreeBSD as below. pkg install p5-App-cpanminus p5-JSON p5-MIME-Base64 p5-Gzip-Faster cpanm HV::Monitor Set it up to be be ran by cron by root. Yes, you can directly call this script from SNMPD, but be aware, especially with Libvirt, there is a very real possibility of the snmpget timing out, especially if a VM is spinning up/down as virsh domstats can block for a few seconds or so then. */5 * * * * /usr/local/bin/hv_monitor > /var/cache/hv_monitor.json -c 2> /dev/null Setup snmpd.conf as below. extend hv-monitor /bin/cat /var/cache/hv_monitor.json Restart SNMPD. Either wait for it to be re-discovered or manually enable it.","title":"SNMP Extend"},{"location":"Extensions/Applications/#icecast","text":"Shell script that reports load average/memory/open-files stats of Icecast","title":"Icecast"},{"location":"Extensions/Applications/#snmp-extend_18","text":"Copy the shell script, icecast-stats.sh, to the desired host (the host must be added to LibreNMS devices) wget https://github.com/librenms/librenms-agent/raw/master/snmp/icecast-stats.sh -O /etc/snmp/icecast-stats.sh Make the script executable chmod +x /etc/snmp/icecast-stats.sh Verify it is working by running /etc/snmp/icecast-stats.sh Edit your snmpd.conf file (usually /etc/snmp/icecast-stats.sh ) and add: extend icecast /etc/snmp/icecast-stats.sh","title":"SNMP Extend"},{"location":"Extensions/Applications/#isc-dhcp-stats","text":"A small python3 script that reports current DHCP leases stats and pool usage of ISC DHCP Server. Also you have to install the dhcpd-pools and the required Perl modules. Under Ubuntu/Debian just run apt install cpanminus ; cpanm Net::ISC::DHCPd::Leases Mime::Base64 File::Slurp or under FreeBSD pkg install p5-JSON p5-MIME-Base64 p5-App-cpanminus p5-File-Slurp ; cpanm Net::ISC::DHCPd::Leases .","title":"ISC DHCP Stats"},{"location":"Extensions/Applications/#snmp-extend_19","text":"Copy the shell script to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/dhcp -O /etc/snmp/dhcp Make the script executable chmod +x /etc/snmp/dhcp Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: # without using cron extend dhcpstats /etc/snmp/dhcp -Z # using cron extend dhcpstats /bin/cat /var/cache/dhcp_extend If on a slow system running it via cron may be needed. */5 * * * * /etc/snmp/dhcp -Z -w /var/cache/dhcp_extend The following options are also supported. Option Description -c $file Path to dhcpd.conf. -l $file Path to lease file. -Z Enable GZip+Base64 compression. -d Do not de-dup. -w $file File to write it out to. Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#logsize","text":"","title":"Logsize"},{"location":"Extensions/Applications/#snmp-extend_20","text":"Download the script and make it executable. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/logsize -O /etc/snmp/logsize chmod +x /etc/snmp/logsize Install the requirements. # FreeBSD pkg install p5-File-Find-Rule p5-JSON p5-TOML p5-Time-Piece p5-MIME-Base64 p5-File-Slurp p5-Statistics-Lite # Debian apt-get install cpanminus cpanm File::Find::Rule JSON TOML Time::Piece MIME::Base64 File::Slurp Statistics::Lite Configure the config at /usr/local/etc/logsize.conf . You can find the documentation for the config file in the extend. Below is a small example. # monitor log sizes of logs directly udner /var/log [sets.var_log] dir=\"/var/log/\" # monitor remote logs from network devices [sets.remote_network] dir=\"/var/log/remote/network/\" # monitor remote logs from windows sources [sets.remote_windows] dir=\"/var/log/remote/windows/\" # monitor suricata flows logs sizes [sets.suricata_flows] dir=\"/var/log/suricata/flows/current\" If the directories all readable via SNMPD, this script can be ran via snmpd. Otherwise it needs setup in cron. Similarly is processing a large number of files, it may also need setup in cron if it takes the script awhile to run. */5 * * * * /etc/snmp/logsize -b 2> /dev/null > /dev/null Make sure that /var/cache/logsize_extend exists and is writable by the user running the extend. mkdir -p /var/cache/logsize_extend Configure it in the SNMPD config. # if not using cron extend logsize /etc/snmp/logsize -b # if using cron extend logsize /bin/cat /var/cache/logsize_extend/extend_return","title":"SNMP Extend"},{"location":"Extensions/Applications/#linux_config_files","text":"linux_config_files is an application intended to monitor a Linux distribution's configuration files via that distribution's configuration management tool/system. At this time, ONLY RPM-based (Fedora/RHEL) SYSTEMS ARE SUPPORTED utilizing the rpmconf tool. The linux_config_files application collects and graphs the total count of configuration files that are out of sync and graphs that number. Fedora/RHEL: Rpmconf is a utility that analyzes rpm configuration files using the RPM Package Manager. Rpmconf reports when a new configuration file standard has been issued for an upgraded/downgraded piece of software. Typically, rpmconf is used to provide a diff of the current configuration file versus the new, standard configuration file. The administrator can then choose to install the new configuration file or keep the old one.","title":"linux_config_files"},{"location":"Extensions/Applications/#snmp-extend_21","text":"Copy the python script, linux_config_files.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/linux_config_files.py -O /etc/snmp/linux_config_files.py Make the script executable chmod +x /etc/snmp/linux_config_files.py Edit your snmpd.conf file and add: extend linux_config_files /etc/snmp/linux_config_files.py (Optional on an RPM-based distribution) Create a /etc/snmp/linux_config_files.json file and specify the following: \"pkg_system\" - String designating the distribution name of the system. At the moment only \"rpm\" is supported [\"rpm\"] \"pkg_tool_cmd\" - String path to the package tool binary [\"/sbin/rpmconf\"] { \"pkg_system\": \"rpm\", \"pkg_tool_cmd\": \"/bin/rpmconf\", } Restart snmpd.","title":"SNMP Extend"},{"location":"Extensions/Applications/#linux-softnet-stat","text":"","title":"Linux Softnet Stat"},{"location":"Extensions/Applications/#snmp-extend_22","text":"1: Install the depends, which on a Debian based system would be as below. apt-get install -y cpanminus zlib1g-dev cpanm File::Slurp MIME::Base64 JSON Gzip::Faster Download the script into the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/linux_softnet_stat -O /etc/snmp/linux_softnet_stat Make the script executable chmod +x /etc/snmp/linux_softnet_stat Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend linux_softnet_stat /etc/snmp/linux_softnet_stat -b Then either enable the application Linux Softnet Stat or wait for it to be re-discovered.","title":"SNMP Extend"},{"location":"Extensions/Applications/#mailcow-dockerized-postfix","text":"","title":"mailcow-dockerized postfix"},{"location":"Extensions/Applications/#snmp-extend_23","text":"Download the script into the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/mailcow-dockerized-postfix -O /etc/snmp/mailcow-dockerized-postfix Make the script executable chmod +x /etc/snmp/mailcow-dockerized-postfix Maybe you will need to install pflogsumm on debian based OS. Please check if you have package installed. Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend mailcow-postfix /etc/snmp/mailcow-dockerized-postfix Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#mailscanner","text":"","title":"Mailscanner"},{"location":"Extensions/Applications/#snmp-extend_24","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/mailscanner.php -O /etc/snmp/mailscanner.php Make the script executable chmod +x /etc/snmp/mailscanner.php Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend mailscanner /etc/snmp/mailscanner.php Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#mdadm","text":"It allows you to checks mdadm health and array data This script require: jq","title":"Mdadm"},{"location":"Extensions/Applications/#snmp-extend_25","text":"Install jq sudo apt install jq Download the script onto the desired host. sudo wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/mdadm -O /etc/snmp/mdadm Make the script executable sudo chmod +x /etc/snmp/mdadm Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend mdadm /etc/snmp/mdadm Verify it is working by running sudo /etc/snmp/mdadm Restart snmpd on your host sudo service snmpd restart The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#megaraid","text":"This software from Broadcom/LSI let you monitor MegaRAID controller. Download the external software and follow the included install instructions. Add the following line to your snmpd.conf file (usually /etc/snmp/snmpd.conf) pass .1.3.6.1.4.1.3582 /usr/sbin/lsi_mrdsnmpmain Restart snmpd on your host","title":"MegaRAID"},{"location":"Extensions/Applications/#memcached","text":"","title":"Memcached"},{"location":"Extensions/Applications/#snmp-extend_26","text":"Copy the memcached script to /etc/snmp/ on your remote server. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/memcached -O /etc/snmp/memcached Make the script executable: chmod +x /etc/snmp/memcached Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend memcached /etc/snmp/memcached Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#mojo-cape-submit","text":"","title":"Mojo CAPE Submit"},{"location":"Extensions/Applications/#snmp","text":"This assumes you've already configured mojo_cape_submit from CAPE::Utils. Add the following to snmpd.conf and restarted SNMPD extend mojo_cape_submit /usr/local/bin/mojo_cape_submit_extend Then just wait for the machine in question to be rediscovered or enabled it in the device settings app page.","title":"SNMP"},{"location":"Extensions/Applications/#munin","text":"","title":"Munin"},{"location":"Extensions/Applications/#agent_6","text":"Install the script to your agent: wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/munin -O /usr/lib/check_mk_agent/local/munin Make the script executable chmod +x /usr/lib/check_mk_agent/local/munin Create the munin scripts dir: mkdir -p /usr/share/munin/munin-scripts Install your munin scripts into the above directory. To create your own custom munin scripts, please see this example: #!/bin/bash if [ \" $1 \" = \"config\" ] ; then echo 'graph_title Some title' echo 'graph_args --base 1000 -l 0' #not required echo 'graph_vlabel Some label' echo 'graph_scale no' #not required, can be yes/no echo 'graph_category system' #Choose something meaningful, can be anything echo 'graph_info This graph shows something awesome.' #Short desc echo 'foobar.label Label for your unit' # Repeat these two lines as much as you like echo 'foobar.info Desc for your unit.' exit 0 fi echo -n \"foobar.value \" $( date +%s ) #Populate a value, here unix-timestamp","title":"Agent"},{"location":"Extensions/Applications/#mysql","text":"Create the cache directory, '/var/cache/librenms/' and make sure that it is owned by the user running the SNMP daemon. mkdir -p /var/cache/librenms/ The MySQL script requires PHP-CLI and the PHP MySQL extension, so please verify those are installed. CentOS (May vary based on PHP version) yum install php-cli php-mysql Debian (May vary based on PHP version) apt-get install php-cli php-mysql Unlike most other scripts, the MySQL script requires a configuration file mysql.cnf in the same directory as the extend or agent script with following content: snmpd_nginx.te module snmpd_nginx 1.0; require { type httpd_t; type http_port_t; type snmpd_t; class tcp_socket name_connect; } #============= snmpd_t ============== allow snmpd_t http_port_t:tcp_socket name_connect; EOF checkmodule -M -m -o snmpd_nginx.mod snmpd_nginx.te semodule_package -o snmpd_nginx.pp -m snmpd_nginx.mod semodule -i snmpd_nginx.pp Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_8","text":"Install the agent on this device if it isn't already and copy the nginx script to /usr/lib/check_mk_agent/local/","title":"Agent"},{"location":"Extensions/Applications/#nfs-server","text":"Export the NFS stats from as server.","title":"NFS Server"},{"location":"Extensions/Applications/#snmp-extend_29","text":"Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add : extend nfs-server /bin/cat /proc/net/rpc/nfsd find out where cat is located using : which cat reload snmpd service to activate the configuration","title":"SNMP Extend"},{"location":"Extensions/Applications/#ntp-client","text":"A shell script that gets stats from ntp client.","title":"NTP Client"},{"location":"Extensions/Applications/#snmp-extend_30","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/ntp-client -O /etc/snmp/ntp-client Make the script executable chmod +x /etc/snmp/ntp-client Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ntp-client /etc/snmp/ntp-client Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#ntp-server-aka-ntpd","text":"A shell script that gets stats from ntp server (ntpd).","title":"NTP Server aka NTPD"},{"location":"Extensions/Applications/#snmp-extend_31","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/ntp-server.sh -O /etc/snmp/ntp-server.sh Make the script executable chmod +x /etc/snmp/ntp-server.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ntp-server /etc/snmp/ntp-server.sh Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#chronyd","text":"A shell script that gets the stats from chronyd and exports them with SNMP Extend.","title":"Chronyd"},{"location":"Extensions/Applications/#snmp-extend_32","text":"Download the shell script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/chrony -O /etc/snmp/chrony Make the script executable chmod +x /etc/snmp/chrony Edit the snmpd.conf file to include the extend by adding the following line to the end of the config file: extend chronyd /etc/snmp/chrony Note: Some distributions need sudo-permissions for the script to work with SNMP Extend. See the instructions on the section SUDO for more information. Restart snmpd service on the host Application should be auto-discovered and its stats presented on the Apps-page on the host. Note: Applications module needs to be enabled on the host or globally for the statistics to work as intended.","title":"SNMP Extend"},{"location":"Extensions/Applications/#nvidia-gpu","text":"","title":"Nvidia GPU"},{"location":"Extensions/Applications/#snmp-extend_33","text":"Copy the shell script, nvidia, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/nvidia -O /etc/snmp/nvidia Make the script executable chmod +x /etc/snmp/nvidia Edit your snmpd.conf file and add: extend nvidia /etc/snmp/nvidia Restart snmpd on your host. Verify you have nvidia-smi installed, which it generally should be if you have the driver from Nvida installed. The GPU numbering on the graphs will correspond to how the nvidia-smi sees them as being. For questions about what the various values are/mean, please see the nvidia-smi man file under the section covering dmon.","title":"SNMP Extend"},{"location":"Extensions/Applications/#opensearchelasticsearch","text":"","title":"Opensearch\\Elasticsearch"},{"location":"Extensions/Applications/#snmp-extend_34","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/opensearch -O /etc/snmp/opensearch Make it executable chmod +x /etc/snmp/opensearch Install the required Perl dependencies. # FreeBSD pkg install p5-JSON p5-libwww # Debian/Ubuntu apt-get install libjson-perl libwww-perl # cpanm cpanm JSON Libwww Update your snmpd.conf. extend opensearch /bin/cat /var/cache/opensearch.json Update root crontab with. This is required as it will this will likely time out otherwise. Use */1 if you want to have the most recent stats when polled or to */5 if you just want at exactly a 5 minute interval. */5 * * * * /etc/snmp/opensearch > /var/cache/opensearch.json Enable it or wait for the device to be re-disocvered.","title":"SNMP Extend"},{"location":"Extensions/Applications/#open-grid-scheduler","text":"Shell script to track the OGS/GE jobs running on clusters.","title":"Open Grid Scheduler"},{"location":"Extensions/Applications/#snmp-extend_35","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/rocks.sh -O /etc/snmp/rocks.sh Make the script executable chmod +x /etc/snmp/rocks.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ogs /etc/snmp/rocks.sh Restart snmpd. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#opensips","text":"Script that reports load-average/memory/open-files stats of Opensips","title":"Opensips"},{"location":"Extensions/Applications/#snmp-extend_36","text":"Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/opensips-stats.sh -O /etc/snmp/opensips-stats.sh Make the script executable: chmod +x /etc/snmp/opensips-stats.sh Verify it is working by running /etc/snmp/opensips-stats.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend opensips /etc/snmp/opensips-stats.sh","title":"SNMP Extend"},{"location":"Extensions/Applications/#os-updates","text":"A small shell script that checks your system package manager for any available updates. Supports apt-get/pacman/yum/zypper package managers. For pacman users automatically refreshing the database, it is recommended you use an alternative database location --dbpath=/var/lib/pacman/checkupdate","title":"OS Updates"},{"location":"Extensions/Applications/#snmp-extend_37","text":"Download the script onto the desired host. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/osupdate -O /etc/snmp/osupdate Make the script executable chmod +x /etc/snmp/osupdate Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend osupdate /etc/snmp/osupdate Restart snmpd on your host Note : apt-get depends on an updated package index. There are several ways to have your system run apt-get update automatically. The easiest is to create /etc/apt/apt.conf.d/10periodic and pasting the following in it: APT::Periodic::Update-Package-Lists \"1\"; . If you have apticron, cron-apt or apt-listchanges installed and configured, chances are that packages are already updated periodically . The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_9","text":"Install the agent on this device if it isn't already and copy the osupdate script to /usr/lib/check_mk_agent/local/ Then uncomment the line towards the top marked to be uncommented if using it as a agent.","title":"Agent"},{"location":"Extensions/Applications/#php-fpm","text":"","title":"PHP-FPM"},{"location":"Extensions/Applications/#snmp-extend_38","text":"Copy the shell script, phpfpmsp, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/phpfpmsp -O /etc/snmp/phpfpmsp Make the script executable chmod +x /etc/snmp/phpfpmsp Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend phpfpmsp /etc/snmp/phpfpmsp Edit /etc/snmp/phpfpmsp to include the status URL for the PHP-FPM pool you are monitoring. Restart snmpd on your host It is worth noting that this only monitors a single pool. If you want to monitor multiple pools, this won't do it. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_10","text":"Install the agent on this device if it isn't already and copy the phpfpmsp script to /usr/lib/check_mk_agent/local/","title":"Agent"},{"location":"Extensions/Applications/#pi-hole","text":"","title":"Pi-hole"},{"location":"Extensions/Applications/#snmp-extend_39","text":"Copy the shell script, pi-hole, to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/pi-hole -O /etc/snmp/pi-hole Make the script executable chmod +x /etc/snmp/pi-hole Edit your snmpd.conf file and add: extend pi-hole /etc/snmp/pi-hole To get all data you must get your API auth token from Pi-hole server and change the API_AUTH_KEY entry inside the snmp script. Restard snmpd. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#portactivity","text":"","title":"Portactivity"},{"location":"Extensions/Applications/#snmp-extend_40","text":"Install missing packages - Ubuntu is shown below. apt install libparse-netstat-perl apt install libjson-perl Copy the Perl script to the desired host (the host must be added to LibreNMS devices) wget https://github.com/librenms/librenms-agent/raw/master/snmp/portactivity -O /etc/snmp/portactivity Make the script executable chmod +x /etc/snmp/portactivity Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend portactivity /etc/snmp/portactivity -p http,ldap,imap Will monitor HTTP, LDAP, and IMAP. The -p switch specifies what ports to use. This is a comma seperated list. These must be found in '/etc/services' or where ever NSS is set to fetch it from. If not, it will throw an error. If you want to JSON returned by it to be printed in a pretty format use the -P flag. Restart snmpd on your host. Please note that for only TCP[46] services are supported.","title":"SNMP Extend"},{"location":"Extensions/Applications/#postfix","text":"","title":"Postfix"},{"location":"Extensions/Applications/#snmp-extend_41","text":"Copy the shell script, postfix-queues, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/postfix-queues -O /etc/snmp/postfix-queues Copy the Perl script, postfixdetailed, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/postfixdetailed -O /etc/snmp/postfixdetailed Make both scripts executable chmod +x /etc/snmp/postfixdetailed /etc/snmp/postfix-queues Edit your snmpd.conf file and add: extend mailq /etc/snmp/postfix-queues extend postfixdetailed /etc/snmp/postfixdetailed Restart snmpd. Install pflogsumm for your OS. Make sure the cache file in /etc/snmp/postfixdetailed is some place that snmpd can write too. This file is used for tracking changes between various values between each time it is called by snmpd. Also make sure the path for pflogsumm is correct. Run /etc/snmp/postfixdetailed to create the initial cache file so you don't end up with some crazy initial starting value. Please note that each time /etc/snmp/postfixdetailed is ran, the cache file is updated, so if this happens in between LibreNMS doing it then the values will be thrown off for that polling period. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. NOTE: If using RHEL for your postfix server, qshape must be installed manually as it is not officially supported. CentOs 6 rpms seem to work without issues.","title":"SNMP Extend"},{"location":"Extensions/Applications/#postgres","text":"","title":"Postgres"},{"location":"Extensions/Applications/#snmp-extend_42","text":"Copy the shell script, postgres, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/postgres -O /etc/snmp/postgres Make the script executable chmod +x /etc/snmp/postgres Edit your snmpd.conf file and add: extend postgres /etc/snmp/postgres Restart snmpd on your host Install the Nagios check check_postgres.pl on your system: https://github.com/bucardo/check_postgres Verify the path to check_postgres.pl in /etc/snmp/postgres is correct. (Optional) If you wish to change the DB username (default: pgsql), enable the postgres DB in totalling (e.g. set ignorePG to 0, default: 1), or set a hostname for check_postgres.pl to connect to (default: the Unix Socket postgresql is running on), then create the file /etc/snmp/postgres.config with the following contents (note that not all of them need be defined, just whichever you'd like to change): DBuser=monitoring ignorePG=0 DBhost=localhost Note that if you are using netdata or the like, you may wish to set ignorePG to 1 or otherwise that total will be very skewed on systems with light or moderate usage. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#powerdns","text":"An authoritative DNS server: https://www.powerdns.com/auth.html","title":"PowerDNS"},{"location":"Extensions/Applications/#snmp-extend_43","text":"Copy the shell script, powerdns.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/powerdns.py -O /etc/snmp/powerdns.py Make the script executable chmod +x /etc/snmp/powerdns.py Edit your snmpd.conf file and add: extend powerdns /etc/snmp/powerdns.py Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_11","text":"Install the agent on this device if it isn't already and copy the powerdns script to /usr/lib/check_mk_agent/local/","title":"Agent"},{"location":"Extensions/Applications/#powerdns-recursor","text":"A recursive DNS server: https://www.powerdns.com/recursor.html","title":"PowerDNS Recursor"},{"location":"Extensions/Applications/#direct","text":"The LibreNMS polling host must be able to connect to port 8082 on the monitored device. The web-server must be enabled, see the Recursor docs: https://doc.powerdns.com/md/recursor/settings/#webserver","title":"Direct"},{"location":"Extensions/Applications/#variables","text":"$config['apps']['powerdns-recursor']['api-key'] required, this is defined in the Recursor config $config['apps']['powerdns-recursor']['port'] numeric, defines the port to connect to PowerDNS Recursor on. The default is 8082 $config['apps']['powerdns-recursor']['https'] true or false, defaults to use http.","title":"Variables"},{"location":"Extensions/Applications/#snmp-extend_44","text":"Copy the shell script, powerdns-recursor, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/powerdns-recursor -O /etc/snmp/powerdns-recursor Make the script executable chmod +x /etc/snmp/powerdns-recursor Edit your snmpd.conf file and add: extend powerdns-recursor /etc/snmp/powerdns-recursor Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_12","text":"Install the agent on this device if it isn't already and copy the powerdns-recursor script to /usr/lib/check_mk_agent/local/ This script uses rec_control get-all to collect stats.","title":"Agent"},{"location":"Extensions/Applications/#powerdns-dnsdist","text":"","title":"PowerDNS-dnsdist"},{"location":"Extensions/Applications/#snmp-extend_45","text":"Copy the BASH script to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/powerdns-dnsdist -O /etc/snmp/powerdns-dnsdist Make the script executable chmod +x /etc/snmp/powerdns-dnsdist Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend powerdns-dnsdist /etc/snmp/powerdns-dnsdist Restart snmpd on your host. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#powermon","text":"PowerMon tracks the power usage on your host and can report on both consumption and cost, using a python script installed on the host. PowerMon consumption graph Currently the script uses one of two methods to determine current power usage: ACPI via libsensors HP-Health (HP Proliant servers only) The ACPI method is quite unreliable as it is usually only implemented by battery-powered devices, e.g. laptops. YMMV. However, it's possible to support any method as long as it can return a power value, usually in Watts. TIP: You can achieve this by adding a method and a function for that method to the script. It should be called by getData() and return a dictionary. Because the methods are unreliable for all hardware, you need to declare to the script which method to use. The are several options to assist with testing, see --help .","title":"PowerMon"},{"location":"Extensions/Applications/#snmp-extend_46","text":"","title":"SNMP Extend"},{"location":"Extensions/Applications/#initial-setup","text":"Download the python script onto the host: wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/powermon-snmp.py -O /usr/local/bin/powermon-snmp.py Make the script executable: chmod +x /usr/local/bin/powermon-snmp.py Edit the script and set the cost per kWh for your supply. You must uncomment this line for the script to work: vi /usr/local/bin/powermon-snmp.py #costPerkWh = 0.15 Choose you method below: Method 1. sensors Method 2. hpasmcli Install dependencies: dnf install lm_sensors pip install PySensors Test the script from the command-line. For example: $ /usr/local/bin/powermon-snmp.py -m sensors -n -p { \"meter\": { \"0\": { \"reading\": 0.0 } }, \"psu\": {}, \"supply\": { \"rate\": 0.15 }, \"reading\": \"0.0\" } If you see a reading of 0.0 it is likely this method is not supported for your system. If not, continue. Obtain the hp-health package for your system. Generally there are three options: Standalone package from HPE Support From the HP Management Component Pack (MCP). Included in the HP Service Pack for Proliant (SPP) If you've downloaded the standalone package, install it. For example: rpm -ivh hp-health-10.91-1878.11.rhel8.x86_64.rpm Check the service is running: systemctl status hp-health Test the script from the command-line. For example: $ /usr/local/bin/powermon-snmp.py -m hpasmcli -n -p { \"meter\": { \"1\": { \"reading\": 338.0 } }, \"psu\": { \"1\": { \"present\": \"Yes\", \"redundant\": \"No\", \"condition\": \"Ok\", \"hotplug\": \"Supported\", \"reading\": 315.0 }, \"2\": { \"present\": \"Yes\", \"redundant\": \"No\", \"condition\": \"FAILED\", \"hotplug\": \"Supported\" } }, \"supply\": { \"rate\": 0.224931 }, \"reading\": 338.0 } If you see a reading of 0.0 it is likely this method is not supported for your system. If not, continue.","title":"Initial setup"},{"location":"Extensions/Applications/#finishing-up","text":"Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add the following: extend powermon /usr/local/bin/powermon-snmp.py -m hpasmcli NOTE: Avoid using other script options in the snmpd config as the results may not be interpreted correctly by LibreNMS. Reload your snmpd service: systemctl reload snmpd You're now ready to enable the application in LibreNMS.","title":"Finishing Up"},{"location":"Extensions/Applications/#privoxy","text":"For this to work, the following log items need enabled for Privoxy. debug 2 # show each connection status debug 512 # Common Log Format debug 1024 # Log the destination for requests Privoxy didn't let through, and the reason why. debug 4096 # Startup banner and warnings debug 8192 # Non-fatal errors","title":"Privoxy"},{"location":"Extensions/Applications/#snmp-extend_47","text":"Download the extend and make sure it is executable. wget https://github.com/librenms/librenms-agent/raw/master/snmp/privoxy -O /etc/snmp/privoxy chmod +x /etc/snmp/privoxy Install the depdenencies. # FreeBSD pkg install p5-File-ReadBackwards p5-Time-Piece p5-JSON p5-IPC-Run3 p5-Gzip-Faster p5-MIME-Base64 # Debian apt-get install cpanminus zlib1g cpanm File::ReadBackwards Time::Piece JSON IPC::Run3 MIME::Base64 Gzip::Faster Add the extend to snmpd.conf and restart snmpd. extend privoxy /etc/snmp/privoxy If your logfile is not at /var/log/privoxy/logfile , that may be changed via the -f option. If privoxy-log-parser.pl is not found in your standard $PATH setting, you may will need up call the extend via /usr/bin/env with a $PATH set to something that includes it. Once that is done, just wait for the server to be rediscovered or just enable it manually.","title":"SNMP Extend"},{"location":"Extensions/Applications/#pwrstatd","text":"Pwrstatd (commonly known as powerpanel) is an application/service available from CyberPower to monitor their PSUs over USB. It is currently capable of reading the status of only one PSU connected via USB at a time. The powerpanel software is available here: https://www.cyberpowersystems.com/products/software/power-panel-personal/","title":"Pwrstatd"},{"location":"Extensions/Applications/#snmp-extend_48","text":"Copy the python script, pwrstatd.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/pwrstatd.py -O /etc/snmp/pwrstatd.py Make the script executable chmod +x /etc/snmp/pwrstatd.py Edit your snmpd.conf file and add: extend pwrstatd /etc/snmp/pwrstatd.py (Optional) Create a /etc/snmp/pwrstatd.json file and specify the path to the pwrstat executable [the default path is /sbin/pwrstat]: { \"pwrstat_cmd\": \"/sbin/pwrstat\" } Restart snmpd.","title":"SNMP Extend"},{"location":"Extensions/Applications/#proxmox","text":"For Proxmox 4.4+ install the libpve-apiclient-perl package apt install libpve-apiclient-perl Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/proxmox -O /usr/local/bin/proxmox Make the script executable chmod +x /usr/local/bin/proxmox Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend proxmox /usr/local/bin/proxmox Note: if your snmpd doesn't run as root, you might have to invoke the script using sudo and modify the \"extend\" line extend proxmox /usr/bin/sudo /usr/local/bin/proxmox after, edit your sudo users (usually visudo ) and add at the bottom: Debian-snmp ALL=(ALL) NOPASSWD: /usr/local/bin/proxmox Restart snmpd on your host","title":"Proxmox"},{"location":"Extensions/Applications/#puppet-agent","text":"SNMP extend script to get your Puppet Agent data into your host.","title":"Puppet Agent"},{"location":"Extensions/Applications/#snmp-extend_49","text":"Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/puppet_agent.py -O /etc/snmp/puppet_agent.py Make the script executable chmod +x /etc/snmp/puppet_agent.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend puppet-agent /etc/snmp/puppet_agent.py The Script needs python3-yaml package to be installed. Per default script searches for on of this files: /var/cache/puppet/state/last_run_summary.yaml /opt/puppetlabs/puppet/cache/state/last_run_summary.yaml optionally you can add a specific summary file with creating /etc/snmp/puppet.json { \"agent\": { \"summary_file\": \"/my/custom/path/to/summary_file\" } } custom summary file has highest priority Restart snmpd on the host","title":"SNMP Extend"},{"location":"Extensions/Applications/#pureftpd","text":"SNMP extend script to monitor PureFTPd.","title":"PureFTPd"},{"location":"Extensions/Applications/#snmp-extend_50","text":"Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/pureftpd.py -O /etc/snmp/pureftpd.py Make the script executable chmod +x /etc/snmp/pureftpd.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend pureftpd sudo /etc/snmp/pureftpd.py Edit your sudo users (usually visudo ) and add at the bottom: snmp ALL=(ALL) NOPASSWD: /etc/snmp/pureftpd.py or the path where your pure-ftpwho is located If pure-ftpwho is not located in /usr/sbin you will also need to create a config file, which is named pureftpd.json. The file has to be located in /etc/snmp/. {\"pureftpwho_cmd\": \"/usr/sbin/pure-ftpwho\" } Restart snmpd on your host","title":"SNMP Extend"},{"location":"Extensions/Applications/#raspberry-pi","text":"SNMP extend script to get your PI data into your host.","title":"Raspberry PI"},{"location":"Extensions/Applications/#snmp-extend_51","text":"Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/raspberry.sh -O /etc/snmp/raspberry.sh Make the script executable chmod +x /etc/snmp/raspberry.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend raspberry /usr/bin/sudo /bin/sh /etc/snmp/raspberry.sh Edit your sudo users (usually visudo ) and add at the bottom: snmp ALL=(ALL) NOPASSWD: /bin/sh /etc/snmp/raspberry.sh Note: If you are using Raspian, the default user is Debian-snmp . Change snmp above to Debian-snmp . You can verify the user snmpd is using with ps aux | grep snmpd Restart snmpd on PI host","title":"SNMP Extend"},{"location":"Extensions/Applications/#raspberry-pi-gpio-monitor","text":"SNMP extend script to monitor your IO pins or sensor modules connected to your GPIO header.","title":"Raspberry Pi GPIO Monitor"},{"location":"Extensions/Applications/#snmp-extend_52","text":"1: Make sure you have wiringpi installed on your Raspberry Pi. In Debian-based systems for example you can achieve this by issuing: apt-get install wiringpi 2: Download the script to your Raspberry Pi. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/rpigpiomonitor.php -O /etc/snmp/rpigpiomonitor.php 3: (optional) Download the example configuration to your Raspberry Pi. wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/rpigpiomonitor.ini -O /etc/snmp/rpigpiomonitor.ini 4: Make the script executable: chmod +x /etc/snmp/rpigpiomonitor.php 5: Create or edit your rpigpiomonitor.ini file according to your needs. 6: Check your configuration with rpigpiomonitor.php -validate 7: Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend rpigpiomonitor /etc/snmp/rpigpiomonitor.php 8: Restart snmpd on your Raspberry Pi and, if your Raspberry Pi is already present in LibreNMS, perform a manual rediscover.","title":"SNMP Extend"},{"location":"Extensions/Applications/#redis","text":"Script to monitor your Redis Server","title":"Redis"},{"location":"Extensions/Applications/#snmp-extend_53","text":"Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/redis.py -O /etc/snmp/redis.py Make the script executable chmod +x /etc/snmp/redis.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend redis /etc/snmp/redis.py (Optional) If you have SELinux in Enforcing mode, you must add a module so the script can get redis informations and write them: cat << EOF > snmpd_redis.te module snmpd_redis 1.0; require { type tmp_t; type redis_port_t; type snmpd_t; class tcp_socket name_connect; class dir { add_name write }; } #============= snmpd_t ============== allow snmpd_t redis_port_t:tcp_socket name_connect; allow snmpd_t tmp_t:dir { write add_name }; EOF checkmodule -M -m -o snmpd_redis.mod snmpd_redis.te semodule_package -o snmpd_redis.pp -m snmpd_redis.mod semodule -i snmpd_redis.pp","title":"SNMP Extend"},{"location":"Extensions/Applications/#agent_13","text":"Install the agent on this device if it isn't already and copy the redis script to /usr/lib/check_mk_agent/local/","title":"Agent"},{"location":"Extensions/Applications/#rrdcached","text":"Install/Setup: For Install/Setup Local Librenms RRDCached: Please see RRDCached Will collect stats by: 1. Connecting directly to the associated device on port 42217 2. Monitor thru snmp with SNMP extend, as outlined below 3. Connecting to the rrdcached server specified by the rrdcached setting SNMP extend script to monitor your (remote) RRDCached via snmp","title":"RRDCached"},{"location":"Extensions/Applications/#snmp-extend_54","text":"Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/agent-local/rrdcached -O /etc/snmp/rrdcached Make the script executable chmod +x /etc/snmp/rrdcached Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf ) and add: extend rrdcached /etc/snmp/rrdcached","title":"SNMP Extend"},{"location":"Extensions/Applications/#sdfs-info","text":"A small shell script that exportfs SDFS volume info.","title":"SDFS info"},{"location":"Extensions/Applications/#snmp-extend_55","text":"Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/sdfsinfo -O /etc/snmp/sdfsinfo Make the script executable chmod +x /etc/snmp/sdfsinfo Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend sdfsinfo /etc/snmp/sdfsinfo Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#seafile","text":"SNMP extend script to monitor your Seafile Server","title":"Seafile"},{"location":"Extensions/Applications/#snmp-extend_56","text":"Copy the Python script, seafile.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/seafile.py -O /etc/snmp/seafile.py Also you have to install the requests Package for Python3. Under Ubuntu/Debian just run apt install python3-requests Make the script executable chmod +x /etc/snmp/seafile.py Edit your snmpd.conf file and add: extend seafile /etc/snmp/seafile.py You will also need to create the config file, which is named seafile.json . The script has to be located at /etc/snmp/. {\"url\": \"https://seafile.mydomain.org\", \"username\": \"some_admin_login@mail.address\", \"password\": \"password\", \"account_identifier\": \"name\" \"hide_monitoring_account\": true } The variables are as below. url = Url how to get access to Seafile Server username = Login to Seafile Server. It is important that used Login has admin privileges. Otherwise most API calls will be denied. password = Password to the configured login. account_identifier = Defines how user accounts are listed in RRD Graph. Options are: name, email hide_monitoring_account = With this Boolean you can hide the Account which you use to access Seafile API Note: It is recommended to use a dedicated Administrator account for monitoring.","title":"SNMP Extend"},{"location":"Extensions/Applications/#smart","text":"","title":"SMART"},{"location":"Extensions/Applications/#snmp-extend_57","text":"Copy the Perl script, smart, to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/smart-v1 -O /etc/snmp/smart Install the depends. # FreeBSD pkg install p5-JSON p5-MIME-Base64 smartmontools # Debian apt-get install cpanminus smartmontools cpanm MIME::Base64 JSON # CentOS dnf install smartmontools perl-JSON perl-MIME-Base64 Make the script executable chmod +x /etc/snmp/smart Edit your snmpd.conf file and add: extend smart /etc/snmp/smart You will also need to create the config file, which defaults to the same path as the script, but with .config appended. So if the script is located at /etc/snmp/smart, the config file will be /etc/snmp/smart.config . Alternatively you can also specific a config via -c . Anything starting with a # is comment. The format for variables is $variable=$value. Empty lines are ignored. Spaces and tabes at either the start or end of a line are ignored. Any line with out a matched variable or # are treated as a disk. #This is a comment cache=/var/cache/smart smartctl=/usr/bin/env smartctl useSN=1 ada0 ada1 da5 /dev/da5 -d sat twl0,0 /dev/twl0 -d 3ware,0 twl0,1 /dev/twl0 -d 3ware,1 twl0,2 /dev/twl0 -d 3ware,2 The variables are as below. cache = The path to the cache file to use. Default: /var/cache/smart smartctl = The path to use for smartctl. Default: /usr/bin/env smartctl useSN = If set to 1, it will use the disks SN for reporting instead of the device name. 1 is the default. 0 will use the device name. A disk line is can be as simple as just a disk name under /dev/. Such as in the config above The line \"ada0\" would resolve to \"/dev/ada0\" and would be called with no special argument. If a line has a space in it, everything before the space is treated as the disk name and is what used for reporting and everything after that is used as the argument to be passed to smartctl. If you want to guess at the configuration, call it with -g and it will print out what it thinks it should be. Restart snmpd on your host If you have a large number of more than one or two disks on a system, you should consider adding this to cron. Also make sure the cache file is some place it can be written to. */5 * * * * /etc/snmp/smart -u If your snmp agent runs as user \"snmp\", edit your sudo users (usually visudo ) and add at the bottom: snmp ALL=(ALL) NOPASSWD: /etc/snmp/smart, /usr/bin/env smartctl and modify your snmpd.conf file accordingly, sudo can be excluded if running it via cron: extend smart /usr/bin/sudo /etc/snmp/smart The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Optionally setup nightly self tests for the disks. The exend will run the specified test on all configured disks if called with the -t flag and the name of the SMART test to run. 0 0 * * * /etc/snmp/smart -t long","title":"SNMP Extend"},{"location":"Extensions/Applications/#sneck","text":"This is for replacing Nagios/Icinga or the LibreNMS service integration in regards to NRPE. This allows LibreNMS to query what checks were ran on the server and keep track of totals of OK, WARNING, CRITICAL, and UNKNOWN statuses. The big advantage over this compared to a NRPE are as below. It does not need to know what checks are configured on it. Also does not need to wait for the tests to run as sneck is meant to be ran via cron and the then return the cache when queried via SNMP, meaning a lot faster response time, especially if slow checks are being performed. Works over proxied SNMP connections. Included are alert examples. Although for setting up custom ones, the metrics below are provided. Metric Description ok Total OK checks warning Total WARNING checks critical Total CRITICAL checks unknown Total UNKNOWN checks errored Total checks that errored time_to_polling Differnce in seconds between when polling data was generated and when polled time_to_polling_abs The absolute value of time_to_polling. check_$CHECK Exit status of a specific check $CHECK is equal to the name of the check in question. So foo would be check_foo The standard Nagios/Icinga style exit codes are used and those are as below. Exit Meaning 0 okay 1 warning 2 critical 3+ unknown To use time_to_polling , it will need to enabled via setting the config item below. The default is false. Unless set to true, this value will default to 0. If enabling this, one will want to make sure that NTP is in use every were or it will alert if it goes over a difference of 540s. lnms config:set app.sneck.polling_time_diff true For more information on Sneck, check it out at MetaCPAN or Github . For poking systems using Sneck, also check out boop_snoot if one wants to query those systems via the CLI. Docs on it at MetaCPAN and Github .","title":"Sneck"},{"location":"Extensions/Applications/#snmp-extend_58","text":"Install the extend. # FreeBSD pkg install p5-JSON p5-File-Slurp p5-MIME-Base64 p5-Gzip-Faster p5-App-cpanminus cpanm Monitoring::Sneck # Debian based systems apt-get install zlib1g-dev cpanminus cpanm Monitoring::Sneck Configure any of the checks you want to run in /usr/local/etc/sneck.conf . You con find it documented here . Set it up in cron. This will mean you don't need to wait for all the checks to complete when polled via SNMP, which for like SMART or other long running checks will mean it timing out. Also means it does not need called via sudo as well. */5 * * * * /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin /usr/local/bin/sneck -u 2> /dev/null > /dev/null Set it up in the snmpd config and restart snmpd. The -c flag will tell read it to read from cache instead of rerunning the checks. extend sneck /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin /usr/local/bin/sneck -c In LibreNMS, enable the application for the server in question or wait for auto discovery to find it.","title":"SNMP Extend"},{"location":"Extensions/Applications/#squid","text":"","title":"Squid"},{"location":"Extensions/Applications/#snmp-proxy","text":"Enable SNMP for Squid like below, if you have not already, and restart it. acl snmppublic snmp_community public snmp_port 3401 snmp_access allow snmppublic localhost snmp_access deny all Restart squid on your host. Edit your snmpd.conf file and add, making sure you have the same community, host, and port as above: proxy -v 2c -Cc -c public 127.0.0.1:3401 1.3.6.1.4.1.3495 For more advanced information on Squid and SNMP or setting up proxying for net-snmp, please see the links below. http://wiki.squid-cache.org/Features/Snmp http://www.net-snmp.org/wiki/index.php/Snmpd_proxy","title":"SNMP Proxy"},{"location":"Extensions/Applications/#supervisord","text":"It shows you the totals per status and also the uptime per process. That way you can add alerts for instance when there are process in state FATAL .","title":"Supervisord"},{"location":"Extensions/Applications/#snmp-extend_59","text":"Copy the python script to the desired host. wget https://github.com/librenms/librenms-agent/raw/master/snmp/supervisord.py -O /etc/snmp/supervisord.py Notice that this will use the default unix socket path. Modify the unix_socket_path variable in the script if your path differs from the default. Make the script executable chmod +x /etc/snmp/supervisord.py Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend supervisord /etc/snmp/supervisord.py Restart snmpd on your host systemctl restart snmpd","title":"SNMP Extend"},{"location":"Extensions/Applications/#sagan","text":"For metrics the stats are migrated as below from the stats JSON. f_drop_percent and drop_percent are computed based on the found data. Instance Key Stats JSON Key uptime .stats.uptime total .stats.captured.total drop .stats.captured.drop ignore .stats.captured.ignore threshold .stats.captured.theshold after .stats.captured.after match .stats.captured.match bytes .stats.captured.bytes_total bytes_ignored .stats.captured.bytes_ignored max_bytes_log_line .stats.captured.max_bytes_log_line eps .stats.captured.eps f_total .stats.flow.total f_dropped .stats.flow.dropped Those keys are appended with the name of the instance running with _ between the instance name and instance metric key. So uptime for ids would be ids_uptime . The default is named 'ids' unless otherwise specified via the extend. There is a special instance name of .total which is the total of all the instances. So if you want the total eps, the metric would be .total_eps . Also worth noting that the alert value is the highest one found among all the instances.","title":"Sagan"},{"location":"Extensions/Applications/#snmp-extend_60","text":"Install the extend. cpanm Sagan::Monitoring Setup cron. Below is a example. */5 * * * * /usr/local/bin/sagan_stat_check > /dev/null Configure snmpd.conf extend sagan-stats /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin sagan_stat_check -c Restart snmpd on your system. You will want to make sure that sagan is setup to with the values set below for stats-json processor, for a single instance setup.. enabled: yes time: 300 subtract_old_values: true filename: \"$LOG_PATH/stats.json\" Any configuration of sagan_stat_check should be done in the cron setup. If the default does not work, check the docs for it at MetaCPAN for sagan_stat_check","title":"SNMP Extend"},{"location":"Extensions/Applications/#socket-statistics-ss","text":"The Socket Statistics application polls ss and scrapes socket statuses. Individual sockets and address-families may be filtered out within the script's optional configuration JSON file. The following socket types are polled directly. Filtering a socket type will disable direct polling as-well-as indirect polling within any address-families that list the socket type as their child: dccp (also exists within address-families \"inet\" and \"inet6\") mptcp (also exists within address-families \"inet\" and \"inet6\") raw (also exists within address-families \"inet\" and \"inet6\") sctp (also exists within address-families \"inet\" and \"inet6\") tcp (also exists within address-families \"inet\" and \"inet6\") udp (also exists within address-families \"inet\" and \"inet6\") xdp The following socket types are polled within an address-family only: inet6 (within address-family \"inet6\") p_dgr (within address-family \"link\") p_raw (within address-family \"link\") ti_dg (within address-family \"tipc\") ti_rd (within address-family \"tipc\") ti_sq (within address-family \"tipc\") ti_st (within address-family \"tipc\") v_dgr (within address-family \"vsock\") v_str (within address-family \"vsock\") unknown (within address-families \"inet\", \"inet6\", \"link\", \"tipc\", and \"vsock\") The following address-families are polled directly and have their child socket types tab-indented below them. Filtering a socket type (see \"1\" above) will filter it from the address-family. Filtering an address-family will filter out all of its child socket types. However, if those socket types are not DIRECTLY filtered out (see \"1\" above), then they will continue to be monitored either directly or within other address-families in which they exist: inet dccp mptcp raw sctp tcp udp unknown inet6 dccp icmp6 mptcp raw sctp tcp udp unknown link p_dgr p_raw unknown netlink tipc ti_dg ti_rd ti_sq ti_st unknown unix u_dgr u_seq u_str vsock v_dgr v_str unknown","title":"Socket Statistics (ss)"},{"location":"Extensions/Applications/#snmp-extend_61","text":"Copy the python script, ss.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/ss.py -O /etc/snmp/ss.py Make the script executable chmod +x /etc/snmp/ss.py Edit your snmpd.conf file and add: extend ss /etc/snmp/ss.py (Optional) Create a /etc/snmp/ss.json file and specify: \"ss_cmd\" - String path to the ss binary: [\"/sbin/ss\"] \"socket_types\" - A comma-delimited list of socket types to include. The following socket types are valid: dccp, icmp6, mptcp, p_dgr, p_raw, raw, sctp, tcp, ti_dg, ti_rd, ti_sq, ti_st, u_dgr, u_seq, u_str, udp, unknown, v_dgr, v_dgr, xdp. Please note that the \"unknown\" socket type is represented in /sbin/ss output with the netid \"???\". Please also note that the p_dgr and p_raw socket types are specific to the \"link\" address family; the ti_dg, ti_rd, ti_sq, and ti_st socket types are specific to the \"tipc\" address family; the u_dgr, u_seq, and u_str socket types are specific to the \"unix\" address family; and the v_dgr and v_str socket types are specific to the \"vsock\" address family. Filtering out the parent address families for the aforementioned will also filter out their specific socket types. Specifying \"all\" includes all of the socket types. For example: to include only tcp, udp, icmp6 sockets, you would specify \"tcp,udp,icmp6\": [\"all\"] \"addr_families\" - A comma-delimited list of address families to include. The following families are valid: inet, inet6, link, netlink, tipc, unix, vsock. As mentioned above under (b), filtering out the link, tipc, unix, or vsock address families will also filter out their respective socket types. Specifying \"all\" includes all of the families. For example: to include only inet and inet6 families, you would specify \"inet,inet6\": [\"all\"] { \"ss_cmd\": \"/sbin/ss\", \"socket_types\": \"all\" \"addr_families\": \"all\" } In order to filter out uncommon/unused socket types, the following JSON configuration is recommended: { \"ss_cmd\": \"/sbin/ss\", \"socket_types\": \"icmp6,p_dgr,p_raw,raw,tcp,u_dgr,u_seq,u_str,udp\", \"addr_families\": \"inet,inet6,link,netlink,unix\" } (Optional) If SELinux is in Enforcing mode, you must add a module so the script can poll sockets: cat << EOF > snmpd_ss.te module snmp_ss 1.0; require { type snmpd_t; class netlink_tcpdiag_socket { bind create getattr nlmsg_read read setopt write }; } #============= snmpd_t ============== allow snmpd_t self:netlink_tcpdiag_socket { bind create getattr nlmsg_read read setopt write }; EOF checkmodule -M -m -o snmpd_ss.mod snmpd_ss.te semodule_package -o snmpd_ss.pp -m snmpd_ss.mod semodule -i snmpd_ss.pp Restart snmpd.","title":"SNMP Extend"},{"location":"Extensions/Applications/#suricata","text":"","title":"Suricata"},{"location":"Extensions/Applications/#snmp-extend_62","text":"Install the extend. cpanm Suricata::Monitoring Setup cron. Below is a example. */5 * * * * /usr/local/bin/suricata_stat_check > /dev/null Configure snmpd.conf extend suricata-stats /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin suricata_stat_check -c Or if you want to use try compressing the return via Base64+GZIP... extend suricata-stats /usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin suricata_stat_check -c -b Restart snmpd on your system. You will want to make sure Suricata is set to output the stats to the eve file once a minute. This will help make sure that it won't be to far back in the file and will make sure it is recent when the cronjob runs. Any configuration of suricata_stat_check should be done in the cron setup. If the default does not work, check the docs for it at MetaCPAN for suricata_stat_check","title":"SNMP Extend"},{"location":"Extensions/Applications/#suricata-extract","text":"","title":"Suricata Extract"},{"location":"Extensions/Applications/#snmp_1","text":"Add the following to your snmpd config and restart. Path may have to be adjusted depending on where suricata_extract_submit_extend is installed to. extend suricata_extract /usr/local/bin/suricata_extract_submit_extend Then just wait for the system to be rediscovered or enable it manually for the server in question.","title":"SNMP"},{"location":"Extensions/Applications/#systemd","text":"The systemd application polls systemd and scrapes systemd units' load, activation, and sub states.","title":"Systemd"},{"location":"Extensions/Applications/#snmp-extend_63","text":"Copy the python script, systemd.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/systemd.py -O /etc/snmp/systemd.py Make the script executable chmod +x /etc/snmp/systemd.py Edit your snmpd.conf file and add: extend systemd /etc/snmp/systemd.py (Optional) Create a /etc/snmp/systemd.json file and specify: \"systemctl_cmd\" - String path to the systemctl binary [Default: \"/usr/bin/systemctl\"] \"include_inactive_units\" - True/False string to include inactive units in results [Default: \"False\"] { \"systemctl_cmd\": \"/bin/systemctl\", \"include_inactive_units\": \"True\" } (Optional) If you have SELinux in Enforcing mode, you must add a module so the script can access systemd state: cat << EOF > snmpd_systemctl.te module snmpd_systemctl 1.0; require { type snmpd_t; type systemd_systemctl_exec_t; type init_t; class file { execute execute_no_trans map open read }; class unix_stream_socket connectto; class system status; } #============= snmpd_t ============== allow snmpd_t init_t:system status; allow snmpd_t init_t:unix_stream_socket connectto; allow snmpd_t systemd_systemctl_exec_t:file { execute execute_no_trans map open read }; EOF checkmodule -M -m -o snmpd_systemctl.mod snmpd_systemctl.te semodule_package -o snmpd_systemctl.pp -m snmpd_systemctl.mod semodule -i snmpd_systemctl.pp Restart snmpd.","title":"SNMP Extend"},{"location":"Extensions/Applications/#tinydns-aka-djbdns","text":"","title":"TinyDNS aka djbdns"},{"location":"Extensions/Applications/#agent_14","text":"Install the agent on this device if it isn't already and copy the tinydns script to /usr/lib/check_mk_agent/local/ Note : We assume that you use DJB's Daemontools to start/stop tinydns. And that your tinydns instance is located in /service/dns , adjust this path if necessary. Replace your log 's run file, typically located in /service/dns/log/run with: #!/bin/sh exec setuidgid dnslog tinystats ./main/tinystats/ multilog t n3 s250000 ./main/ Create tinystats directory and chown: mkdir /service/dns/log/main/tinystats chown dnslog:nofiles /service/dns/log/main/tinystats Restart TinyDNS and Daemontools: /etc/init.d/svscan restart Note : Some say svc -t /service/dns is enough, on my install (Gentoo) it doesn't rehook the logging and I'm forced to restart it entirely.","title":"Agent"},{"location":"Extensions/Applications/#unbound","text":"Unbound configuration: # Enable extended statistics. server: extended-statistics: yes statistics-cumulative: yes remote-control: control-enable: yes control-interface: 127.0.0.1 Restart your unbound after changing the configuration, verify it is working by running unbound-control stats .","title":"Unbound"},{"location":"Extensions/Applications/#option-1-snmp-extend-preferred-and-easiest-method","text":"Copy the shell script, unbound, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/unbound -O /etc/snmp/unbound Make the script executable chmod +x /etc/snmp/unbound Edit your snmpd.conf file and add: extend unbound /usr/bin/sudo /etc/snmp/unbound Restart snmpd. The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"Option 1. SNMP Extend (Preferred and easiest method)"},{"location":"Extensions/Applications/#option-2-agent","text":"Install the agent on this device if it isn't already and copy the unbound.sh script to /usr/lib/check_mk_agent/local/","title":"Option 2. Agent"},{"location":"Extensions/Applications/#ups-nut","text":"A small shell script that exports nut ups status.","title":"UPS-nut"},{"location":"Extensions/Applications/#snmp-extend_64","text":"Copy the shell script, unbound, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/ups-nut.sh -O /etc/snmp/ups-nut.sh Make the script executable chmod +x /etc/snmp/ups-nut.sh Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ups-nut /etc/snmp/ups-nut.sh Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page. Optionally if you have multiple UPS or your UPS is not named APCUPS you can specify its name as an argument into /etc/snmp/ups-nut.sh extend ups-nut /etc/snmp/ups-nut.sh ups1 extend ups-nut /etc/snmp/ups-nut.sh ups2","title":"SNMP Extend"},{"location":"Extensions/Applications/#ups-apcups","text":"A small shell script that exports apcacess ups status.","title":"UPS-apcups"},{"location":"Extensions/Applications/#snmp-extend_65","text":"Copy the shell script, unbound, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/ups-apcups -O /etc/snmp/ups-apcups Make the script executable chmod +x /etc/snmp/ups-apcups Edit your snmpd.conf file (usually /etc/snmp/snmpd.conf) and add: extend ups-apcups /etc/snmp/ups-apcups If 'apcaccess' is not in the PATH enviromental variable snmpd is using, you may need to do something like below. extend ups-apcups/usr/bin/env PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin /etc/snmp/ups-apcups Restart snmpd on your host The application should be auto-discovered as described at the top of the page. If it is not, please follow the steps set out under SNMP Extend heading top of page.","title":"SNMP Extend"},{"location":"Extensions/Applications/#voip-monitor","text":"Shell script that reports cpu-load/memory/open-files files stats of Voip Monitor","title":"Voip-monitor"},{"location":"Extensions/Applications/#snmp-extend_66","text":"Download the script onto the desired host wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/voipmon-stats.sh -O /etc/snmp/voipmon-stats.sh Make the script executable chmod +x /etc/snmp/voipmon-stats.sh Edit your snmpd.conf file (usually /etc/snmp/voipmon-stats.sh ) and add: extend voipmon /etc/snmp/voipmon-stats.sh","title":"SNMP Extend"},{"location":"Extensions/Applications/#wireguard","text":"The Wireguard application polls the Wireguard service and scrapes all client statistics for all interfaces configured as Wireguard interfaces.","title":"Wireguard"},{"location":"Extensions/Applications/#snmp-extend_67","text":"Copy the python script, wireguard.py, to the desired host wget https://github.com/librenms/librenms-agent/raw/master/snmp/wireguard.py -O /etc/snmp/wireguard.py Make the script executable chmod +x /etc/snmp/wireguard.py Edit your snmpd.conf file and add: extend wireguard /etc/snmp/wireguard.py Create a /etc/snmp/wireguard.json file and specify: (optional) \"wg_cmd\" - String path to the wg binary [\"/usr/bin/wg\"] \"public_key_to_arbitrary_name\" - A dictionary to convert between the publickey assigned to the client (specified in the wireguard interface conf file) to an arbitrary, friendly name. The friendly names MUST be unique within each interface. Also note that the interface name and friendly names are used in the RRD filename, so using special characters is highly discouraged. { \"wg_cmd\": \"/bin/wg\", \"public_key_to_arbitrary_name\": { \"wg0\": { \"z1iSIymFEFi/PS8rR19AFBle7O4tWowMWuFzHO7oRlE=\": \"client1\", \"XqWJRE21Fw1ke47mH1yPg/lyWqCCfjkIXiS6JobuhTI=\": \"server.domain.com\" } } } Restart snmpd.","title":"SNMP Extend"},{"location":"Extensions/Applications/#zfs","text":"","title":"ZFS"},{"location":"Extensions/Applications/#snmp-extend_68","text":"1: Install the depends. ### FreeBSD pkg install p5-JSON p5-MIME-Base64 p5-Gzip-Faster ### Debian apt-get install -y cpanminus zlib1g-dev cpanm Mime::Base64 JSON Gzip::Faster 2: Fetch the script in question and make it executable. wget https://github.com/librenms/librenms-agent/raw/master/snmp/zfs -O /etc/snmp/zfs chmod +x /etc/snmp/zfs 3: Add the following to snmpd.conf and restart snmpd. extend zfs /etc/snmp/zfs","title":"SNMP Extend"},{"location":"Extensions/Authentication/","text":"Authentication Options LibreNMS supports multiple authentication modules along with Two Factor Auth . Here we will provide configuration details for these modules. Alternatively, you can use Socialite Providers which supports a wide variety of social/OAuth/SAML authentication methods. Available authentication modules MySQL: mysql Active Directory: active_directory LDAP: ldap Radius: radius HTTP Auth: http-auth , ad_authorization , ldap_authorization Single Sign-on: sso \u26a0\ufe0f When enabling a new authentication module, the local users will no longer be available to log in. Enable authentication module To enable a particular authentication module you need to set this up in config.php. Please note that only ONE module can be enabled. LibreNMS doesn't support multiple authentication mechanisms at the same time. auth/general lnms config:set auth_mechanism mysql User levels and User account type 1: Normal User : You will need to assign device / port permissions for users at this level. 5: Global Read : Read only Administrator. 10: Administrator : This is a global read/write admin account. 11: Demo Account : Provides full read/write with certain restrictions (i.e can't delete devices). Note Oxidized configs can often contain sensitive data. Because of that only Administrator account type can see configs. Note for SELinux users When using SELinux on the LibreNMS server, you need to allow Apache (httpd) to connect LDAP/Active Directory server, this is disabled by default. You can use SELinux Booleans to allow network access to LDAP resources with this command: setsebool -P httpd_can_connect_ldap = 1 Testing authentication You can test authentication with this script: ./scripts/auth_test.php Enable debug output to troubleshoot issues MySQL Authentication auth/general lnms config:set auth_mechanism mysql This is default option with LibreNMS so you should have already have the following configuration setup in your environment file (.env). DB_HOST=HOSTNAME DB_DATABASE=DBNAME DB_USERNAME=DBUSER DB_PASSWORD=\"DBPASS\" Active Directory Authentication auth/general lnms config:set auth_mechanism active_directory Install php-ldap or php8.1-ldap , making sure to install the same version as PHP. If you have issues with secure LDAP try setting auth/ad lnms config:set auth_ad_check_certificates 0 this will ignore certificate errors. Require actual membership of the configured groups auth/ad lnms config:set auth_ad_require_groupmembership 1 If you set auth_ad_require_groupmembership to 1, the authenticated user has to be a member of the specific group. Otherwise all users can authenticate, and will be either level 0 or you may set auth_ad_global_read to 1 and all users will have read only access unless otherwise specified. Old account cleanup Cleanup of old accounts is done by checking the authlog. You will need to set the number of days when old accounts will be purged AUTOMATICALLY by daily.sh. Please ensure that you set the authlog_purge value to be greater than active_directory.users_purge otherwise old users won't be removed. Sample configuration auth/general lnms config:set auth_mechanism active_directory lnms config:set auth_ad_url ldaps://server.example.com lnms config:set auth_ad_domain lnms config:set auth_ad_base_dn dc = example,dc = com lnms config:set auth_ad_check_certificates true lnms config:set auth_ad_binduser examplebinduser lnms config:set auth_ad_bindpassword examplepassword lnms config:set auth_ad_timeout 5 lnms config:set auth_ad_debug false lnms config:set active_directory.users_purge 30 lnms config:set auth_ad_require_groupmembership true lnms config:set auth_ad_groups.ad-admingroup.level 10 lnms config:set auth_ad_groups.ad-usergroup.level 5 Replace ad-admingroup with your Active Directory admin-user group and ad-usergroup with your standard user group. It is highly suggested to create a bind user, otherwise \"remember me\", alerting users, and the API will not work. Active Directory redundancy You can set two Active Directory servers by editing the auth_ad_url setting like this example: auth/ad lnms config:set auth_ad_url \"ldaps://dc1.example.com ldaps://dc2.example.com\" Active Directory LDAP filters You can add an LDAP filter to be ANDed with the builtin user filter ( (sAMAccountName=$username) ). The defaults are: auth/ad lnms config:set auth_ad_user_filter \"(objectclass=user)\" lnms config:set auth_ad_group_filter \"(objectclass=group)\" This yields (&(objectclass=user)(sAMAccountName=$username)) for the user filter and (&(objectclass=group)(sAMAccountName=$group)) for the group filter. SELinux configuration On RHEL / CentOS / Fedora, in order for LibreNMS to reach Active Directory, you need to allow LDAP requests in SELinux: setsebool -P httpd_can_connect_ldap 1 LDAP Authentication auth/general lnms config:set auth_mechanism ldap Install php_ldap or php7.0-ldap , making sure to install the same version as PHP. Standard config auth/ldap lnms config:set auth_ldap_server ldap.example.com lnms config:set auth_ldap_suffix ',ou=People,dc=example,dc=com' lnms config:set auth_ldap_groupbase 'ou=groups,dc=example,dc=com' lnms config:set auth_ldap_groups.admin.level 10 lnms config:set auth_ldap_groups.pfy.level 5 lnms config:set auth_ldap_groups.support.level 1 Additional options (usually not needed) auth/ldap lnms config:set auth_ldap_version 3 lnms config:set auth_ldap_port 389 lnms config:set auth_ldap_starttls true lnms config:set auth_ldap_prefix 'uid=' lnms config:set auth_ldap_group 'cn=groupname,ou=groups,dc=example,dc=com' lnms config:set auth_ldap_groupmemberattr memberUid lnms config:set auth_ldap_groupmembertype username lnms config:set auth_ldap_uid_attribute uidnumber lnms config:set auth_ldap_timeout 5 lnms config:set auth_ldap_emailattr mail lnms config:set auth_ldap_attr.uid uid lnms config:set auth_ldap_debug false lnms config:set auth_ldap_userdn true lnms config:set auth_ldap_userlist_filter service = informatique lnms config:set auth_ldap_wildcard_ou false lnms config:set auth_ldap_cacertfile /opt/librenms/ldap-ca-cert lnms config:set auth_ldap_ignorecert false LDAP bind user (optional) If your ldap server does not allow anonymous bind, it is highly suggested to create a bind user, otherwise \"remember me\", alerting users, and the API will not work. auth/ldap lnms config:set auth_ldap_binduser ldapbind lnms config:set auth_ldap_binddn 'CN=John.Smith,CN=Users,DC=MyDomain,DC=com' lnms config:set auth_ldap_bindpassword password LDAP server redundancy You can set two LDAP servers by editing the auth_ldap_server like this example: auth/ldap lnms config:set auth_ldap_server ldaps://dir1.example.com ldaps://dir2.example.com An example config setup for use with Jumpcloud LDAP as a service is: auth/ldap lnms config:set auth_mechanism ldap lnms config:set auth_ldap_version 3 lnms config:set auth_ldap_server ldap.jumpcloud.com lnms config:set auth_ldap_port 389 lnms config:set auth_ldap_prefix 'uid=' ; lnms config:set auth_ldap_suffix ',ou=Users,o={id},dc=jumpcloud,dc=com' lnms config:set auth_ldap_groupbase 'ou=Users,o={id},dc=jumpcloud,dc=com' lnms config:set auth_ldap_groupmemberattr member lnms config:set auth_ldap_groups. { group } .level 10 lnms config:set auth_ldap_userdn true Replace {id} with the unique ID provided by Jumpcloud. Replace {group} with the unique group name created in Jumpcloud. This field is case sensitive. Note: If you have multiple user groups to define individual access levels replace the auth_ldap_groups line with the following: auth/ldap lnms config:set auth_ldap_groups. { admin_group } .level 10 ] lnms config:set auth_ldap_groups.global_readonly_group.level 5 SELinux configuration On RHEL / CentOS / Fedora, in order for LibreNMS to reach LDAP, you need to allow LDAP requests in SELinux: setsebool -P httpd_can_connect_ldap 1 Radius Authentication Please note that a mysql user is created for each user the logs in successfully. Users are assigned the user role by default, unless radius sends a reply attribute with a role. You can change the default role(s) by setting auth/radius lnms config:set radius.default_roles '[\"csr\"]' The attribute Filter-ID is a standard Radius-Reply-Attribute (string) that can be assigned a specially formatted string to assign a single role to the user. The string to send in Filter-ID reply attribute must start with librenms_role_ followed by the role name. For example to set the admin role send librenms_role_admin . The following strings correspond to the built-in roles, but any defined role can be used: - librenms_role_normal - Sets the normal user level. - librenms_role_admin - Sets the administrator level. - librenms_role_global-read - Sets the global read level LibreNMS will ignore any other strings sent in Filter-ID and revert to default role that is set in your config. $config [ 'radius' ][ 'hostname' ] = 'localhost' ; $config [ 'radius' ][ 'port' ] = '1812' ; $config [ 'radius' ][ 'secret' ] = 'testing123' ; $config [ 'radius' ][ 'timeout' ] = 3 ; $config [ 'radius' ][ 'users_purge' ] = 14 ; // Purge users who haven't logged in for 14 days. $config [ 'radius' ][ 'default_level' ] = 1 ; // Set the default user level when automatically creating a user. Radius Huntgroup Freeradius has a function called Radius Huntgroup which allows to send different attributes based on NAS. This may be utilized if you already use Filter-ID in your environment and also want to use radius with LibreNMS. Old account cleanup Cleanup of old accounts is done by checking the authlog. You will need to set the number of days when old accounts will be purged AUTOMATICALLY by daily.sh. Please ensure that you set the $config['authlog_purge'] value to be greater than $config['radius']['users_purge'] otherwise old users won't be removed. HTTP Authentication Config option: http-auth LibreNMS will expect the user to have authenticated via your webservice already. At this stage it will need to assign a userlevel for that user which is done in one of two ways: A user exists in MySQL still where the usernames match up. A global guest user (which still needs to be added into MySQL: $config [ 'http_auth_guest' ] = \"guest\" ; This will then assign the userlevel for guest to all authenticated users. HTTP Authentication / AD Authorization Config option: ad-authorization This module is a combination of http-auth and active_directory LibreNMS will expect the user to have authenticated via your webservice already (e.g. using Kerberos Authentication in Apache) but will use Active Directory lookups to determine and assign the userlevel of a user. The userlevel will be calculated by using AD group membership information as the active_directory module does. The configuration is the same as for the active_directory module with two extra, optional options: auth_ad_binduser and auth_ad_bindpassword. These should be set to a AD user with read capabilities in your AD Domain in order to be able to perform searches. If these options are omitted, the module will attempt an anonymous bind (which then of course must be allowed by your Active Directory server(s)). There is also one extra option for controlling user information caching: auth_ldap_cache_ttl. This option allows to control how long user information (user_exists, userid, userlevel) are cached within the PHP Session. The default value is 300 seconds. To disable this caching (highly discourage) set this option to 0. $config [ 'auth_ad_binduser' ] = \"ad_binduser\" ; $config [ 'auth_ad_bindpassword' ] = \"ad_bindpassword\" ; $config [ 'auth_ldap_cache_ttl' ] = 300 ; HTTP Authentication / LDAP Authorization Config option: ldap-authorization This module is a combination of http-auth and ldap LibreNMS will expect the user to have authenticated via your webservice already (e.g. using Kerberos Authentication in Apache) but will use LDAP to determine and assign the userlevel of a user. The userlevel will be calculated by using LDAP group membership information as the ldap module does. The configuration is similar to the ldap module with one extra option: auth_ldap_cache_ttl. This option allows to control how long user information (user_exists, userid, userlevel) are cached within the PHP Session. The default value is 300 seconds. To disabled this caching (highly discourage) set this option to 0. Standard config $config [ 'auth_mechanism' ] = 'ldap-authorization' ; $config [ 'auth_ldap_server' ] = 'ldap.example.com' ; // Set server(s), space separated. Prefix with ldaps:// for ssl $config [ 'auth_ldap_suffix' ] = ',ou=People,dc=example,dc=com' ; // appended to usernames $config [ 'auth_ldap_groupbase' ] = 'ou=groups,dc=example,dc=com' ; // all groups must be inside this $config [ 'auth_ldap_groups' ][ 'admin' ][ 'roles' ] = [ 'admin' ]; // set admin group to admin role $config [ 'auth_ldap_groups' ][ 'pfy' ][ 'roles' ] = [ 'global-read' ]; // set pfy group to global read only role $config [ 'auth_ldap_groups' ][ 'support' ][ 'roles' ] = [ 'user' ]; // set support group as a normal user Additional options (usually not needed) $config [ 'auth_ldap_version' ] = 3 ; # v2 or v3 $config [ 'auth_ldap_port' ] = 389 ; // 389 or 636 for ssl $config [ 'auth_ldap_starttls' ] = True ; // Enable TLS on port 389 $config [ 'auth_ldap_prefix' ] = 'uid=' ; // prepended to usernames $config [ 'auth_ldap_group' ] = 'cn=groupname,ou=groups,dc=example,dc=com' ; // generic group with level 0 $config [ 'auth_ldap_groupmemberattr' ] = 'memberUid' ; // attribute to use to see if a user is a member of a group $config [ 'auth_ldap_groupmembertype' ] = 'username' ; // username type to find group members by, either username (default), fulldn or puredn $config [ 'auth_ldap_emailattr' ] = 'mail' ; // attribute for email address $config [ 'auth_ldap_attr.uid' ] = 'uid' ; // attribute to check username against $config [ 'auth_ldap_userlist_filter' ] = 'service=informatique' ; // Replace 'service=informatique' by your ldap filter to limit the number of responses if you have an ldap directory with thousand of users $config [ 'auth_ldap_cache_ttl' ] = 300 ; LDAP bind user (optional) If your ldap server does not allow anonymous bind, it is highly suggested to create a bind user, otherwise \"remember me\", alerting users, and the API will not work. $config [ 'auth_ldap_binduser' ] = 'ldapbind' ; // will use auth_ldap_prefix and auth_ldap_suffix #$config['auth_ldap_binddn'] = 'CN=John.Smith,CN=Users,DC=MyDomain,DC=com'; // overrides binduser $config [ 'auth_ldap_bindpassword' ] = 'password' ; View/embedded graphs without being logged into LibreNMS webui/graph ```bash lnms config:set allow_unauth_graphs_cidr ['127.0.0.1/32'] lnms config:set allow_unauth_graphs true ``` Single Sign-on The single sign-on mechanism is used to integrate with third party authentication providers that are managed outside of LibreNMS - such as ADFS, Shibboleth, EZProxy, BeyondCorp, and others. A large number of these methods use SAML the module has been written assuming the use of SAML, and therefore these instructions contain some SAML terminology, but it should be possible to use any software that works in a similar way. In order to make use of the single sign-on module, you need to have an Identity Provider up and running, and know how to configure your Relying Party to pass attributes to LibreNMS via header injection or environment variables. Setting these up is outside of the scope of this documentation. As this module deals with authentication, it is extremely careful about validating the configuration - if it finds that certain values in the configuration are not set, it will reject access rather than try and guess. Basic Configuration To get up and running, all you need to do is configure the following values: $config [ 'auth_mechanism' ] = \"sso\" ; $config [ 'sso' ][ 'mode' ] = \"env\" ; $config [ 'sso' ][ 'group_strategy' ] = \"static\" ; $config [ 'sso' ][ 'static_level' ] = 10 ; This, along with the defaults, sets up a basic Single Sign-on setup that: Reads values from environment variables Automatically creates users when they're first seen Automatically updates users with new values Gives everyone privilege level 10 This happens to mimic the behaviour of http-auth , so if this is the kind of setup you want, you're probably better of just going and using that mechanism. Security If there is a proxy involved (e.g. EZProxy, Azure AD Application Proxy, NGINX, mod_proxy) it's essential that you have some means in place to prevent headers being injected between the proxy and the end user, and also prevent end users from contacting LibreNMS directly. This should also apply to user connections to the proxy itself - the proxy must not be allowed to blindly pass through HTTP headers. mod security _ should be considered a minimum, with a full WAF being strongly recommended. This advice applies to the IDP too. The mechanism includes very basic protection, in the form of an IP whitelist with should contain the source addresses of your proxies: $config [ 'sso' ][ 'trusted_proxies' ] = [ '127.0.0.1/8' , '::1/128' , '192.0.2.0' , '2001:DB8::' ]; This configuration item should contain an array with a list of IP addresses or CIDR prefixes that are allowed to connect to LibreNMS and supply environment variables or headers. Advanced Configuration Options User Attribute If for some reason your relying party doesn't store the username in REMOTE_USER , you can override this choice. $config [ 'sso' ][ 'user_attr' ] = 'HTTP_UID' ; Note that the user lookup is a little special - normally headers are prefixed with HTTP_ , however this is not the case for remote user - it's a special case. If you're using something different you need to figure out of the HTTP_ prefix is required or not yourself. Automatic User Create/Update These are enabled by default: $config [ 'sso' ][ 'create_users' ] = true ; $config [ 'sso' ][ 'update_users' ] = true ; If these are not enabled, user logins will be (somewhat silently) rejected unless an administrator has created the account in advance. Note that in the case of SAML federations, unless release of the users true identity has been negotiated with the IDP, the username (probably ePTID) is not likely to be predicable. Personalisation If the attributes are being populated, you can instruct the mechanism to add additional information to the user's database entry: $config [ 'sso' ][ 'email_attr' ] = \"mail\" ; $config [ 'sso' ][ 'realname_attr' ] = \"displayName\" ; $config [ 'sso' ][ 'descr_attr' ] = \"unscoped-affiliation Group Strategies Static As used above, static gives every single user the same privilege level. If you're working with a small team, or don't need access control, this is probably suitable. Attribute $config [ 'sso' ][ 'group_strategy' ] = \"attribute\" ; $config [ 'sso' ][ 'level_attr' ] = \"entitlement\" ; If your Relying Party is capable of calculating the necessary privilege level, you can configure the module to read the privilege number straight from an attribute. sso_level_attr should contain the name of the attribute that the Relying Party exposes to LibreNMS - as long as sso_mode is correctly set, the mechanism should find the value. Group Map This is the most flexible (and complex) way of assigning privileges. $config [ 'sso' ][ 'group_strategy' ] = \"map\" ; $config [ 'sso' ][ 'group_attr' ] = \"member\" ; $config [ 'sso' ][ 'group_level_map' ] = [ 'librenms-admins' => 10 , 'librenms-readers' => 1 , 'librenms-billingcontacts' => 5 ]; $config [ 'sso' ][ 'group_delimiter' ] = ';' ; This mechanism expects to find a delimited list of groups within the attribute that sso_group_attr points to. This should be an associative array of group name keys, with privilege levels as values. The mechanism will scan the list and find the highest privilege level that the user is entitled to, and assign that value to the user. If there are no matches between the user's groups and the sso_group_level_map , the user will be assigned the privilege level specified in the sso_static_level variable, with a default of 0 (no access). This feature can be used to provide a default access level (such as read-only) to all authenticated users. Additionally, this format may be specific to Shibboleth; other relying party software may need changes to the mechanism (e.g. mod_auth_mellon may create pseudo arrays). There is an optional value for sites with large numbers of groups: $config [ 'sso' ][ 'group_filter' ] = \"/librenms-(.*)/i\" ; This filter causes the mechanism to only consider groups matching a regular expression. Logout Behaviour LibreNMS has no capability to log out a user authenticated via Single Sign-On - that responsibility falls to the Relying Party. If your Relying Party has a magic URL that needs to be called to end a session, you can configure LibreNMS to direct the user to it: # Example for Shibboleth $config [ 'auth_logout_handler' ] = '/Shibboleth.sso/Logout' ; # Example for oauth2-proxy $config [ 'auth_logout_handler' ] = '/oauth2/sign_out' ; This option functions independently of the Single Sign-on mechanism. Complete Configuration This configuration works on my deployment with a Shibboleth relying party, injecting environment variables, with the IDP supplying a list of groups. $config [ 'auth_mechanism' ] = 'sso' ; $config [ 'auth_logout_handler' ] = '/Shibboleth.sso/Logout' ; $config [ 'sso' ][ 'mode' ] = 'env' ; $config [ 'sso' ][ 'create_users' ] = true ; $config [ 'sso' ][ 'update_users' ] = true ; $config [ 'sso' ][ 'realname_attr' ] = 'displayName' ; $config [ 'sso' ][ 'email_attr' ] = 'mail' ; $config [ 'sso' ][ 'group_strategy' ] = 'map' ; $config [ 'sso' ][ 'group_attr' ] = 'member' ; $config [ 'sso' ][ 'group_filter' ] = '/(librenms-.*)/i' ; $config [ 'sso' ][ 'group_delimiter' ] = ';' ; $config [ 'sso' ][ 'group_level_map' ] = [ 'librenms-demo' => 11 , 'librenms-globaladmin' => 10 , 'librenms-globalread' => 5 , 'librenms-lowpriv' => 1 ];","title":"Authentication Options"},{"location":"Extensions/Authentication/#authentication-options","text":"LibreNMS supports multiple authentication modules along with Two Factor Auth . Here we will provide configuration details for these modules. Alternatively, you can use Socialite Providers which supports a wide variety of social/OAuth/SAML authentication methods.","title":"Authentication Options"},{"location":"Extensions/Authentication/#available-authentication-modules","text":"MySQL: mysql Active Directory: active_directory LDAP: ldap Radius: radius HTTP Auth: http-auth , ad_authorization , ldap_authorization Single Sign-on: sso \u26a0\ufe0f When enabling a new authentication module, the local users will no longer be available to log in.","title":"Available authentication modules"},{"location":"Extensions/Authentication/#enable-authentication-module","text":"To enable a particular authentication module you need to set this up in config.php. Please note that only ONE module can be enabled. LibreNMS doesn't support multiple authentication mechanisms at the same time. auth/general lnms config:set auth_mechanism mysql","title":"Enable authentication module"},{"location":"Extensions/Authentication/#user-levels-and-user-account-type","text":"1: Normal User : You will need to assign device / port permissions for users at this level. 5: Global Read : Read only Administrator. 10: Administrator : This is a global read/write admin account. 11: Demo Account : Provides full read/write with certain restrictions (i.e can't delete devices). Note Oxidized configs can often contain sensitive data. Because of that only Administrator account type can see configs.","title":"User levels and User account type"},{"location":"Extensions/Authentication/#note-for-selinux-users","text":"When using SELinux on the LibreNMS server, you need to allow Apache (httpd) to connect LDAP/Active Directory server, this is disabled by default. You can use SELinux Booleans to allow network access to LDAP resources with this command: setsebool -P httpd_can_connect_ldap = 1","title":"Note for SELinux users"},{"location":"Extensions/Authentication/#testing-authentication","text":"You can test authentication with this script: ./scripts/auth_test.php Enable debug output to troubleshoot issues","title":"Testing authentication"},{"location":"Extensions/Authentication/#mysql-authentication","text":"auth/general lnms config:set auth_mechanism mysql This is default option with LibreNMS so you should have already have the following configuration setup in your environment file (.env). DB_HOST=HOSTNAME DB_DATABASE=DBNAME DB_USERNAME=DBUSER DB_PASSWORD=\"DBPASS\"","title":"MySQL Authentication"},{"location":"Extensions/Authentication/#active-directory-authentication","text":"auth/general lnms config:set auth_mechanism active_directory Install php-ldap or php8.1-ldap , making sure to install the same version as PHP. If you have issues with secure LDAP try setting auth/ad lnms config:set auth_ad_check_certificates 0 this will ignore certificate errors.","title":"Active Directory Authentication"},{"location":"Extensions/Authentication/#require-actual-membership-of-the-configured-groups","text":"auth/ad lnms config:set auth_ad_require_groupmembership 1 If you set auth_ad_require_groupmembership to 1, the authenticated user has to be a member of the specific group. Otherwise all users can authenticate, and will be either level 0 or you may set auth_ad_global_read to 1 and all users will have read only access unless otherwise specified.","title":"Require actual membership of the configured groups"},{"location":"Extensions/Authentication/#old-account-cleanup","text":"Cleanup of old accounts is done by checking the authlog. You will need to set the number of days when old accounts will be purged AUTOMATICALLY by daily.sh. Please ensure that you set the authlog_purge value to be greater than active_directory.users_purge otherwise old users won't be removed.","title":"Old account cleanup"},{"location":"Extensions/Authentication/#sample-configuration","text":"auth/general lnms config:set auth_mechanism active_directory lnms config:set auth_ad_url ldaps://server.example.com lnms config:set auth_ad_domain lnms config:set auth_ad_base_dn dc = example,dc = com lnms config:set auth_ad_check_certificates true lnms config:set auth_ad_binduser examplebinduser lnms config:set auth_ad_bindpassword examplepassword lnms config:set auth_ad_timeout 5 lnms config:set auth_ad_debug false lnms config:set active_directory.users_purge 30 lnms config:set auth_ad_require_groupmembership true lnms config:set auth_ad_groups.ad-admingroup.level 10 lnms config:set auth_ad_groups.ad-usergroup.level 5 Replace ad-admingroup with your Active Directory admin-user group and ad-usergroup with your standard user group. It is highly suggested to create a bind user, otherwise \"remember me\", alerting users, and the API will not work.","title":"Sample configuration"},{"location":"Extensions/Authentication/#active-directory-redundancy","text":"You can set two Active Directory servers by editing the auth_ad_url setting like this example: auth/ad lnms config:set auth_ad_url \"ldaps://dc1.example.com ldaps://dc2.example.com\"","title":"Active Directory redundancy"},{"location":"Extensions/Authentication/#active-directory-ldap-filters","text":"You can add an LDAP filter to be ANDed with the builtin user filter ( (sAMAccountName=$username) ). The defaults are: auth/ad lnms config:set auth_ad_user_filter \"(objectclass=user)\" lnms config:set auth_ad_group_filter \"(objectclass=group)\" This yields (&(objectclass=user)(sAMAccountName=$username)) for the user filter and (&(objectclass=group)(sAMAccountName=$group)) for the group filter.","title":"Active Directory LDAP filters"},{"location":"Extensions/Authentication/#selinux-configuration","text":"On RHEL / CentOS / Fedora, in order for LibreNMS to reach Active Directory, you need to allow LDAP requests in SELinux: setsebool -P httpd_can_connect_ldap 1","title":"SELinux configuration"},{"location":"Extensions/Authentication/#ldap-authentication","text":"auth/general lnms config:set auth_mechanism ldap Install php_ldap or php7.0-ldap , making sure to install the same version as PHP.","title":"LDAP Authentication"},{"location":"Extensions/Authentication/#standard-config","text":"auth/ldap lnms config:set auth_ldap_server ldap.example.com lnms config:set auth_ldap_suffix ',ou=People,dc=example,dc=com' lnms config:set auth_ldap_groupbase 'ou=groups,dc=example,dc=com' lnms config:set auth_ldap_groups.admin.level 10 lnms config:set auth_ldap_groups.pfy.level 5 lnms config:set auth_ldap_groups.support.level 1","title":"Standard config"},{"location":"Extensions/Authentication/#additional-options-usually-not-needed","text":"auth/ldap lnms config:set auth_ldap_version 3 lnms config:set auth_ldap_port 389 lnms config:set auth_ldap_starttls true lnms config:set auth_ldap_prefix 'uid=' lnms config:set auth_ldap_group 'cn=groupname,ou=groups,dc=example,dc=com' lnms config:set auth_ldap_groupmemberattr memberUid lnms config:set auth_ldap_groupmembertype username lnms config:set auth_ldap_uid_attribute uidnumber lnms config:set auth_ldap_timeout 5 lnms config:set auth_ldap_emailattr mail lnms config:set auth_ldap_attr.uid uid lnms config:set auth_ldap_debug false lnms config:set auth_ldap_userdn true lnms config:set auth_ldap_userlist_filter service = informatique lnms config:set auth_ldap_wildcard_ou false lnms config:set auth_ldap_cacertfile /opt/librenms/ldap-ca-cert lnms config:set auth_ldap_ignorecert false","title":"Additional options (usually not needed)"},{"location":"Extensions/Authentication/#ldap-bind-user-optional","text":"If your ldap server does not allow anonymous bind, it is highly suggested to create a bind user, otherwise \"remember me\", alerting users, and the API will not work. auth/ldap lnms config:set auth_ldap_binduser ldapbind lnms config:set auth_ldap_binddn 'CN=John.Smith,CN=Users,DC=MyDomain,DC=com' lnms config:set auth_ldap_bindpassword password","title":"LDAP bind user (optional)"},{"location":"Extensions/Authentication/#ldap-server-redundancy","text":"You can set two LDAP servers by editing the auth_ldap_server like this example: auth/ldap lnms config:set auth_ldap_server ldaps://dir1.example.com ldaps://dir2.example.com An example config setup for use with Jumpcloud LDAP as a service is: auth/ldap lnms config:set auth_mechanism ldap lnms config:set auth_ldap_version 3 lnms config:set auth_ldap_server ldap.jumpcloud.com lnms config:set auth_ldap_port 389 lnms config:set auth_ldap_prefix 'uid=' ; lnms config:set auth_ldap_suffix ',ou=Users,o={id},dc=jumpcloud,dc=com' lnms config:set auth_ldap_groupbase 'ou=Users,o={id},dc=jumpcloud,dc=com' lnms config:set auth_ldap_groupmemberattr member lnms config:set auth_ldap_groups. { group } .level 10 lnms config:set auth_ldap_userdn true Replace {id} with the unique ID provided by Jumpcloud. Replace {group} with the unique group name created in Jumpcloud. This field is case sensitive. Note: If you have multiple user groups to define individual access levels replace the auth_ldap_groups line with the following: auth/ldap lnms config:set auth_ldap_groups. { admin_group } .level 10 ] lnms config:set auth_ldap_groups.global_readonly_group.level 5","title":"LDAP server redundancy"},{"location":"Extensions/Authentication/#selinux-configuration_1","text":"On RHEL / CentOS / Fedora, in order for LibreNMS to reach LDAP, you need to allow LDAP requests in SELinux: setsebool -P httpd_can_connect_ldap 1","title":"SELinux configuration"},{"location":"Extensions/Authentication/#radius-authentication","text":"Please note that a mysql user is created for each user the logs in successfully. Users are assigned the user role by default, unless radius sends a reply attribute with a role. You can change the default role(s) by setting auth/radius lnms config:set radius.default_roles '[\"csr\"]' The attribute Filter-ID is a standard Radius-Reply-Attribute (string) that can be assigned a specially formatted string to assign a single role to the user. The string to send in Filter-ID reply attribute must start with librenms_role_ followed by the role name. For example to set the admin role send librenms_role_admin . The following strings correspond to the built-in roles, but any defined role can be used: - librenms_role_normal - Sets the normal user level. - librenms_role_admin - Sets the administrator level. - librenms_role_global-read - Sets the global read level LibreNMS will ignore any other strings sent in Filter-ID and revert to default role that is set in your config. $config [ 'radius' ][ 'hostname' ] = 'localhost' ; $config [ 'radius' ][ 'port' ] = '1812' ; $config [ 'radius' ][ 'secret' ] = 'testing123' ; $config [ 'radius' ][ 'timeout' ] = 3 ; $config [ 'radius' ][ 'users_purge' ] = 14 ; // Purge users who haven't logged in for 14 days. $config [ 'radius' ][ 'default_level' ] = 1 ; // Set the default user level when automatically creating a user.","title":"Radius Authentication"},{"location":"Extensions/Authentication/#radius-huntgroup","text":"Freeradius has a function called Radius Huntgroup which allows to send different attributes based on NAS. This may be utilized if you already use Filter-ID in your environment and also want to use radius with LibreNMS.","title":"Radius Huntgroup"},{"location":"Extensions/Authentication/#old-account-cleanup_1","text":"Cleanup of old accounts is done by checking the authlog. You will need to set the number of days when old accounts will be purged AUTOMATICALLY by daily.sh. Please ensure that you set the $config['authlog_purge'] value to be greater than $config['radius']['users_purge'] otherwise old users won't be removed.","title":"Old account cleanup"},{"location":"Extensions/Authentication/#http-authentication","text":"Config option: http-auth LibreNMS will expect the user to have authenticated via your webservice already. At this stage it will need to assign a userlevel for that user which is done in one of two ways: A user exists in MySQL still where the usernames match up. A global guest user (which still needs to be added into MySQL: $config [ 'http_auth_guest' ] = \"guest\" ; This will then assign the userlevel for guest to all authenticated users.","title":"HTTP Authentication"},{"location":"Extensions/Authentication/#http-authentication-ad-authorization","text":"Config option: ad-authorization This module is a combination of http-auth and active_directory LibreNMS will expect the user to have authenticated via your webservice already (e.g. using Kerberos Authentication in Apache) but will use Active Directory lookups to determine and assign the userlevel of a user. The userlevel will be calculated by using AD group membership information as the active_directory module does. The configuration is the same as for the active_directory module with two extra, optional options: auth_ad_binduser and auth_ad_bindpassword. These should be set to a AD user with read capabilities in your AD Domain in order to be able to perform searches. If these options are omitted, the module will attempt an anonymous bind (which then of course must be allowed by your Active Directory server(s)). There is also one extra option for controlling user information caching: auth_ldap_cache_ttl. This option allows to control how long user information (user_exists, userid, userlevel) are cached within the PHP Session. The default value is 300 seconds. To disable this caching (highly discourage) set this option to 0. $config [ 'auth_ad_binduser' ] = \"ad_binduser\" ; $config [ 'auth_ad_bindpassword' ] = \"ad_bindpassword\" ; $config [ 'auth_ldap_cache_ttl' ] = 300 ;","title":"HTTP Authentication / AD Authorization"},{"location":"Extensions/Authentication/#http-authentication-ldap-authorization","text":"Config option: ldap-authorization This module is a combination of http-auth and ldap LibreNMS will expect the user to have authenticated via your webservice already (e.g. using Kerberos Authentication in Apache) but will use LDAP to determine and assign the userlevel of a user. The userlevel will be calculated by using LDAP group membership information as the ldap module does. The configuration is similar to the ldap module with one extra option: auth_ldap_cache_ttl. This option allows to control how long user information (user_exists, userid, userlevel) are cached within the PHP Session. The default value is 300 seconds. To disabled this caching (highly discourage) set this option to 0.","title":"HTTP Authentication / LDAP Authorization"},{"location":"Extensions/Authentication/#standard-config_1","text":"$config [ 'auth_mechanism' ] = 'ldap-authorization' ; $config [ 'auth_ldap_server' ] = 'ldap.example.com' ; // Set server(s), space separated. Prefix with ldaps:// for ssl $config [ 'auth_ldap_suffix' ] = ',ou=People,dc=example,dc=com' ; // appended to usernames $config [ 'auth_ldap_groupbase' ] = 'ou=groups,dc=example,dc=com' ; // all groups must be inside this $config [ 'auth_ldap_groups' ][ 'admin' ][ 'roles' ] = [ 'admin' ]; // set admin group to admin role $config [ 'auth_ldap_groups' ][ 'pfy' ][ 'roles' ] = [ 'global-read' ]; // set pfy group to global read only role $config [ 'auth_ldap_groups' ][ 'support' ][ 'roles' ] = [ 'user' ]; // set support group as a normal user","title":"Standard config"},{"location":"Extensions/Authentication/#additional-options-usually-not-needed_1","text":"$config [ 'auth_ldap_version' ] = 3 ; # v2 or v3 $config [ 'auth_ldap_port' ] = 389 ; // 389 or 636 for ssl $config [ 'auth_ldap_starttls' ] = True ; // Enable TLS on port 389 $config [ 'auth_ldap_prefix' ] = 'uid=' ; // prepended to usernames $config [ 'auth_ldap_group' ] = 'cn=groupname,ou=groups,dc=example,dc=com' ; // generic group with level 0 $config [ 'auth_ldap_groupmemberattr' ] = 'memberUid' ; // attribute to use to see if a user is a member of a group $config [ 'auth_ldap_groupmembertype' ] = 'username' ; // username type to find group members by, either username (default), fulldn or puredn $config [ 'auth_ldap_emailattr' ] = 'mail' ; // attribute for email address $config [ 'auth_ldap_attr.uid' ] = 'uid' ; // attribute to check username against $config [ 'auth_ldap_userlist_filter' ] = 'service=informatique' ; // Replace 'service=informatique' by your ldap filter to limit the number of responses if you have an ldap directory with thousand of users $config [ 'auth_ldap_cache_ttl' ] = 300 ;","title":"Additional options (usually not needed)"},{"location":"Extensions/Authentication/#ldap-bind-user-optional_1","text":"If your ldap server does not allow anonymous bind, it is highly suggested to create a bind user, otherwise \"remember me\", alerting users, and the API will not work. $config [ 'auth_ldap_binduser' ] = 'ldapbind' ; // will use auth_ldap_prefix and auth_ldap_suffix #$config['auth_ldap_binddn'] = 'CN=John.Smith,CN=Users,DC=MyDomain,DC=com'; // overrides binduser $config [ 'auth_ldap_bindpassword' ] = 'password' ;","title":"LDAP bind user (optional)"},{"location":"Extensions/Authentication/#viewembedded-graphs-without-being-logged-into-librenms","text":"webui/graph ```bash lnms config:set allow_unauth_graphs_cidr ['127.0.0.1/32'] lnms config:set allow_unauth_graphs true ```","title":"View/embedded graphs without being logged into LibreNMS"},{"location":"Extensions/Authentication/#single-sign-on","text":"The single sign-on mechanism is used to integrate with third party authentication providers that are managed outside of LibreNMS - such as ADFS, Shibboleth, EZProxy, BeyondCorp, and others. A large number of these methods use SAML the module has been written assuming the use of SAML, and therefore these instructions contain some SAML terminology, but it should be possible to use any software that works in a similar way. In order to make use of the single sign-on module, you need to have an Identity Provider up and running, and know how to configure your Relying Party to pass attributes to LibreNMS via header injection or environment variables. Setting these up is outside of the scope of this documentation. As this module deals with authentication, it is extremely careful about validating the configuration - if it finds that certain values in the configuration are not set, it will reject access rather than try and guess.","title":"Single Sign-on"},{"location":"Extensions/Authentication/#basic-configuration","text":"To get up and running, all you need to do is configure the following values: $config [ 'auth_mechanism' ] = \"sso\" ; $config [ 'sso' ][ 'mode' ] = \"env\" ; $config [ 'sso' ][ 'group_strategy' ] = \"static\" ; $config [ 'sso' ][ 'static_level' ] = 10 ; This, along with the defaults, sets up a basic Single Sign-on setup that: Reads values from environment variables Automatically creates users when they're first seen Automatically updates users with new values Gives everyone privilege level 10 This happens to mimic the behaviour of http-auth , so if this is the kind of setup you want, you're probably better of just going and using that mechanism.","title":"Basic Configuration"},{"location":"Extensions/Authentication/#security","text":"If there is a proxy involved (e.g. EZProxy, Azure AD Application Proxy, NGINX, mod_proxy) it's essential that you have some means in place to prevent headers being injected between the proxy and the end user, and also prevent end users from contacting LibreNMS directly. This should also apply to user connections to the proxy itself - the proxy must not be allowed to blindly pass through HTTP headers. mod security _ should be considered a minimum, with a full WAF being strongly recommended. This advice applies to the IDP too. The mechanism includes very basic protection, in the form of an IP whitelist with should contain the source addresses of your proxies: $config [ 'sso' ][ 'trusted_proxies' ] = [ '127.0.0.1/8' , '::1/128' , '192.0.2.0' , '2001:DB8::' ]; This configuration item should contain an array with a list of IP addresses or CIDR prefixes that are allowed to connect to LibreNMS and supply environment variables or headers.","title":"Security"},{"location":"Extensions/Authentication/#advanced-configuration-options","text":"","title":"Advanced Configuration Options"},{"location":"Extensions/Authentication/#user-attribute","text":"If for some reason your relying party doesn't store the username in REMOTE_USER , you can override this choice. $config [ 'sso' ][ 'user_attr' ] = 'HTTP_UID' ; Note that the user lookup is a little special - normally headers are prefixed with HTTP_ , however this is not the case for remote user - it's a special case. If you're using something different you need to figure out of the HTTP_ prefix is required or not yourself.","title":"User Attribute"},{"location":"Extensions/Authentication/#automatic-user-createupdate","text":"These are enabled by default: $config [ 'sso' ][ 'create_users' ] = true ; $config [ 'sso' ][ 'update_users' ] = true ; If these are not enabled, user logins will be (somewhat silently) rejected unless an administrator has created the account in advance. Note that in the case of SAML federations, unless release of the users true identity has been negotiated with the IDP, the username (probably ePTID) is not likely to be predicable.","title":"Automatic User Create/Update"},{"location":"Extensions/Authentication/#personalisation","text":"If the attributes are being populated, you can instruct the mechanism to add additional information to the user's database entry: $config [ 'sso' ][ 'email_attr' ] = \"mail\" ; $config [ 'sso' ][ 'realname_attr' ] = \"displayName\" ; $config [ 'sso' ][ 'descr_attr' ] = \"unscoped-affiliation","title":"Personalisation"},{"location":"Extensions/Authentication/#group-strategies","text":"","title":"Group Strategies"},{"location":"Extensions/Authentication/#static","text":"As used above, static gives every single user the same privilege level. If you're working with a small team, or don't need access control, this is probably suitable.","title":"Static"},{"location":"Extensions/Authentication/#attribute","text":"$config [ 'sso' ][ 'group_strategy' ] = \"attribute\" ; $config [ 'sso' ][ 'level_attr' ] = \"entitlement\" ; If your Relying Party is capable of calculating the necessary privilege level, you can configure the module to read the privilege number straight from an attribute. sso_level_attr should contain the name of the attribute that the Relying Party exposes to LibreNMS - as long as sso_mode is correctly set, the mechanism should find the value.","title":"Attribute"},{"location":"Extensions/Authentication/#group-map","text":"This is the most flexible (and complex) way of assigning privileges. $config [ 'sso' ][ 'group_strategy' ] = \"map\" ; $config [ 'sso' ][ 'group_attr' ] = \"member\" ; $config [ 'sso' ][ 'group_level_map' ] = [ 'librenms-admins' => 10 , 'librenms-readers' => 1 , 'librenms-billingcontacts' => 5 ]; $config [ 'sso' ][ 'group_delimiter' ] = ';' ; This mechanism expects to find a delimited list of groups within the attribute that sso_group_attr points to. This should be an associative array of group name keys, with privilege levels as values. The mechanism will scan the list and find the highest privilege level that the user is entitled to, and assign that value to the user. If there are no matches between the user's groups and the sso_group_level_map , the user will be assigned the privilege level specified in the sso_static_level variable, with a default of 0 (no access). This feature can be used to provide a default access level (such as read-only) to all authenticated users. Additionally, this format may be specific to Shibboleth; other relying party software may need changes to the mechanism (e.g. mod_auth_mellon may create pseudo arrays). There is an optional value for sites with large numbers of groups: $config [ 'sso' ][ 'group_filter' ] = \"/librenms-(.*)/i\" ; This filter causes the mechanism to only consider groups matching a regular expression.","title":"Group Map"},{"location":"Extensions/Authentication/#logout-behaviour","text":"LibreNMS has no capability to log out a user authenticated via Single Sign-On - that responsibility falls to the Relying Party. If your Relying Party has a magic URL that needs to be called to end a session, you can configure LibreNMS to direct the user to it: # Example for Shibboleth $config [ 'auth_logout_handler' ] = '/Shibboleth.sso/Logout' ; # Example for oauth2-proxy $config [ 'auth_logout_handler' ] = '/oauth2/sign_out' ; This option functions independently of the Single Sign-on mechanism.","title":"Logout Behaviour"},{"location":"Extensions/Authentication/#complete-configuration","text":"This configuration works on my deployment with a Shibboleth relying party, injecting environment variables, with the IDP supplying a list of groups. $config [ 'auth_mechanism' ] = 'sso' ; $config [ 'auth_logout_handler' ] = '/Shibboleth.sso/Logout' ; $config [ 'sso' ][ 'mode' ] = 'env' ; $config [ 'sso' ][ 'create_users' ] = true ; $config [ 'sso' ][ 'update_users' ] = true ; $config [ 'sso' ][ 'realname_attr' ] = 'displayName' ; $config [ 'sso' ][ 'email_attr' ] = 'mail' ; $config [ 'sso' ][ 'group_strategy' ] = 'map' ; $config [ 'sso' ][ 'group_attr' ] = 'member' ; $config [ 'sso' ][ 'group_filter' ] = '/(librenms-.*)/i' ; $config [ 'sso' ][ 'group_delimiter' ] = ';' ; $config [ 'sso' ][ 'group_level_map' ] = [ 'librenms-demo' => 11 , 'librenms-globaladmin' => 10 , 'librenms-globalread' => 5 , 'librenms-lowpriv' => 1 ];","title":"Complete Configuration"},{"location":"Extensions/Auto-Discovery/","text":"Auto Discovery Support Getting Started LibreNMS provides the ability to automatically add devices on your network, we can do this via a few methods which will be explained below and also indicate if they are enabled by default. All discovery methods run when discovery runs (every 6 hours by default and within 5 minutes for new devices). Please note that you need at least ONE device added before auto-discovery will work. The first thing to do though is add the required configuration options to config.php . SNMP Details To add devices automatically we need to know your snmp details, examples of SNMP v1, v2c and v3 are below: // v1 or v2c $config [ 'snmp' ][ 'community' ][] = \"my_custom_community\" ; $config [ 'snmp' ][ 'community' ][] = \"another_community\" ; // v3 $config [ 'snmp' ][ 'v3' ][ 0 ][ 'authlevel' ] = 'authPriv' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'authname' ] = 'my_username' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'authpass' ] = 'my_password' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'authalgo' ] = 'SHA' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'cryptopass' ] = 'my_crypto' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'cryptoalgo' ] = 'AES' ; These details will be attempted when adding devices, you can specify any mixture of these. Allowed Networks Your Networks To add devices, we need to know what are your subnets so we don't go blindly attempting to add devices not under your control. discovery/networks lnms config:set nets.+ '192.168.0.0/24' lnms config:set nets.+ '172.2.4.0/22' Exclusions If you have added a network as above but a single device exists within it that you can't auto add, then you can exclude this with the following: discovery/networks lnms config:set autodiscovery.nets-exclude.+ '192.168.0.1/32' Additional Options Discovering devices by IP By default we don't add devices by IP address, we look for a reverse dns name to be found and add with that. If this fails and you would like to still add devices automatically then you will need to set $config['discovery_by_ip'] = true; Short hostnames If your devices only return a short hostname such as lax-fa0-dc01 but the full name should be lax-fa0-dc01.example.com then you can set discovery/general lnms config:set mydomain example.com Allow Duplicate sysName By default we require unique sysNames when adding devices (this is returned over snmp by your devices). If you would like to allow devices to be added with duplicate sysNames then please set discovery/discovery_modules lnms config:set allow_duplicate_sysName true Discovery Methods Below are the methods for auto discovering devices. Each one can be enabled or disabled and may have additional configuration options. ARP Disabled by default. Adds devices that are listed in another device's arp table. This module depends on the arp-table module being enabled and returning data. To enable, switch on globally the discovery_modules.discovery-arp or per device within the Modules section. discovery/discovery_modules lnms config:set discovery_modules.discovery-arp true XDP Enabled by default. $config['autodiscovery']['xdp'] = false; to disable. This includes FDP, CDP and LLDP support based on the device type. The LLDP/xDP links with neighbours will always be discovered as soon as the discovery module is enabled. However, LibreNMS will only try to add the new devices discovered with LLDP/xDP if $config['autodiscovery']['xdp'] = true; . Devices may be excluded from xdp discovery by sysName and sysDescr. //Exclude devices by name $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysname_regexp' ][] = '/host1/' ; $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysname_regexp' ][] = '/^dev/' ; //Exclude devices by description $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysdesc_regexp' ][] = '/Vendor X/' ; $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysdesc_regexp' ][] = '/Vendor Y/' ; Devices may be excluded from cdp discovery by platform. //Exclude devices by platform(Cisco only) $config [ 'autodiscovery' ][ 'cdp_exclude' ][ 'platform_regexp' ][] = '/WS-C3750G/' ; These devices are excluded by default: $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysdesc_regexp' ][] = '/-K9W8/' ; // Cisco Lightweight Access Point $config [ 'autodiscovery' ][ 'cdp_exclude' ][ 'platform_regexp' ][] = '/^Cisco IP Phone/' ; //Cisco IP Phone OSPF Enabled by default. $config['autodiscovery']['ospf'] = false; to disable. BGP Enabled by default. $config['autodiscovery']['bgp'] = false; to disable. This module is invoked from bgp-peers discovery module. SNMP Scan Apart from the aforementioned Auto-Discovery options, LibreNMS is also able to proactively scan a network for SNMP-enabled devices using the configured version/credentials. SNMP Scan will scan nets by default and respects autodiscovery.nets-exclude . To run the SNMP-Scanner you need to execute the snmp-scan.py from within your LibreNMS installation directory. Here the script's help-page for reference: usage: snmp-scan.py [-h] [-t THREADS] [-g GROUP] [-l] [-v] [--ping-fallback] [--ping-only] [-P] [network ...] Scan network for snmp hosts and add them to LibreNMS. positional arguments: network CIDR noted IP-Range to scan. Can be specified multiple times This argument is only required if 'nets' config is not set Example: 192.168.0.0/24 Example: 192.168.0.0/31 will be treated as an RFC3021 p-t-p network with two addresses, 192.168.0.0 and 192.168.0.1 Example: 192.168.0.1/32 will be treated as a single host address optional arguments: -h, --help show this help message and exit -t THREADS How many IPs to scan at a time. More will increase the scan speed, but could overload your system. Default: 32 -g GROUP The poller group all scanned devices will be added to. Default: The first group listed in 'distributed_poller_group', or 0 if not specificed -l, --legend Print the legend. -v, --verbose Show debug output. Specifying multiple times increases the verbosity. --ping-fallback Add the device as an ICMP only device if it replies to ping but not SNMP. --ping-only Always add the device as an ICMP only device. -P, --ping Deprecated. Use --ping-fallback instead. Discovered devices Newly discovered devices will be added to the default_poller_group , this value defaults to 0 if unset. When using distributed polling, this value can be changed locally by setting $config['default_poller_group'] in config.php or globally by using lnms config:set .","title":"Auto-discovery Setup"},{"location":"Extensions/Auto-Discovery/#auto-discovery-support","text":"","title":"Auto Discovery Support"},{"location":"Extensions/Auto-Discovery/#getting-started","text":"LibreNMS provides the ability to automatically add devices on your network, we can do this via a few methods which will be explained below and also indicate if they are enabled by default. All discovery methods run when discovery runs (every 6 hours by default and within 5 minutes for new devices). Please note that you need at least ONE device added before auto-discovery will work. The first thing to do though is add the required configuration options to config.php .","title":"Getting Started"},{"location":"Extensions/Auto-Discovery/#snmp-details","text":"To add devices automatically we need to know your snmp details, examples of SNMP v1, v2c and v3 are below: // v1 or v2c $config [ 'snmp' ][ 'community' ][] = \"my_custom_community\" ; $config [ 'snmp' ][ 'community' ][] = \"another_community\" ; // v3 $config [ 'snmp' ][ 'v3' ][ 0 ][ 'authlevel' ] = 'authPriv' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'authname' ] = 'my_username' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'authpass' ] = 'my_password' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'authalgo' ] = 'SHA' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'cryptopass' ] = 'my_crypto' ; $config [ 'snmp' ][ 'v3' ][ 0 ][ 'cryptoalgo' ] = 'AES' ; These details will be attempted when adding devices, you can specify any mixture of these.","title":"SNMP Details"},{"location":"Extensions/Auto-Discovery/#allowed-networks","text":"","title":"Allowed Networks"},{"location":"Extensions/Auto-Discovery/#your-networks","text":"To add devices, we need to know what are your subnets so we don't go blindly attempting to add devices not under your control. discovery/networks lnms config:set nets.+ '192.168.0.0/24' lnms config:set nets.+ '172.2.4.0/22'","title":"Your Networks"},{"location":"Extensions/Auto-Discovery/#exclusions","text":"If you have added a network as above but a single device exists within it that you can't auto add, then you can exclude this with the following: discovery/networks lnms config:set autodiscovery.nets-exclude.+ '192.168.0.1/32'","title":"Exclusions"},{"location":"Extensions/Auto-Discovery/#additional-options","text":"","title":"Additional Options"},{"location":"Extensions/Auto-Discovery/#discovering-devices-by-ip","text":"By default we don't add devices by IP address, we look for a reverse dns name to be found and add with that. If this fails and you would like to still add devices automatically then you will need to set $config['discovery_by_ip'] = true;","title":"Discovering devices by IP"},{"location":"Extensions/Auto-Discovery/#short-hostnames","text":"If your devices only return a short hostname such as lax-fa0-dc01 but the full name should be lax-fa0-dc01.example.com then you can set discovery/general lnms config:set mydomain example.com","title":"Short hostnames"},{"location":"Extensions/Auto-Discovery/#allow-duplicate-sysname","text":"By default we require unique sysNames when adding devices (this is returned over snmp by your devices). If you would like to allow devices to be added with duplicate sysNames then please set discovery/discovery_modules lnms config:set allow_duplicate_sysName true","title":"Allow Duplicate sysName"},{"location":"Extensions/Auto-Discovery/#discovery-methods","text":"Below are the methods for auto discovering devices. Each one can be enabled or disabled and may have additional configuration options.","title":"Discovery Methods"},{"location":"Extensions/Auto-Discovery/#arp","text":"Disabled by default. Adds devices that are listed in another device's arp table. This module depends on the arp-table module being enabled and returning data. To enable, switch on globally the discovery_modules.discovery-arp or per device within the Modules section. discovery/discovery_modules lnms config:set discovery_modules.discovery-arp true","title":"ARP"},{"location":"Extensions/Auto-Discovery/#xdp","text":"Enabled by default. $config['autodiscovery']['xdp'] = false; to disable. This includes FDP, CDP and LLDP support based on the device type. The LLDP/xDP links with neighbours will always be discovered as soon as the discovery module is enabled. However, LibreNMS will only try to add the new devices discovered with LLDP/xDP if $config['autodiscovery']['xdp'] = true; . Devices may be excluded from xdp discovery by sysName and sysDescr. //Exclude devices by name $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysname_regexp' ][] = '/host1/' ; $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysname_regexp' ][] = '/^dev/' ; //Exclude devices by description $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysdesc_regexp' ][] = '/Vendor X/' ; $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysdesc_regexp' ][] = '/Vendor Y/' ; Devices may be excluded from cdp discovery by platform. //Exclude devices by platform(Cisco only) $config [ 'autodiscovery' ][ 'cdp_exclude' ][ 'platform_regexp' ][] = '/WS-C3750G/' ; These devices are excluded by default: $config [ 'autodiscovery' ][ 'xdp_exclude' ][ 'sysdesc_regexp' ][] = '/-K9W8/' ; // Cisco Lightweight Access Point $config [ 'autodiscovery' ][ 'cdp_exclude' ][ 'platform_regexp' ][] = '/^Cisco IP Phone/' ; //Cisco IP Phone","title":"XDP"},{"location":"Extensions/Auto-Discovery/#ospf","text":"Enabled by default. $config['autodiscovery']['ospf'] = false; to disable.","title":"OSPF"},{"location":"Extensions/Auto-Discovery/#bgp","text":"Enabled by default. $config['autodiscovery']['bgp'] = false; to disable. This module is invoked from bgp-peers discovery module.","title":"BGP"},{"location":"Extensions/Auto-Discovery/#snmp-scan","text":"Apart from the aforementioned Auto-Discovery options, LibreNMS is also able to proactively scan a network for SNMP-enabled devices using the configured version/credentials. SNMP Scan will scan nets by default and respects autodiscovery.nets-exclude . To run the SNMP-Scanner you need to execute the snmp-scan.py from within your LibreNMS installation directory. Here the script's help-page for reference: usage: snmp-scan.py [-h] [-t THREADS] [-g GROUP] [-l] [-v] [--ping-fallback] [--ping-only] [-P] [network ...] Scan network for snmp hosts and add them to LibreNMS. positional arguments: network CIDR noted IP-Range to scan. Can be specified multiple times This argument is only required if 'nets' config is not set Example: 192.168.0.0/24 Example: 192.168.0.0/31 will be treated as an RFC3021 p-t-p network with two addresses, 192.168.0.0 and 192.168.0.1 Example: 192.168.0.1/32 will be treated as a single host address optional arguments: -h, --help show this help message and exit -t THREADS How many IPs to scan at a time. More will increase the scan speed, but could overload your system. Default: 32 -g GROUP The poller group all scanned devices will be added to. Default: The first group listed in 'distributed_poller_group', or 0 if not specificed -l, --legend Print the legend. -v, --verbose Show debug output. Specifying multiple times increases the verbosity. --ping-fallback Add the device as an ICMP only device if it replies to ping but not SNMP. --ping-only Always add the device as an ICMP only device. -P, --ping Deprecated. Use --ping-fallback instead.","title":"SNMP Scan"},{"location":"Extensions/Auto-Discovery/#discovered-devices","text":"Newly discovered devices will be added to the default_poller_group , this value defaults to 0 if unset. When using distributed polling, this value can be changed locally by setting $config['default_poller_group'] in config.php or globally by using lnms config:set .","title":"Discovered devices"},{"location":"Extensions/Availability-Map/","text":"Availability Map LibreNMS has the following page to show an availability map: Overview -> Maps -> Availability This map will show all devices on a single page, with each device having either a box or a coloured square representing its status. Widget There is an availability map widget that can be added to a dashboard to give a quick overview of the status of all devices on the network. Settings # Set the compact view mode for the availability map lnms config:set webui.availability_map_compact false # Size of the box for each device in the availability map (not compact) lnms config:set webui.availability_map_box_size 165 # Sort by status instead of hostname lnms config:set webui.availability_map_sort_status false # Show the device group drop-down on the availabiltiy map page lnms config:set webui.availability_map_use_device_groups true","title":"Availability Map"},{"location":"Extensions/Availability-Map/#availability-map","text":"LibreNMS has the following page to show an availability map: Overview -> Maps -> Availability This map will show all devices on a single page, with each device having either a box or a coloured square representing its status.","title":"Availability Map"},{"location":"Extensions/Availability-Map/#widget","text":"There is an availability map widget that can be added to a dashboard to give a quick overview of the status of all devices on the network.","title":"Widget"},{"location":"Extensions/Availability-Map/#settings","text":"# Set the compact view mode for the availability map lnms config:set webui.availability_map_compact false # Size of the box for each device in the availability map (not compact) lnms config:set webui.availability_map_box_size 165 # Sort by status instead of hostname lnms config:set webui.availability_map_sort_status false # Show the device group drop-down on the availabiltiy map page lnms config:set webui.availability_map_use_device_groups true","title":"Settings"},{"location":"Extensions/Billing-Module/","text":"Billing Module With the billing module you can create a bill, assign a quota to it and add ports to it. It then tracks the ports usage and shows you the usage in the bill, including any overage. Accounting by both total transferred data and 95th percentile is supported. To enable and use the billing module you need to perform the following steps: Edit config.php and add (or enable) the following line near the end of the config $config [ 'enable_billing' ] = 1 ; # Enable Billing Edit /etc/cron.d/librenms and add the following: */5 * * * * librenms /opt/librenms/poll-billing.php >> /dev/null 2 > & 1 01 * * * * librenms /opt/librenms/billing-calculate.php >> /dev/null 2 > & 1 Create billing graphs as required. Data Retention Billing data is stored in the MySQL database, and you may wish to purge the detailed stats for old data (per-month totals will always be kept). To enable this, add the following to config.php : $config [ 'billing_data_purge' ] = 12 ; // Number of months to retain Data for the last complete billing cycle will always be retained - only data older than this by the configured number of months will be removed. This task is performed in the daily cleanup tasks. 95th Percentile Calculation For 95th Percentile billing, the default behavior is to use the highest of the input or output 95th Percentile calculation. To instead use the combined total of inout + output to derive the 95th percentile, This can be changed on a per bill basis by setting 95th Calculation to \"Aggregate\". To change the default option to Aggregate, add the following the config.php : $config [ 'billing' ][ '95th_default_agg' ] = 1 ; // Set aggregate 95th as default This configuration setting is cosmetic and only changes the default selected option when adding a new bill.","title":"Billing Module"},{"location":"Extensions/Billing-Module/#billing-module","text":"With the billing module you can create a bill, assign a quota to it and add ports to it. It then tracks the ports usage and shows you the usage in the bill, including any overage. Accounting by both total transferred data and 95th percentile is supported. To enable and use the billing module you need to perform the following steps: Edit config.php and add (or enable) the following line near the end of the config $config [ 'enable_billing' ] = 1 ; # Enable Billing Edit /etc/cron.d/librenms and add the following: */5 * * * * librenms /opt/librenms/poll-billing.php >> /dev/null 2 > & 1 01 * * * * librenms /opt/librenms/billing-calculate.php >> /dev/null 2 > & 1 Create billing graphs as required.","title":"Billing Module"},{"location":"Extensions/Billing-Module/#data-retention","text":"Billing data is stored in the MySQL database, and you may wish to purge the detailed stats for old data (per-month totals will always be kept). To enable this, add the following to config.php : $config [ 'billing_data_purge' ] = 12 ; // Number of months to retain Data for the last complete billing cycle will always be retained - only data older than this by the configured number of months will be removed. This task is performed in the daily cleanup tasks.","title":"Data Retention"},{"location":"Extensions/Billing-Module/#95th-percentile-calculation","text":"For 95th Percentile billing, the default behavior is to use the highest of the input or output 95th Percentile calculation. To instead use the combined total of inout + output to derive the 95th percentile, This can be changed on a per bill basis by setting 95th Calculation to \"Aggregate\". To change the default option to Aggregate, add the following the config.php : $config [ 'billing' ][ '95th_default_agg' ] = 1 ; // Set aggregate 95th as default This configuration setting is cosmetic and only changes the default selected option when adding a new bill.","title":"95th Percentile Calculation"},{"location":"Extensions/Component/","text":"About The Component extension provides a generic database storage mechanism for discovery and poller modules. The Driver behind this extension was to provide the features of ports, in a generic manner to discovery/poller modules. It provides a status (Nagios convention), the ability to Disable (do not poll), or Ignore (do not Alert). Database Structure The database structure contains the component table: mysql > select * from component limit 1 ; + ----+-----------+------+------------+--------+----------+--------+-------+ | id | device_id | type | label | status | disabled | ignore | error | + ----+-----------+------+------------+--------+----------+--------+-------+ | 9 | 1 | TEST | TEST LABEL | 0 | 1 | 1 | | + ----+-----------+------+------------+--------+----------+--------+-------+ 1 row in set ( 0 . 00 sec ) These fields are described below: id - ID for each component, unique index device_id - device_id from the devices table type - name from the component_type table label - Display label for the component status - The status of the component, retrieved from the device disabled - Should this component be polled? ignore - Should this component be alerted on error - Error message if in Alert state The component_prefs table holds custom data in an Attribute/Value format: mysql > select * from component_prefs limit 1 ; + ----+-----------+-----------+-----------+ | id | component | attribute | value | + ----+-----------+-----------+-----------+ | 4 | 9 | TEST_ATTR | TEST_ATTR | + ----+-----------+-----------+-----------+ 2 rows in set ( 0 . 00 sec ) Reserved Fields When this data from both the component and component_prefs tables is returned in one single consolidated array, there is the potential for someone to attempt to set an attribute (in the component_prefs ) table that is used in the component table. Because of this all fields of the component table are reserved, they cannot be used as custom attributes, if you update these the module will attempt to write them to the component table, not the component_prefs table. Using Components Create an instance of the component class: $COMPONENT = new LibreNMS\\Component (); Retrieving Components Now you can retrieve an array of the available components: $ARRAY = $COMPONENT -> getComponents ( $DEVICE_ID , $OPTIONS ); getComponents takes 2 arguments: DEVICE_ID or null for all devices. OPTIONS - an array of various options. getComponents will return an array containing components in the following format: Array ( [ X ] => Array ( [ Y1 ] => Array ( [ device_id ] => 1 [ TEST_ATTR ] => TEST_ATTR [ type ] => TEST [ label ] => TEST LABEL [ status ] => 0 [ ignore ] => 1 [ disabled ] => 1 [ error ] => ), [ Y2 ] => Array ( [ device_id ] => 1 [ TEST_ATTR ] => TEST_ATTR [ type ] => TESTING [ label ] => TEST LABEL [ status ] => 0 [ ignore ] => 1 [ disabled ] => 0 [ error ] => ), ) ) Where X is the Device ID and Y1/Y2 is the Component ID. In the example above, TEST_ATTR is a custom field, the rest are reserved fields. Options Options can be supplied to getComponents to influence which and how components are returned. Filtering You can filter on any of the reserved fields. Filters are created in the following format: $options [ 'filter' ][ 'FIELD' ] = array ( 'OPERATOR' , 'CRITERIA' ); Where: FIELD - The reserved field to filter on OPERATOR - 'LIKE' or '=', are we checking if the FIELD equals or contains the CRITERIA. CRITERIA - The criteria to search on There are 2 filtering shortcuts: $DEVICE_ID is a synonym for: $OPTIONS [ 'filter' ][ 'device_id' ] = array ( '=' , $DEVICE_ID ); $OPTIONS['type'] = $TYPE is a synonym for: $OPTIONS [ 'filter' ][ 'type' ] = array ( '=' , $TYPE ); Sorting You can sort the records that are returned by specifying the following option: $OPTIONS [ 'sort' ][ FIELD ] = 'DIRECTION' ; Where Direction is one of: ASC - Ascending, from Low to High DESC - Descending, from High to Low Creating Components To create a new component, run the createComponent function. $ARRAY = $COMPONENT -> createComponent ( $DEVICE_ID , $TYPE ); createComponent takes 2 arguments: DEVICE_ID - The ID of the device to attach the component to. TYPE - The unique type for your module. This will return a new, empty array with a component ID and Type set, all other fields will be set to defaults. Array ( [ 1 ] => Array ( [ type ] => TESTING [ label ] => [ status ] => 1 [ ignore ] => 0 [ disabled ] => 0 [ error ] => ) ) Deleting Components When a component is no longer needed, it can be deleted. $COMPONENT -> deleteComponent ( $COMPONENT_ID ) This will return True on success or False on failure. Editing Components To edit a component, the procedure is: Get the Current Components Edit the array Write the components Edit the Array Once you have a component array from getComponents the first thing to do is extract the components for only the single device you are editing. This is required because the setComponentPrefs function only saves a single device at a time. $ARRAY = $COMPONENT -> getComponents ( $DEVICE_ID , $OPTIONS ); $ARRAY = $ARRAY [ $DEVICE_ID ]; Then simply edit this array to suit your needs. If you need to add a new Attribute/Value pair you can: $ARRAY [ COMPONENT_ID ][ 'New Attribute' ] = \"Value\" ; If you need to delete a previously set Attribute/Value pair you can: unset ( $ARRAY [ COMPONENT_ID ][ 'New Attribute' ]); If you need to edit a previously set Attribute/Value pair you can: $ARRAY [ COMPONENT_ID ][ 'Existing Attribute' ] = \"New Value\" ; Write the components To write component changes back to the database simply: $COMPONENT -> setComponentPrefs ( $DEVICE_ID , $ARRAY ) When writing the component array there are several caveats to be aware of, these are: $ARRAY must be in the format of a single device ID - $ARRAY[$COMPONENT_ID][Attribute] = 'Value'; NOT in the multi device format returned by getComponents - $ARRAY[$DEVICE_ID][$COMPONENT_ID][Attribute] = 'Value'; You cannot edit the Component ID or the Device ID reserved fields can not be removed if a change is found an entry will be written to the eventlog. API Component details are available via the API. Please see the API-Docs for details. Alerting It is intended that discovery/poller modules will detect the status of a component during the polling cycle. Status is logged using the Nagios convention for status codes, where: 0 = Ok, 1 = Warning, 2 = Critical If you are creating a poller module which can detect a fault condition simply set STATUS to something other than 0 and ERROR to a message that indicates the problem. To actually raise an alert, the user will need to create an alert rule. To assist with this several Alerting Macro's have been created: %macro.component_normal - A component that is not disabled or ignored and in a Normal state. %macro.component_warning - A component that is not disabled or ignored and NOT in a Warning state. %macro.component_critical - A component that is not disabled or ignored and NOT in a Critical state. To raise alerts for components, the following rules could be created: %macros.component_critical = \"1\" - To alert on all Critical components %macros.component_critical = \"1\" && %component.type = \"\" - To alert on all Critical components of a particular type. If there is a particular component you would like excluded from alerting, simply set the ignore field to 1. The data that is written to each alert when it is raised is in the following format: COMPONENT_TYPE - LABEL - ERROR Example Code To see an example of how the component module can used, please see the following modules: Cisco CBQoS includes/discovery/cisco-cbqos.inc.php includes/polling/cisco-cbqos.inc.php html/includes/graphs/device/cbqos_traffic.inc.php Cisco OTV includes/discovery/cisco-otv.inc.php includes/polling/cisco-otv.inc.php html/includes/graphs/device/cisco-otv-mac.inc.php html/pages/routing/cisco-otv.inc.php","title":"Component"},{"location":"Extensions/Component/#about","text":"The Component extension provides a generic database storage mechanism for discovery and poller modules. The Driver behind this extension was to provide the features of ports, in a generic manner to discovery/poller modules. It provides a status (Nagios convention), the ability to Disable (do not poll), or Ignore (do not Alert).","title":"About"},{"location":"Extensions/Component/#database-structure","text":"The database structure contains the component table: mysql > select * from component limit 1 ; + ----+-----------+------+------------+--------+----------+--------+-------+ | id | device_id | type | label | status | disabled | ignore | error | + ----+-----------+------+------------+--------+----------+--------+-------+ | 9 | 1 | TEST | TEST LABEL | 0 | 1 | 1 | | + ----+-----------+------+------------+--------+----------+--------+-------+ 1 row in set ( 0 . 00 sec ) These fields are described below: id - ID for each component, unique index device_id - device_id from the devices table type - name from the component_type table label - Display label for the component status - The status of the component, retrieved from the device disabled - Should this component be polled? ignore - Should this component be alerted on error - Error message if in Alert state The component_prefs table holds custom data in an Attribute/Value format: mysql > select * from component_prefs limit 1 ; + ----+-----------+-----------+-----------+ | id | component | attribute | value | + ----+-----------+-----------+-----------+ | 4 | 9 | TEST_ATTR | TEST_ATTR | + ----+-----------+-----------+-----------+ 2 rows in set ( 0 . 00 sec )","title":"Database Structure"},{"location":"Extensions/Component/#reserved-fields","text":"When this data from both the component and component_prefs tables is returned in one single consolidated array, there is the potential for someone to attempt to set an attribute (in the component_prefs ) table that is used in the component table. Because of this all fields of the component table are reserved, they cannot be used as custom attributes, if you update these the module will attempt to write them to the component table, not the component_prefs table.","title":"Reserved Fields"},{"location":"Extensions/Component/#using-components","text":"Create an instance of the component class: $COMPONENT = new LibreNMS\\Component ();","title":"Using Components"},{"location":"Extensions/Component/#retrieving-components","text":"Now you can retrieve an array of the available components: $ARRAY = $COMPONENT -> getComponents ( $DEVICE_ID , $OPTIONS ); getComponents takes 2 arguments: DEVICE_ID or null for all devices. OPTIONS - an array of various options. getComponents will return an array containing components in the following format: Array ( [ X ] => Array ( [ Y1 ] => Array ( [ device_id ] => 1 [ TEST_ATTR ] => TEST_ATTR [ type ] => TEST [ label ] => TEST LABEL [ status ] => 0 [ ignore ] => 1 [ disabled ] => 1 [ error ] => ), [ Y2 ] => Array ( [ device_id ] => 1 [ TEST_ATTR ] => TEST_ATTR [ type ] => TESTING [ label ] => TEST LABEL [ status ] => 0 [ ignore ] => 1 [ disabled ] => 0 [ error ] => ), ) ) Where X is the Device ID and Y1/Y2 is the Component ID. In the example above, TEST_ATTR is a custom field, the rest are reserved fields.","title":"Retrieving Components"},{"location":"Extensions/Component/#options","text":"Options can be supplied to getComponents to influence which and how components are returned.","title":"Options"},{"location":"Extensions/Component/#filtering","text":"You can filter on any of the reserved fields. Filters are created in the following format: $options [ 'filter' ][ 'FIELD' ] = array ( 'OPERATOR' , 'CRITERIA' ); Where: FIELD - The reserved field to filter on OPERATOR - 'LIKE' or '=', are we checking if the FIELD equals or contains the CRITERIA. CRITERIA - The criteria to search on There are 2 filtering shortcuts: $DEVICE_ID is a synonym for: $OPTIONS [ 'filter' ][ 'device_id' ] = array ( '=' , $DEVICE_ID ); $OPTIONS['type'] = $TYPE is a synonym for: $OPTIONS [ 'filter' ][ 'type' ] = array ( '=' , $TYPE );","title":"Filtering"},{"location":"Extensions/Component/#sorting","text":"You can sort the records that are returned by specifying the following option: $OPTIONS [ 'sort' ][ FIELD ] = 'DIRECTION' ; Where Direction is one of: ASC - Ascending, from Low to High DESC - Descending, from High to Low","title":"Sorting"},{"location":"Extensions/Component/#creating-components","text":"To create a new component, run the createComponent function. $ARRAY = $COMPONENT -> createComponent ( $DEVICE_ID , $TYPE ); createComponent takes 2 arguments: DEVICE_ID - The ID of the device to attach the component to. TYPE - The unique type for your module. This will return a new, empty array with a component ID and Type set, all other fields will be set to defaults. Array ( [ 1 ] => Array ( [ type ] => TESTING [ label ] => [ status ] => 1 [ ignore ] => 0 [ disabled ] => 0 [ error ] => ) )","title":"Creating Components"},{"location":"Extensions/Component/#deleting-components","text":"When a component is no longer needed, it can be deleted. $COMPONENT -> deleteComponent ( $COMPONENT_ID ) This will return True on success or False on failure.","title":"Deleting Components"},{"location":"Extensions/Component/#editing-components","text":"To edit a component, the procedure is: Get the Current Components Edit the array Write the components","title":"Editing Components"},{"location":"Extensions/Component/#edit-the-array","text":"Once you have a component array from getComponents the first thing to do is extract the components for only the single device you are editing. This is required because the setComponentPrefs function only saves a single device at a time. $ARRAY = $COMPONENT -> getComponents ( $DEVICE_ID , $OPTIONS ); $ARRAY = $ARRAY [ $DEVICE_ID ]; Then simply edit this array to suit your needs. If you need to add a new Attribute/Value pair you can: $ARRAY [ COMPONENT_ID ][ 'New Attribute' ] = \"Value\" ; If you need to delete a previously set Attribute/Value pair you can: unset ( $ARRAY [ COMPONENT_ID ][ 'New Attribute' ]); If you need to edit a previously set Attribute/Value pair you can: $ARRAY [ COMPONENT_ID ][ 'Existing Attribute' ] = \"New Value\" ;","title":"Edit the Array"},{"location":"Extensions/Component/#write-the-components","text":"To write component changes back to the database simply: $COMPONENT -> setComponentPrefs ( $DEVICE_ID , $ARRAY ) When writing the component array there are several caveats to be aware of, these are: $ARRAY must be in the format of a single device ID - $ARRAY[$COMPONENT_ID][Attribute] = 'Value'; NOT in the multi device format returned by getComponents - $ARRAY[$DEVICE_ID][$COMPONENT_ID][Attribute] = 'Value'; You cannot edit the Component ID or the Device ID reserved fields can not be removed if a change is found an entry will be written to the eventlog.","title":"Write the components"},{"location":"Extensions/Component/#api","text":"Component details are available via the API. Please see the API-Docs for details.","title":"API"},{"location":"Extensions/Component/#alerting","text":"It is intended that discovery/poller modules will detect the status of a component during the polling cycle. Status is logged using the Nagios convention for status codes, where: 0 = Ok, 1 = Warning, 2 = Critical If you are creating a poller module which can detect a fault condition simply set STATUS to something other than 0 and ERROR to a message that indicates the problem. To actually raise an alert, the user will need to create an alert rule. To assist with this several Alerting Macro's have been created: %macro.component_normal - A component that is not disabled or ignored and in a Normal state. %macro.component_warning - A component that is not disabled or ignored and NOT in a Warning state. %macro.component_critical - A component that is not disabled or ignored and NOT in a Critical state. To raise alerts for components, the following rules could be created: %macros.component_critical = \"1\" - To alert on all Critical components %macros.component_critical = \"1\" && %component.type = \"\" - To alert on all Critical components of a particular type. If there is a particular component you would like excluded from alerting, simply set the ignore field to 1. The data that is written to each alert when it is raised is in the following format: COMPONENT_TYPE - LABEL - ERROR","title":"Alerting"},{"location":"Extensions/Component/#example-code","text":"To see an example of how the component module can used, please see the following modules: Cisco CBQoS includes/discovery/cisco-cbqos.inc.php includes/polling/cisco-cbqos.inc.php html/includes/graphs/device/cbqos_traffic.inc.php Cisco OTV includes/discovery/cisco-otv.inc.php includes/polling/cisco-otv.inc.php html/includes/graphs/device/cisco-otv-mac.inc.php html/pages/routing/cisco-otv.inc.php","title":"Example Code"},{"location":"Extensions/Custom-Map/","text":"Custom Map LibreNMS has the ability to create custom maps to give a quick overview of parts of the network including up/down status of devices and link utilisation. These are also referred to as weather maps. Viewer Once some maps have been created, they will be visible to any users who have read access to all devices on a given map. Custom maps are available through the Overview -> Maps -> Custom Maps menu. Some key points about the viewer are: Nodes will change colour if they are down or disabled Links are only associated with a single network interface Link utilisation can only be shown if the link speed is known Link speed is decoded from SNMP if possible (Upload/Download) and defaults to the physical speed if SNMP data is not available, or cannot be decoded Links will change colour as follows: Black if the link is down, or the max speed is unknown Green at 0% utilisation, with a gradual change to Yellow at 50% utilisation, with a gradual change to Orange at 75% utilisation, with a gradual change to Red at 100% utilisation, with a gradual change to Purple at 150% utilisation and above Viewer URL options You can manually add the following parameters to a URL to alter the display of a custom map. The following URL options are available: bare=yes : Removes the control bar from the top of the page. screenshot=yes : Removes all labels from the nodes and links e.g. If you want bare and screenshot enabled, https:// nmsserver /maps/custom/2 becomes https:// nmsserver /maps/custom/2?bare=yes&screenshot=yes Editor To access the custom map editor, a user must be an admin. The editor is accessed through the Overview -> Maps -> Custom Map Editor menu. Once you are in the editor, you will be given a drop-down list of all the custom maps so you can choose one to edit, or select \"Create New Map\" to create a new map. Map Settings When you create a new map, you will be presented with a page to set some global map settings. These are: Name : The name for the map Width : The width of the map in pixels Height : The height of the map in pixels Node Alignment : When devices are added to the map, this will align the devices to an invisible grid this many pixels wide, which can help to make the maps look better. This can be set to 0 to disable. Background : An image (PNG/JPG) up to 2MB can be uploaded as a background. These settings can be changed at any stage by clicking on the \"Edit Map Settings\" button in the top-left of the editor. Nodes Once you have a map, you can start by adding \"nodes\" to the map. A node represents a device, or an external point in the network (e.g. the internet) To add a node, you click on the \"Add Node\" button in the control bar, then click on the map area where you want to add the node. You will then be aked for the following information: Label : The text to display on this point in the network Device : If this node represents a device, you can select the device from the drop-down. This will overwrite the label, which you can then change if you want to. Style : You can select the style of the node. If a device has been selected you can choose the LibreNMS icon by choosing \"Device Image\". You can also choose \"Icon\" to select an image for the device. Icon : If you choose \"Icon\" in the style box, you can select from a list of images to represent this node There are also options to choose the size and colour of the node and the font. Once you have finished choosing the options for the node, you can press Save to add it to the map. NOTE: This does not save anything to the database immediately. You need to click on the \"Save Map\" button in the top-right to save your changes to the database. You can edit a node at any time by selecting it on the map and clicking on the \"Edit Node\" button in the control bar. You can also modify the default settings for all new nodes by clicking on the \"Edit Node Default\" button at the top of the page. Edges Once you have 2 or more nodes, you can add links between the nodes. These are called edges in the editor. To add a link, click on the \"Add Edge\" button in the control bar, then click on one of the nodes you want to link and drag the cursor to the second node that you want to link. You will then be prompted for the following information: From : The node that the link runs from (it will default to first node you selected) To : The node that the link runs to (it will default to the second node you selected) Port : If the From or To node is linked to a device, you can select an interface from one of the devices and the custom map will show traffic utilisation for the selected interface. Reverse Port Direction : If the selected port displays data in the wrong direction for the link, you can reverse it by toggling this option. Line Style : You can try different line styles, especially if you are running multiple links between the same 2 nodes Show percent usage : Choose whether to have text on the lines showing the link utilisation as a percentage Recenter Line : If you tick this box, the centre point of the line will be moved back to half way between the 2 nodes when you click on the save button. Once you have finished choosing the options for the node, you can press Save to add it to the map. NOTE: This does not save anything to the database immediately. You need to click on the \"Save Map\" button in the top-right to save your changes to the database. Once you press save, you it will create 3 objects on the screen, 2 arrows and a round node in the middle. Having the 3 objects allows you to move the mid point of the line off centre, and also allows us to display bandwidth information for both directions of the link. You can edit an edge at any time by selecting it on the map and clicking on the \"Edit Edge\" button in the control bar. You can also modify the default settings for all new edges by clicking on the \"Edit Edge Default\" button at the top of the page. Re-Render When you drag items around the map, some of the lines will bend. This will cause a \"Re-Render Map\" button to appear at the top-right of the page. This button can be clicked on to cause all lines to be re-drawn the way they will be shown in the viewer. Save Map Once you are happy with a set of changes that you have made, you can click on the \"Save Map\" button in the top-right of the page to commit changes to the database. This will cause anyone viewing the map to see the new version the next time their page refreshes. Adding Images You can add your own images to use on the custom map by copying files into the html/images/custommap/icons/ directory. Any files with a .svg, .png or .jpg extension will be shown in the image selection drop-down in the custom map editor.","title":"Custom Map"},{"location":"Extensions/Custom-Map/#custom-map","text":"LibreNMS has the ability to create custom maps to give a quick overview of parts of the network including up/down status of devices and link utilisation. These are also referred to as weather maps.","title":"Custom Map"},{"location":"Extensions/Custom-Map/#viewer","text":"Once some maps have been created, they will be visible to any users who have read access to all devices on a given map. Custom maps are available through the Overview -> Maps -> Custom Maps menu. Some key points about the viewer are: Nodes will change colour if they are down or disabled Links are only associated with a single network interface Link utilisation can only be shown if the link speed is known Link speed is decoded from SNMP if possible (Upload/Download) and defaults to the physical speed if SNMP data is not available, or cannot be decoded Links will change colour as follows: Black if the link is down, or the max speed is unknown Green at 0% utilisation, with a gradual change to Yellow at 50% utilisation, with a gradual change to Orange at 75% utilisation, with a gradual change to Red at 100% utilisation, with a gradual change to Purple at 150% utilisation and above","title":"Viewer"},{"location":"Extensions/Custom-Map/#viewer-url-options","text":"You can manually add the following parameters to a URL to alter the display of a custom map. The following URL options are available: bare=yes : Removes the control bar from the top of the page. screenshot=yes : Removes all labels from the nodes and links e.g. If you want bare and screenshot enabled, https:// nmsserver /maps/custom/2 becomes https:// nmsserver /maps/custom/2?bare=yes&screenshot=yes","title":"Viewer URL options"},{"location":"Extensions/Custom-Map/#editor","text":"To access the custom map editor, a user must be an admin. The editor is accessed through the Overview -> Maps -> Custom Map Editor menu. Once you are in the editor, you will be given a drop-down list of all the custom maps so you can choose one to edit, or select \"Create New Map\" to create a new map.","title":"Editor"},{"location":"Extensions/Custom-Map/#map-settings","text":"When you create a new map, you will be presented with a page to set some global map settings. These are: Name : The name for the map Width : The width of the map in pixels Height : The height of the map in pixels Node Alignment : When devices are added to the map, this will align the devices to an invisible grid this many pixels wide, which can help to make the maps look better. This can be set to 0 to disable. Background : An image (PNG/JPG) up to 2MB can be uploaded as a background. These settings can be changed at any stage by clicking on the \"Edit Map Settings\" button in the top-left of the editor.","title":"Map Settings"},{"location":"Extensions/Custom-Map/#nodes","text":"Once you have a map, you can start by adding \"nodes\" to the map. A node represents a device, or an external point in the network (e.g. the internet) To add a node, you click on the \"Add Node\" button in the control bar, then click on the map area where you want to add the node. You will then be aked for the following information: Label : The text to display on this point in the network Device : If this node represents a device, you can select the device from the drop-down. This will overwrite the label, which you can then change if you want to. Style : You can select the style of the node. If a device has been selected you can choose the LibreNMS icon by choosing \"Device Image\". You can also choose \"Icon\" to select an image for the device. Icon : If you choose \"Icon\" in the style box, you can select from a list of images to represent this node There are also options to choose the size and colour of the node and the font. Once you have finished choosing the options for the node, you can press Save to add it to the map. NOTE: This does not save anything to the database immediately. You need to click on the \"Save Map\" button in the top-right to save your changes to the database. You can edit a node at any time by selecting it on the map and clicking on the \"Edit Node\" button in the control bar. You can also modify the default settings for all new nodes by clicking on the \"Edit Node Default\" button at the top of the page.","title":"Nodes"},{"location":"Extensions/Custom-Map/#edges","text":"Once you have 2 or more nodes, you can add links between the nodes. These are called edges in the editor. To add a link, click on the \"Add Edge\" button in the control bar, then click on one of the nodes you want to link and drag the cursor to the second node that you want to link. You will then be prompted for the following information: From : The node that the link runs from (it will default to first node you selected) To : The node that the link runs to (it will default to the second node you selected) Port : If the From or To node is linked to a device, you can select an interface from one of the devices and the custom map will show traffic utilisation for the selected interface. Reverse Port Direction : If the selected port displays data in the wrong direction for the link, you can reverse it by toggling this option. Line Style : You can try different line styles, especially if you are running multiple links between the same 2 nodes Show percent usage : Choose whether to have text on the lines showing the link utilisation as a percentage Recenter Line : If you tick this box, the centre point of the line will be moved back to half way between the 2 nodes when you click on the save button. Once you have finished choosing the options for the node, you can press Save to add it to the map. NOTE: This does not save anything to the database immediately. You need to click on the \"Save Map\" button in the top-right to save your changes to the database. Once you press save, you it will create 3 objects on the screen, 2 arrows and a round node in the middle. Having the 3 objects allows you to move the mid point of the line off centre, and also allows us to display bandwidth information for both directions of the link. You can edit an edge at any time by selecting it on the map and clicking on the \"Edit Edge\" button in the control bar. You can also modify the default settings for all new edges by clicking on the \"Edit Edge Default\" button at the top of the page.","title":"Edges"},{"location":"Extensions/Custom-Map/#re-render","text":"When you drag items around the map, some of the lines will bend. This will cause a \"Re-Render Map\" button to appear at the top-right of the page. This button can be clicked on to cause all lines to be re-drawn the way they will be shown in the viewer.","title":"Re-Render"},{"location":"Extensions/Custom-Map/#save-map","text":"Once you are happy with a set of changes that you have made, you can click on the \"Save Map\" button in the top-right of the page to commit changes to the database. This will cause anyone viewing the map to see the new version the next time their page refreshes.","title":"Save Map"},{"location":"Extensions/Custom-Map/#adding-images","text":"You can add your own images to use on the custom map by copying files into the html/images/custommap/icons/ directory. Any files with a .svg, .png or .jpg extension will be shown in the image selection drop-down in the custom map editor.","title":"Adding Images"},{"location":"Extensions/Customizing-the-Web-UI/","text":"Customizing the Web UI Custom menu entry Create the file resources/views/menu/custom.blade.php Example contents:
          11. Custom Menu
          12. Custom device menu action You can add custom external links in the menu on the device page. This feature allows you to easily link applications to related systems, as shown in the example of Open-audIT. The url value is parsed by the Laravel Blade templating engine. You can access device variables such as $device->hostname , $device->sysName and use full PHP. settings/webui/device lnms config:set html.device.links.+ '{\"url\": \"http://atssrv/open-audit/index/devices/{{ $device->sysName }}\", \"title\": \"Open-AudIT\"}' Field Description url Url blade template resulting in valid url. Required. title Title text displayed in the menu. Required. icon Font Awesome icon class. Default: fa-external-link external Open link in new window. Default: true action Show as action on device list. Default: false Launching Windows programs from the LibreNMS device menu You can launch windows programs from links in LibreNMS, but it does take some registry entries on the client device. Save the following as winbox.reg, edit for your winbox.exe path and double click to add to your registry. Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\\winbox] @=\"URL:Winbox Protocol\" \"URL Protocol\"=\"\" [HKEY_CLASSES_ROOT\\winbox\\shell] [HKEY_CLASSES_ROOT\\winbox\\shell\\open] [HKEY_CLASSES_ROOT\\winbox\\shell\\open\\command] @=\"C:\\Windows\\System32\\WindowsPowerShell 1.0\\powershell.exe -Command \"$val='%l'; $val = $val.TrimEnd('/');if ($val.StartsWith('winbox://' { $val = $val.SubString(9) }; & 'C:\\Program Files\\winbox64.exe' \"$val\"\"\" Now we can use that in the device menu entry to open winbox. settings/webui/device lnms config:set html.device.links.+ '{\"url\": \"winbox://{{ $device->hostname }}\", \"title\": \"Winbox\"}' Setting the primary device menu action You can change the icon that is clickable in the device without having to open the dropdown menu. The primary button is edit device by default. settings/webui/device lnms config:set html.device.primary_link web Value Description edit Edit device web Connect to the device via https/http ssh launch ssh:// protocol to the device, make sure you have a handler registered telnet launch telnet:// protocol to the device capture Link to the device capture page custom1 Custom Link 1 custom2 Custom Link 2 custom3 Custom Link 3 custom4 Custom Link 4 custom5 Custom Link 5 custom6 Custom Link 6 custom7 Custom Link 7 custom8 Custom Link 8 !!! Custom http, ssh, telnet ports Custom ports can be set through the device setting misc tab and will be appended to the Uri. Empty value will not append anything and automatically default to the standard. - custom ssh port set to 2222 will result in ssh://10.0.0.0:2222 - custom telnet port set to 2323 will result in telnet://10.0.0.0:2323","title":"Customizing the Web UI"},{"location":"Extensions/Customizing-the-Web-UI/#customizing-the-web-ui","text":"","title":"Customizing the Web UI"},{"location":"Extensions/Customizing-the-Web-UI/#custom-menu-entry","text":"Create the file resources/views/menu/custom.blade.php Example contents:
          13. Custom Menu
          14. ","title":"Custom menu entry"},{"location":"Extensions/Customizing-the-Web-UI/#custom-device-menu-action","text":"You can add custom external links in the menu on the device page. This feature allows you to easily link applications to related systems, as shown in the example of Open-audIT. The url value is parsed by the Laravel Blade templating engine. You can access device variables such as $device->hostname , $device->sysName and use full PHP. settings/webui/device lnms config:set html.device.links.+ '{\"url\": \"http://atssrv/open-audit/index/devices/{{ $device->sysName }}\", \"title\": \"Open-AudIT\"}' Field Description url Url blade template resulting in valid url. Required. title Title text displayed in the menu. Required. icon Font Awesome icon class. Default: fa-external-link external Open link in new window. Default: true action Show as action on device list. Default: false","title":"Custom device menu action"},{"location":"Extensions/Customizing-the-Web-UI/#launching-windows-programs-from-the-librenms-device-menu","text":"You can launch windows programs from links in LibreNMS, but it does take some registry entries on the client device. Save the following as winbox.reg, edit for your winbox.exe path and double click to add to your registry. Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\\winbox] @=\"URL:Winbox Protocol\" \"URL Protocol\"=\"\" [HKEY_CLASSES_ROOT\\winbox\\shell] [HKEY_CLASSES_ROOT\\winbox\\shell\\open] [HKEY_CLASSES_ROOT\\winbox\\shell\\open\\command] @=\"C:\\Windows\\System32\\WindowsPowerShell 1.0\\powershell.exe -Command \"$val='%l'; $val = $val.TrimEnd('/');if ($val.StartsWith('winbox://' { $val = $val.SubString(9) }; & 'C:\\Program Files\\winbox64.exe' \"$val\"\"\" Now we can use that in the device menu entry to open winbox. settings/webui/device lnms config:set html.device.links.+ '{\"url\": \"winbox://{{ $device->hostname }}\", \"title\": \"Winbox\"}'","title":"Launching Windows programs from the LibreNMS device menu"},{"location":"Extensions/Customizing-the-Web-UI/#setting-the-primary-device-menu-action","text":"You can change the icon that is clickable in the device without having to open the dropdown menu. The primary button is edit device by default. settings/webui/device lnms config:set html.device.primary_link web Value Description edit Edit device web Connect to the device via https/http ssh launch ssh:// protocol to the device, make sure you have a handler registered telnet launch telnet:// protocol to the device capture Link to the device capture page custom1 Custom Link 1 custom2 Custom Link 2 custom3 Custom Link 3 custom4 Custom Link 4 custom5 Custom Link 5 custom6 Custom Link 6 custom7 Custom Link 7 custom8 Custom Link 8 !!! Custom http, ssh, telnet ports Custom ports can be set through the device setting misc tab and will be appended to the Uri. Empty value will not append anything and automatically default to the standard. - custom ssh port set to 2222 will result in ssh://10.0.0.0:2222 - custom telnet port set to 2323 will result in telnet://10.0.0.0:2323","title":"Setting the primary device menu action"},{"location":"Extensions/Dashboards/","text":"Dashboards Create customised dashboards in LibreNMS per user. You can share dashboards with other users. You can also make a custom dashboard and default it for all users in LibreNMS. Example Dashboard Widgets LibreNMS has a whole list of Widgets to select from. Alerts Widget: Displays all alert notifications. Availability Map: Displays all devices with colored tiles, green up, yellow for warning (device has been restarted in last 24 hours), red for down. You can also list all services and ignored/disabled devices in this widget. Components Status: List all components Ok state, Warning state, Critical state. Device Summary horizontal: List device totals, up, down, ignored, disabled. Same for ports and services. Device Summary vertical: List device totals, up, down, ignored, disabled. Same for ports and services. Eventlog: Displays all events with your devices and LibreNMS. External Image: can be used to show external images on your dashboard. Or images from inside LibreNMS. Globe Map: Will display map of the globe. Graph: Can be used to display graphs from devices. Graylog: Displays all Graylog's syslog entries. Notes: use for html tags, embed links and external web pages. Or just notes in general. Server Stats: Will display gauges for CPU, Memory, Storage usage. Note the device type has to be listed as \"Server\". Syslog: Displays all syslog entries. Top Devices: By Traffic, or Uptime, or Response time, or Poller Duration, or Processor load, or Memory Usage, or Storage Usage. Top Interfaces: Lists top interfaces by traffic utilization. World Map: displays all your devices locations. From syslocation or from override sysLocation. List of Widgets: Dashboard Permissions Private: Sets the dashboard to only the user that created the dashboard can view and edit. Shared Read: Sets the dashboard to allow other users to view the dashboard, but cant make changes to the dashboard. Shared: Allows all users to view the dashboard and make changes. Setting a global default dashboard Step 1: Set the dashboard to either shared read or shared, depending on what you want the users access to change. Step 2: Then go to Settings -> WebUI settings -> Dashboard Settings and set the global default dashboard. Setting embedded webpage Using the Notes Widget. < iframe src = \"your_url\" frameBorder = \"0\" width = \"100%\" height = \"100%\" > < p > Your browser does not support iframes. Note you may need to play with the width and height and also size your widget properly. src=\"url\" needs to be URL to webpage you are linking to. Also some web pages may not support html embedded or iframe. How to create ports graph In the dashboard, you want to create an interface graph select the widget called 'Graph' then select \"Port\" -> \"Bits\" Note: you can map the port by description or the alias or by port id. You will need to know this in order to map the port to the graph. Dimension parameter replacement for Generic-image widget When using the Generic-image widget you can provide the width and height of the widget with your request. This will ensure that the image will fit nicely with the dimensions if the Generic-image widget. You can add @AUTO_HEIGHT@ and @AUTO_WIDTH@ to the Image URL as parameters. Examples: http://librenms.example.com/graph.php?id=333%2C444&type=multiport_bits_separate&legend=no&absolute=1&from=-14200&width=@AUTO_WIDTH@&height=@AUTO_HEIGHT@ http://example.com/myimage.php?size=@AUTO_WIDTH@x@AUTO_HEIGHT@","title":"Dashboards"},{"location":"Extensions/Dashboards/#dashboards","text":"Create customised dashboards in LibreNMS per user. You can share dashboards with other users. You can also make a custom dashboard and default it for all users in LibreNMS. Example Dashboard","title":"Dashboards"},{"location":"Extensions/Dashboards/#widgets","text":"LibreNMS has a whole list of Widgets to select from. Alerts Widget: Displays all alert notifications. Availability Map: Displays all devices with colored tiles, green up, yellow for warning (device has been restarted in last 24 hours), red for down. You can also list all services and ignored/disabled devices in this widget. Components Status: List all components Ok state, Warning state, Critical state. Device Summary horizontal: List device totals, up, down, ignored, disabled. Same for ports and services. Device Summary vertical: List device totals, up, down, ignored, disabled. Same for ports and services. Eventlog: Displays all events with your devices and LibreNMS. External Image: can be used to show external images on your dashboard. Or images from inside LibreNMS. Globe Map: Will display map of the globe. Graph: Can be used to display graphs from devices. Graylog: Displays all Graylog's syslog entries. Notes: use for html tags, embed links and external web pages. Or just notes in general. Server Stats: Will display gauges for CPU, Memory, Storage usage. Note the device type has to be listed as \"Server\". Syslog: Displays all syslog entries. Top Devices: By Traffic, or Uptime, or Response time, or Poller Duration, or Processor load, or Memory Usage, or Storage Usage. Top Interfaces: Lists top interfaces by traffic utilization. World Map: displays all your devices locations. From syslocation or from override sysLocation. List of Widgets:","title":"Widgets"},{"location":"Extensions/Dashboards/#dashboard-permissions","text":"Private: Sets the dashboard to only the user that created the dashboard can view and edit. Shared Read: Sets the dashboard to allow other users to view the dashboard, but cant make changes to the dashboard. Shared: Allows all users to view the dashboard and make changes.","title":"Dashboard Permissions"},{"location":"Extensions/Dashboards/#setting-a-global-default-dashboard","text":"Step 1: Set the dashboard to either shared read or shared, depending on what you want the users access to change. Step 2: Then go to Settings -> WebUI settings -> Dashboard Settings and set the global default dashboard.","title":"Setting a global default dashboard"},{"location":"Extensions/Dashboards/#setting-embedded-webpage","text":"Using the Notes Widget. < iframe src = \"your_url\" frameBorder = \"0\" width = \"100%\" height = \"100%\" > < p > Your browser does not support iframes. Note you may need to play with the width and height and also size your widget properly. src=\"url\" needs to be URL to webpage you are linking to. Also some web pages may not support html embedded or iframe.","title":"Setting embedded webpage"},{"location":"Extensions/Dashboards/#how-to-create-ports-graph","text":"In the dashboard, you want to create an interface graph select the widget called 'Graph' then select \"Port\" -> \"Bits\" Note: you can map the port by description or the alias or by port id. You will need to know this in order to map the port to the graph.","title":"How to create ports graph"},{"location":"Extensions/Dashboards/#dimension-parameter-replacement-for-generic-image-widget","text":"When using the Generic-image widget you can provide the width and height of the widget with your request. This will ensure that the image will fit nicely with the dimensions if the Generic-image widget. You can add @AUTO_HEIGHT@ and @AUTO_WIDTH@ to the Image URL as parameters. Examples: http://librenms.example.com/graph.php?id=333%2C444&type=multiport_bits_separate&legend=no&absolute=1&from=-14200&width=@AUTO_WIDTH@&height=@AUTO_HEIGHT@ http://example.com/myimage.php?size=@AUTO_WIDTH@x@AUTO_HEIGHT@","title":"Dimension parameter replacement for Generic-image widget"},{"location":"Extensions/Dell-OpenManage/","text":"Dell OpenManage Support For Dell OpenManage support you will need to install Dell OpenManage (yeah - really :)) (minimum 5.1) onto the device you want to monitor. Ensure that net-snmp is using srvadmin, you should see something similar to: master agentx view all included .1 access notConfigGroup \"\" any noauth exact all none none smuxpeer .1.3.6.1.4.1.674.10892.1 Restart net-snmp: service snmpd restart Ensure that srvadmin is started, this is usually done by executing: /opt/dell/srvadmin/sbin/srvadmin-services.sh start Once this has been done, add the device to LibreNMS as normal and you will start to receive Temperatures and Fan speed data. Windows Download OpenManage from Dell's support page Link and install OpenManage on your windows server. Make sure you have SNMP setup and running on your windows server.","title":"Dell OpenManage"},{"location":"Extensions/Dell-OpenManage/#dell-openmanage-support","text":"For Dell OpenManage support you will need to install Dell OpenManage (yeah - really :)) (minimum 5.1) onto the device you want to monitor. Ensure that net-snmp is using srvadmin, you should see something similar to: master agentx view all included .1 access notConfigGroup \"\" any noauth exact all none none smuxpeer .1.3.6.1.4.1.674.10892.1 Restart net-snmp: service snmpd restart Ensure that srvadmin is started, this is usually done by executing: /opt/dell/srvadmin/sbin/srvadmin-services.sh start Once this has been done, add the device to LibreNMS as normal and you will start to receive Temperatures and Fan speed data.","title":"Dell OpenManage Support"},{"location":"Extensions/Dell-OpenManage/#windows","text":"Download OpenManage from Dell's support page Link and install OpenManage on your windows server. Make sure you have SNMP setup and running on your windows server.","title":"Windows"},{"location":"Extensions/Dependency-Map/","text":"Dependency Map LibreNMS has the ability to show you a dynamic network map based on device dependencies that have been configure. These maps are accessed through the following menu options: Overview -> Maps -> Device Dependency Overview -> Maps -> Device Groups Dependencies Settings The map display can be configured by altering the VisJS-Config.md","title":"Dependency Map"},{"location":"Extensions/Dependency-Map/#dependency-map","text":"LibreNMS has the ability to show you a dynamic network map based on device dependencies that have been configure. These maps are accessed through the following menu options: Overview -> Maps -> Device Dependency Overview -> Maps -> Device Groups Dependencies","title":"Dependency Map"},{"location":"Extensions/Dependency-Map/#settings","text":"The map display can be configured by altering the VisJS-Config.md","title":"Settings"},{"location":"Extensions/Device-Groups/","text":"Grouping Devices LibreNMS supports grouping your devices together in much the same way as you can configure alerts. This document will hopefully help you get started. Dynamic Groups Rule Editor The rule is based on the MySQL structure your data is in. Such as tablename.columnname . If you already know the entity you want, you can browse around inside MySQL using show tables and desc . As a working example and a common question, let's assume you want to group devices by hostname. If your hostname format is dcX.[devicetype].example.com. You would use the field devices.hostname . If you want to group them by device type, you would add a rule for routers of devices.hostname endswith rtr.example.com . If you want to group them by DC, you could use the rule devices.hostname regex dc1\\..*\\.example\\.com (Don't forget to escape periods in the regex) Static Groups You can create static groups (and convert dynamic groups to static) to put specific devices in a group. Just select static as the type and select the devices you want in the group. You can now select this group from the Devices -> All Devices link in the navigation at the top. You can also use the group to map alert rules to by creating an alert mapping Overview -> Alerts -> Rule Mapping .","title":"Grouping Devices"},{"location":"Extensions/Device-Groups/#grouping-devices","text":"LibreNMS supports grouping your devices together in much the same way as you can configure alerts. This document will hopefully help you get started.","title":"Grouping Devices"},{"location":"Extensions/Device-Groups/#dynamic-groups","text":"","title":"Dynamic Groups"},{"location":"Extensions/Device-Groups/#rule-editor","text":"The rule is based on the MySQL structure your data is in. Such as tablename.columnname . If you already know the entity you want, you can browse around inside MySQL using show tables and desc . As a working example and a common question, let's assume you want to group devices by hostname. If your hostname format is dcX.[devicetype].example.com. You would use the field devices.hostname . If you want to group them by device type, you would add a rule for routers of devices.hostname endswith rtr.example.com . If you want to group them by DC, you could use the rule devices.hostname regex dc1\\..*\\.example\\.com (Don't forget to escape periods in the regex)","title":"Rule Editor"},{"location":"Extensions/Device-Groups/#static-groups","text":"You can create static groups (and convert dynamic groups to static) to put specific devices in a group. Just select static as the type and select the devices you want in the group. You can now select this group from the Devices -> All Devices link in the navigation at the top. You can also use the group to map alert rules to by creating an alert mapping Overview -> Alerts -> Rule Mapping .","title":"Static Groups"},{"location":"Extensions/Dispatcher-Service/","text":"Dispatcher Service Status: Release Candidate The LibreNMS dispatcher service ( librenms-service.py ) is a new method of running the poller service at set times. It does not replace the php scripts, just the cron entries running them. External Requirements A recent version of Python The LibreNMS service requires Python 3 and some features require behaviour only found in Python3.4+. Python modules PyMySQL is recommended as it requires no C compiler to install. MySQLclient can also be used, but does require compilation. python-dotenv .env loader redis-py 4.0+ and Redis 5.0+ server (if using distributed polling) psutil These can be obtained from your OS package manager, or from PyPI with the below commands. pip3 install -r requirements.txt Redis (distributed polling) If you want to use distributed polling, you'll need a Redis instance to coordinate the nodes. It's recommended that you do not share the Redis database with any other system - by default, Redis supports up to 16 databases (numbered 0-15). You can also use Redis on a single host if you want It's strongly recommended that you deploy a resilient cluster of redis systems, and use redis-sentinel. You should not rely on the password for the security of your system. See https://redis.io/topics/security Memcached (distributed polling) LibreNMS can still use memcached as a locking mechanism when using distributed polling. So you can configure memcached for this purpose unless you have updates disabled. See Locking Mechanisms at https://docs.librenms.org/Extensions/Distributed-Poller/ MySQL You should already have this, but the pollers do need access to the SQL database. The LibreNMS service runs faster and more aggressively than the standard poller, so keep an eye on the number of open connections and other important health metrics. Configuration Connection settings are required in .env . The .env file is generated after composer install and APP_KEY and NODE_ID are set. Remember that the APP_KEY value must be the same on all your pollers. #APP_KEY= #Required, generated by composer install #NODE_ID= #Required, generated by composer install DB_HOST=localhost DB_DATABASE=librenms DB_USERNAME=librenms DB_PASSWORD= Distributed Polling Configuration Once you have your Redis database set up, configure it in the .env file on each node. Configure the redis cache driver for distributed locking. There are a number of options - most of them are optional if your redis instance is standalone and unauthenticated (neither recommended). ## ## Standalone ## REDIS_HOST=127.0.0.1 REDIS_PORT=6379 REDIS_DB=0 REDIS_TIMEOUT=60 # If requirepass is set in redis set everything above as well as: (recommended) REDIS_PASSWORD=PasswordGoesHere # If ACL's are in use, set everything above as well as: (highly recommended) REDIS_USERNAME=UsernameGoesHere ## ## Sentinel ## REDIS_SENTINEL=redis-001.example.org:26379,redis-002.example.org:26379,redis-003.example.org:26379 REDIS_SENTINEL_SERVICE=mymaster # If requirepass is set in sentinel, set everything above as well as: (recommended) REDIS_SENTINEL_PASSWORD=SentinelPasswordGoesHere # If ACL's are in use, set everything above as well as: (highly recommended) REDIS_SENTINEL_USERNAME=SentinelUsernameGoesHere For more information on ACL's, see https://redis.io/docs/management/security/acl/ Note that if you use Sentinel, you may still need REDIS_PASSWORD , REDIS_USERNAME , REDIS_DB and REDIS_TIMEOUT - Sentinel just provides the address of the instance currently accepting writes and manages failover. It's possible (and recommended) to have authentication both on Sentinel and the managed Redis instances. Basic Configuration Additional configuration settings can be set in your config. The defaults are shown here - it's recommended that you at least tune the number of workers. poller/distributed lnms config:set service_poller_workers 24 lnms config:set service_services_workers 8 lnms config:set service_discovery_workers 16 Optional Settings poller/distributed lnms config:set service_poller_frequency 300 lnms config:set service_services_frequency 300 lnms config:set service_discovery_frequency 21600 lnms config:set service_billing_frequency 300 lnms config:set service_billing_calculate_frequency 60 lnms config:set service_poller_down_retry 60 lnms config:set service_loglevel INFO lnms config:set service_update_frequency 86400 There are also some SQL options, but these should be inherited from your LibreNMS web UI configuration. Logs are sent to the system logging service (usually journald or rsyslog ) - see https://docs.python.org/3/library/logging.html#logging-levels for the options available. $config [ 'distributed_poller' ] = true ; # Set to true to enable distributed polling $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); # Uniquely identifies the poller instance $config [ 'distributed_poller_group' ] = 0 ; # Which group to poll Tuning the number of workers See https://your_librenms_install/poller You want to keep Consumed Worker Seconds comfortably below Maximum Worker Seconds. The closer the values are to each other, the flatter the CPU graph of the poller machine. Meaning that you are utilizing your CPU resources well. As long as Consumed WS stays below Maximum WS and Devices Pending is 0, you should be ok. If Consumed WS is below Maximum WS and Devices Pending is > 0, your hardware is not up to the task. Maximum WS equals the number of workers multiplied with the number of seconds in the polling period. (default 300) Fast Ping The fast ping scheduler is disabled by default. You can enable it by setting the following: $config [ 'service_ping_enabled' ] = true ; Watchdog The watchdog scheduler is disabled by default. You can enable it by setting the following: $config [ 'service_watchdog_enabled' ] = true ; The watchdog scheduler will check that the poller log file has been written to within the last poll period. If there is no change to the log file since, the watchdog will restart the polling service. The poller log file is set by $config['log_file'] and defaults to ./logs/librenms.log Cron Scripts Once the LibreNMS service is installed, the cron scripts used by LibreNMS to start alerting, polling, discovery and maintenance tasks are no longer required and must be disabled either by removing or commenting them out. The service handles these tasks when enabled. The only cron task enabled after switching to the dispatcher service should be the following: * * * * * librenms cd /opt/librenms/ && php artisan schedule:run >> /dev/null 2>&1 Service Installation A systemd unit file is provided - You must adapt ExecStart and WorkingDirectory if you did not install librenms in /opt/librenms The sysv and upstart init scripts could also be used with a little modification. systemd service A systemd unit file can be found in misc/librenms.service . To install run: cp /opt/librenms/misc/librenms.service /etc/systemd/system/librenms.service && systemctl enable --now librenms.service systemd service with watchdog This service file is an alternative to the above service file. It uses the systemd WatchdogSec= option to restart the service if it does not receive a keep-alive from the running process. A systemd unit file can be found in misc/librenms-watchdog.service . To install run: cp /opt/librenms/misc/librenms-watchdog.service /etc/systemd/system/librenms.service && systemctl enable --now librenms.service This requires: python3-systemd (or python-systemd on older systems) or https://pypi.org/project/systemd-python/ If you run this systemd service without python3-systemd it will restart every 30 seconds. OS-Specific Instructions RHEL/CentOS To get the LibreNMS service running under python3.4+ on RHEL-derivatives with minimal fuss, you can use the software collections build: First, enable SCL's on your system: CentOS 7 # yum install centos-release-scl RHEL 7 # subscription-manager repos --enable rhel-server-rhscl-7-rpms Then install and configure the runtime and service: # yum install gcc rh-python36 rh-python36-python-devel epel-release # yum --enablerepo=remi install redis # vi /opt/librenms/config.php # vi /etc/redis.conf # systemctl enable --now redis.service # scl enable rh-python36 bash # change directory to librenms (default /opt/librenms) # pip3 install -r requirements.txt # cp /opt/librenms/misc/librenms.service.scl /etc/systemd/system/librenms.service # systemctl enable --now librenms.service If you want to use another version of python 3, change rh-python36 in the unit file and the commands above to match the name of the replacement scl. Debian/Ubuntu Debian 11 (Bullseye) Warning: Bullseye provide PHP 7.4 that is too old to run LibreNMS. Debian 12 (Bookworm) Warning: Bookworm is not available as stable yet (as 2022 november). Install dependancies apt install python3 python3-mysqldb python3-dotenv Add the python3-systemd package for service with watchdog.","title":"Dispatcher Service (RC)"},{"location":"Extensions/Dispatcher-Service/#dispatcher-service","text":"Status: Release Candidate The LibreNMS dispatcher service ( librenms-service.py ) is a new method of running the poller service at set times. It does not replace the php scripts, just the cron entries running them.","title":"Dispatcher Service"},{"location":"Extensions/Dispatcher-Service/#external-requirements","text":"","title":"External Requirements"},{"location":"Extensions/Dispatcher-Service/#a-recent-version-of-python","text":"The LibreNMS service requires Python 3 and some features require behaviour only found in Python3.4+.","title":"A recent version of Python"},{"location":"Extensions/Dispatcher-Service/#python-modules","text":"PyMySQL is recommended as it requires no C compiler to install. MySQLclient can also be used, but does require compilation. python-dotenv .env loader redis-py 4.0+ and Redis 5.0+ server (if using distributed polling) psutil These can be obtained from your OS package manager, or from PyPI with the below commands. pip3 install -r requirements.txt","title":"Python modules"},{"location":"Extensions/Dispatcher-Service/#redis-distributed-polling","text":"If you want to use distributed polling, you'll need a Redis instance to coordinate the nodes. It's recommended that you do not share the Redis database with any other system - by default, Redis supports up to 16 databases (numbered 0-15). You can also use Redis on a single host if you want It's strongly recommended that you deploy a resilient cluster of redis systems, and use redis-sentinel. You should not rely on the password for the security of your system. See https://redis.io/topics/security","title":"Redis (distributed polling)"},{"location":"Extensions/Dispatcher-Service/#memcached-distributed-polling","text":"LibreNMS can still use memcached as a locking mechanism when using distributed polling. So you can configure memcached for this purpose unless you have updates disabled. See Locking Mechanisms at https://docs.librenms.org/Extensions/Distributed-Poller/","title":"Memcached (distributed polling)"},{"location":"Extensions/Dispatcher-Service/#mysql","text":"You should already have this, but the pollers do need access to the SQL database. The LibreNMS service runs faster and more aggressively than the standard poller, so keep an eye on the number of open connections and other important health metrics.","title":"MySQL"},{"location":"Extensions/Dispatcher-Service/#configuration","text":"Connection settings are required in .env . The .env file is generated after composer install and APP_KEY and NODE_ID are set. Remember that the APP_KEY value must be the same on all your pollers. #APP_KEY= #Required, generated by composer install #NODE_ID= #Required, generated by composer install DB_HOST=localhost DB_DATABASE=librenms DB_USERNAME=librenms DB_PASSWORD=","title":"Configuration"},{"location":"Extensions/Dispatcher-Service/#distributed-polling-configuration","text":"Once you have your Redis database set up, configure it in the .env file on each node. Configure the redis cache driver for distributed locking. There are a number of options - most of them are optional if your redis instance is standalone and unauthenticated (neither recommended). ## ## Standalone ## REDIS_HOST=127.0.0.1 REDIS_PORT=6379 REDIS_DB=0 REDIS_TIMEOUT=60 # If requirepass is set in redis set everything above as well as: (recommended) REDIS_PASSWORD=PasswordGoesHere # If ACL's are in use, set everything above as well as: (highly recommended) REDIS_USERNAME=UsernameGoesHere ## ## Sentinel ## REDIS_SENTINEL=redis-001.example.org:26379,redis-002.example.org:26379,redis-003.example.org:26379 REDIS_SENTINEL_SERVICE=mymaster # If requirepass is set in sentinel, set everything above as well as: (recommended) REDIS_SENTINEL_PASSWORD=SentinelPasswordGoesHere # If ACL's are in use, set everything above as well as: (highly recommended) REDIS_SENTINEL_USERNAME=SentinelUsernameGoesHere For more information on ACL's, see https://redis.io/docs/management/security/acl/ Note that if you use Sentinel, you may still need REDIS_PASSWORD , REDIS_USERNAME , REDIS_DB and REDIS_TIMEOUT - Sentinel just provides the address of the instance currently accepting writes and manages failover. It's possible (and recommended) to have authentication both on Sentinel and the managed Redis instances.","title":"Distributed Polling Configuration"},{"location":"Extensions/Dispatcher-Service/#basic-configuration","text":"Additional configuration settings can be set in your config. The defaults are shown here - it's recommended that you at least tune the number of workers. poller/distributed lnms config:set service_poller_workers 24 lnms config:set service_services_workers 8 lnms config:set service_discovery_workers 16 Optional Settings poller/distributed lnms config:set service_poller_frequency 300 lnms config:set service_services_frequency 300 lnms config:set service_discovery_frequency 21600 lnms config:set service_billing_frequency 300 lnms config:set service_billing_calculate_frequency 60 lnms config:set service_poller_down_retry 60 lnms config:set service_loglevel INFO lnms config:set service_update_frequency 86400 There are also some SQL options, but these should be inherited from your LibreNMS web UI configuration. Logs are sent to the system logging service (usually journald or rsyslog ) - see https://docs.python.org/3/library/logging.html#logging-levels for the options available. $config [ 'distributed_poller' ] = true ; # Set to true to enable distributed polling $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); # Uniquely identifies the poller instance $config [ 'distributed_poller_group' ] = 0 ; # Which group to poll","title":"Basic Configuration"},{"location":"Extensions/Dispatcher-Service/#tuning-the-number-of-workers","text":"See https://your_librenms_install/poller You want to keep Consumed Worker Seconds comfortably below Maximum Worker Seconds. The closer the values are to each other, the flatter the CPU graph of the poller machine. Meaning that you are utilizing your CPU resources well. As long as Consumed WS stays below Maximum WS and Devices Pending is 0, you should be ok. If Consumed WS is below Maximum WS and Devices Pending is > 0, your hardware is not up to the task. Maximum WS equals the number of workers multiplied with the number of seconds in the polling period. (default 300)","title":"Tuning the number of workers"},{"location":"Extensions/Dispatcher-Service/#fast-ping","text":"The fast ping scheduler is disabled by default. You can enable it by setting the following: $config [ 'service_ping_enabled' ] = true ;","title":"Fast Ping"},{"location":"Extensions/Dispatcher-Service/#watchdog","text":"The watchdog scheduler is disabled by default. You can enable it by setting the following: $config [ 'service_watchdog_enabled' ] = true ; The watchdog scheduler will check that the poller log file has been written to within the last poll period. If there is no change to the log file since, the watchdog will restart the polling service. The poller log file is set by $config['log_file'] and defaults to ./logs/librenms.log","title":"Watchdog"},{"location":"Extensions/Dispatcher-Service/#cron-scripts","text":"Once the LibreNMS service is installed, the cron scripts used by LibreNMS to start alerting, polling, discovery and maintenance tasks are no longer required and must be disabled either by removing or commenting them out. The service handles these tasks when enabled. The only cron task enabled after switching to the dispatcher service should be the following: * * * * * librenms cd /opt/librenms/ && php artisan schedule:run >> /dev/null 2>&1","title":"Cron Scripts"},{"location":"Extensions/Dispatcher-Service/#service-installation","text":"A systemd unit file is provided - You must adapt ExecStart and WorkingDirectory if you did not install librenms in /opt/librenms The sysv and upstart init scripts could also be used with a little modification.","title":"Service Installation"},{"location":"Extensions/Dispatcher-Service/#systemd-service","text":"A systemd unit file can be found in misc/librenms.service . To install run: cp /opt/librenms/misc/librenms.service /etc/systemd/system/librenms.service && systemctl enable --now librenms.service","title":"systemd service"},{"location":"Extensions/Dispatcher-Service/#systemd-service-with-watchdog","text":"This service file is an alternative to the above service file. It uses the systemd WatchdogSec= option to restart the service if it does not receive a keep-alive from the running process. A systemd unit file can be found in misc/librenms-watchdog.service . To install run: cp /opt/librenms/misc/librenms-watchdog.service /etc/systemd/system/librenms.service && systemctl enable --now librenms.service This requires: python3-systemd (or python-systemd on older systems) or https://pypi.org/project/systemd-python/ If you run this systemd service without python3-systemd it will restart every 30 seconds.","title":"systemd service with watchdog"},{"location":"Extensions/Dispatcher-Service/#os-specific-instructions","text":"","title":"OS-Specific Instructions"},{"location":"Extensions/Dispatcher-Service/#rhelcentos","text":"To get the LibreNMS service running under python3.4+ on RHEL-derivatives with minimal fuss, you can use the software collections build: First, enable SCL's on your system:","title":"RHEL/CentOS"},{"location":"Extensions/Dispatcher-Service/#centos-7","text":"# yum install centos-release-scl","title":"CentOS 7"},{"location":"Extensions/Dispatcher-Service/#rhel-7","text":"# subscription-manager repos --enable rhel-server-rhscl-7-rpms Then install and configure the runtime and service: # yum install gcc rh-python36 rh-python36-python-devel epel-release # yum --enablerepo=remi install redis # vi /opt/librenms/config.php # vi /etc/redis.conf # systemctl enable --now redis.service # scl enable rh-python36 bash # change directory to librenms (default /opt/librenms) # pip3 install -r requirements.txt # cp /opt/librenms/misc/librenms.service.scl /etc/systemd/system/librenms.service # systemctl enable --now librenms.service If you want to use another version of python 3, change rh-python36 in the unit file and the commands above to match the name of the replacement scl.","title":"RHEL 7"},{"location":"Extensions/Dispatcher-Service/#debianubuntu","text":"","title":"Debian/Ubuntu"},{"location":"Extensions/Dispatcher-Service/#debian-11-bullseye","text":"Warning: Bullseye provide PHP 7.4 that is too old to run LibreNMS.","title":"Debian 11 (Bullseye)"},{"location":"Extensions/Dispatcher-Service/#debian-12-bookworm","text":"Warning: Bookworm is not available as stable yet (as 2022 november). Install dependancies apt install python3 python3-mysqldb python3-dotenv Add the python3-systemd package for service with watchdog.","title":"Debian 12 (Bookworm)"},{"location":"Extensions/Distributed-Poller/","text":"Distributed Poller A normal install contains all parts of LibreNMS: Poller/Discovery/etc workers RRD (Time series data store) * Database * Webserver (Web UI/API) * * may only be installed on one server (however, some can be clustered) Distributed Polling allows the workers to be spread across additional servers for horizontal scaling. Distributed polling is not intended for remote polling. Devices can be grouped together into a poller_group to pin these devices to a single or a group of designated pollers. All pollers need to write to the same set of RRD files, preferably via RRDcached. It is also a requirement that at least one locking service is in place to which all pollers can connect. There are currently three locking mechanisms available memcached redis (preferred) sql locks (default) All of the above locking mechanisms are natively supported in LibreNMS. If none are specified, it will default to using SQL. Requirements for distributed polling These requirements are above the normal requirements for a full LibreNMS install. rrdtool version 1.4 or above At least one locking mechanism configured a rrdcached install By default, all hosts are shared and have the poller_group = 0 . To pin a device to a poller, set it to a value greater than 0 and set the same value in the poller's config with distributed_poller_group . One can also specify a comma separated string of poller groups in distributed_poller_group . The poller will then poll devices from any of the groups listed. If new devices get added from the poller they will be assigned to the first poller group in the list unless the group is specified when adding the device. The following is a standard config, combined with a locking mechanism below: poller/distributed lnms config:set distributed_poller true lnms config:set distributed_poller_group 0 If you want to customise the hostname for the poller then you will need to set this in config.php : $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); Locking mechanisms Pick one of the following setups, do not use all of them at the same time. Using REDIS In your .env file you will need to specify a redis server, port and the driver. REDIS_HOST=HOSTNAME or IP REDIS_PORT=6379 CACHE_DRIVER=redis Using Memcached Preferably you should set the memcached server settings via the web UI. Under Settings > Global Settings > Distributed poller, you fill out the memcached host and port, and then in your .env file you will need to add: CACHE_DRIVER=memcached If you want to use memcached, you will also need to install an additional Python 3 python-memcached package. Example Setup Below is an example setup based on a real deployment which at the time of writing covers over 2,500 devices and 50,000 ports. The setup is running within an OpenStack environment with some commodity hardware for remote pollers. Here's a diagram of how you can scale LibreNMS out: Architecture How you set the distribution up is entirely up to you. You can choose to host the majority of the required services on a single virtual machine or server and then a poller to actually query the devices being monitored, all the way through to having a dedicated server for each of the individual roles. Below are notes on what you need to consider both from the software layer, but also connectivity. Web / API Layer This is typically Apache but we have setup guides for both Nginx and Lighttpd which should work perfectly fine. There is nothing unique about the role this service is providing except that if you are adding devices from this layer then the web service will need to be able to connect to the end device via SNMP and perform an ICMP test. It is advisable to run RRDCached within this setup so that you don't need to share the rrd folder via a remote file share such as NFS. The web service can then generate rrd graphs via RRDCached. If RRDCached isn't an option then you can mount the rrd directory to read the RRD files directly. Database Server MySQL / MariaDB - At the moment these are the only database servers that are supported. The pollers, web and API layers should all be able to access the database server directly. RRD Storage Central storage should be provided so all RRD files can be read from and written to in one location. As suggested above, it's recommended that RRD Cached is configured and used. For this example, we are running RRDCached to allow all pollers and web/api servers to read/write to the rrd files with the rrd directory also exported by NFS for simple access and maintenance. Pollers Pollers can be installed and run from anywhere, the only requirements are: They can access the Memcache instance They can create RRD files via some method such as a shared filesystem or RRDTool >=1.5.5 They can access the MySQL server You can either assign pollers into groups and set a poller group against certain devices, this will mean that those devices will only be processed by certain pollers (default poller group is 0) or you can assign all pollers to the default poller group for them to process any and all devices. This will provide the ability to have a single poller behind a NAT firewall monitor internal devices and report back to your central system. You will then be able to monitor those devices from the Web UI as normal. Another benefit to this is that you can provide N+x pollers, i.e if you know that you require three pollers to process all devices within 300 seconds then adding a 4th poller will mean that should any one single poller fail then the remaining three will complete polling in time. You could also use this to take a poller out of service for maintenance, i.e OS updates and software updates. It is extremely advisable to either run a central recursive dns server such as pdns-recursor and have all of your pollers use this or install a recursive dns server on each poller - the volume of DNS requests on large installs can be significant and will slow polling down enough to cause issues with a large number of devices. A last note to make sure of, is that all pollers writing to the same DB need to have the same APP_KEY value set in the .env file. Discovery Depending on your setup will depend on how you configure your discovery processes. Cron based polling It's not necessary to run discovery services on all pollers. In fact, you should only run one discovery process per poller group. Designate a single poller to run discovery (or a separate server if required). If you run billing, you can do this in one of two ways: Run poll-billing.php and calculate-billing.php on a single poller which will create billing information for all bills. Please note this poller must have snmp access to all of your devices which have ports within a bill. The other option is to enable $config['distributed_billing'] = true; in config.php. Then run poll-billing.php on a single poller per group. You can run calculate-billing.php on any poller but only one poller overall. Dispatcher service When using the dispatcher service, discovery can run on all nodes. Configuration Settings in config.php should be copied to all servers as they only apply locally. One way around this is to set settings in the database via the web ui or ./lnms config:set Config sample The following config is taken from a live setup which consists of a Web server, DB server, RRDCached server and 3 pollers. Web Server: Running Apache and an install of LibreNMS in /opt/librenms poller/distributed lnms config:set distributed_poller true poller/rrdtool lnms config:set rrdcached \"example.com:42217\" Database Server: Running Memcache and MariaDB Memcache Ubuntu (/etc/memcached.conf) -d -m 64 -p 11211 -u memcache -l ip.ip.ip.ip RRDCached Server: Running RRDCached RRDCached Ubuntu (/etc/default/rrdcached) OPTS=\"-l 0:42217\" OPTS=\"$OPTS -j /var/lib/rrdcached/journal/ -F\" OPTS=\"$OPTS -b /opt/librenms/rrd -B\" OPTS=\"$OPTS -w 1800 -z 900\" Ubuntu (/etc/default/rrdcached) - RRDCached 1.5.5 and above. BASE_OPTIONS=\"-l 0:42217\" BASE_OPTIONS=\"$BASE_OPTIONS -R -j /var/lib/rrdcached/journal/ -F\" BASE_OPTIONS=\"$BASE_OPTIONS -b /opt/librenms/rrd -B\" BASE_OPTIONS=\"$BASE_OPTIONS -w 1800 -z 900\" Poller 1: Running an install of LibreNMS in /opt/librenms config.php $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); $config [ 'distributed_poller_group' ] = '0' ; $config [ 'distributed_billing' ] = true ; poller/distributed lnms config:set distributed_poller_memcached_host \"example.com\" lnms config:set distributed_poller_memcached_port 11211 lnms config:set distributed_poller true poller/rrdtool lnms config:set rrdcached \"example.com:42217\" /etc/cron.d/librenms Runs discovery and polling for group 0, daily.sh to deal with notifications and DB cleanup and alerts. 33 */6 * * * librenms /opt/librenms/cronic /opt/librenms/discovery-wrapper.py 1 */5 * * * * librenms /opt/librenms/discovery.php -h new >> /dev/null 2>&1 */5 * * * * librenms /opt/librenms/cronic /opt/librenms/poller-wrapper.py 16 15 0 * * * librenms /opt/librenms/daily.sh >> /dev/null 2>&1 * * * * * librenms /opt/librenms/alerts.php >> /dev/null 2>&1 Poller 2: Running an install of LibreNMS in /opt/librenms config.php $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); $config [ 'distributed_poller_group' ] = '0' ; $config [ 'distributed_billing' ] = true ; poller/distributed lnms config:set distributed_poller_memcached_host \"example.com\" lnms config:set distributed_poller_memcached_port 11211 lnms config:set distributed_poller true poller/rrdtool lnms config:set rrdcached \"example.com:42217\" /etc/cron.d/librenms Runs billing as well as polling for group 0. */5 * * * * librenms /opt/librenms/poller-wrapper.py 16 >> /opt/librenms/logs/wrapper.log */5 * * * * librenms /opt/librenms/poll-billing.php >> /dev/null 2>&1 01 * * * * librenms /opt/librenms/billing-calculate.php >> /dev/null 2>&1 15 0 * * * librenms /opt/librenms/daily.sh >> /dev/null 2>&1 Poller 3: Running an install of LibreNMS in /opt/librenms config.php $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); $config [ 'distributed_poller_group' ] = '2,3' ; $config [ 'distributed_billing' ] = true ; poller/distributed lnms config:set distributed_poller_memcached_host \"example.com\" lnms config:set distributed_poller_memcached_port 11211 lnms config:set distributed_poller true poller/rrdtool lnms config:set rrdcached \"example.com:42217\" /etc/cron.d/librenms Runs discovery and polling for groups 2 and 3. 33 */6 * * * librenms /opt/librenms/cronic /opt/librenms/discovery-wrapper.py 1 */5 * * * * librenms /opt/librenms/discovery.php -h new >> /dev/null 2>&1 */5 * * * * librenms /opt/librenms/poll-billing.php >> /dev/null 2>&1 */5 * * * * librenms /opt/librenms/cronic /opt/librenms/poller-wrapper.py 16 15 0 * * * librenms /opt/librenms/daily.sh >> /dev/null 2>&1","title":"Scaling LibreNMS"},{"location":"Extensions/Distributed-Poller/#distributed-poller","text":"A normal install contains all parts of LibreNMS: Poller/Discovery/etc workers RRD (Time series data store) * Database * Webserver (Web UI/API) * * may only be installed on one server (however, some can be clustered) Distributed Polling allows the workers to be spread across additional servers for horizontal scaling. Distributed polling is not intended for remote polling. Devices can be grouped together into a poller_group to pin these devices to a single or a group of designated pollers. All pollers need to write to the same set of RRD files, preferably via RRDcached. It is also a requirement that at least one locking service is in place to which all pollers can connect. There are currently three locking mechanisms available memcached redis (preferred) sql locks (default) All of the above locking mechanisms are natively supported in LibreNMS. If none are specified, it will default to using SQL.","title":"Distributed Poller"},{"location":"Extensions/Distributed-Poller/#requirements-for-distributed-polling","text":"These requirements are above the normal requirements for a full LibreNMS install. rrdtool version 1.4 or above At least one locking mechanism configured a rrdcached install By default, all hosts are shared and have the poller_group = 0 . To pin a device to a poller, set it to a value greater than 0 and set the same value in the poller's config with distributed_poller_group . One can also specify a comma separated string of poller groups in distributed_poller_group . The poller will then poll devices from any of the groups listed. If new devices get added from the poller they will be assigned to the first poller group in the list unless the group is specified when adding the device. The following is a standard config, combined with a locking mechanism below: poller/distributed lnms config:set distributed_poller true lnms config:set distributed_poller_group 0 If you want to customise the hostname for the poller then you will need to set this in config.php : $config [ 'distributed_poller_name' ] = php_uname ( 'n' );","title":"Requirements for distributed polling"},{"location":"Extensions/Distributed-Poller/#locking-mechanisms","text":"Pick one of the following setups, do not use all of them at the same time.","title":"Locking mechanisms"},{"location":"Extensions/Distributed-Poller/#using-redis","text":"In your .env file you will need to specify a redis server, port and the driver. REDIS_HOST=HOSTNAME or IP REDIS_PORT=6379 CACHE_DRIVER=redis","title":"Using REDIS"},{"location":"Extensions/Distributed-Poller/#using-memcached","text":"Preferably you should set the memcached server settings via the web UI. Under Settings > Global Settings > Distributed poller, you fill out the memcached host and port, and then in your .env file you will need to add: CACHE_DRIVER=memcached If you want to use memcached, you will also need to install an additional Python 3 python-memcached package.","title":"Using Memcached"},{"location":"Extensions/Distributed-Poller/#example-setup","text":"Below is an example setup based on a real deployment which at the time of writing covers over 2,500 devices and 50,000 ports. The setup is running within an OpenStack environment with some commodity hardware for remote pollers. Here's a diagram of how you can scale LibreNMS out:","title":"Example Setup"},{"location":"Extensions/Distributed-Poller/#architecture","text":"How you set the distribution up is entirely up to you. You can choose to host the majority of the required services on a single virtual machine or server and then a poller to actually query the devices being monitored, all the way through to having a dedicated server for each of the individual roles. Below are notes on what you need to consider both from the software layer, but also connectivity.","title":"Architecture"},{"location":"Extensions/Distributed-Poller/#web-api-layer","text":"This is typically Apache but we have setup guides for both Nginx and Lighttpd which should work perfectly fine. There is nothing unique about the role this service is providing except that if you are adding devices from this layer then the web service will need to be able to connect to the end device via SNMP and perform an ICMP test. It is advisable to run RRDCached within this setup so that you don't need to share the rrd folder via a remote file share such as NFS. The web service can then generate rrd graphs via RRDCached. If RRDCached isn't an option then you can mount the rrd directory to read the RRD files directly.","title":"Web / API Layer"},{"location":"Extensions/Distributed-Poller/#database-server","text":"MySQL / MariaDB - At the moment these are the only database servers that are supported. The pollers, web and API layers should all be able to access the database server directly.","title":"Database Server"},{"location":"Extensions/Distributed-Poller/#rrd-storage","text":"Central storage should be provided so all RRD files can be read from and written to in one location. As suggested above, it's recommended that RRD Cached is configured and used. For this example, we are running RRDCached to allow all pollers and web/api servers to read/write to the rrd files with the rrd directory also exported by NFS for simple access and maintenance.","title":"RRD Storage"},{"location":"Extensions/Distributed-Poller/#pollers","text":"Pollers can be installed and run from anywhere, the only requirements are: They can access the Memcache instance They can create RRD files via some method such as a shared filesystem or RRDTool >=1.5.5 They can access the MySQL server You can either assign pollers into groups and set a poller group against certain devices, this will mean that those devices will only be processed by certain pollers (default poller group is 0) or you can assign all pollers to the default poller group for them to process any and all devices. This will provide the ability to have a single poller behind a NAT firewall monitor internal devices and report back to your central system. You will then be able to monitor those devices from the Web UI as normal. Another benefit to this is that you can provide N+x pollers, i.e if you know that you require three pollers to process all devices within 300 seconds then adding a 4th poller will mean that should any one single poller fail then the remaining three will complete polling in time. You could also use this to take a poller out of service for maintenance, i.e OS updates and software updates. It is extremely advisable to either run a central recursive dns server such as pdns-recursor and have all of your pollers use this or install a recursive dns server on each poller - the volume of DNS requests on large installs can be significant and will slow polling down enough to cause issues with a large number of devices. A last note to make sure of, is that all pollers writing to the same DB need to have the same APP_KEY value set in the .env file.","title":"Pollers"},{"location":"Extensions/Distributed-Poller/#discovery","text":"Depending on your setup will depend on how you configure your discovery processes. Cron based polling It's not necessary to run discovery services on all pollers. In fact, you should only run one discovery process per poller group. Designate a single poller to run discovery (or a separate server if required). If you run billing, you can do this in one of two ways: Run poll-billing.php and calculate-billing.php on a single poller which will create billing information for all bills. Please note this poller must have snmp access to all of your devices which have ports within a bill. The other option is to enable $config['distributed_billing'] = true; in config.php. Then run poll-billing.php on a single poller per group. You can run calculate-billing.php on any poller but only one poller overall. Dispatcher service When using the dispatcher service, discovery can run on all nodes.","title":"Discovery"},{"location":"Extensions/Distributed-Poller/#configuration","text":"Settings in config.php should be copied to all servers as they only apply locally. One way around this is to set settings in the database via the web ui or ./lnms config:set","title":"Configuration"},{"location":"Extensions/Distributed-Poller/#config-sample","text":"The following config is taken from a live setup which consists of a Web server, DB server, RRDCached server and 3 pollers. Web Server: Running Apache and an install of LibreNMS in /opt/librenms poller/distributed lnms config:set distributed_poller true poller/rrdtool lnms config:set rrdcached \"example.com:42217\" Database Server: Running Memcache and MariaDB Memcache Ubuntu (/etc/memcached.conf) -d -m 64 -p 11211 -u memcache -l ip.ip.ip.ip RRDCached Server: Running RRDCached RRDCached Ubuntu (/etc/default/rrdcached) OPTS=\"-l 0:42217\" OPTS=\"$OPTS -j /var/lib/rrdcached/journal/ -F\" OPTS=\"$OPTS -b /opt/librenms/rrd -B\" OPTS=\"$OPTS -w 1800 -z 900\" Ubuntu (/etc/default/rrdcached) - RRDCached 1.5.5 and above. BASE_OPTIONS=\"-l 0:42217\" BASE_OPTIONS=\"$BASE_OPTIONS -R -j /var/lib/rrdcached/journal/ -F\" BASE_OPTIONS=\"$BASE_OPTIONS -b /opt/librenms/rrd -B\" BASE_OPTIONS=\"$BASE_OPTIONS -w 1800 -z 900\" Poller 1: Running an install of LibreNMS in /opt/librenms config.php $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); $config [ 'distributed_poller_group' ] = '0' ; $config [ 'distributed_billing' ] = true ; poller/distributed lnms config:set distributed_poller_memcached_host \"example.com\" lnms config:set distributed_poller_memcached_port 11211 lnms config:set distributed_poller true poller/rrdtool lnms config:set rrdcached \"example.com:42217\" /etc/cron.d/librenms Runs discovery and polling for group 0, daily.sh to deal with notifications and DB cleanup and alerts. 33 */6 * * * librenms /opt/librenms/cronic /opt/librenms/discovery-wrapper.py 1 */5 * * * * librenms /opt/librenms/discovery.php -h new >> /dev/null 2>&1 */5 * * * * librenms /opt/librenms/cronic /opt/librenms/poller-wrapper.py 16 15 0 * * * librenms /opt/librenms/daily.sh >> /dev/null 2>&1 * * * * * librenms /opt/librenms/alerts.php >> /dev/null 2>&1 Poller 2: Running an install of LibreNMS in /opt/librenms config.php $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); $config [ 'distributed_poller_group' ] = '0' ; $config [ 'distributed_billing' ] = true ; poller/distributed lnms config:set distributed_poller_memcached_host \"example.com\" lnms config:set distributed_poller_memcached_port 11211 lnms config:set distributed_poller true poller/rrdtool lnms config:set rrdcached \"example.com:42217\" /etc/cron.d/librenms Runs billing as well as polling for group 0. */5 * * * * librenms /opt/librenms/poller-wrapper.py 16 >> /opt/librenms/logs/wrapper.log */5 * * * * librenms /opt/librenms/poll-billing.php >> /dev/null 2>&1 01 * * * * librenms /opt/librenms/billing-calculate.php >> /dev/null 2>&1 15 0 * * * librenms /opt/librenms/daily.sh >> /dev/null 2>&1 Poller 3: Running an install of LibreNMS in /opt/librenms config.php $config [ 'distributed_poller_name' ] = php_uname ( 'n' ); $config [ 'distributed_poller_group' ] = '2,3' ; $config [ 'distributed_billing' ] = true ; poller/distributed lnms config:set distributed_poller_memcached_host \"example.com\" lnms config:set distributed_poller_memcached_port 11211 lnms config:set distributed_poller true poller/rrdtool lnms config:set rrdcached \"example.com:42217\" /etc/cron.d/librenms Runs discovery and polling for groups 2 and 3. 33 */6 * * * librenms /opt/librenms/cronic /opt/librenms/discovery-wrapper.py 1 */5 * * * * librenms /opt/librenms/discovery.php -h new >> /dev/null 2>&1 */5 * * * * librenms /opt/librenms/poll-billing.php >> /dev/null 2>&1 */5 * * * * librenms /opt/librenms/cronic /opt/librenms/poller-wrapper.py 16 15 0 * * * librenms /opt/librenms/daily.sh >> /dev/null 2>&1","title":"Config sample"},{"location":"Extensions/Fast-Ping-Check/","text":"Fast up/down checking Normally, LibreNMS sends an ICMP ping to the device before polling to check if it is up or down. This check is tied to the poller frequency, which is normally 5 minutes. This means it may take up to 5 minutes to find out if a device is down. Some users may want to know if devices stop responding to ping more quickly than that. LibreNMS offers a ping.php script to run ping checks as quickly as possible without increasing snmp load on your devices by switching to 1 minute polling. WARNING : If you do not have an alert rule that alerts on device status, enabling this will be a waste of resources. You can find one in the Alert Rules Collection . Setting the ping check to 1 minute 1: If you are using RRDCached , stop the service. - This will flush all pending writes so that the rrdstep.php script can change the steps. 2: Change the ping_rrd_step setting in config.php poller/rrdtool lnms config:set ping_rrd_step 60 3: Update the rrd files to change the step (step is hardcoded at file creation in rrd files) ./scripts/rrdstep.php -h all 4: Add the following line to /etc/cron.d/librenms to allow 1 minute ping checks * * * * * librenms /opt/librenms/ping.php >> /dev/null 2>&1 5: If applicable: Start the RRDCached service NOTE : If you are using distributed pollers you can restrict a poller to a group by appending -g to the cron entry. Alternatively, you should only run ping.php on a single node. Sub minute ping check Cron only has a resolution of one minute, so for sub-minute ping checks we need to adapt both ping and alerts entries. We add two entries per function, but add a delay before one of these entries. Remember, you need to remove the original ping.php and alerts.php entries in crontab before proceeding! 1: Set ping_rrd_step poller/rrdtool lnms config:set ping_rrd_step 30 2: Update the rrd files ./scripts/rrdstep.php -h all 3: Update cron (removing any other ping.php or alert.php entries) * * * * * librenms /opt/librenms/ping.php >> /dev/null 2>&1 * * * * * librenms sleep 30 && /opt/librenms/ping.php >> /dev/null 2>&1 * * * * * librenms sleep 15 && /opt/librenms/alerts.php >> /dev/null 2>&1 * * * * * librenms sleep 45 && /opt/librenms/alerts.php >> /dev/null 2>&1 Device dependencies The ping.php script respects device dependencies, but the main poller does not (for technical reasons). However, using this script does not disable the icmp check in the poller and a child may be reported as down before the parent. Settings ping.php uses much the same settings as the poller fping with one exception: retries is used instead of count. ping.php does not measure loss and avg response time, only up/down, so once a device responds it stops pinging it. poller/ping lnms config:set fping_options.retries 2 lnms config:set fping_options.timeout 500 lnms config:set fping_options.interval 500","title":"Fast Ping Checking"},{"location":"Extensions/Fast-Ping-Check/#fast-updown-checking","text":"Normally, LibreNMS sends an ICMP ping to the device before polling to check if it is up or down. This check is tied to the poller frequency, which is normally 5 minutes. This means it may take up to 5 minutes to find out if a device is down. Some users may want to know if devices stop responding to ping more quickly than that. LibreNMS offers a ping.php script to run ping checks as quickly as possible without increasing snmp load on your devices by switching to 1 minute polling. WARNING : If you do not have an alert rule that alerts on device status, enabling this will be a waste of resources. You can find one in the Alert Rules Collection .","title":"Fast up/down checking"},{"location":"Extensions/Fast-Ping-Check/#setting-the-ping-check-to-1-minute","text":"1: If you are using RRDCached , stop the service. - This will flush all pending writes so that the rrdstep.php script can change the steps. 2: Change the ping_rrd_step setting in config.php poller/rrdtool lnms config:set ping_rrd_step 60 3: Update the rrd files to change the step (step is hardcoded at file creation in rrd files) ./scripts/rrdstep.php -h all 4: Add the following line to /etc/cron.d/librenms to allow 1 minute ping checks * * * * * librenms /opt/librenms/ping.php >> /dev/null 2>&1 5: If applicable: Start the RRDCached service NOTE : If you are using distributed pollers you can restrict a poller to a group by appending -g to the cron entry. Alternatively, you should only run ping.php on a single node.","title":"Setting the ping check to 1 minute"},{"location":"Extensions/Fast-Ping-Check/#sub-minute-ping-check","text":"Cron only has a resolution of one minute, so for sub-minute ping checks we need to adapt both ping and alerts entries. We add two entries per function, but add a delay before one of these entries. Remember, you need to remove the original ping.php and alerts.php entries in crontab before proceeding! 1: Set ping_rrd_step poller/rrdtool lnms config:set ping_rrd_step 30 2: Update the rrd files ./scripts/rrdstep.php -h all 3: Update cron (removing any other ping.php or alert.php entries) * * * * * librenms /opt/librenms/ping.php >> /dev/null 2>&1 * * * * * librenms sleep 30 && /opt/librenms/ping.php >> /dev/null 2>&1 * * * * * librenms sleep 15 && /opt/librenms/alerts.php >> /dev/null 2>&1 * * * * * librenms sleep 45 && /opt/librenms/alerts.php >> /dev/null 2>&1","title":"Sub minute ping check"},{"location":"Extensions/Fast-Ping-Check/#device-dependencies","text":"The ping.php script respects device dependencies, but the main poller does not (for technical reasons). However, using this script does not disable the icmp check in the poller and a child may be reported as down before the parent.","title":"Device dependencies"},{"location":"Extensions/Fast-Ping-Check/#settings","text":"ping.php uses much the same settings as the poller fping with one exception: retries is used instead of count. ping.php does not measure loss and avg response time, only up/down, so once a device responds it stops pinging it. poller/ping lnms config:set fping_options.retries 2 lnms config:set fping_options.timeout 500 lnms config:set fping_options.interval 500","title":"Settings"},{"location":"Extensions/Galera-Cluster/","text":"MariaDB Galera Cluster This is currently being tested, use at your own risk. LibreNMS can be used with a MariaDB Galera Cluster. This is a Multi Master cluster, meaning each node in the cluster can read and write to the database. They all have the same ability. LibreNMS will randomly choose a working node to read and write requests to. For more information see https://laravel.com/docs/database#read-and-write-connections Getting Started It is best practice to have a minimum of 3 nodes in the cluster, A odd number of nodes is recommended in the event nodes have a disagreement on data, they will have a tie breaker. It's recommended that all servers be similar in hardware performance, cluster performance can be affected by the slowest server in the cluster. Backup the database before starting, and backing up the database regularly is still recommended even in a working cluster environment. Install and Configure Galera Install Galera4 and MariaDB Server These can be obtained from your OS package manager. For example in Ubuntu. sudo apt-get install mariadb-server mariadb-client galera-4 Create Galera Config Create a new file /etc/mysql/conf.d/galera.conf on each node [mysqld] binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 bind-address=0.0.0.0 # Galera Provider Configuration wsrep_on=ON wsrep_provider=/usr/lib/galera/libgalera_smm.so # Galera Cluster Configuration wsrep_cluster_name=\"librenms_cluster\" wsrep_cluster_address=\"gcomm://192.168.1.35,192.168.1.36,192.168.1.37,192.168.1.38,192.168.1.39\" # Galera Synchronization Configuration wsrep_sst_method=rsync # Galera Node Configuration wsrep_node_address=\"192.168.1.35\" wsrep_node_name=\"librenms1.35\" Change the following values for your environment. * wsrep_cluster_address - All the IP address's of your nodes. * wsrep_cluster_name - Name of cluster, should be the same for all nodes * wsrep_node_address - IP address of this node. * wsrep_node_name - Name of this node. Edit LibreNMS .env LibreNMS supports up to 9 galera nodes, you define these nodes in the .env file. For each node we have the ability to define if this librenms installation/poller is able to write, read or both to that node. The galera nodes you define here can be the same or differnt for each librenms poller. If you have a poller you only want to write/read to one galera node, you would simply add one DB_HOST, and omit all the rest. This allows you to precisely control what galera nodes a librenms poller is reading and or writing too. DB_HOST is always set to read/write. DB_HOST must be set, however, it does not have to be the same on each poller, it can be different as long as it's part of the same galera cluster. If the node that is set to DB_HOST is down, things like lnms db command no longer work, as they only use DB_HOST and don't failover to other nodes. Set DB_CONNECTION=mysql_cluster to enable DB_STICKY can be used if you are pulling out of sync data form the database in a read request. For more information see https://laravel.com/docs/database#the-sticky-option The below example setting up 5 nodes DB_HOST=192.168.1.35 DB_HOST_R2=192.168.1.36 DB_HOST_R3=192.168.1.37 DB_HOST_R4=192.168.1.38 DB_HOST_R5=192.168.1.39 DB_HOST_W2=192.168.1.36 DB_HOST_W3=192.168.1.37 DB_STICKY=true DB_CONNECTION=mysql_cluster DB_DATABASE=librenms DB_USERNAME=librenms DB_PASSWORD=password The above .env on a librenms installation/poller would communicate to each galera node as follows. 192.168.1.35 - Read/Write 192.168.1.36 - Read/Write 192.168.1.37 - Read/Write 192.168.1.38 - Read Only 192.168.1.39 - Read Only Starting Galera Cluster for the first time. 1) Shutdown MariaDB server on ALL nodes. sudo systemctl stop mariadb-server 2) On the server with your existing database or any mariadb server if you are starting without existing data, run the following command sudo galera_new_cluster 3) Start the rest of the nodes normally. sudo systemctl start mariadb-server Galera Cluster Status To see some stats on how the Galera cluster is preforming run the following. lnms db In the database run following mysql query SHOW GLOBAL STATUS LIKE 'wsrep_%' ; Variable Name Value Notes ----------------------------------- ---------------------------------------------------------------- --------------------------------------------------------- wsrep_cluster_size 2 Current number of nodes in Cluster wsrep_cluster_state_uuid e71582f3-cf14-11eb-bcf6-a23029e16405 Last Transaction UUID, Should be the same for each node wsrep_connected On On = Connected with other nodes wsrep_local_state_comment Synced Synced with other nodes Restarting the Entire Cluster In a cluster environment, steps should be taken to ensure that ALL nodes are not offline at the same time. Failed nodes can recover without issue as long as one node remains online. In the event that ALL nodes are offline, the following should be done to ensure you are starting the cluster with the most up-to-date database. To do this login to each node and running the following sudo cat /var/lib/data/grastate.dat # GALERA saved state version: 2.1 uuid: e71582f3-cf14-11eb-bcf6-a23029e16405 seqno: -1 safe_to_bootstrap: 1 If the safe_to_bootstrap = 1, then Galera determined that this node has the most up-to-date database and can be safeley used to start the cluster. Once you have found a node that can be used for starting the cluster, follow the steps in starting for the first time.","title":"Galera Database Cluster"},{"location":"Extensions/Galera-Cluster/#mariadb-galera-cluster","text":"This is currently being tested, use at your own risk. LibreNMS can be used with a MariaDB Galera Cluster. This is a Multi Master cluster, meaning each node in the cluster can read and write to the database. They all have the same ability. LibreNMS will randomly choose a working node to read and write requests to. For more information see https://laravel.com/docs/database#read-and-write-connections","title":"MariaDB Galera Cluster"},{"location":"Extensions/Galera-Cluster/#getting-started","text":"It is best practice to have a minimum of 3 nodes in the cluster, A odd number of nodes is recommended in the event nodes have a disagreement on data, they will have a tie breaker. It's recommended that all servers be similar in hardware performance, cluster performance can be affected by the slowest server in the cluster. Backup the database before starting, and backing up the database regularly is still recommended even in a working cluster environment.","title":"Getting Started"},{"location":"Extensions/Galera-Cluster/#install-and-configure-galera","text":"","title":"Install and Configure Galera"},{"location":"Extensions/Galera-Cluster/#install-galera4-and-mariadb-server","text":"These can be obtained from your OS package manager. For example in Ubuntu. sudo apt-get install mariadb-server mariadb-client galera-4","title":"Install Galera4 and MariaDB Server"},{"location":"Extensions/Galera-Cluster/#create-galera-config","text":"Create a new file /etc/mysql/conf.d/galera.conf on each node [mysqld] binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 bind-address=0.0.0.0 # Galera Provider Configuration wsrep_on=ON wsrep_provider=/usr/lib/galera/libgalera_smm.so # Galera Cluster Configuration wsrep_cluster_name=\"librenms_cluster\" wsrep_cluster_address=\"gcomm://192.168.1.35,192.168.1.36,192.168.1.37,192.168.1.38,192.168.1.39\" # Galera Synchronization Configuration wsrep_sst_method=rsync # Galera Node Configuration wsrep_node_address=\"192.168.1.35\" wsrep_node_name=\"librenms1.35\" Change the following values for your environment. * wsrep_cluster_address - All the IP address's of your nodes. * wsrep_cluster_name - Name of cluster, should be the same for all nodes * wsrep_node_address - IP address of this node. * wsrep_node_name - Name of this node.","title":"Create Galera Config"},{"location":"Extensions/Galera-Cluster/#edit-librenms-env","text":"LibreNMS supports up to 9 galera nodes, you define these nodes in the .env file. For each node we have the ability to define if this librenms installation/poller is able to write, read or both to that node. The galera nodes you define here can be the same or differnt for each librenms poller. If you have a poller you only want to write/read to one galera node, you would simply add one DB_HOST, and omit all the rest. This allows you to precisely control what galera nodes a librenms poller is reading and or writing too. DB_HOST is always set to read/write. DB_HOST must be set, however, it does not have to be the same on each poller, it can be different as long as it's part of the same galera cluster. If the node that is set to DB_HOST is down, things like lnms db command no longer work, as they only use DB_HOST and don't failover to other nodes. Set DB_CONNECTION=mysql_cluster to enable DB_STICKY can be used if you are pulling out of sync data form the database in a read request. For more information see https://laravel.com/docs/database#the-sticky-option The below example setting up 5 nodes DB_HOST=192.168.1.35 DB_HOST_R2=192.168.1.36 DB_HOST_R3=192.168.1.37 DB_HOST_R4=192.168.1.38 DB_HOST_R5=192.168.1.39 DB_HOST_W2=192.168.1.36 DB_HOST_W3=192.168.1.37 DB_STICKY=true DB_CONNECTION=mysql_cluster DB_DATABASE=librenms DB_USERNAME=librenms DB_PASSWORD=password The above .env on a librenms installation/poller would communicate to each galera node as follows. 192.168.1.35 - Read/Write 192.168.1.36 - Read/Write 192.168.1.37 - Read/Write 192.168.1.38 - Read Only 192.168.1.39 - Read Only","title":"Edit LibreNMS .env"},{"location":"Extensions/Galera-Cluster/#starting-galera-cluster-for-the-first-time","text":"1) Shutdown MariaDB server on ALL nodes. sudo systemctl stop mariadb-server 2) On the server with your existing database or any mariadb server if you are starting without existing data, run the following command sudo galera_new_cluster 3) Start the rest of the nodes normally. sudo systemctl start mariadb-server","title":"Starting Galera Cluster for the first time."},{"location":"Extensions/Galera-Cluster/#galera-cluster-status","text":"To see some stats on how the Galera cluster is preforming run the following. lnms db In the database run following mysql query SHOW GLOBAL STATUS LIKE 'wsrep_%' ; Variable Name Value Notes ----------------------------------- ---------------------------------------------------------------- --------------------------------------------------------- wsrep_cluster_size 2 Current number of nodes in Cluster wsrep_cluster_state_uuid e71582f3-cf14-11eb-bcf6-a23029e16405 Last Transaction UUID, Should be the same for each node wsrep_connected On On = Connected with other nodes wsrep_local_state_comment Synced Synced with other nodes","title":"Galera Cluster Status"},{"location":"Extensions/Galera-Cluster/#restarting-the-entire-cluster","text":"In a cluster environment, steps should be taken to ensure that ALL nodes are not offline at the same time. Failed nodes can recover without issue as long as one node remains online. In the event that ALL nodes are offline, the following should be done to ensure you are starting the cluster with the most up-to-date database. To do this login to each node and running the following sudo cat /var/lib/data/grastate.dat # GALERA saved state version: 2.1 uuid: e71582f3-cf14-11eb-bcf6-a23029e16405 seqno: -1 safe_to_bootstrap: 1 If the safe_to_bootstrap = 1, then Galera determined that this node has the most up-to-date database and can be safeley used to start the cluster. Once you have found a node that can be used for starting the cluster, follow the steps in starting for the first time.","title":"Restarting the Entire Cluster"},{"location":"Extensions/Gateone/","text":"GateOne integration We have simple integration for GateOne , you will be redirected to your Gateone command line frontend to access your equipment. (Currently this only works with SSH) GateOne itself isn't included within LibreNMS, you will need to install this separately either on the same infrastructure as LibreNMS or as a totally standalone appliance. The installation is beyond the scope of this document. Config is simple, include the following in your config.php : $config [ 'gateone' ][ 'server' ] = 'http:// , have special meanings or effects. Before a command is executed, the IRC-Bot ensures that the MySQL-Socket is working, that $this->user points to the right user and that the user is authenticated. Below you will find a table with related functions and attributes. You can chain-load any built-in command by calling $this->_command(\"My Parameters\") . You cannot chain-load external commands. To enable your command, edit your config.php and add something like this: ... $config [ 'irc_external' ][] = \"mycommand\" ; ... See: Example Functions and Attributes ... that are accessible from within an extension Functions Function( (Type) $Variable [= Default] [,...] ) Returns Description $this->getChan( ) String Returns channel of current event. $this->getData( (boolean) $Block = false ) String/Boolean Returns a line from the IRC-Buffer if it's not matched against any other command . If $Block is true , wait until a suitable line is returned. $this->getUser( ) String Returns nick of current user. Not to confuse with $this->user ! $this->get_user( ) Array See $this->user in Attributes. $this->irc_raw( (string) $Protocol ) Boolean Sends raw IRC-Protocol. $this->isAuthd( ) Boolean true if the user is authenticated. $this->joinChan( (string) $Channel ) Boolean Joins given $Channel . $this->log( (string) $Message ) Boolean Logs given $Message into STDOUT . $this->read( (string) $Buffer ) String/Boolean Returns a line from given $Buffer or false if there's nothing suitable inside the Buffer. Please use $this->getData() for handler-safe data retrieval. $this->respond( (string) $Message ) Boolean Responds to the request auto-detecting channel or private message. Attributes Attribute Type Description $params String Contains all arguments that are passed to the .command . $this->chan Array Channels that are configured. $this->commands Array Contains accessible commands . $this->config Array Contains $config from config.php . $this->data String Contains raw IRC-Protocol. $this->debug Boolean Debug-Flag. $this->external Array Contains loaded extra commands . $this->nick String Bot's nick on the IRC. $this->pass String IRC-Server's passphrase. $this->port Int IRC-Server's port-number. $this->server String IRC-Server's hostname. $this->ssl Boolean SSL-Flag. $this->tick Int Interval to check buffers in microseconds. $this->user Array Array containing details about the user that sent the request . Example includes/ircbot/join-ng.inc.php if ( $this -> user [ 'level' ] != 10 ) { return $this -> respond ( \"Sorry only admins can make me join.\" ); } if ( $this -> getChan () == \"#noc\" ) { $this -> respond ( \"Joining $params \" ); $this -> joinChan ( $params ); } else { $this -> respond ( \"Sorry, only people from #noc can make join.\" ); } config.php ... $config [ 'irc_external' ][] = \"join-ng\" ; ...","title":"IRC Bot Extensions"},{"location":"Extensions/IRC-Bot-Extensions/#irc-bot-extensions","text":"Okay this is a very quick walk-through in writing your own commands for the IRC-Bot. First of all, create a file in includes/ircbot , the file-name should be in this format: command.inc.php . When editing the file, do not open nor close PHP-tags. Any variable you assign will be discarded as soon as your command returns. Some variables, specially all listed under $this-> , have special meanings or effects. Before a command is executed, the IRC-Bot ensures that the MySQL-Socket is working, that $this->user points to the right user and that the user is authenticated. Below you will find a table with related functions and attributes. You can chain-load any built-in command by calling $this->_command(\"My Parameters\") . You cannot chain-load external commands. To enable your command, edit your config.php and add something like this: ... $config [ 'irc_external' ][] = \"mycommand\" ; ... See: Example","title":"IRC Bot Extensions"},{"location":"Extensions/IRC-Bot-Extensions/#functions-and-attributes","text":"... that are accessible from within an extension","title":"Functions and Attributes"},{"location":"Extensions/IRC-Bot-Extensions/#functions","text":"Function( (Type) $Variable [= Default] [,...] ) Returns Description $this->getChan( ) String Returns channel of current event. $this->getData( (boolean) $Block = false ) String/Boolean Returns a line from the IRC-Buffer if it's not matched against any other command . If $Block is true , wait until a suitable line is returned. $this->getUser( ) String Returns nick of current user. Not to confuse with $this->user ! $this->get_user( ) Array See $this->user in Attributes. $this->irc_raw( (string) $Protocol ) Boolean Sends raw IRC-Protocol. $this->isAuthd( ) Boolean true if the user is authenticated. $this->joinChan( (string) $Channel ) Boolean Joins given $Channel . $this->log( (string) $Message ) Boolean Logs given $Message into STDOUT . $this->read( (string) $Buffer ) String/Boolean Returns a line from given $Buffer or false if there's nothing suitable inside the Buffer. Please use $this->getData() for handler-safe data retrieval. $this->respond( (string) $Message ) Boolean Responds to the request auto-detecting channel or private message.","title":"Functions"},{"location":"Extensions/IRC-Bot-Extensions/#attributes","text":"Attribute Type Description $params String Contains all arguments that are passed to the .command . $this->chan Array Channels that are configured. $this->commands Array Contains accessible commands . $this->config Array Contains $config from config.php . $this->data String Contains raw IRC-Protocol. $this->debug Boolean Debug-Flag. $this->external Array Contains loaded extra commands . $this->nick String Bot's nick on the IRC. $this->pass String IRC-Server's passphrase. $this->port Int IRC-Server's port-number. $this->server String IRC-Server's hostname. $this->ssl Boolean SSL-Flag. $this->tick Int Interval to check buffers in microseconds. $this->user Array Array containing details about the user that sent the request .","title":"Attributes"},{"location":"Extensions/IRC-Bot-Extensions/#example","text":"includes/ircbot/join-ng.inc.php if ( $this -> user [ 'level' ] != 10 ) { return $this -> respond ( \"Sorry only admins can make me join.\" ); } if ( $this -> getChan () == \"#noc\" ) { $this -> respond ( \"Joining $params \" ); $this -> joinChan ( $params ); } else { $this -> respond ( \"Sorry, only people from #noc can make join.\" ); } config.php ... $config [ 'irc_external' ][] = \"join-ng\" ; ...","title":"Example"},{"location":"Extensions/IRC-Bot/","text":"IRC Bot LibreNMS has an easy to use IRC-Interface for basic tasks like viewing last log-entry, current device/port status and such. By default the IRC-Bot will not start when executed and will return an error until at least $config['irc_host'] and $config['irc_port'] has been specified inside config.php . (To start the IRC-Bot run ./irc.php ) If no channel has been specified with $config['irc_chan'] , ##librenms will be used. The default Nick for the bot is LibreNMS . The Bot will reply the same way it's being called. If you send it the commands via Query, it will respond in the Query. If you send the commands via a Channel, then it will respond in the Channel. Configuration & Defaults Option Default-Value Notes $config['irc_alert'] false Optional; Enables Alerting-Socket. EXPERIMENTAL $config['irc_alert_chan'] false Optional; Multiple channels can be defined as Array or delimited with , . EXPERIMENTAL $config['irc_alert_utf8'] false Optional; Enables use of strikethrough in alerts via UTF-8 encoded characters. Might cause trouble for some clients. $config['irc_alert_short'] false Optional; Send a one line alert summary instead of multi-line detailed alert. $config['irc_authtime'] 3 Optional; Defines how long in Hours an auth-session is valid. $config['irc_chan'] ##librenms Optional; Multiple channels can be defined as Array or delimited with , . Passwords are defined after a space-character . $config['irc_debug'] false Optional; Enables debug output (Wall of text) $config['irc_external'] Optional; Array or , delimited string with commands to include from includes/ircbot/*.inc.php $config['irc_host'] Required; Domain or IP to connect. If it's an IPv6 Address, embed it in [] . (Example: [::1] ) $config['irc_maxretry'] 5 Optional; How many connection attempts should be made before giving up $config['irc_nick'] LibreNMS Optional; $config['irc_pass'] Optional; This sends the IRC-PASS Sequence to IRC-Servers that require Password on Connect $config['irc_port'] 6667 Required; To enable SSL append a + before the Port. (Example: +6697 ) $config['irc_ctcp'] false Optional; Enable/disable ctcp-replies from the bot (currently VERSION, PING and TIME). $config['irc_ctcp_version'] LibreNMS IRCbot. https://www.librenms.org/ Optional; Reply-string to CTCP VERSION requests $config['irc_auth'] Optional; Array of hostmasks that are automatically authenticated. IRC-Commands Command Description .auth If : Request an Auth-Token. If : Authenticate session. .device Prints basic information about given hostname . .down List hostnames that are down, if any. .help List available commands. .join Joins if user has admin-level. .listdevices Lists the hostnames of all known devices. .log [] Prints N lines or last line of the eventlog. .port Prints Port-related information from ifname on given hostname . .quit Disconnect from IRC and exit. .reload Reload configuration. .status Prints status information for given type . Type can be devices , services , ports . Shorthands are: dev , srv , prt .version Prints $this->config['project_name_version'] . ( /!\\ All commands are case- insensitive but their arguments are case- sensitive ) Examples Server examples Unencrypted Connection to irc.libera.chat : ... $config [ 'irc_host' ] = \"irc.libera.chat\" ; $config [ 'irc_port' ] = 6667 ; ... SSL-Encrypted Connection to irc.libera.chat : ... $config [ 'irc_host' ] = \"irc.libera.chat\" ; $config [ 'irc_port' ] = \"+6697\" ; ... SSL-Encrypted Connection to irc.localdomain with Server-Password and odd port: ... $config [ 'irc_host' ] = \"irc.localdomain\" ; $config [ 'irc_port' ] = \"+12345\" ; $config [ 'irc_pass' ] = \"Super Secret Passphrase123\" ; ... Channel notations Channels can be defined using Array-Notation like: ... $config [ 'irc_chan' ][] = \"#librenms\" ; $config [ 'irc_chan' ][] = \"#otherchan\" ; $config [ 'irc_chan' ][] = \"#noc\" ; ... Or using a single string using , as delimiter between various channels: ... $config [ 'irc_chan' ] = \"#librenms,#otherchan,#noc\" ; ... Hostmask authentication ... $config [ 'irc_auth' ][ 'admin' ][] = \"*!root@nms.host.invalid\" ; $config [ 'irc_auth' ][ 'admin' ][] = \"*!*peter@peters.computer.invalid\" ; $config [ 'irc_auth' ][ ' john ][] = \"john!doe@login.server.invalid\" ; ... Any client matching one of the first two hostmasks will automatically be authenticated as the \"admin\" user in LibreNMS, and clients matching the last line will be authenticated as the user \"john\" in LibreNMS, without using .auth and a waiting for a valid token. Extensions?! The bot is coded in a unified way. This makes writing extensions by far less painful. Simply add your command to the $config['irc_external'] directive and create a file called includes/ircbot/command.inc.php containing your code. The string behind the call of .command is passed as $params . The user who requested something is accessible via $this->user . Send your reply/ies via $this->respond($string) . A more detailed documentation of the functions and variables available for extensions can be found at IRC-Bot Extensions ; Confused? Here an Echo-Example: File: config.php ... $config [ 'irc_external' ][] = \"echo\" ; ... File: includes/ircbot/echo.inc.php //Prefix everything with `You said: '...'` and return what was sent. if ( $this -> user [ 'name' ] != \"root\" ) { return $this -> respond ( \"You said: '\" . $params . \"'\" ); } else { return $this -> respond ( \"root shouldn't be online so late!\" ); } Systemd start up script Basic systemd start up script to be placed in /etc/systemd/system/ to start irc service at boot. librenms-irc.service script is located at /opt/librenms/misc/ Once copied to /etc/systemd/system/ you must run the following commands: a) chmod 664 /etc/systemd/system/librenms-irc.service b) systemctl daemon-reload c) systemctl enable librenms-irc.service d) systemctl start librenms-irc.service It can be stopped or started just like any other systemd script such as systemctl start librenms-irc.service","title":"IRC Bot"},{"location":"Extensions/IRC-Bot/#irc-bot","text":"LibreNMS has an easy to use IRC-Interface for basic tasks like viewing last log-entry, current device/port status and such. By default the IRC-Bot will not start when executed and will return an error until at least $config['irc_host'] and $config['irc_port'] has been specified inside config.php . (To start the IRC-Bot run ./irc.php ) If no channel has been specified with $config['irc_chan'] , ##librenms will be used. The default Nick for the bot is LibreNMS . The Bot will reply the same way it's being called. If you send it the commands via Query, it will respond in the Query. If you send the commands via a Channel, then it will respond in the Channel.","title":"IRC Bot"},{"location":"Extensions/IRC-Bot/#configuration-defaults","text":"Option Default-Value Notes $config['irc_alert'] false Optional; Enables Alerting-Socket. EXPERIMENTAL $config['irc_alert_chan'] false Optional; Multiple channels can be defined as Array or delimited with , . EXPERIMENTAL $config['irc_alert_utf8'] false Optional; Enables use of strikethrough in alerts via UTF-8 encoded characters. Might cause trouble for some clients. $config['irc_alert_short'] false Optional; Send a one line alert summary instead of multi-line detailed alert. $config['irc_authtime'] 3 Optional; Defines how long in Hours an auth-session is valid. $config['irc_chan'] ##librenms Optional; Multiple channels can be defined as Array or delimited with , . Passwords are defined after a space-character . $config['irc_debug'] false Optional; Enables debug output (Wall of text) $config['irc_external'] Optional; Array or , delimited string with commands to include from includes/ircbot/*.inc.php $config['irc_host'] Required; Domain or IP to connect. If it's an IPv6 Address, embed it in [] . (Example: [::1] ) $config['irc_maxretry'] 5 Optional; How many connection attempts should be made before giving up $config['irc_nick'] LibreNMS Optional; $config['irc_pass'] Optional; This sends the IRC-PASS Sequence to IRC-Servers that require Password on Connect $config['irc_port'] 6667 Required; To enable SSL append a + before the Port. (Example: +6697 ) $config['irc_ctcp'] false Optional; Enable/disable ctcp-replies from the bot (currently VERSION, PING and TIME). $config['irc_ctcp_version'] LibreNMS IRCbot. https://www.librenms.org/ Optional; Reply-string to CTCP VERSION requests $config['irc_auth'] Optional; Array of hostmasks that are automatically authenticated.","title":"Configuration & Defaults"},{"location":"Extensions/IRC-Bot/#irc-commands","text":"Command Description .auth If : Request an Auth-Token. If : Authenticate session. .device Prints basic information about given hostname . .down List hostnames that are down, if any. .help List available commands. .join Joins if user has admin-level. .listdevices Lists the hostnames of all known devices. .log [] Prints N lines or last line of the eventlog. .port Prints Port-related information from ifname on given hostname . .quit Disconnect from IRC and exit. .reload Reload configuration. .status Prints status information for given type . Type can be devices , services , ports . Shorthands are: dev , srv , prt .version Prints $this->config['project_name_version'] . ( /!\\ All commands are case- insensitive but their arguments are case- sensitive )","title":"IRC-Commands"},{"location":"Extensions/IRC-Bot/#examples","text":"","title":"Examples"},{"location":"Extensions/IRC-Bot/#server-examples","text":"Unencrypted Connection to irc.libera.chat : ... $config [ 'irc_host' ] = \"irc.libera.chat\" ; $config [ 'irc_port' ] = 6667 ; ... SSL-Encrypted Connection to irc.libera.chat : ... $config [ 'irc_host' ] = \"irc.libera.chat\" ; $config [ 'irc_port' ] = \"+6697\" ; ... SSL-Encrypted Connection to irc.localdomain with Server-Password and odd port: ... $config [ 'irc_host' ] = \"irc.localdomain\" ; $config [ 'irc_port' ] = \"+12345\" ; $config [ 'irc_pass' ] = \"Super Secret Passphrase123\" ; ...","title":"Server examples"},{"location":"Extensions/IRC-Bot/#channel-notations","text":"Channels can be defined using Array-Notation like: ... $config [ 'irc_chan' ][] = \"#librenms\" ; $config [ 'irc_chan' ][] = \"#otherchan\" ; $config [ 'irc_chan' ][] = \"#noc\" ; ... Or using a single string using , as delimiter between various channels: ... $config [ 'irc_chan' ] = \"#librenms,#otherchan,#noc\" ; ...","title":"Channel notations"},{"location":"Extensions/IRC-Bot/#hostmask-authentication","text":"... $config [ 'irc_auth' ][ 'admin' ][] = \"*!root@nms.host.invalid\" ; $config [ 'irc_auth' ][ 'admin' ][] = \"*!*peter@peters.computer.invalid\" ; $config [ 'irc_auth' ][ ' john ][] = \"john!doe@login.server.invalid\" ; ... Any client matching one of the first two hostmasks will automatically be authenticated as the \"admin\" user in LibreNMS, and clients matching the last line will be authenticated as the user \"john\" in LibreNMS, without using .auth and a waiting for a valid token.","title":"Hostmask authentication"},{"location":"Extensions/IRC-Bot/#extensions","text":"The bot is coded in a unified way. This makes writing extensions by far less painful. Simply add your command to the $config['irc_external'] directive and create a file called includes/ircbot/command.inc.php containing your code. The string behind the call of .command is passed as $params . The user who requested something is accessible via $this->user . Send your reply/ies via $this->respond($string) . A more detailed documentation of the functions and variables available for extensions can be found at IRC-Bot Extensions ; Confused? Here an Echo-Example: File: config.php ... $config [ 'irc_external' ][] = \"echo\" ; ... File: includes/ircbot/echo.inc.php //Prefix everything with `You said: '...'` and return what was sent. if ( $this -> user [ 'name' ] != \"root\" ) { return $this -> respond ( \"You said: '\" . $params . \"'\" ); } else { return $this -> respond ( \"root shouldn't be online so late!\" ); }","title":"Extensions?!"},{"location":"Extensions/IRC-Bot/#systemd-start-up-script","text":"Basic systemd start up script to be placed in /etc/systemd/system/ to start irc service at boot. librenms-irc.service script is located at /opt/librenms/misc/ Once copied to /etc/systemd/system/ you must run the following commands: a) chmod 664 /etc/systemd/system/librenms-irc.service b) systemctl daemon-reload c) systemctl enable librenms-irc.service d) systemctl start librenms-irc.service It can be stopped or started just like any other systemd script such as systemctl start librenms-irc.service","title":"Systemd start up script"},{"location":"Extensions/Interface-Description-Parsing/","text":"Interface Description Parsing Librenms can interpret, display and group certain additional information on ports. This is done based on the format that the port description is written although it's possible to customise the parser to be specific for your setup. Keywords See examples for formats. Keywords Cust - Customer Transit - Transit link Peering - Peering link Core - Infrastructure link (non-customer) Info-keywords () contains a note {} contains your circuit id [] contains the service type or speed Examples Cisco IOS / NXOS / IOSXR: interface Gi0/1 descr Transit: Example Provider (AS65000) interface Gi0/2 descr Peering: Peering Exchange interface Gi0/3 descr Core: core.router01 FastEthernet0/0 (Telco X CCID023141) interface Gi0/4 descr Cust: Example Customer [10Mbit] (T1 Telco Y CCID129031) {EXAMP0001} Unix / Linux: This requires an additional script to be setup # eth3: Cust: Example Customer [10Mbit] (T1 Telco Y CCID129031) {EXAMP0001} # eth0: Transit: Example Provider (AS65000) # eth1: Core: core.router01 FastEthernet0/0 (Telco X CCID023141) # eth2: Peering: Peering Exchange Customisation The following config options can be set to enable more custom types: webui/port-descr lnms config:set customers_descr.+ 'cust' lnms config:set transit_descr.+ 'transit' lnms config:set peering_descr.+ 'peering' \";' lnms config:set core_descr.+ 'core' lnms config:set custom_descr.+ 'something_made_up' Custom interface parser It's also possible to write your own parser, the existing one is: includes/port-descr-parser.inc.php Once you've created your own then you can enable it with: $config [ 'port_descr_parser' ] = \"includes/custom/my-port-descr-parser.inc.php\" ; Setup For Unix / Linux based systems, you need to run an additional script to support the parsing of interface information. Add ifAlias from /opt/librenms/scripts/ or download it from here to the Server and make it executable chmod +x /path/to/ifAlias Add to snmpd.conf something like: pass .1.3.6.1.2.1.31.1.1.1.18 /path/to/ifAlias Add aliasses with iproute2 package like: ip link set eth0.427 alias 'Cust: CustomerA' in /etc/network/interfaces or /etc/network/interfaces.d/* with a comment like: # eth0.427: Cust CustomerA Restart snmpd - systemctl restart snmpd There are no changes to be made or additions to install for the polling librenms. Now you can set up your keywords in your aliases.","title":"Interface Description Parsing"},{"location":"Extensions/Interface-Description-Parsing/#interface-description-parsing","text":"Librenms can interpret, display and group certain additional information on ports. This is done based on the format that the port description is written although it's possible to customise the parser to be specific for your setup.","title":"Interface Description Parsing"},{"location":"Extensions/Interface-Description-Parsing/#keywords","text":"See examples for formats. Keywords Cust - Customer Transit - Transit link Peering - Peering link Core - Infrastructure link (non-customer) Info-keywords () contains a note {} contains your circuit id [] contains the service type or speed","title":"Keywords"},{"location":"Extensions/Interface-Description-Parsing/#examples","text":"Cisco IOS / NXOS / IOSXR: interface Gi0/1 descr Transit: Example Provider (AS65000) interface Gi0/2 descr Peering: Peering Exchange interface Gi0/3 descr Core: core.router01 FastEthernet0/0 (Telco X CCID023141) interface Gi0/4 descr Cust: Example Customer [10Mbit] (T1 Telco Y CCID129031) {EXAMP0001} Unix / Linux: This requires an additional script to be setup # eth3: Cust: Example Customer [10Mbit] (T1 Telco Y CCID129031) {EXAMP0001} # eth0: Transit: Example Provider (AS65000) # eth1: Core: core.router01 FastEthernet0/0 (Telco X CCID023141) # eth2: Peering: Peering Exchange","title":"Examples"},{"location":"Extensions/Interface-Description-Parsing/#customisation","text":"The following config options can be set to enable more custom types: webui/port-descr lnms config:set customers_descr.+ 'cust' lnms config:set transit_descr.+ 'transit' lnms config:set peering_descr.+ 'peering' \";' lnms config:set core_descr.+ 'core' lnms config:set custom_descr.+ 'something_made_up'","title":"Customisation"},{"location":"Extensions/Interface-Description-Parsing/#custom-interface-parser","text":"It's also possible to write your own parser, the existing one is: includes/port-descr-parser.inc.php Once you've created your own then you can enable it with: $config [ 'port_descr_parser' ] = \"includes/custom/my-port-descr-parser.inc.php\" ;","title":"Custom interface parser"},{"location":"Extensions/Interface-Description-Parsing/#setup","text":"For Unix / Linux based systems, you need to run an additional script to support the parsing of interface information. Add ifAlias from /opt/librenms/scripts/ or download it from here to the Server and make it executable chmod +x /path/to/ifAlias Add to snmpd.conf something like: pass .1.3.6.1.2.1.31.1.1.1.18 /path/to/ifAlias Add aliasses with iproute2 package like: ip link set eth0.427 alias 'Cust: CustomerA' in /etc/network/interfaces or /etc/network/interfaces.d/* with a comment like: # eth0.427: Cust CustomerA Restart snmpd - systemctl restart snmpd There are no changes to be made or additions to install for the polling librenms. Now you can set up your keywords in your aliases.","title":"Setup"},{"location":"Extensions/Metric-Storage/","text":"Metric storage By default we ship all metrics to RRD files, either directly or via RRDCached . On top of this you can ship metrics to Graphite, InfluxDB (v1 or v2 API), OpenTSDB or Prometheus. At present you can't use these backends to display graphs within LibreNMS and will need to use something like Grafana . For further information on configuring LibreNMS to ship data to one of the other backends then please see the documentation below. Graphite InfluxDB InfluxDBv2 OpenTSDB Prometheus","title":"Intro"},{"location":"Extensions/Metric-Storage/#metric-storage","text":"By default we ship all metrics to RRD files, either directly or via RRDCached . On top of this you can ship metrics to Graphite, InfluxDB (v1 or v2 API), OpenTSDB or Prometheus. At present you can't use these backends to display graphs within LibreNMS and will need to use something like Grafana . For further information on configuring LibreNMS to ship data to one of the other backends then please see the documentation below. Graphite InfluxDB InfluxDBv2 OpenTSDB Prometheus","title":"Metric storage"},{"location":"Extensions/NFSen/","text":"NFSen The installation of NFSen is out of scope for this document / LibreNMS Configuration The following is the configuration that can be used: external/nfsen lnms config:set nfsen_enable true lnms config:set nfsen_split_char '_' lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat/live/' lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat' lnms config:set nfsen_base.+ '/var/nfsen/' lnms config:set nfsen_suffix '_yourdomain_com' Set lnms config:set nfsen_enable true to enable NFSen support. nfsen_rrds This value tells us where your NFSen rrd files live. This can also be an array to specify more directories like: external/nfsen lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat/sitea/' lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat/siteb/' Although for most setups, it will look like below, with the profiles-stat/live directory being where it stores the general RRDs for data sources. external/nfsen lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat/live' If you wish to render info for configure channels for a device, you need add the various profile-stat directories your system uses, which for most systems will be as below. external/nfsen lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat' When adding sources to nfsen.conf, it is important to use the hostname that matches what is configured in LibreNMS, because the rrd files NfSen creates is named after the source name (ident), and it doesn't allow you to use an IP address instead. However, in LibreNMS, if your device is added by an IP address, add your source with any name of your choice, and create a symbolic link to the rrd file. cd /var/nfsen/profiles-stat/sitea/ ln -s mychannel.rrd librenmsdeviceIP.rrd external/nfsen lnms config:set nfsen_split_char '_' This value tells us what to replace the full stops . in the devices hostname with. external/nfsen lnms config:set nfsen_suffix '_yourdomain_com' The above is a very important bit as device names in NfSen are limited to 21 characters. This means full domain names for devices can be very problematic to squeeze in, so therefor this chunk is usually removed. On a similar note, NfSen profiles for channels should be created with the same name. Stats Defaults and Settings Below are the default settings used with nfdump for stats. For more defaulted information on that, please see nfdump(1). The default location for nfdump is /usr/bin/nfdump . If nfdump is located elsewhere, set it with external/binaries ```bash lnms config:set nfdump /usr/local/bin/nfdump ``` external/nfsen lnms config:set nfsen_last_max 153600 lnms config:set nfsen_top_max 500 lnms config:set nfsen_top_N '[10, 20, 50, 100, 200, 500]' lnms config:set nfsen_top_default 20 lnms config:set nfsen_stat_default srcip lnms config:set nfsen_order_default packets lnms config:set nfsen_last_default 900 lnms config:set nfsen_lasts \"{'300':'5 minutes', '600':'10 minutes', '900':'15 minutes', '1800':'30 minutes', '3600':'1 hour', '9600':'3 hours', '38400':'12 hours', '76800':'24 hours', '115200':'36 hours', '153600':'48 hours'}\" external/nfsen lnms config:set nfsen_last_max 153600 The above is the max value in seconds one may pull stats for. The higher this is, the more CPU and disk intensive the search will be. Numbers larger than this will be set to this. external/nfsen lnms config:set nfsen_top_max 500 The above is max number of items to be displayed. Numbers larger than this will be set to this. external/nfsen lnms config:set nfsen_top_N '[10, 20, 50, 100, 200, 500]' The above is a array containing a list for the drop down menu how many top items should be returned. external/nfsen lnms config:set nfsen_top_default 20 The above sets default top number to use from the drop down. external/nfsen lnms config:set nfsen_stat_default srcip The above sets default stat type to use from the drop down. record Flow Records ip Any IP Address srcip SRC IP Address dstip DST IP Address port Any Port srcport SRC Port dstport DST Port srctos SRC TOS dsttos DST TOS tos TOS as AS srcas SRC AS dstas DST AS external/nfsen lnms config:set nfsen_order_default packets The above sets default order type to use from the drop down. Any of the following below are currently supported. flows Number of total flows for the time period. packet Number of total packets for the time period. bytes Number of total bytes for the time period. pps Packets Per Second bps Bytes Per Second bpp Bytes Per Packet external/nfsen lnms config:set nfsen_last_default 900 The above is the last default to use from the drop down. external/nfsen lnms config:set nfsen_lasts \"{'300':'5 minutes', '600':'10 minutes', '900':'15 minutes', '1800':'30 minutes', '3600':'1 hour', '9600':'3 hours', '38400':'12 hours', '76800':'24 hours', '115200':'36 hours', '153600':'48 hours'}\" The above associative array contains time intervals for how far back to go. The keys are the length in seconds and the value is just a description to display.","title":"NFSen"},{"location":"Extensions/NFSen/#nfsen","text":"The installation of NFSen is out of scope for this document / LibreNMS","title":"NFSen"},{"location":"Extensions/NFSen/#configuration","text":"The following is the configuration that can be used: external/nfsen lnms config:set nfsen_enable true lnms config:set nfsen_split_char '_' lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat/live/' lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat' lnms config:set nfsen_base.+ '/var/nfsen/' lnms config:set nfsen_suffix '_yourdomain_com' Set lnms config:set nfsen_enable true to enable NFSen support. nfsen_rrds This value tells us where your NFSen rrd files live. This can also be an array to specify more directories like: external/nfsen lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat/sitea/' lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat/siteb/' Although for most setups, it will look like below, with the profiles-stat/live directory being where it stores the general RRDs for data sources. external/nfsen lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat/live' If you wish to render info for configure channels for a device, you need add the various profile-stat directories your system uses, which for most systems will be as below. external/nfsen lnms config:set nfsen_rrds.+ '/var/nfsen/profiles-stat' When adding sources to nfsen.conf, it is important to use the hostname that matches what is configured in LibreNMS, because the rrd files NfSen creates is named after the source name (ident), and it doesn't allow you to use an IP address instead. However, in LibreNMS, if your device is added by an IP address, add your source with any name of your choice, and create a symbolic link to the rrd file. cd /var/nfsen/profiles-stat/sitea/ ln -s mychannel.rrd librenmsdeviceIP.rrd external/nfsen lnms config:set nfsen_split_char '_' This value tells us what to replace the full stops . in the devices hostname with. external/nfsen lnms config:set nfsen_suffix '_yourdomain_com' The above is a very important bit as device names in NfSen are limited to 21 characters. This means full domain names for devices can be very problematic to squeeze in, so therefor this chunk is usually removed. On a similar note, NfSen profiles for channels should be created with the same name.","title":"Configuration"},{"location":"Extensions/NFSen/#stats-defaults-and-settings","text":"Below are the default settings used with nfdump for stats. For more defaulted information on that, please see nfdump(1). The default location for nfdump is /usr/bin/nfdump . If nfdump is located elsewhere, set it with external/binaries ```bash lnms config:set nfdump /usr/local/bin/nfdump ``` external/nfsen lnms config:set nfsen_last_max 153600 lnms config:set nfsen_top_max 500 lnms config:set nfsen_top_N '[10, 20, 50, 100, 200, 500]' lnms config:set nfsen_top_default 20 lnms config:set nfsen_stat_default srcip lnms config:set nfsen_order_default packets lnms config:set nfsen_last_default 900 lnms config:set nfsen_lasts \"{'300':'5 minutes', '600':'10 minutes', '900':'15 minutes', '1800':'30 minutes', '3600':'1 hour', '9600':'3 hours', '38400':'12 hours', '76800':'24 hours', '115200':'36 hours', '153600':'48 hours'}\" external/nfsen lnms config:set nfsen_last_max 153600 The above is the max value in seconds one may pull stats for. The higher this is, the more CPU and disk intensive the search will be. Numbers larger than this will be set to this. external/nfsen lnms config:set nfsen_top_max 500 The above is max number of items to be displayed. Numbers larger than this will be set to this. external/nfsen lnms config:set nfsen_top_N '[10, 20, 50, 100, 200, 500]' The above is a array containing a list for the drop down menu how many top items should be returned. external/nfsen lnms config:set nfsen_top_default 20 The above sets default top number to use from the drop down. external/nfsen lnms config:set nfsen_stat_default srcip The above sets default stat type to use from the drop down. record Flow Records ip Any IP Address srcip SRC IP Address dstip DST IP Address port Any Port srcport SRC Port dstport DST Port srctos SRC TOS dsttos DST TOS tos TOS as AS srcas SRC AS dstas DST AS external/nfsen lnms config:set nfsen_order_default packets The above sets default order type to use from the drop down. Any of the following below are currently supported. flows Number of total flows for the time period. packet Number of total packets for the time period. bytes Number of total bytes for the time period. pps Packets Per Second bps Bytes Per Second bpp Bytes Per Packet external/nfsen lnms config:set nfsen_last_default 900 The above is the last default to use from the drop down. external/nfsen lnms config:set nfsen_lasts \"{'300':'5 minutes', '600':'10 minutes', '900':'15 minutes', '1800':'30 minutes', '3600':'1 hour', '9600':'3 hours', '38400':'12 hours', '76800':'24 hours', '115200':'36 hours', '153600':'48 hours'}\" The above associative array contains time intervals for how far back to go. The keys are the length in seconds and the value is just a description to display.","title":"Stats Defaults and Settings"},{"location":"Extensions/Network-Map/","text":"Network Map LibreNMS has the ability to show you a dynamic network map based on data collected from devices. These maps are accessed through the following menu options: Overview -> Maps -> Network Overview -> Maps -> Device Group Maps The Neighbours -> Map tab when viewing a single device (the Neighbours tab will only show if a device has xDP neighbours) These network maps can be based on: xDP Discovery MAC addresses (ARP entries matching interface IP and MAC) By default, both are are included but you can enable / disable either one using the following config option: lnms config:set 'network_map_items' \"('mac','xdp')\" Either remove mac or xdp depending on which you want. XDP is based on FDP, CDP and LLDP support based on the device type. It is worth noting that the global map could lead to a large network map that is slow to render and interact with. The network map on the device neighbour page, or building device groups and using the device group maps will be more usable on large networks. Settings The map display can be configured by altering the VisJS-Config.md","title":"Network Map"},{"location":"Extensions/Network-Map/#network-map","text":"LibreNMS has the ability to show you a dynamic network map based on data collected from devices. These maps are accessed through the following menu options: Overview -> Maps -> Network Overview -> Maps -> Device Group Maps The Neighbours -> Map tab when viewing a single device (the Neighbours tab will only show if a device has xDP neighbours) These network maps can be based on: xDP Discovery MAC addresses (ARP entries matching interface IP and MAC) By default, both are are included but you can enable / disable either one using the following config option: lnms config:set 'network_map_items' \"('mac','xdp')\" Either remove mac or xdp depending on which you want. XDP is based on FDP, CDP and LLDP support based on the device type. It is worth noting that the global map could lead to a large network map that is slow to render and interact with. The network map on the device neighbour page, or building device groups and using the device group maps will be more usable on large networks.","title":"Network Map"},{"location":"Extensions/Network-Map/#settings","text":"The map display can be configured by altering the VisJS-Config.md","title":"Settings"},{"location":"Extensions/OAuth-SAML/","text":"OAuth and SAML Support Introduction LibreNMS has support for Laravel Socialite to try and simplify the use of OAuth 1 or 2 providers such as using GitHub, Microsoft, Twitter + many more and SAML. Socialite Providers supports more than 100+ 3rd parties so you will most likely find support for the SAML or OAuth provider you need without too much trouble. Please do note however, these providers are not maintained by LibreNMS so we cannot add support for new ones and we can only provide you basic help with general configuration. See the Socialite Providers website for more information on adding a new OAuth provider. Below we will guide you on how to install SAML or some of these OAth providers, you should be able to use these as a guide on how to install any others you may need but please, please, ensure you read the Socialite Providers documentation carefully . GitHub Provider Microsoft Provider Okta Provider SAML2 Requirements LibreNMS version 22.3.0 or later. Please ensure you set APP_URL within your .env file so that callback URLs work correctly with the identify provider. Note Once you have configured your OAuth or SAML2 provider, please ensure you check the Post configuration settings section at the end. GitHub and Microsoft Examples Install plugin Note First we need to install the plugin itself. The plugin name can be slightly different so be sure to check the Socialite Providers documentation and look for this line, composer require socialiteproviders/github which will give you the name you need for the command, i.e: socialiteproviders/github . GitHub Microsoft Okta lnms plugin:add socialiteproviders/github lnms plugin:add socialiteproviders/microsoft lnms plugin:add socialiteproviders/okta Find the provider name Next we need to find the provider name and writing it down Note It's almost always the name of the provider in lowercase but can be different so check the Socialite Providers documentation and look for this line, github => [ which will give you the name you need for the above command: github . GitHub Microsoft Okta For GitHub we can find the line: 'github' => [ 'client_id' => env ( 'GITHUB_CLIENT_ID' ), 'client_secret' => env ( 'GITHUB_CLIENT_SECRET' ), 'redirect' => env ( 'GITHUB_REDIRECT_URI' ) ], So our provider name is github , write this down. For Microsoft we can find the line: 'microsoft' => [ 'client_id' => env ( 'MICROSOFT_CLIENT_ID' ), 'client_secret' => env ( 'MICROSOFT_CLIENT_SECRET' ), 'redirect' => env ( 'MICROSOFT_REDIRECT_URI' ) ], So our provider name is microsoft , write this down. For Okta we can find the line: 'okta' => [ 'base_url' => env ( 'OKTA_BASE_URL' ), 'client_id' => env ( 'OKTA_CLIENT_ID' ), 'client_secret' => env ( 'OKTA_CLIENT_SECRET' ), 'redirect' => env ( 'OKTA_REDIRECT_URI' ) ], So our provider name is okta , write this down. Register OAuth application Register a new application Now we need some values from the OAuth provider itself, in most cases you need to register a new \"OAuth application\" at the providers site. This will vary from provider to provider but the process itself should be similar to the examples below. Note The callback URL is always: https:// your-librenms-url /auth/ provider /callback It doesn't need to be a public available site, but it almost always needs to support TLS (https)! GitHub Microsoft Okta For our example with GitHub we go to GitHub Developer Settings and press \"Register a new application\": Fill out the form accordingly (with your own values): For our example with Microsoft we go to \"Azure Active Directory\" > \"App registrations\" and press \"New registration\" Fill out the form accordingly using your own values): Copy the value of the Application (client) ID and Directory (tenant) ID and save them, you will need them in the next step. For our example with Okta, we go to Applications>Create App Integration , Select OIDC - OpenID Connect , then Web Application . Fill in the Name, Logo, and Assignments based on your preferred settings. Leave the Sign-In Redirect URI field, this is where you will edit this later: Note your Okta domain or login url. Sometimes this can be a vanity url like login.company.com , or sometimes just company.okta.com . Click save. Generate a new client secret GitHub Microsoft Okta Press 'Generate a new client secret' to get a new client secret. Copy the Client ID and Client secret In the example above it is: Client ID : 7a41f1d8215640ca6b00 Client secret : ea03957288edd0e590be202b239e4f0ff26b8047 Select Certificates & secrets under Manage. Select the 'New client secret' button. Enter a value in Description and select one of the options for Expires and select 'Add'. Copy the client secret Value (not Secret ID!) before you leave this page. You will need it in the next step. This step is done for you when creating the app. All you have to do is copy down the client secret. You will need it in the next step. Saving configuration Now we need to set the configuration options for your provider within LibreNMS itself. Please replace the values in the examples below with the values you collected earlier: The format of the configuration string is auth.socialite.configs.*provider name*.*value* GitHub Microsoft Okta settings/auth/socialite lnms config:set auth.socialite.configs.github.client_id 7a41f1d8215640ca6b00 lnms config:set auth.socialite.configs.github.client_secret ea03957288edd0e590be202b239e4f0ff26b8047 settings/auth/socialite lnms config:set auth.socialite.configs.microsoft.client_id 7983ac13-c955-40e9-9b85-5ba27be52a52 lnms config:set auth.socialite.configs.microsoft.client_secret J9P7Q~K2F5C.L243sqzbGj.cOOcjTBgAPak_l lnms config:set auth.socialite.configs.microsoft.tenant a15edc05-152d-4eb4-973c-14f1fdc57d8b settings/auth/socialite lnms config:set auth.socialite.configs.okta.client_id 0oa1c08tti8D7xgXb697 lnms config:set auth.socialite.configs.okta.client_secret sWew90IKqKDmURj1XLsCPjXjre0U3zmJuFR6SzsG lnms config:set auth.socialite.configs.okta.base_url \"https://\" Add provider event listener The final step is to now add an event listener. Note It's important to copy exactly the right value here, It should begin with a \\ and end before the ::class.'@handle' GitHub Microsoft Okta Find the section looking like: protected $listen = [ \\SocialiteProviders\\Manager\\SocialiteWasCalled :: class => [ // ... other providers \\SocialiteProviders\\GitHub\\GitHubExtendSocialite :: class . '@handle' , ], ]; Copy the part: \\SocialiteProviders\\GitHub\\GitHubExtendSocialite and run; settings/auth/socialite lnms config:set auth.socialite.configs.github.listener \"\\SocialiteProviders\\GitHub\\GitHubExtendSocialite\" Don't forget the initial backslash (\\) ! Find the section looking like: protected $listen = [ \\SocialiteProviders\\Manager\\SocialiteWasCalled :: class => [ // ... other providers \\SocialiteProviders\\Microsoft\\MicrosoftExtendSocialite :: class . '@handle' , ], ]; Copy the part: \\SocialiteProviders\\Microsoft\\MicrosoftExtendSocialite and run; settings/auth/socialite lnms config:set auth.socialite.configs.microsoft.listener \"\\SocialiteProviders\\Microsoft\\MicrosoftExtendSocialite\" Don't forget the initial backslash (\\) ! Find the section looking like: protected $listen = [ \\SocialiteProviders\\Manager\\SocialiteWasCalled :: class => [ // ... other providers \\SocialiteProviders\\Okta\\OktaExtendSocialite :: class . '@handle' , ], ]; Copy the part: \\SocialiteProviders\\Okta\\OktaExtendSocialite and run; settings/auth/socialite lnms config:set auth.socialite.configs.okta.listener \"\\SocialiteProviders\\Okta\\OktaExtendSocialite\" Don't forget the initial backslack (\\) ! Now you are done with setting up the OAuth provider! If it doesn't work, please double check your configuration values by using the config:get command below. settings/auth/socialite lnms config:get auth.socialite Default Role Since most Socialite Providers don't provide Authorization only Authentication it is possible to set the default User Role for Authorized users. Appropriate care should be taken. none: No Access : User has no access normal: Normal User : You will need to assign device / port permissions for users at this level. global-read: Global Read : Read only Administrator. admin: Administrator : This is a global read/write admin account. settings/auth/socialite lnms config:set auth.socialite.default_role global-read Claims / Access Scopes Socialite can specifiy scopes that should be included with in the authentication request. (see Larvel docs ) For example, if Okta is configured to expose group information it is possible to use these group names to configure User Roles. First enable sending the 'groups' claim (along with the normal openid, profile, and email claims). Be aware that the scope name must match the claim name. For identity providers where the scope does not match (e.g. Keycloak: roles -> groups) you need to configure a custom scope. settings/auth/socialite lnms config:set auth.socialite.scopes.+ groups Then setup mappings from the returned claim arrays to the User levels you want settings/auth/socialite lnms config:set auth.socialite.claims.RETURN_FROM_CLAIM.roles '[\"admin\"]' lnms config:set auth.socialite.claims.OTHER_RETURN_FROM_CLAIM.roles '[\"global-read\",\"cleaner\"]' SAML2 Example Install plugin The first step is to install the plugin itself. lnms plugin:add socialiteproviders/saml2 Add configuration Depending on what your identity provider (Google, Azure, ...) supports, the configuration could look different from what you see next so please use this as a rough guide. It is up the IdP to provide the relevant details that you will need for configuration. Google Azure Go to https://admin.google.com/ac/apps/unified Press \"DOWNLOAD METADATA\" and save the file somewhere accessible by your LibreNMS server ACS URL = https:// your-librenms-url /auth/saml2/callback Entity ID = https:// your-librenms-url /auth/saml2 Name ID format = PERSISTANT Name ID = Basic Information > Primary email First name = http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname Last name = http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname Primary email = http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress settings/auth/socialite lnms config:set auth.socialite.configs.saml2.metadata \" $( cat /tmp/GoogleIDPMetadata.xml ) \" Alternatively, you can copy the content of the file and run it like so, this will result in the exact same result as above. settings/auth/socialite lnms config:set auth.socialite.configs.saml2.metadata '''''' echo \"SESSION_SAME_SITE_COOKIE=none\" >> .env lnms plugin:add socialiteproviders/saml2 lnms config:set auth.socialite.redirect true lnms config:set auth.socialite.register true lnms config:set auth.socialite.configs.saml2.acs https://login.microsoftonline.com/xxxidfromazurexxx/saml2 lnms config:set auth.socialite.configs.saml2.entityid https://sts.windows.net/xxxidfromazurexxx/ lnms config:set auth.socialite.configs.saml2.certificate xxxcertinonelinexxx lnms config:set auth.socialite.configs.saml2.listener \"\\SocialiteProviders\\Saml2\\Saml2ExtendSocialite\" lnms config:set auth.socialite.configs.saml2.metadata https://nexus.microsoftonline-p.com/federationmetadata/saml20/federationmetadata.xml lnms config:set auth.socialite.configs.saml2.sp_default_binding_method urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST lnms config:clear Using an Identity Provider metadata URL Note This is the prefered and easiest way, if your IdP supports it! settings/auth/socialite lnms config:set auth.socialite.configs.saml2.metadata https://idp.co/metadata/xml Using an Identity Provider metadata XML file settings/auth/socialite lnms config:set auth.socialite.configs.saml2.metadata \" $( cat GoogleIDPMetadata.xml ) \" Manually configuring the Identity Provider with a certificate string settings/auth/socialite lnms config:set auth.socialite.configs.saml2.acs https://idp.co/auth/acs lnms config:set auth.socialite.configs.saml2.entityid http://saml.to/trust lnms config:set auth.socialite.configs.saml2.certificate MIIC4jCCAcqgAwIBAgIQbDO5YO.... Manually configuring the Identity Provider with a certificate file settings/auth/socialite lnms config:set auth.socialite.configs.saml2.acs https://idp.co/auth/acs lnms config:set auth.socialite.configs.saml2.entityid http://saml.to/trust lnms config:set auth.socialite.configs.saml2.certificate \" $( cat /path/to/certificate.pem ) \" Add provider event listener Now we just need to define the listener service within LibreNMS: settings/auth/socialite lnms config:set auth.socialite.configs.saml2.listener \"\\SocialiteProviders\\Saml2\\Saml2ExtendSocialite\" SESSION_SAME_SITE_COOKIE You most likely will need to set SESSION_SAME_SITE_COOKIE=none in .env if you use SAML2! If you get an error with http code 419, you should try to remove SESSION_SAME_SITE_COOKIE=none from your .env . Note Don't forget to run lnms config:clear after you modify .env to flush the config cache Service provider metadata Your identify provider might ask you for your Service Provider (SP) metadata. LibreNMS exposes all of this information from your LibreNMS install Troubleshooting If it doesn't work, please double check your configuration values by using the config:get command below. settings/auth/socialite lnms config:get auth.socialite Redirect URL If you have a need to, then you can override redirect url with the following commands: OAuth SAML2 Replace github and the relevant URL below with your identity provider details. lnms config:set auth.socialite.configs.github.redirect https://demo.librenms.org/auth/github/callback lnms config:set auth.socialite.configs.saml2.sp_acs auth/saml2/callback Post configuration settings settings/auth/socialite From here you can configure the settings for any identity providers you have configured along with some bespoke options. Redirect Login page: This setting will skip your LibreNMS login and take the end user straight to the first idP you configured. Allow registration via provider: If this setting is disabled, new users signing in via the idP will not be authenticated. This setting allows a local user to be automatically created which permits their login.","title":"Oauth/SAML support"},{"location":"Extensions/OAuth-SAML/#oauth-and-saml-support","text":"","title":"OAuth and SAML Support"},{"location":"Extensions/OAuth-SAML/#introduction","text":"LibreNMS has support for Laravel Socialite to try and simplify the use of OAuth 1 or 2 providers such as using GitHub, Microsoft, Twitter + many more and SAML. Socialite Providers supports more than 100+ 3rd parties so you will most likely find support for the SAML or OAuth provider you need without too much trouble. Please do note however, these providers are not maintained by LibreNMS so we cannot add support for new ones and we can only provide you basic help with general configuration. See the Socialite Providers website for more information on adding a new OAuth provider. Below we will guide you on how to install SAML or some of these OAth providers, you should be able to use these as a guide on how to install any others you may need but please, please, ensure you read the Socialite Providers documentation carefully . GitHub Provider Microsoft Provider Okta Provider SAML2","title":"Introduction"},{"location":"Extensions/OAuth-SAML/#requirements","text":"LibreNMS version 22.3.0 or later. Please ensure you set APP_URL within your .env file so that callback URLs work correctly with the identify provider. Note Once you have configured your OAuth or SAML2 provider, please ensure you check the Post configuration settings section at the end.","title":"Requirements"},{"location":"Extensions/OAuth-SAML/#github-and-microsoft-examples","text":"","title":"GitHub and Microsoft Examples"},{"location":"Extensions/OAuth-SAML/#install-plugin","text":"Note First we need to install the plugin itself. The plugin name can be slightly different so be sure to check the Socialite Providers documentation and look for this line, composer require socialiteproviders/github which will give you the name you need for the command, i.e: socialiteproviders/github . GitHub Microsoft Okta lnms plugin:add socialiteproviders/github lnms plugin:add socialiteproviders/microsoft lnms plugin:add socialiteproviders/okta","title":"Install plugin"},{"location":"Extensions/OAuth-SAML/#find-the-provider-name","text":"Next we need to find the provider name and writing it down Note It's almost always the name of the provider in lowercase but can be different so check the Socialite Providers documentation and look for this line, github => [ which will give you the name you need for the above command: github . GitHub Microsoft Okta For GitHub we can find the line: 'github' => [ 'client_id' => env ( 'GITHUB_CLIENT_ID' ), 'client_secret' => env ( 'GITHUB_CLIENT_SECRET' ), 'redirect' => env ( 'GITHUB_REDIRECT_URI' ) ], So our provider name is github , write this down. For Microsoft we can find the line: 'microsoft' => [ 'client_id' => env ( 'MICROSOFT_CLIENT_ID' ), 'client_secret' => env ( 'MICROSOFT_CLIENT_SECRET' ), 'redirect' => env ( 'MICROSOFT_REDIRECT_URI' ) ], So our provider name is microsoft , write this down. For Okta we can find the line: 'okta' => [ 'base_url' => env ( 'OKTA_BASE_URL' ), 'client_id' => env ( 'OKTA_CLIENT_ID' ), 'client_secret' => env ( 'OKTA_CLIENT_SECRET' ), 'redirect' => env ( 'OKTA_REDIRECT_URI' ) ], So our provider name is okta , write this down.","title":"Find the provider name"},{"location":"Extensions/OAuth-SAML/#register-oauth-application","text":"","title":"Register OAuth application"},{"location":"Extensions/OAuth-SAML/#register-a-new-application","text":"Now we need some values from the OAuth provider itself, in most cases you need to register a new \"OAuth application\" at the providers site. This will vary from provider to provider but the process itself should be similar to the examples below. Note The callback URL is always: https:// your-librenms-url /auth/ provider /callback It doesn't need to be a public available site, but it almost always needs to support TLS (https)! GitHub Microsoft Okta For our example with GitHub we go to GitHub Developer Settings and press \"Register a new application\": Fill out the form accordingly (with your own values): For our example with Microsoft we go to \"Azure Active Directory\" > \"App registrations\" and press \"New registration\" Fill out the form accordingly using your own values): Copy the value of the Application (client) ID and Directory (tenant) ID and save them, you will need them in the next step. For our example with Okta, we go to Applications>Create App Integration , Select OIDC - OpenID Connect , then Web Application . Fill in the Name, Logo, and Assignments based on your preferred settings. Leave the Sign-In Redirect URI field, this is where you will edit this later: Note your Okta domain or login url. Sometimes this can be a vanity url like login.company.com , or sometimes just company.okta.com . Click save.","title":"Register a new application"},{"location":"Extensions/OAuth-SAML/#generate-a-new-client-secret","text":"GitHub Microsoft Okta Press 'Generate a new client secret' to get a new client secret. Copy the Client ID and Client secret In the example above it is: Client ID : 7a41f1d8215640ca6b00 Client secret : ea03957288edd0e590be202b239e4f0ff26b8047 Select Certificates & secrets under Manage. Select the 'New client secret' button. Enter a value in Description and select one of the options for Expires and select 'Add'. Copy the client secret Value (not Secret ID!) before you leave this page. You will need it in the next step. This step is done for you when creating the app. All you have to do is copy down the client secret. You will need it in the next step.","title":"Generate a new client secret"},{"location":"Extensions/OAuth-SAML/#saving-configuration","text":"Now we need to set the configuration options for your provider within LibreNMS itself. Please replace the values in the examples below with the values you collected earlier: The format of the configuration string is auth.socialite.configs.*provider name*.*value* GitHub Microsoft Okta settings/auth/socialite lnms config:set auth.socialite.configs.github.client_id 7a41f1d8215640ca6b00 lnms config:set auth.socialite.configs.github.client_secret ea03957288edd0e590be202b239e4f0ff26b8047 settings/auth/socialite lnms config:set auth.socialite.configs.microsoft.client_id 7983ac13-c955-40e9-9b85-5ba27be52a52 lnms config:set auth.socialite.configs.microsoft.client_secret J9P7Q~K2F5C.L243sqzbGj.cOOcjTBgAPak_l lnms config:set auth.socialite.configs.microsoft.tenant a15edc05-152d-4eb4-973c-14f1fdc57d8b settings/auth/socialite lnms config:set auth.socialite.configs.okta.client_id 0oa1c08tti8D7xgXb697 lnms config:set auth.socialite.configs.okta.client_secret sWew90IKqKDmURj1XLsCPjXjre0U3zmJuFR6SzsG lnms config:set auth.socialite.configs.okta.base_url \"https://\"","title":"Saving configuration"},{"location":"Extensions/OAuth-SAML/#add-provider-event-listener","text":"The final step is to now add an event listener. Note It's important to copy exactly the right value here, It should begin with a \\ and end before the ::class.'@handle' GitHub Microsoft Okta Find the section looking like: protected $listen = [ \\SocialiteProviders\\Manager\\SocialiteWasCalled :: class => [ // ... other providers \\SocialiteProviders\\GitHub\\GitHubExtendSocialite :: class . '@handle' , ], ]; Copy the part: \\SocialiteProviders\\GitHub\\GitHubExtendSocialite and run; settings/auth/socialite lnms config:set auth.socialite.configs.github.listener \"\\SocialiteProviders\\GitHub\\GitHubExtendSocialite\" Don't forget the initial backslash (\\) ! Find the section looking like: protected $listen = [ \\SocialiteProviders\\Manager\\SocialiteWasCalled :: class => [ // ... other providers \\SocialiteProviders\\Microsoft\\MicrosoftExtendSocialite :: class . '@handle' , ], ]; Copy the part: \\SocialiteProviders\\Microsoft\\MicrosoftExtendSocialite and run; settings/auth/socialite lnms config:set auth.socialite.configs.microsoft.listener \"\\SocialiteProviders\\Microsoft\\MicrosoftExtendSocialite\" Don't forget the initial backslash (\\) ! Find the section looking like: protected $listen = [ \\SocialiteProviders\\Manager\\SocialiteWasCalled :: class => [ // ... other providers \\SocialiteProviders\\Okta\\OktaExtendSocialite :: class . '@handle' , ], ]; Copy the part: \\SocialiteProviders\\Okta\\OktaExtendSocialite and run; settings/auth/socialite lnms config:set auth.socialite.configs.okta.listener \"\\SocialiteProviders\\Okta\\OktaExtendSocialite\" Don't forget the initial backslack (\\) ! Now you are done with setting up the OAuth provider! If it doesn't work, please double check your configuration values by using the config:get command below. settings/auth/socialite lnms config:get auth.socialite","title":"Add provider event listener"},{"location":"Extensions/OAuth-SAML/#default-role","text":"Since most Socialite Providers don't provide Authorization only Authentication it is possible to set the default User Role for Authorized users. Appropriate care should be taken. none: No Access : User has no access normal: Normal User : You will need to assign device / port permissions for users at this level. global-read: Global Read : Read only Administrator. admin: Administrator : This is a global read/write admin account. settings/auth/socialite lnms config:set auth.socialite.default_role global-read","title":"Default Role"},{"location":"Extensions/OAuth-SAML/#claims-access-scopes","text":"Socialite can specifiy scopes that should be included with in the authentication request. (see Larvel docs ) For example, if Okta is configured to expose group information it is possible to use these group names to configure User Roles. First enable sending the 'groups' claim (along with the normal openid, profile, and email claims). Be aware that the scope name must match the claim name. For identity providers where the scope does not match (e.g. Keycloak: roles -> groups) you need to configure a custom scope. settings/auth/socialite lnms config:set auth.socialite.scopes.+ groups Then setup mappings from the returned claim arrays to the User levels you want settings/auth/socialite lnms config:set auth.socialite.claims.RETURN_FROM_CLAIM.roles '[\"admin\"]' lnms config:set auth.socialite.claims.OTHER_RETURN_FROM_CLAIM.roles '[\"global-read\",\"cleaner\"]'","title":"Claims / Access Scopes"},{"location":"Extensions/OAuth-SAML/#saml2-example","text":"","title":"SAML2 Example"},{"location":"Extensions/OAuth-SAML/#install-plugin_1","text":"The first step is to install the plugin itself. lnms plugin:add socialiteproviders/saml2","title":"Install plugin"},{"location":"Extensions/OAuth-SAML/#add-configuration","text":"Depending on what your identity provider (Google, Azure, ...) supports, the configuration could look different from what you see next so please use this as a rough guide. It is up the IdP to provide the relevant details that you will need for configuration. Google Azure Go to https://admin.google.com/ac/apps/unified Press \"DOWNLOAD METADATA\" and save the file somewhere accessible by your LibreNMS server ACS URL = https:// your-librenms-url /auth/saml2/callback Entity ID = https:// your-librenms-url /auth/saml2 Name ID format = PERSISTANT Name ID = Basic Information > Primary email First name = http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname Last name = http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname Primary email = http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress settings/auth/socialite lnms config:set auth.socialite.configs.saml2.metadata \" $( cat /tmp/GoogleIDPMetadata.xml ) \" Alternatively, you can copy the content of the file and run it like so, this will result in the exact same result as above. settings/auth/socialite lnms config:set auth.socialite.configs.saml2.metadata '''''' echo \"SESSION_SAME_SITE_COOKIE=none\" >> .env lnms plugin:add socialiteproviders/saml2 lnms config:set auth.socialite.redirect true lnms config:set auth.socialite.register true lnms config:set auth.socialite.configs.saml2.acs https://login.microsoftonline.com/xxxidfromazurexxx/saml2 lnms config:set auth.socialite.configs.saml2.entityid https://sts.windows.net/xxxidfromazurexxx/ lnms config:set auth.socialite.configs.saml2.certificate xxxcertinonelinexxx lnms config:set auth.socialite.configs.saml2.listener \"\\SocialiteProviders\\Saml2\\Saml2ExtendSocialite\" lnms config:set auth.socialite.configs.saml2.metadata https://nexus.microsoftonline-p.com/federationmetadata/saml20/federationmetadata.xml lnms config:set auth.socialite.configs.saml2.sp_default_binding_method urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST lnms config:clear","title":"Add configuration"},{"location":"Extensions/OAuth-SAML/#using-an-identity-provider-metadata-url","text":"Note This is the prefered and easiest way, if your IdP supports it! settings/auth/socialite lnms config:set auth.socialite.configs.saml2.metadata https://idp.co/metadata/xml","title":"Using an Identity Provider metadata URL"},{"location":"Extensions/OAuth-SAML/#using-an-identity-provider-metadata-xml-file","text":"settings/auth/socialite lnms config:set auth.socialite.configs.saml2.metadata \" $( cat GoogleIDPMetadata.xml ) \"","title":"Using an Identity Provider metadata XML file"},{"location":"Extensions/OAuth-SAML/#manually-configuring-the-identity-provider-with-a-certificate-string","text":"settings/auth/socialite lnms config:set auth.socialite.configs.saml2.acs https://idp.co/auth/acs lnms config:set auth.socialite.configs.saml2.entityid http://saml.to/trust lnms config:set auth.socialite.configs.saml2.certificate MIIC4jCCAcqgAwIBAgIQbDO5YO....","title":"Manually configuring the Identity Provider with a certificate string"},{"location":"Extensions/OAuth-SAML/#manually-configuring-the-identity-provider-with-a-certificate-file","text":"settings/auth/socialite lnms config:set auth.socialite.configs.saml2.acs https://idp.co/auth/acs lnms config:set auth.socialite.configs.saml2.entityid http://saml.to/trust lnms config:set auth.socialite.configs.saml2.certificate \" $( cat /path/to/certificate.pem ) \"","title":"Manually configuring the Identity Provider with a certificate file"},{"location":"Extensions/OAuth-SAML/#add-provider-event-listener_1","text":"Now we just need to define the listener service within LibreNMS: settings/auth/socialite lnms config:set auth.socialite.configs.saml2.listener \"\\SocialiteProviders\\Saml2\\Saml2ExtendSocialite\"","title":"Add provider event listener"},{"location":"Extensions/OAuth-SAML/#session_same_site_cookie","text":"You most likely will need to set SESSION_SAME_SITE_COOKIE=none in .env if you use SAML2! If you get an error with http code 419, you should try to remove SESSION_SAME_SITE_COOKIE=none from your .env . Note Don't forget to run lnms config:clear after you modify .env to flush the config cache","title":"SESSION_SAME_SITE_COOKIE"},{"location":"Extensions/OAuth-SAML/#service-provider-metadata","text":"Your identify provider might ask you for your Service Provider (SP) metadata. LibreNMS exposes all of this information from your LibreNMS install","title":"Service provider metadata"},{"location":"Extensions/OAuth-SAML/#troubleshooting","text":"If it doesn't work, please double check your configuration values by using the config:get command below. settings/auth/socialite lnms config:get auth.socialite","title":"Troubleshooting"},{"location":"Extensions/OAuth-SAML/#redirect-url","text":"If you have a need to, then you can override redirect url with the following commands: OAuth SAML2 Replace github and the relevant URL below with your identity provider details. lnms config:set auth.socialite.configs.github.redirect https://demo.librenms.org/auth/github/callback lnms config:set auth.socialite.configs.saml2.sp_acs auth/saml2/callback","title":"Redirect URL"},{"location":"Extensions/OAuth-SAML/#post-configuration-settings","text":"settings/auth/socialite From here you can configure the settings for any identity providers you have configured along with some bespoke options. Redirect Login page: This setting will skip your LibreNMS login and take the end user straight to the first idP you configured. Allow registration via provider: If this setting is disabled, new users signing in via the idP will not be authenticated. This setting allows a local user to be automatically created which permits their login.","title":"Post configuration settings"},{"location":"Extensions/Oxidized/","text":"Oxidized Integrating LibreNMS with Oxidized brings the following benefits: Config viewing: Current, History, and Diffs all under the Configs tab of each device Automatic addition of devices to Oxidized: Including filtering and grouping to ease credential management Configuration searching (Requires oxidized-web 0.8.0 or newer) First you will need to install Oxidized following their documentation . Then you can procede to the LibreNMS Web UI and go to Oxidized Settings in the External Settings section of Global Settings. Enable it and enter the url to your oxidized instance. To have devices automatically added, you will need to configure oxidized to pull them from LibreNMS Feeding Oxidized Note: this means devices will be controlled by the LibreNMS API, and not router.db, passwords will still need to be in the oxidized config file. LibreNMS will automatically map the OS to the Oxidized model name if they don't match. this means you shouldn't need to use the model_map config option within Oxidized. Detailed integration information This is a straight forward use of Oxidized, it relies on you having a working Oxidized setup which is already taking config snapshots for your devices. When you have that, you only need the following config to enable the display of device configs within the device page itself: external/oxidized lnms config:set oxidized.enabled true lnms config:set oxidized.url http://127.0.0.1:8888 LibreNMS supports config versioning if Oxidized does. This is known to work with the git output module. external/oxidized lnms config:set oxidized.features.versioning true Oxidized supports various ways to utilise credentials to login to devices, you can specify global username/password within Oxidized, Group level username/password or per device. LibreNMS currently supports sending groups back to Oxidized so that you can then define group credentials within Oxidized. To enable this support please switch on 'Enable the return of groups to Oxidized': external/oxidized lnms config:set oxidized.group_support true You can set a default group that devices will fall back to with: external/oxidized lnms config:set oxidized.default_group default You can ignore specific groups external/oxidized lnms config:set oxidized.ignore_groups '[\"badgroup\", \"nobackup\"]' One trick you can do to ignore all ungrouped devices is set both of these settings external/oxidized lnms config:set oxidized.default_group nobackup lnms config:set oxidized.ignore_groups.+ nobackup SELinux If you're running SELinux, you'll need to allow httpd to connect outbound to the network, otherwise Oxidized integration in the web UI will silently fail: setsebool -P httpd_can_network_connect 1 Feeding Oxidized Oxidized has support for feeding devices into it via an API call, support for Oxidized has been added to the LibreNMS API. A sample config for Oxidized is provided below. You will need to configure default credentials for your devices in the Oxidized config, LibreNMS doesn't provide login credentials at this time. source: default: http debug: false http: url: https://librenms/api/v0/oxidized map: name: hostname model: os group: group headers: X-Auth-Token: '01582bf94c03104ecb7953dsadsadwed' LibreNMS is able to reload the Oxidized list of nodes, each time a device is added to LibreNMS. To do so, edit the option in Global Settings>External Settings>Oxidized Integration or add the following to your config. external/oxidized lnms config:set oxidized.reload_nodes true Creating overrides To return an override to Oxidized you can do this by providing the override key, followed by matching a lookup for a host (or hosts), and finally by defining the overriding value itself. LibreNMS does not check for the validity of these attributes but will deliver them to Oxidized as defined. Matching of hosts can be done using hostname , sysname , os , location , sysDescr , hardware , purpose or notes and including either a 'match' key and value, or a 'regex' key and value. The order of matching is: hostname sysName sysDescr hardware os location ip purpose notes To match on the device hostnames or sysNames that contain 'lon-sw' or if the location contains 'London' then you would set the following: external/oxidized lnms config:set oxidized.maps.group.hostname.+ '{\"regex\": \"/^lon-sw/\", \"value\": \"london-switches\"}' lnms config:set oxidized.maps.group.sysName.+ '{\"regex\": \"/^lon-sw/\", \"value\": \"london-switches\"}' lnms config:set oxidized.maps.group.location.+ '{\"regex\": \"/london/\", \"value\": \"london-switches\"}' To match on a device os of edgeos then please use the following: external/oxidized lnms config:set oxidized.maps.group.os.+ '{\"match\": \"edgeos\", \"value\": \"wireless\"}' Matching on OS requires system name of the OS. For example, \"match\": \"RouterOS\" will not work, while \"match\": \"routeros\" will. To match on a device purpose or device notes that contains 'lon-net' then you would set the following: external/oxidized lnms config:set oxidized.maps.group.purpose.+ '{\"regex\": \"/^lon-sw/\", \"value\": \"london-network\"}' lnms config:set oxidized.maps.group.notes.+ '{\"regex\": \"/^lon-sw/\", \"value\": \"london-network\"}' To edit an existing map, you must use the index to override it. external/oxidized lnms config:get oxidized.maps.os.os [ { \"match\" : \"airos-af-ltu\" , \"value\" : \"airfiber\" } , { \"match\" : \"airos-af\" , \"value\" : \"airfiber\" } , ] lnms config:set oxidized.maps.os.os.1 '{\"match\": \"airos-af\", \"value\": \"something-else\"}' To override the IP Oxidized uses to poll the device, set the following: external/oxidized lnms config:set oxidized.maps.ip.sysName.+ '{\"regex\": \"/^my.node/\", \"value\": \"192.168.1.10\"}' lnms config:set oxidized.maps.ip.sysName.+ '{\"match\": \"my-other.node\", \"value\": \"192.168.1.20\"}' This allows extending the configuration further by providing a completely flexible model for custom flags and settings, for example, below shows the ability to add an ssh_proxy host within Oxidized simply by adding the below to your configuration: external/oxidized lnms config:set oxidized.maps.ssh_proxy.sysName.+ '{\"regex\": \"/^my.node/\", \"value\": \"my-ssh-gateway.node\"}' Or of course, any custom value that could be needed or wanted can be applied, for example, setting a \"myAttribute\" to \"Super cool value\" for any configured and enabled \"routeros\" device. external/oxidized lnms config:set oxidized.maps.myAttribute.os.+ '{\"match\": \"routeros\", \"value\": \"Super cool value\"}' Verify the return of groups by querying the API: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/oxidized If you need to, you can specify credentials for groups by using the following in your Oxidized config: groups: : username: password: Miscellaneous If you have devices which you do not wish to appear in Oxidized then you can edit those devices in Device -> Edit -> Misc and enable \"Exclude from Oxidized?\" The use of custom ssh and telnet ports can be set through device settings misc tab, and can be passed on to oxidized with the following vars_map source: http: map: name: hostname model: os group: group vars_map: ssh_port: ssh_port telnet_port: telnet_port It's also possible to exclude certain device types and OS' from being output via the API. external/oxidized lnms config:set oxidized.ignore_types '[\"server\", \"power\"]' lnms config:set oxidized.ignore_os '[\"linux\", \"windows\"]' You can also ignore whole groups of devices external/oxidized lnms config:set oxidized.ignore_groups '[\"london-switches\", \"default\"]' Trigger configuration backups Using the Oxidized REST API and Syslog Hooks , Oxidized can trigger configuration downloads whenever a configuration change event has been logged. An example script to do this is included in ./scripts/syslog-notify-oxidized.php . Oxidized can spawn a new worker thread and perform the download immediately with the following configuration next_adds_job: true Validate Oxidized config You can perform basic validation of the Oxidized configuration by going to the Overview -> Tools -> Oxidized link and in the Oxidized config validation page, paste your yaml file into the input box and click 'Validate YAML'. We check for yaml syntax errors and also actual config values to ensure they are used in the correct location. Accessing configuration of a disabled/removed device When you're disabling or removing a device from LibreNMS, the configuration will no longer be available via the LibreNMS web interface. You can gain access to these configurations directly in the Git repository of Oxidized (if using Git for version control). 1: Check in your Oxidized where are stored your Git repositories: /home/oxidized/.config/oxidized/config 2: Go the correct Git repository for the needed device (the .git one) and get the list of devices using this command: git ls-files -s 3: Save the object ID of the device, and run the command to get the file content: git cat-file -p Remove disabled/removed device If you want to purge saved config of a device that is not in LibreNMS anymore, you can run the following command: git rm --cached ","title":"Oxidized"},{"location":"Extensions/Oxidized/#oxidized","text":"Integrating LibreNMS with Oxidized brings the following benefits: Config viewing: Current, History, and Diffs all under the Configs tab of each device Automatic addition of devices to Oxidized: Including filtering and grouping to ease credential management Configuration searching (Requires oxidized-web 0.8.0 or newer) First you will need to install Oxidized following their documentation . Then you can procede to the LibreNMS Web UI and go to Oxidized Settings in the External Settings section of Global Settings. Enable it and enter the url to your oxidized instance. To have devices automatically added, you will need to configure oxidized to pull them from LibreNMS Feeding Oxidized Note: this means devices will be controlled by the LibreNMS API, and not router.db, passwords will still need to be in the oxidized config file. LibreNMS will automatically map the OS to the Oxidized model name if they don't match. this means you shouldn't need to use the model_map config option within Oxidized.","title":"Oxidized"},{"location":"Extensions/Oxidized/#detailed-integration-information","text":"This is a straight forward use of Oxidized, it relies on you having a working Oxidized setup which is already taking config snapshots for your devices. When you have that, you only need the following config to enable the display of device configs within the device page itself: external/oxidized lnms config:set oxidized.enabled true lnms config:set oxidized.url http://127.0.0.1:8888 LibreNMS supports config versioning if Oxidized does. This is known to work with the git output module. external/oxidized lnms config:set oxidized.features.versioning true Oxidized supports various ways to utilise credentials to login to devices, you can specify global username/password within Oxidized, Group level username/password or per device. LibreNMS currently supports sending groups back to Oxidized so that you can then define group credentials within Oxidized. To enable this support please switch on 'Enable the return of groups to Oxidized': external/oxidized lnms config:set oxidized.group_support true You can set a default group that devices will fall back to with: external/oxidized lnms config:set oxidized.default_group default You can ignore specific groups external/oxidized lnms config:set oxidized.ignore_groups '[\"badgroup\", \"nobackup\"]' One trick you can do to ignore all ungrouped devices is set both of these settings external/oxidized lnms config:set oxidized.default_group nobackup lnms config:set oxidized.ignore_groups.+ nobackup","title":"Detailed integration information"},{"location":"Extensions/Oxidized/#selinux","text":"If you're running SELinux, you'll need to allow httpd to connect outbound to the network, otherwise Oxidized integration in the web UI will silently fail: setsebool -P httpd_can_network_connect 1","title":"SELinux"},{"location":"Extensions/Oxidized/#feeding-oxidized","text":"Oxidized has support for feeding devices into it via an API call, support for Oxidized has been added to the LibreNMS API. A sample config for Oxidized is provided below. You will need to configure default credentials for your devices in the Oxidized config, LibreNMS doesn't provide login credentials at this time. source: default: http debug: false http: url: https://librenms/api/v0/oxidized map: name: hostname model: os group: group headers: X-Auth-Token: '01582bf94c03104ecb7953dsadsadwed' LibreNMS is able to reload the Oxidized list of nodes, each time a device is added to LibreNMS. To do so, edit the option in Global Settings>External Settings>Oxidized Integration or add the following to your config. external/oxidized lnms config:set oxidized.reload_nodes true","title":"Feeding Oxidized"},{"location":"Extensions/Oxidized/#creating-overrides","text":"To return an override to Oxidized you can do this by providing the override key, followed by matching a lookup for a host (or hosts), and finally by defining the overriding value itself. LibreNMS does not check for the validity of these attributes but will deliver them to Oxidized as defined. Matching of hosts can be done using hostname , sysname , os , location , sysDescr , hardware , purpose or notes and including either a 'match' key and value, or a 'regex' key and value. The order of matching is: hostname sysName sysDescr hardware os location ip purpose notes To match on the device hostnames or sysNames that contain 'lon-sw' or if the location contains 'London' then you would set the following: external/oxidized lnms config:set oxidized.maps.group.hostname.+ '{\"regex\": \"/^lon-sw/\", \"value\": \"london-switches\"}' lnms config:set oxidized.maps.group.sysName.+ '{\"regex\": \"/^lon-sw/\", \"value\": \"london-switches\"}' lnms config:set oxidized.maps.group.location.+ '{\"regex\": \"/london/\", \"value\": \"london-switches\"}' To match on a device os of edgeos then please use the following: external/oxidized lnms config:set oxidized.maps.group.os.+ '{\"match\": \"edgeos\", \"value\": \"wireless\"}' Matching on OS requires system name of the OS. For example, \"match\": \"RouterOS\" will not work, while \"match\": \"routeros\" will. To match on a device purpose or device notes that contains 'lon-net' then you would set the following: external/oxidized lnms config:set oxidized.maps.group.purpose.+ '{\"regex\": \"/^lon-sw/\", \"value\": \"london-network\"}' lnms config:set oxidized.maps.group.notes.+ '{\"regex\": \"/^lon-sw/\", \"value\": \"london-network\"}' To edit an existing map, you must use the index to override it. external/oxidized lnms config:get oxidized.maps.os.os [ { \"match\" : \"airos-af-ltu\" , \"value\" : \"airfiber\" } , { \"match\" : \"airos-af\" , \"value\" : \"airfiber\" } , ] lnms config:set oxidized.maps.os.os.1 '{\"match\": \"airos-af\", \"value\": \"something-else\"}' To override the IP Oxidized uses to poll the device, set the following: external/oxidized lnms config:set oxidized.maps.ip.sysName.+ '{\"regex\": \"/^my.node/\", \"value\": \"192.168.1.10\"}' lnms config:set oxidized.maps.ip.sysName.+ '{\"match\": \"my-other.node\", \"value\": \"192.168.1.20\"}' This allows extending the configuration further by providing a completely flexible model for custom flags and settings, for example, below shows the ability to add an ssh_proxy host within Oxidized simply by adding the below to your configuration: external/oxidized lnms config:set oxidized.maps.ssh_proxy.sysName.+ '{\"regex\": \"/^my.node/\", \"value\": \"my-ssh-gateway.node\"}' Or of course, any custom value that could be needed or wanted can be applied, for example, setting a \"myAttribute\" to \"Super cool value\" for any configured and enabled \"routeros\" device. external/oxidized lnms config:set oxidized.maps.myAttribute.os.+ '{\"match\": \"routeros\", \"value\": \"Super cool value\"}' Verify the return of groups by querying the API: curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/oxidized If you need to, you can specify credentials for groups by using the following in your Oxidized config: groups: : username: password: ","title":"Creating overrides"},{"location":"Extensions/Oxidized/#miscellaneous","text":"If you have devices which you do not wish to appear in Oxidized then you can edit those devices in Device -> Edit -> Misc and enable \"Exclude from Oxidized?\" The use of custom ssh and telnet ports can be set through device settings misc tab, and can be passed on to oxidized with the following vars_map source: http: map: name: hostname model: os group: group vars_map: ssh_port: ssh_port telnet_port: telnet_port It's also possible to exclude certain device types and OS' from being output via the API. external/oxidized lnms config:set oxidized.ignore_types '[\"server\", \"power\"]' lnms config:set oxidized.ignore_os '[\"linux\", \"windows\"]' You can also ignore whole groups of devices external/oxidized lnms config:set oxidized.ignore_groups '[\"london-switches\", \"default\"]'","title":"Miscellaneous"},{"location":"Extensions/Oxidized/#trigger-configuration-backups","text":"Using the Oxidized REST API and Syslog Hooks , Oxidized can trigger configuration downloads whenever a configuration change event has been logged. An example script to do this is included in ./scripts/syslog-notify-oxidized.php . Oxidized can spawn a new worker thread and perform the download immediately with the following configuration next_adds_job: true","title":"Trigger configuration backups"},{"location":"Extensions/Oxidized/#validate-oxidized-config","text":"You can perform basic validation of the Oxidized configuration by going to the Overview -> Tools -> Oxidized link and in the Oxidized config validation page, paste your yaml file into the input box and click 'Validate YAML'. We check for yaml syntax errors and also actual config values to ensure they are used in the correct location.","title":"Validate Oxidized config"},{"location":"Extensions/Oxidized/#accessing-configuration-of-a-disabledremoved-device","text":"When you're disabling or removing a device from LibreNMS, the configuration will no longer be available via the LibreNMS web interface. You can gain access to these configurations directly in the Git repository of Oxidized (if using Git for version control). 1: Check in your Oxidized where are stored your Git repositories: /home/oxidized/.config/oxidized/config 2: Go the correct Git repository for the needed device (the .git one) and get the list of devices using this command: git ls-files -s 3: Save the object ID of the device, and run the command to get the file content: git cat-file -p ","title":"Accessing configuration of a disabled/removed device"},{"location":"Extensions/Oxidized/#remove-disabledremoved-device","text":"If you want to purge saved config of a device that is not in LibreNMS anymore, you can run the following command: git rm --cached ","title":"Remove disabled/removed device"},{"location":"Extensions/PeeringDB/","text":"PeeringDB Support LibreNMS has integration with PeeringDB to match up your BGP sessions with the peering exchanges you are connected to. To enable the integration please do so within the WebUI external/peeringdb lnms config:set peeringdb.enabled true Data will be collated the next time daily.sh is run or you can manually force this by running php daily.php -f peeringdb , the initial collection is delayed for a random amount of time to avoid overloading the PeeringDB API. Once enabled you will have an additional menu item under Routing -> PeeringDB","title":"PeeringDB"},{"location":"Extensions/PeeringDB/#peeringdb-support","text":"LibreNMS has integration with PeeringDB to match up your BGP sessions with the peering exchanges you are connected to. To enable the integration please do so within the WebUI external/peeringdb lnms config:set peeringdb.enabled true Data will be collated the next time daily.sh is run or you can manually force this by running php daily.php -f peeringdb , the initial collection is delayed for a random amount of time to avoid overloading the PeeringDB API. Once enabled you will have an additional menu item under Routing -> PeeringDB","title":"PeeringDB Support"},{"location":"Extensions/Plugin-System/","text":"Developing for the Plugin System With plugins you can extend LibreNMS with special functions that are specific to your setup or are not relevant or interesting for all community members. You are able to intervene in defined places in the behavior of the website, without it coming to problems with future updates. This documentation will give you a basis for writing a plugin for LibreNMS. An example plugin is included in the LibreNMS distribution. Version 2 Plugin System structure Plugins in version 2 need to be installed into app/Plugins Note: Plugins are disabled when the have an error, to show errors instead set plugins.show_errors The structure of a plugin is follows: app/Plugins /PluginName /DeviceOverview.php /Menu.php /Page.php /PortTab.php /Settings.php /resources/views /device-overview.blade.php /menu.blade.php /page.blade.php /port-tab.blade.php /settings.blade.php The above structure is checked before a plugin can be installed. All file/folder names are case sensitive and must match the structure. Only the blade files that are really needed need to be created. A plugin manager will then load a hook that has a basic functionality. If you want to customize the basic behavior of the hooks, you can create a class in 'app/Plugins/PluginName' and overload the hook methods. device-overview.blade.php :: This is called in the Device Overview page. You receive the $device as a object per default, you can do your work here and display your results in a frame.
            {{ $title }}
            {{ $device->hostname }}
            port-tab.blade.php :: This is called in the Port page, in the \"Plugins\" menu_option that will appear when your plugin gets enabled. In this blade, you can do your work and display your results in a frame. menu.blade.php :: For a menu entry page.blade.pho :: Here is a good place to add a own LibreNMS page without dependence with a device. A good place to create your own lists with special requirements and behavior. settings.blade.php :: If you need your own settings and variables, you can have a look in the ExamplePlugin. PHP Hooks customization PHP code should run inside your hooks method and not your blade view. The built in hooks support authorize and data methods. These methods are called with Dependency Injection Hooks with relevant database models will include them in these calls. Additionally, the settings argument may be included to inject the plugin settings into the method. Data You can overrid the data method to supply data to your view. You should also do any processing here. You can do things like access the database or configuration settings and more. In the data method we are injecting settings here to count how many we have for display in the menu entry blade view. Note that you must specify a default value ( = [] here) for any arguments that don't exist on the parent method. class Menu extends MenuEntryHook { public function data ( array $settings = []) : array { return [ 'count' => count ( $settings ), ]; } } Authorize By default hooks are always shown, but you may control when the user is authorized to view the hook content. As an example, you could imagine that the device-overview.blade.php should only be displayed when the device is in maintanence mode and the current user has the admin role. class DeviceOverview extends DeviceOverviewHook { public function authorize ( User $user , Device $device ) : bool { return $user -> can ( 'admin' ) && $device -> isUnderMaintenance (); } } Full plugin You may create a full plugin that can publish multiple routes, views, database migrations and more. Create a package according to the Laravel documentation you may call any of the supported hooks to tie into LibreNMS. https://laravel.com/docs/packages This is untested, please come to discord and share any expriences and update this documentation! Version 1 Plugin System structure (legacy verion) Plugins need to be installed into html/plugins The structure of a plugin is follows: html/plugins /PluginName /PluginName.php /PluginName.inc.php The above structure is checked before a plugin can be installed. All files / folder names are case sensitive and must match. PluginName - This is a directory and needs to be named as per the plugin you are creating. PluginName.php :: This file is used to process calls into the plugin from the main LibreNMS install. Here only functions within the class for your plugin that LibreNMS calls will be executed. For a list of currently enabled system hooks, please see further down. The minimum code required in this file is (replace Test with the name of your plugin): PluginName.inc.php :: This file is the main included file when browsing to the plugin itself. You can use this to display / edit / remove whatever you like. The minimum code required in this file is: System Hooks System hooks are called as functions within your plugin class. The following system hooks are currently available: menu() :: This is called to build the plugin menu system and you can use this to link to your plugin (you don't have to). public static function menu() { echo('
          15. '.get_class().'
          16. '); } device_overview_container($device) :: This is called in the Device Overview page. You receive the $device as a parameter, can do your work here and display your results in a frame. public static function device_overview_container($device) { echo('
            '.get_class().' Plugin
            '); echo(' Example plugin in \"Device - Overview\" tab
            '); echo('
            '); } port_container($device, $port) :: This is called in the Port page, in the \"Plugins\" menu_option that will appear when your plugin gets enabled. In this function, you can do your work and display your results in a frame. public static function port_container($device, $port) { echo('
            '.get_class().' plugin in \"Port\" tab
            '); echo ('Example display in Port tab
            '); echo('
            '); }","title":"Plugin System"},{"location":"Extensions/Plugin-System/#developing-for-the-plugin-system","text":"With plugins you can extend LibreNMS with special functions that are specific to your setup or are not relevant or interesting for all community members. You are able to intervene in defined places in the behavior of the website, without it coming to problems with future updates. This documentation will give you a basis for writing a plugin for LibreNMS. An example plugin is included in the LibreNMS distribution.","title":"Developing for the Plugin System"},{"location":"Extensions/Plugin-System/#version-2-plugin-system-structure","text":"Plugins in version 2 need to be installed into app/Plugins Note: Plugins are disabled when the have an error, to show errors instead set plugins.show_errors The structure of a plugin is follows: app/Plugins /PluginName /DeviceOverview.php /Menu.php /Page.php /PortTab.php /Settings.php /resources/views /device-overview.blade.php /menu.blade.php /page.blade.php /port-tab.blade.php /settings.blade.php The above structure is checked before a plugin can be installed. All file/folder names are case sensitive and must match the structure. Only the blade files that are really needed need to be created. A plugin manager will then load a hook that has a basic functionality. If you want to customize the basic behavior of the hooks, you can create a class in 'app/Plugins/PluginName' and overload the hook methods. device-overview.blade.php :: This is called in the Device Overview page. You receive the $device as a object per default, you can do your work here and display your results in a frame.
            {{ $title }}
            {{ $device->hostname }}
            port-tab.blade.php :: This is called in the Port page, in the \"Plugins\" menu_option that will appear when your plugin gets enabled. In this blade, you can do your work and display your results in a frame. menu.blade.php :: For a menu entry page.blade.pho :: Here is a good place to add a own LibreNMS page without dependence with a device. A good place to create your own lists with special requirements and behavior. settings.blade.php :: If you need your own settings and variables, you can have a look in the ExamplePlugin.","title":"Version 2 Plugin System structure"},{"location":"Extensions/Plugin-System/#php-hooks-customization","text":"PHP code should run inside your hooks method and not your blade view. The built in hooks support authorize and data methods. These methods are called with Dependency Injection Hooks with relevant database models will include them in these calls. Additionally, the settings argument may be included to inject the plugin settings into the method.","title":"PHP Hooks customization"},{"location":"Extensions/Plugin-System/#data","text":"You can overrid the data method to supply data to your view. You should also do any processing here. You can do things like access the database or configuration settings and more. In the data method we are injecting settings here to count how many we have for display in the menu entry blade view. Note that you must specify a default value ( = [] here) for any arguments that don't exist on the parent method. class Menu extends MenuEntryHook { public function data ( array $settings = []) : array { return [ 'count' => count ( $settings ), ]; } }","title":"Data"},{"location":"Extensions/Plugin-System/#authorize","text":"By default hooks are always shown, but you may control when the user is authorized to view the hook content. As an example, you could imagine that the device-overview.blade.php should only be displayed when the device is in maintanence mode and the current user has the admin role. class DeviceOverview extends DeviceOverviewHook { public function authorize ( User $user , Device $device ) : bool { return $user -> can ( 'admin' ) && $device -> isUnderMaintenance (); } }","title":"Authorize"},{"location":"Extensions/Plugin-System/#full-plugin","text":"You may create a full plugin that can publish multiple routes, views, database migrations and more. Create a package according to the Laravel documentation you may call any of the supported hooks to tie into LibreNMS. https://laravel.com/docs/packages This is untested, please come to discord and share any expriences and update this documentation!","title":"Full plugin"},{"location":"Extensions/Plugin-System/#version-1-plugin-system-structure-legacy-verion","text":"Plugins need to be installed into html/plugins The structure of a plugin is follows: html/plugins /PluginName /PluginName.php /PluginName.inc.php The above structure is checked before a plugin can be installed. All files / folder names are case sensitive and must match. PluginName - This is a directory and needs to be named as per the plugin you are creating. PluginName.php :: This file is used to process calls into the plugin from the main LibreNMS install. Here only functions within the class for your plugin that LibreNMS calls will be executed. For a list of currently enabled system hooks, please see further down. The minimum code required in this file is (replace Test with the name of your plugin): PluginName.inc.php :: This file is the main included file when browsing to the plugin itself. You can use this to display / edit / remove whatever you like. The minimum code required in this file is: ","title":"Version 1 Plugin System structure (legacy verion)"},{"location":"Extensions/Plugin-System/#system-hooks","text":"System hooks are called as functions within your plugin class. The following system hooks are currently available: menu() :: This is called to build the plugin menu system and you can use this to link to your plugin (you don't have to). public static function menu() { echo('
          17. '.get_class().'
          18. '); } device_overview_container($device) :: This is called in the Device Overview page. You receive the $device as a parameter, can do your work here and display your results in a frame. public static function device_overview_container($device) { echo('
            '.get_class().' Plugin
            '); echo(' Example plugin in \"Device - Overview\" tab
            '); echo('
            '); } port_container($device, $port) :: This is called in the Port page, in the \"Plugins\" menu_option that will appear when your plugin gets enabled. In this function, you can do your work and display your results in a frame. public static function port_container($device, $port) { echo('
            '.get_class().' plugin in \"Port\" tab
            '); echo ('Example display in Port tab
            '); echo('
            '); }","title":"System Hooks"},{"location":"Extensions/Proxmox/","text":"Proxmox graphing It is possible to create graphs of the Proxmox VMs that run on your monitored machines. Currently, only traffic graphs are created. One for each interface on each VM. Possibly, IO graphs will be added later on. The ultimate goal is to be able to create traffic bills for VMs, no matter on which physical machine that VM runs. Enabling Proxmox graphs To enable Proxmox graphs, do the following: In config.php, enable Proxmox: $config [ 'enable_proxmox' ] = 1 ; Then, install git and librenms-agent on the machines running Proxmox and enable the Proxmox-script using: cp /opt/librenms-agent/agent-local/proxmox /usr/lib/check_mk_agent/local/proxmox chmod +x /usr/lib/check_mk_agent/local/proxmox Then, enable and start the check_mk service using systemd cp /opt/librenms-agent/check_mk@.service /opt/librenms-agent/check_mk.socket /etc/systemd/system systemctl daemon-reload systemctl enable check_mk.socket && systemctl start check_mk.socket Then in LibreNMS active the librenms-agent and proxmox application flag for the device you are monitoring. You should now see an application in LibreNMS, as well as a new menu-item in the topmenu, allowing you to choose which cluster you want to look at. Note, if you want to use use xinetd instead of systemd Its possible to use the librenms-agent started by xinetd instead of systemd. One use case is if you are forced to use a old Proxmox installation. After installing the librenms-agent (see above) please copy enable the xinetd config, then restart the xinetd service: cp check_mk_xinetd /etc/xinetd.d/check_mk /etc/init.d/xinetd restart","title":"Proxmox"},{"location":"Extensions/Proxmox/#proxmox-graphing","text":"It is possible to create graphs of the Proxmox VMs that run on your monitored machines. Currently, only traffic graphs are created. One for each interface on each VM. Possibly, IO graphs will be added later on. The ultimate goal is to be able to create traffic bills for VMs, no matter on which physical machine that VM runs.","title":"Proxmox graphing"},{"location":"Extensions/Proxmox/#enabling-proxmox-graphs","text":"To enable Proxmox graphs, do the following: In config.php, enable Proxmox: $config [ 'enable_proxmox' ] = 1 ; Then, install git and librenms-agent on the machines running Proxmox and enable the Proxmox-script using: cp /opt/librenms-agent/agent-local/proxmox /usr/lib/check_mk_agent/local/proxmox chmod +x /usr/lib/check_mk_agent/local/proxmox Then, enable and start the check_mk service using systemd cp /opt/librenms-agent/check_mk@.service /opt/librenms-agent/check_mk.socket /etc/systemd/system systemctl daemon-reload systemctl enable check_mk.socket && systemctl start check_mk.socket Then in LibreNMS active the librenms-agent and proxmox application flag for the device you are monitoring. You should now see an application in LibreNMS, as well as a new menu-item in the topmenu, allowing you to choose which cluster you want to look at.","title":"Enabling Proxmox graphs"},{"location":"Extensions/Proxmox/#note-if-you-want-to-use-use-xinetd-instead-of-systemd","text":"Its possible to use the librenms-agent started by xinetd instead of systemd. One use case is if you are forced to use a old Proxmox installation. After installing the librenms-agent (see above) please copy enable the xinetd config, then restart the xinetd service: cp check_mk_xinetd /etc/xinetd.d/check_mk /etc/init.d/xinetd restart","title":"Note, if you want to use use xinetd instead of systemd"},{"location":"Extensions/RRDCached/","text":"Setting up RRDCached This document will explain how to set up RRDCached for LibreNMS. Since version 1.5, rrdtool / rrdcached now supports creating rrd files over rrdcached. If you have rrdcached 1.5.5 or above, you can also tune over rrdcached. To enable this set the following config: poller/rrdtool lnms config:set rrdtool_version '1.5.5' This setting has to be the exact version of rrdtool you are running. NOTE: This feature requires your client version of rrdtool to be 1.5.5 or newer, in addition to your rrdcached version. Distributed Poller Support Matrix Shared FS: Is a shared filesystem required? Features: Supported features in the version indicated. G = Graphs. C = Create RRD files. U = Update RRD files. T = Tune RRD files. Version Shared FS Features 1.4.x Yes G,U <1.5.5 Yes G,U >=1.5.5 No G,C,U >=1.6.x No G,C,U It is recommended that you monitor your LibreNMS server with LibreNMS so you can view the disk I/O usage delta. Installation Manual for RRDCached installation Ubuntu 16 RRDCached installation Debian Buster RRDCached installation Debian Stretch RRDCached installation CentOS 7 or 8 RRDCached installation CentOS 6 Securing RRCached RRDCached installation Ubuntu 16 1: Install rrdcached sudo apt-get install rrdcached 2: Edit /etc/default/rrdcached to include: DAEMON=/usr/bin/rrdcached DAEMON_USER=librenms DAEMON_GROUP=librenms WRITE_THREADS=4 WRITE_TIMEOUT=1800 WRITE_JITTER=1800 BASE_PATH=/opt/librenms/rrd/ JOURNAL_PATH=/var/lib/rrdcached/journal/ PIDFILE=/run/rrdcached.pid SOCKFILE=/run/rrdcached.sock SOCKGROUP=librenms BASE_OPTIONS=\"-B -F -R\" 2: Fix permissions chown librenms:librenms /var/lib/rrdcached/journal/ 3: Restart the rrdcached service systemctl restart rrdcached.service 5: Edit your config to include: poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\" RRDCached installation Debian Buster (rrdcached 1.7.1) 1: Install rrdcached sudo apt-get install rrdcached 2; Edit /etc/default/rrdcached to include: DAEMON = /usr/bin/rrdcached WRITE_TIMEOUT = 1800 WRITE_JITTER = 1800 WRITE_THREADS = 4 BASE_PATH = /opt/librenms/rrd/ JOURNAL_PATH = /var/lib/rrdcached/journal/ PIDFILE = /var/run/rrdcached.pid SOCKFILE = /run/rrdcached.sock SOCKGROUP = librenms DAEMON_GROUP = librenms DAEMON_USER = librenms BASE_OPTIONS = \"-B -F -R\" 3: Fix permissions chown librenms:librenms /var/lib/rrdcached/journal/ 4: Restart the rrdcached service systemctl restart rrdcached.service 5: Edit your config to include: For local RRDCached server poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\" For remote RRDCached server make sure you have network option in /var/default/rrdcached NETWORK_OPTIONS = \"-L\" poller/rrdtool lnms config:set rrdcached \"IPADDRESS:42217\" NOTE: change IPADDRESS to the ip the rrdcached server is listening on. RRDCached installation Debian Stretch (rrdcached 1.6.0) 1: Install rrdcached sudo apt-get install rrdcached 2; Edit /etc/default/rrdcached to include: DAEMON = /usr/bin/rrdcached WRITE_TIMEOUT = 1800 WRITE_JITTER = 1800 WRITE_THREADS = 4 BASE_PATH = /opt/librenms/rrd/ JOURNAL_PATH = /var/lib/rrdcached/journal/ PIDFILE = /var/run/rrdcached.pid SOCKFILE = /run/rrdcached.sock SOCKGROUP = librenms DAEMON_GROUP = librenms DAEMON_USER = librenms BASE_OPTIONS = \"-B -F -R\" 3: Fix permissions chown librenms:librenms /var/lib/rrdcached/journal/ 4: Restart the rrdcached service systemctl restart rrdcached.service 5: Edit your config to include: For local RRDCached server poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\" For remote RRDCached server make sure you have network option in /var/default/rrdcached NETWORK_OPTIONS = \"-L\" poller/rrdtool lnms config:set rrdcached \"IPADDRESS:42217\" NOTE: change IPADDRESS to the ip the rrdcached server is listening on. RRDCached installation CentOS 7 or 8 1: Create /etc/systemd/system/rrdcached.service with this content: [Unit] Description=Data caching daemon for rrdtool After=network.service [Service] Type=forking PIDFile=/run/rrdcached.pid ExecStart=/usr/bin/rrdcached -w 1800 -z 1800 -f 3600 -s librenms -U librenms -G librenms -B -R -j /var/tmp -l unix:/run/rrdcached.sock -t 4 -F -b /opt/librenms/rrd/ [Install] WantedBy=default.target 2: Configure SELinux for RRDCached cat > rrdcached_librenms.te << EOF module rrdcached_librenms 1.0; require { type var_run_t; type tmp_t; type httpd_t; type rrdcached_t; type httpd_sys_rw_content_t; class dir { add_name getattr open read remove_name rmdir search write }; class file { create getattr open read rename setattr unlink write map lock }; class sock_file { create setattr unlink write }; class capability { fsetid sys_resource }; class unix_stream_socket connectto; } #============= rrdcached_t ============== allow rrdcached_t httpd_sys_rw_content_t:dir { add_name getattr remove_name search write }; allow rrdcached_t httpd_sys_rw_content_t:file { create getattr open read rename setattr unlink write map lock }; allow rrdcached_t self:capability fsetid; allow rrdcached_t var_run_t:sock_file { create setattr unlink }; allow httpd_t var_run_t:sock_file write; allow httpd_t rrdcached_t:unix_stream_socket connectto; EOF checkmodule -M -m -o rrdcached_librenms.mod rrdcached_librenms.te semodule_package -o rrdcached_librenms.pp -m rrdcached_librenms.mod semodule -i rrdcached_librenms.pp 3: Start rrdcached systemctl enable --now rrdcached.service 4: Edit your config to include: poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\" RRDCached installation CentOS 6 This example is based on a fresh LibreNMS install, on a minimal CentOS 6 installation. In this example, we'll use the Repoforge repository. rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm vi /etc/yum.repos.d/rpmforge.repo Enable the Extra repo yum update rrdtool vi /etc/yum.repos.d/rpmforge.repo Disable the [rpmforge] and [rpmforge-extras] repos again vi /etc/sysconfig/rrdcached # Settings for rrdcached OPTIONS=\"-w 1800 -z 1800 -f 3600 -s librenms -U librenms -G librenms -B -R -j /var/tmp -l unix:/run/rrdcached.sock -t 4 -F -b /opt/librenms/rrd/\" RRDC_USER=librenms mkdir /var/run/rrdcached chown librenms:librenms /var/run/rrdcached/ chown librenms:librenms /var/rrdtool/ chown librenms:librenms /var/rrdtool/rrdcached/ chkconfig rrdcached on service rrdcached start Edit your config to include: poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\" Verify Check to see if the graphs are being drawn in LibreNMS. This might take a few minutes. After at least one poll cycle (5 mins), check the LibreNMS disk I/O performance delta. Disk I/O can be found under the menu Devices>All Devices>[localhost hostname]>Health>Disk I/O. Depending on many factors, you should see the Ops/sec drop by ~30-40%. Securing RRCached According to the man page , under \"SECURITY CONSIDERATIONS\", rrdcached has no authentication or security except for running under a unix socket. If you choose to use a network socket instead of a unix socket, you will need to secure your rrdcached installation. To do so you can proxy rrdcached using nginx to allow only specific IPs to connect. Using the same setup above, using nginx version 1.9.0 or later, you can follow this setup to proxy the default rrdcached port to the local unix socket. (You can use ./conf.d for your configuration as well) mkdir /etc/nginx/streams-{available,enabled} add the following to your nginx.conf file: #/etc/nginx/nginx.conf ... stream { include /etc/nginx/streams-enabled/* ; } Add this to /etc/nginx/streams-available/rrd server { listen 42217 ; error_log /var/log/nginx/rrd.stream.error.log ; allow $LibreNMS_IP ; deny all ; proxy_pass unix:/run/rrdcached.sock ; } Replace $LibreNMS_IP with the ip of the server that will be using rrdcached. You can specify more than one allow statement. This will bind nginx to TCP 42217 (the default rrdcached port), allow the specified IPs to connect, and deny all others. next, we'll symlink the config to streams-enabled: ln -s /etc/nginx/streams-{available,enabled}/rrd and reload nginx service nginx reload","title":"RRDCached"},{"location":"Extensions/RRDCached/#setting-up-rrdcached","text":"This document will explain how to set up RRDCached for LibreNMS. Since version 1.5, rrdtool / rrdcached now supports creating rrd files over rrdcached. If you have rrdcached 1.5.5 or above, you can also tune over rrdcached. To enable this set the following config: poller/rrdtool lnms config:set rrdtool_version '1.5.5' This setting has to be the exact version of rrdtool you are running. NOTE: This feature requires your client version of rrdtool to be 1.5.5 or newer, in addition to your rrdcached version.","title":"Setting up RRDCached"},{"location":"Extensions/RRDCached/#distributed-poller-support-matrix","text":"Shared FS: Is a shared filesystem required? Features: Supported features in the version indicated. G = Graphs. C = Create RRD files. U = Update RRD files. T = Tune RRD files. Version Shared FS Features 1.4.x Yes G,U <1.5.5 Yes G,U >=1.5.5 No G,C,U >=1.6.x No G,C,U It is recommended that you monitor your LibreNMS server with LibreNMS so you can view the disk I/O usage delta.","title":"Distributed Poller Support Matrix"},{"location":"Extensions/RRDCached/#installation-manual-for","text":"RRDCached installation Ubuntu 16 RRDCached installation Debian Buster RRDCached installation Debian Stretch RRDCached installation CentOS 7 or 8 RRDCached installation CentOS 6 Securing RRCached","title":"Installation Manual for"},{"location":"Extensions/RRDCached/#rrdcached-installation-ubuntu-16","text":"1: Install rrdcached sudo apt-get install rrdcached 2: Edit /etc/default/rrdcached to include: DAEMON=/usr/bin/rrdcached DAEMON_USER=librenms DAEMON_GROUP=librenms WRITE_THREADS=4 WRITE_TIMEOUT=1800 WRITE_JITTER=1800 BASE_PATH=/opt/librenms/rrd/ JOURNAL_PATH=/var/lib/rrdcached/journal/ PIDFILE=/run/rrdcached.pid SOCKFILE=/run/rrdcached.sock SOCKGROUP=librenms BASE_OPTIONS=\"-B -F -R\" 2: Fix permissions chown librenms:librenms /var/lib/rrdcached/journal/ 3: Restart the rrdcached service systemctl restart rrdcached.service 5: Edit your config to include: poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\"","title":"RRDCached installation Ubuntu 16"},{"location":"Extensions/RRDCached/#rrdcached-installation-debian-buster","text":"(rrdcached 1.7.1) 1: Install rrdcached sudo apt-get install rrdcached 2; Edit /etc/default/rrdcached to include: DAEMON = /usr/bin/rrdcached WRITE_TIMEOUT = 1800 WRITE_JITTER = 1800 WRITE_THREADS = 4 BASE_PATH = /opt/librenms/rrd/ JOURNAL_PATH = /var/lib/rrdcached/journal/ PIDFILE = /var/run/rrdcached.pid SOCKFILE = /run/rrdcached.sock SOCKGROUP = librenms DAEMON_GROUP = librenms DAEMON_USER = librenms BASE_OPTIONS = \"-B -F -R\" 3: Fix permissions chown librenms:librenms /var/lib/rrdcached/journal/ 4: Restart the rrdcached service systemctl restart rrdcached.service 5: Edit your config to include: For local RRDCached server poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\" For remote RRDCached server make sure you have network option in /var/default/rrdcached NETWORK_OPTIONS = \"-L\" poller/rrdtool lnms config:set rrdcached \"IPADDRESS:42217\" NOTE: change IPADDRESS to the ip the rrdcached server is listening on.","title":"RRDCached installation Debian Buster"},{"location":"Extensions/RRDCached/#rrdcached-installation-debian-stretch","text":"(rrdcached 1.6.0) 1: Install rrdcached sudo apt-get install rrdcached 2; Edit /etc/default/rrdcached to include: DAEMON = /usr/bin/rrdcached WRITE_TIMEOUT = 1800 WRITE_JITTER = 1800 WRITE_THREADS = 4 BASE_PATH = /opt/librenms/rrd/ JOURNAL_PATH = /var/lib/rrdcached/journal/ PIDFILE = /var/run/rrdcached.pid SOCKFILE = /run/rrdcached.sock SOCKGROUP = librenms DAEMON_GROUP = librenms DAEMON_USER = librenms BASE_OPTIONS = \"-B -F -R\" 3: Fix permissions chown librenms:librenms /var/lib/rrdcached/journal/ 4: Restart the rrdcached service systemctl restart rrdcached.service 5: Edit your config to include: For local RRDCached server poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\" For remote RRDCached server make sure you have network option in /var/default/rrdcached NETWORK_OPTIONS = \"-L\" poller/rrdtool lnms config:set rrdcached \"IPADDRESS:42217\" NOTE: change IPADDRESS to the ip the rrdcached server is listening on.","title":"RRDCached installation Debian Stretch"},{"location":"Extensions/RRDCached/#rrdcached-installation-centos-7-or-8","text":"1: Create /etc/systemd/system/rrdcached.service with this content: [Unit] Description=Data caching daemon for rrdtool After=network.service [Service] Type=forking PIDFile=/run/rrdcached.pid ExecStart=/usr/bin/rrdcached -w 1800 -z 1800 -f 3600 -s librenms -U librenms -G librenms -B -R -j /var/tmp -l unix:/run/rrdcached.sock -t 4 -F -b /opt/librenms/rrd/ [Install] WantedBy=default.target 2: Configure SELinux for RRDCached cat > rrdcached_librenms.te << EOF module rrdcached_librenms 1.0; require { type var_run_t; type tmp_t; type httpd_t; type rrdcached_t; type httpd_sys_rw_content_t; class dir { add_name getattr open read remove_name rmdir search write }; class file { create getattr open read rename setattr unlink write map lock }; class sock_file { create setattr unlink write }; class capability { fsetid sys_resource }; class unix_stream_socket connectto; } #============= rrdcached_t ============== allow rrdcached_t httpd_sys_rw_content_t:dir { add_name getattr remove_name search write }; allow rrdcached_t httpd_sys_rw_content_t:file { create getattr open read rename setattr unlink write map lock }; allow rrdcached_t self:capability fsetid; allow rrdcached_t var_run_t:sock_file { create setattr unlink }; allow httpd_t var_run_t:sock_file write; allow httpd_t rrdcached_t:unix_stream_socket connectto; EOF checkmodule -M -m -o rrdcached_librenms.mod rrdcached_librenms.te semodule_package -o rrdcached_librenms.pp -m rrdcached_librenms.mod semodule -i rrdcached_librenms.pp 3: Start rrdcached systemctl enable --now rrdcached.service 4: Edit your config to include: poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\"","title":"RRDCached installation CentOS 7 or 8"},{"location":"Extensions/RRDCached/#rrdcached-installation-centos-6","text":"This example is based on a fresh LibreNMS install, on a minimal CentOS 6 installation. In this example, we'll use the Repoforge repository. rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm vi /etc/yum.repos.d/rpmforge.repo Enable the Extra repo yum update rrdtool vi /etc/yum.repos.d/rpmforge.repo Disable the [rpmforge] and [rpmforge-extras] repos again vi /etc/sysconfig/rrdcached # Settings for rrdcached OPTIONS=\"-w 1800 -z 1800 -f 3600 -s librenms -U librenms -G librenms -B -R -j /var/tmp -l unix:/run/rrdcached.sock -t 4 -F -b /opt/librenms/rrd/\" RRDC_USER=librenms mkdir /var/run/rrdcached chown librenms:librenms /var/run/rrdcached/ chown librenms:librenms /var/rrdtool/ chown librenms:librenms /var/rrdtool/rrdcached/ chkconfig rrdcached on service rrdcached start Edit your config to include: poller/rrdtool lnms config:set rrdcached \"unix:/run/rrdcached.sock\"","title":"RRDCached installation CentOS 6"},{"location":"Extensions/RRDCached/#verify","text":"Check to see if the graphs are being drawn in LibreNMS. This might take a few minutes. After at least one poll cycle (5 mins), check the LibreNMS disk I/O performance delta. Disk I/O can be found under the menu Devices>All Devices>[localhost hostname]>Health>Disk I/O. Depending on many factors, you should see the Ops/sec drop by ~30-40%.","title":"Verify"},{"location":"Extensions/RRDCached/#securing-rrcached","text":"According to the man page , under \"SECURITY CONSIDERATIONS\", rrdcached has no authentication or security except for running under a unix socket. If you choose to use a network socket instead of a unix socket, you will need to secure your rrdcached installation. To do so you can proxy rrdcached using nginx to allow only specific IPs to connect. Using the same setup above, using nginx version 1.9.0 or later, you can follow this setup to proxy the default rrdcached port to the local unix socket. (You can use ./conf.d for your configuration as well) mkdir /etc/nginx/streams-{available,enabled} add the following to your nginx.conf file: #/etc/nginx/nginx.conf ... stream { include /etc/nginx/streams-enabled/* ; } Add this to /etc/nginx/streams-available/rrd server { listen 42217 ; error_log /var/log/nginx/rrd.stream.error.log ; allow $LibreNMS_IP ; deny all ; proxy_pass unix:/run/rrdcached.sock ; } Replace $LibreNMS_IP with the ip of the server that will be using rrdcached. You can specify more than one allow statement. This will bind nginx to TCP 42217 (the default rrdcached port), allow the specified IPs to connect, and deny all others. next, we'll symlink the config to streams-enabled: ln -s /etc/nginx/streams-{available,enabled}/rrd and reload nginx service nginx reload","title":"Securing RRCached"},{"location":"Extensions/RRDTune/","text":"RRDTune When we create rrd files for ports, we currently do so with a max value of 12500000000 (100G). Because of this if a device sends us bad data back then it can appear as though a 100M port is doing 40G+ which is impossible. To counter this you can enable the rrdtool tune option which will fix the max value to the interfaces physical speed (minimum of 10M). To enable this you can do so in three ways! Globally under Global Settings -> Poller -> Datastore: RRDTool For the actual device, Edit Device -> Misc For each port, Edit Device -> Port Settings Now when a port interface speed changes (this can happen because of a physical change or just because the device has misreported) the max value is set. If you don't want to wait until a port speed changes then you can run the included script: ./scripts/tune_port.php -h -p Wildcards are supported using *, i.e: ./scripts/tune_port.php -h local* -p eth* This script will then perform the rrdtool tune on each port found using the provided ifSpeed for that port. Run ./scripts/tune_port.php to see help page.","title":"RRDTune"},{"location":"Extensions/RRDTune/#rrdtune","text":"When we create rrd files for ports, we currently do so with a max value of 12500000000 (100G). Because of this if a device sends us bad data back then it can appear as though a 100M port is doing 40G+ which is impossible. To counter this you can enable the rrdtool tune option which will fix the max value to the interfaces physical speed (minimum of 10M). To enable this you can do so in three ways! Globally under Global Settings -> Poller -> Datastore: RRDTool For the actual device, Edit Device -> Misc For each port, Edit Device -> Port Settings Now when a port interface speed changes (this can happen because of a physical change or just because the device has misreported) the max value is set. If you don't want to wait until a port speed changes then you can run the included script: ./scripts/tune_port.php -h -p Wildcards are supported using *, i.e: ./scripts/tune_port.php -h local* -p eth* This script will then perform the rrdtool tune on each port found using the provided ifSpeed for that port. Run ./scripts/tune_port.php to see help page.","title":"RRDTune"},{"location":"Extensions/Rancid/","text":"Rancid Librenms can generate a list of hosts that can be monitored by RANCID. We assume you have currently a running Rancid, and you just need to create and update the file 'router.db' Included Rancid script To generate the config file (maybe even add a cron to schedule this). We've assumed a few locations for Rancid, the config file you want to call it and where LibreNMS is: cd /opt/librenms/scripts/ php ./gen_rancid.php > /the/path/where/is/rancid/core/router.db Sample cron: 15 0 * * * root cd /opt/librenms/scripts && php ./gen_rancid.php > /the/path/where/is/rancid/core/router.db Now configure LibreNMS (make sure you point dir to your rancid data directory): $config [ 'rancid_configs' ][ 'core' ] = '/the/path/where/is/rancid/core' ; $config [ 'rancid_ignorecomments' ] = 0 ; After that, you should see some \"config\" tab on routers that have a rancid update. Ubuntu Rancid Install The options shown below also contains the default values. NOTE - This is Only for Ubuntu 16.04 at this time, and may not work on other distros! sudo apt-get install rancid subversion Edit Rancid config file to use subversion or git instead of default cvs, and adds a group: sudo vi /etc/rancid/rancid.conf LIST_OF_GROUPS=\"librenms\" Now change these two lines: CVSROOT=$BASEDIR/CVS; export CVSROOT RCSSYS=cvs; export RCSSYS to: CVSROOT=$BASEDIR/SVN; export CVSROOT RCSSYS=svn; export RCSSYS NOTE - This only creates 1 group! You can of course make more when you get the hang of it, this is just a basic 'Need it to work\" deal. sudo su -c /var/lib/rancid/bin/rancid-cvs -s /bin/bash -l rancid NOTE - do NOT change cvs to svn here! Leave command as is! Get a list of devices from Librenms you can pull configs from: cd /opt/librenms/scripts sudo ./gen_rancid.php Copy the output. Replace all \":\" with \";\" example: alphcr1:cisco:up will change to: alphcr1;cisco;up copy and past results into the below file: sudo vi /var/lib/rancid/librenms/router.db NOTE - This ONLY applies to newer RANCID versions and Linux distros. Older versions will need to retain the : and not the ; Create/edit rancids login file: sudo vi /var/lib/rancid/.cloginrc Add following at minimum: add user * add password * add method * ssh add noenable * {1} ******This disables the enable when using radius etc ******* Grant permissions for rancid: sudo chown rancid /var/lib/rancid/.cloginrc sudo chmod 600 /var/lib/rancid/.cloginrc Test config: sudo /usr/lib/rancid/bin/clogin -f /var/lib/rancid/.cloginrc NOTE: IF you run into a 'diffie-hellmen' kind of error, then it is because your Linux distro is using newer encryption methods etc. This is basically just letting you know that the device you tested on is running an outdated encryption type. I recommend updating downstream device if able. If not, the following should fix: sudo vi /etc/ssh/ssh_config Add: KexAlgorithms diffie-hellman-group1-sha1 Re-try logging into your device again Upon success, run rancid: sudo su -c /var/lib/rancid/bin/rancid-run -s /bin/bash -l rancid Ensure your configs pulled: sudo su - rancid cd librenms/configs/ ls Make sure your config files are there :-) sudo usermod -a -G rancid librenms Add Rancid into LibreNMS config.php: ### Rancid $config [ 'rancid_configs' ][] = '/var/lib/rancid/librenms/configs/' ; $config [ 'rancid_repo_type' ] = 'svn' ; //'svn' or 'git' $config [ 'rancid_ignorecomments' ] = 0 ; Now restart apache sudo /etc/init.d/apache2 restart","title":"Rancid"},{"location":"Extensions/Rancid/#rancid","text":"Librenms can generate a list of hosts that can be monitored by RANCID. We assume you have currently a running Rancid, and you just need to create and update the file 'router.db'","title":"Rancid"},{"location":"Extensions/Rancid/#included-rancid-script","text":"To generate the config file (maybe even add a cron to schedule this). We've assumed a few locations for Rancid, the config file you want to call it and where LibreNMS is: cd /opt/librenms/scripts/ php ./gen_rancid.php > /the/path/where/is/rancid/core/router.db Sample cron: 15 0 * * * root cd /opt/librenms/scripts && php ./gen_rancid.php > /the/path/where/is/rancid/core/router.db Now configure LibreNMS (make sure you point dir to your rancid data directory): $config [ 'rancid_configs' ][ 'core' ] = '/the/path/where/is/rancid/core' ; $config [ 'rancid_ignorecomments' ] = 0 ; After that, you should see some \"config\" tab on routers that have a rancid update.","title":"Included Rancid script"},{"location":"Extensions/Rancid/#ubuntu-rancid-install","text":"The options shown below also contains the default values. NOTE - This is Only for Ubuntu 16.04 at this time, and may not work on other distros! sudo apt-get install rancid subversion Edit Rancid config file to use subversion or git instead of default cvs, and adds a group: sudo vi /etc/rancid/rancid.conf LIST_OF_GROUPS=\"librenms\" Now change these two lines: CVSROOT=$BASEDIR/CVS; export CVSROOT RCSSYS=cvs; export RCSSYS to: CVSROOT=$BASEDIR/SVN; export CVSROOT RCSSYS=svn; export RCSSYS NOTE - This only creates 1 group! You can of course make more when you get the hang of it, this is just a basic 'Need it to work\" deal. sudo su -c /var/lib/rancid/bin/rancid-cvs -s /bin/bash -l rancid NOTE - do NOT change cvs to svn here! Leave command as is! Get a list of devices from Librenms you can pull configs from: cd /opt/librenms/scripts sudo ./gen_rancid.php Copy the output. Replace all \":\" with \";\" example: alphcr1:cisco:up will change to: alphcr1;cisco;up copy and past results into the below file: sudo vi /var/lib/rancid/librenms/router.db NOTE - This ONLY applies to newer RANCID versions and Linux distros. Older versions will need to retain the : and not the ; Create/edit rancids login file: sudo vi /var/lib/rancid/.cloginrc Add following at minimum: add user * add password * add method * ssh add noenable * {1} ******This disables the enable when using radius etc ******* Grant permissions for rancid: sudo chown rancid /var/lib/rancid/.cloginrc sudo chmod 600 /var/lib/rancid/.cloginrc Test config: sudo /usr/lib/rancid/bin/clogin -f /var/lib/rancid/.cloginrc NOTE: IF you run into a 'diffie-hellmen' kind of error, then it is because your Linux distro is using newer encryption methods etc. This is basically just letting you know that the device you tested on is running an outdated encryption type. I recommend updating downstream device if able. If not, the following should fix: sudo vi /etc/ssh/ssh_config Add: KexAlgorithms diffie-hellman-group1-sha1 Re-try logging into your device again Upon success, run rancid: sudo su -c /var/lib/rancid/bin/rancid-run -s /bin/bash -l rancid Ensure your configs pulled: sudo su - rancid cd librenms/configs/ ls Make sure your config files are there :-) sudo usermod -a -G rancid librenms Add Rancid into LibreNMS config.php: ### Rancid $config [ 'rancid_configs' ][] = '/var/lib/rancid/librenms/configs/' ; $config [ 'rancid_repo_type' ] = 'svn' ; //'svn' or 'git' $config [ 'rancid_ignorecomments' ] = 0 ; Now restart apache sudo /etc/init.d/apache2 restart","title":"Ubuntu Rancid Install"},{"location":"Extensions/SNMP-Proxy/","text":"SNMP Proxy If you have machines that you want to monitor but are not reachable directly, you can use SNMPD Proxy . This will use the reachable SNMPD to proxy requests to the unreachable SNMPD. Example configuration We want to poll 'unreachable.example.com' via 'hereweare.example.com'. Use the following config: On 'hereweare.example.com': view all included .1 com2sec -Cn ctx_unreachable readonly unreachable access MyROGroup ctx_unreachable any noauth prefix all none none proxy -Cn ctx_unreachable -v 2c -c private unreachable.example.com .1.3 On 'unreachable.example.com': view all included .1 80 com2sec readonly private group MyROGroup v1 readonly group MyROGroup v2c readonly group MyROGroup usm readonly access MyROGroup \"\" any noauth exact all none none You can now poll community 'private' on 'unreachable.example.com' via community 'unreachable' on host 'hereweare.example.com'. Please note that requests on 'unreachable.example.com' will be coming from 'hereweare.example.com', not your poller.","title":"SNMP Proxy"},{"location":"Extensions/SNMP-Proxy/#snmp-proxy","text":"If you have machines that you want to monitor but are not reachable directly, you can use SNMPD Proxy . This will use the reachable SNMPD to proxy requests to the unreachable SNMPD.","title":"SNMP Proxy"},{"location":"Extensions/SNMP-Proxy/#example-configuration","text":"We want to poll 'unreachable.example.com' via 'hereweare.example.com'. Use the following config: On 'hereweare.example.com': view all included .1 com2sec -Cn ctx_unreachable readonly unreachable access MyROGroup ctx_unreachable any noauth prefix all none none proxy -Cn ctx_unreachable -v 2c -c private unreachable.example.com .1.3 On 'unreachable.example.com': view all included .1 80 com2sec readonly private group MyROGroup v1 readonly group MyROGroup v2c readonly group MyROGroup usm readonly access MyROGroup \"\" any noauth exact all none none You can now poll community 'private' on 'unreachable.example.com' via community 'unreachable' on host 'hereweare.example.com'. Please note that requests on 'unreachable.example.com' will be coming from 'hereweare.example.com', not your poller.","title":"Example configuration"},{"location":"Extensions/SNMP-Trap-Handler/","text":"SNMP trap handling Currently, LibreNMS supports a lot of trap handlers. You can check them on GitHub here . To add more see Adding new SNMP Trap handlers . Traps are handled via snmptrapd. snmptrapd is an SNMP application that receives and logs SNMP TRAP and INFORM messages. The default is to listen on UDP port 162 on all IPv4 interfaces. Since 162 is a privileged port, snmptrapd must typically be run as root. Configure snmptrapd Install snmptrapd via your package manager. For example (Debian based systems): sudo apt install snmptrapd -y In /etc/snmp/snmptrapd.conf , add : disableAuthorization yes authCommunity log,execute,net COMMUNITYSTRING traphandle default /opt/librenms/snmptrap.php To enable snmptrapd to properly parse traps, we will need to add MIBs to service. Option 1 Make the folder /etc/systemd/system/snmptrapd.service.d/ and edit the file /etc/systemd/system/snmptrapd.service.d/mibs.conf and add the following content. You may want to tweak to add vendor directories for devices you care about. In the example below, standard and cisco directories are defined, and only IF-MIB is loaded. [Service] Environment = MIBDIRS=+/opt/librenms/mibs:/opt/librenms/mibs/cisco Environment = MIBS=+IF-MIB For non-systemd systems, you can edit TRAPDOPTS in the init script in /etc/init.d/snmptrapd. TRAPDOPTS=\"-Lsd -M /opt/librenms/mibs -m IF-MIB -f -p $TRAPD_PID\" Along with any necessary configuration to receive the traps from your devices (community, etc.) Option 2 Tested on Ubuntu 18 Just set up your service like: [Unit] Description=Simple Network Management Protocol (SNMP) Trap Daemon. After=network.target ConditionPathExists=/etc/snmp/snmptrapd.conf [Service] Environment=\"MIBSDIR=/opt/librenms/mibs\" Type=simple ExecStart=/usr/sbin/snmptrapd -f -m IF-MIB -M /opt/librenms/mibs ExecReload=/bin/kill -HUP $MAINPID [Install] WantedBy=multi-user.target In Ubuntu 18 is service located by default in /etc/systemd/system/multi-user.target.wants/snmptrapd.service Here is a list of snmptrapd options: Option Description -a Ignore authenticationFailure traps. [OPTIONAL] -f Do not fork from the shell -n Use numeric addresses instead of attempting hostname lookups (no DNS) [OPTIONAL] -m MIBLIST: use MIBLIST ( FILE1-MIB:FILE2-MIB ). ALL = Load all MIBS in DIRLIST. (usually fails) -M DIRLIST: use DIRLIST as the list of locations to look for MIBs. Option is not recursive, so you need to specify each DIR individually, separated by : . (For example: /opt/librenms/mibs:/opt/librenms/mibs/cisco:/opt/librenms/mibs/edgecos) Good practice is to avoid -m ALL because then it will try to load all the MIBs in DIRLIST, which will typically fail (snmptrapd cannot load that many mibs). Better is to specify the exact MIB files defining the traps you are interested in, for example for LinkDown and LinkUp as well as BGP traps, use -m IF-MIB:BGP4-MIB . Multiple files can be added, separated with : . If you want to test or store original TRAPS in log then: Create a folder for storing traps for example in file traps.log sudo mkdir /var/log/snmptrap Add the following config to your snmptrapd.service after ExecStart=/usr/sbin/snmptrapd -f -m ALL -M /opt/librenms/mibs -tLf /var/log/snmptrap/traps.log On SELinux, you need to configure SELinux for SNMPd to communicate to LibreNMS: cat > snmptrap.te << EOF module snmptrap 1.0; require { type httpd_sys_rw_content_t; type snmpd_t; class file { append getattr open read }; class capability dac_override; } #============= snmpd_t ============== allow snmpd_t httpd_sys_rw_content_t:file { append getattr open read }; allow snmpd_t self:capability dac_override; EOF checkmodule -M -m -o snmptrap.mod snmptrap.te semodule_package -o snmptrap.pp -m snmptrap.mod semodule -i snmptrap.pp After successfully configuring the service, reload service files, enable, and start the snmptrapd service: sudo systemctl daemon-reload sudo systemctl enable snmptrapd sudo systemctl restart snmptrapd Testing The easiest test is to generate a trap from your device. Usually, changing the configuration on a network device, or plugging/unplugging a network cable (LinkUp, LinkDown) will generate a trap. You can confirm it using a with tcpdump , tshark or wireshark . You can also generate a trap using the snmptrap command from the LibreNMS server itself (if and only if the LibreNMS server is monitored). How to send SNMP v2 Trap The command below takes the form of: snmptrap -v -c Using OID's: snmptrap -v 2c -c public localhost '' 1.3.6.1.4.1.8072.2.3.0.1 1.3.6.1.4.1.8072.2.3.2.1 i 123456 If you have configured logging of traps to /var/log/snmptrap/traps.log then you will see in traps.log new entry: 2020-03-09 16:22:59 localhost [UDP: [127.0.0.1]:58942->[127.0.0.1]:162]: SNMPv2-MIB::sysUpTime.0 = Timeticks: (149721964) 17 days, 7:53:39.64 SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-SMI::enterprises.8072.2.3.0.1 SNMPv2-SMI::enterprises.8072.2.3.2.1 = INTEGER: 123456 and in LibreNMS your localhost device eventlog like: 2020-03-09 16:22:59 SNMP trap received: SNMPv2-SMI::enterprises.8072.2.3.0.1 Why we need Uptime When you send a trap, it must of course conform to a set of standards. Every trap needs an uptime value. Uptime is how long the system has been running since boot. Sometimes this is the operating system, other devices might use the SNMP engine uptime. Regardless, a value will be sent. So what value should you type in the commands below? Oddly enough, simply supplying no value by using two single quotes '' will instruct the command to obtain the value from the operating system you are executing this on. Event logging You can configure generic event logging for snmp traps. This will log an event of the type trap for received traps. These events can be used for alerting. By default, only the TrapOID is logged. But you can enable the \"detailed\" variant, and all the data received with the trap will be logged. The parameter can be found in General Settings / External / SNMP Traps Integration. It can also be configured in your config. external/snmptrapd lnms config:set snmptraps.eventlog 'unhandled' lnms config:set snmptraps.eventlog_detailed false Valid options are: unhandled only unhandled traps will be logged (default value) all log all traps none no traps will create a generic event log (handled traps may still log events)","title":"SNMP Trap Handler"},{"location":"Extensions/SNMP-Trap-Handler/#snmp-trap-handling","text":"Currently, LibreNMS supports a lot of trap handlers. You can check them on GitHub here . To add more see Adding new SNMP Trap handlers . Traps are handled via snmptrapd. snmptrapd is an SNMP application that receives and logs SNMP TRAP and INFORM messages. The default is to listen on UDP port 162 on all IPv4 interfaces. Since 162 is a privileged port, snmptrapd must typically be run as root.","title":"SNMP trap handling"},{"location":"Extensions/SNMP-Trap-Handler/#configure-snmptrapd","text":"Install snmptrapd via your package manager. For example (Debian based systems): sudo apt install snmptrapd -y In /etc/snmp/snmptrapd.conf , add : disableAuthorization yes authCommunity log,execute,net COMMUNITYSTRING traphandle default /opt/librenms/snmptrap.php To enable snmptrapd to properly parse traps, we will need to add MIBs to service.","title":"Configure snmptrapd"},{"location":"Extensions/SNMP-Trap-Handler/#option-1","text":"Make the folder /etc/systemd/system/snmptrapd.service.d/ and edit the file /etc/systemd/system/snmptrapd.service.d/mibs.conf and add the following content. You may want to tweak to add vendor directories for devices you care about. In the example below, standard and cisco directories are defined, and only IF-MIB is loaded. [Service] Environment = MIBDIRS=+/opt/librenms/mibs:/opt/librenms/mibs/cisco Environment = MIBS=+IF-MIB For non-systemd systems, you can edit TRAPDOPTS in the init script in /etc/init.d/snmptrapd. TRAPDOPTS=\"-Lsd -M /opt/librenms/mibs -m IF-MIB -f -p $TRAPD_PID\" Along with any necessary configuration to receive the traps from your devices (community, etc.)","title":"Option 1"},{"location":"Extensions/SNMP-Trap-Handler/#option-2","text":"Tested on Ubuntu 18 Just set up your service like: [Unit] Description=Simple Network Management Protocol (SNMP) Trap Daemon. After=network.target ConditionPathExists=/etc/snmp/snmptrapd.conf [Service] Environment=\"MIBSDIR=/opt/librenms/mibs\" Type=simple ExecStart=/usr/sbin/snmptrapd -f -m IF-MIB -M /opt/librenms/mibs ExecReload=/bin/kill -HUP $MAINPID [Install] WantedBy=multi-user.target In Ubuntu 18 is service located by default in /etc/systemd/system/multi-user.target.wants/snmptrapd.service Here is a list of snmptrapd options: Option Description -a Ignore authenticationFailure traps. [OPTIONAL] -f Do not fork from the shell -n Use numeric addresses instead of attempting hostname lookups (no DNS) [OPTIONAL] -m MIBLIST: use MIBLIST ( FILE1-MIB:FILE2-MIB ). ALL = Load all MIBS in DIRLIST. (usually fails) -M DIRLIST: use DIRLIST as the list of locations to look for MIBs. Option is not recursive, so you need to specify each DIR individually, separated by : . (For example: /opt/librenms/mibs:/opt/librenms/mibs/cisco:/opt/librenms/mibs/edgecos) Good practice is to avoid -m ALL because then it will try to load all the MIBs in DIRLIST, which will typically fail (snmptrapd cannot load that many mibs). Better is to specify the exact MIB files defining the traps you are interested in, for example for LinkDown and LinkUp as well as BGP traps, use -m IF-MIB:BGP4-MIB . Multiple files can be added, separated with : . If you want to test or store original TRAPS in log then: Create a folder for storing traps for example in file traps.log sudo mkdir /var/log/snmptrap Add the following config to your snmptrapd.service after ExecStart=/usr/sbin/snmptrapd -f -m ALL -M /opt/librenms/mibs -tLf /var/log/snmptrap/traps.log On SELinux, you need to configure SELinux for SNMPd to communicate to LibreNMS: cat > snmptrap.te << EOF module snmptrap 1.0; require { type httpd_sys_rw_content_t; type snmpd_t; class file { append getattr open read }; class capability dac_override; } #============= snmpd_t ============== allow snmpd_t httpd_sys_rw_content_t:file { append getattr open read }; allow snmpd_t self:capability dac_override; EOF checkmodule -M -m -o snmptrap.mod snmptrap.te semodule_package -o snmptrap.pp -m snmptrap.mod semodule -i snmptrap.pp After successfully configuring the service, reload service files, enable, and start the snmptrapd service: sudo systemctl daemon-reload sudo systemctl enable snmptrapd sudo systemctl restart snmptrapd","title":"Option 2"},{"location":"Extensions/SNMP-Trap-Handler/#testing","text":"The easiest test is to generate a trap from your device. Usually, changing the configuration on a network device, or plugging/unplugging a network cable (LinkUp, LinkDown) will generate a trap. You can confirm it using a with tcpdump , tshark or wireshark . You can also generate a trap using the snmptrap command from the LibreNMS server itself (if and only if the LibreNMS server is monitored).","title":"Testing"},{"location":"Extensions/SNMP-Trap-Handler/#how-to-send-snmp-v2-trap","text":"The command below takes the form of: snmptrap -v -c Using OID's: snmptrap -v 2c -c public localhost '' 1.3.6.1.4.1.8072.2.3.0.1 1.3.6.1.4.1.8072.2.3.2.1 i 123456 If you have configured logging of traps to /var/log/snmptrap/traps.log then you will see in traps.log new entry: 2020-03-09 16:22:59 localhost [UDP: [127.0.0.1]:58942->[127.0.0.1]:162]: SNMPv2-MIB::sysUpTime.0 = Timeticks: (149721964) 17 days, 7:53:39.64 SNMPv2-MIB::snmpTrapOID.0 = OID: SNMPv2-SMI::enterprises.8072.2.3.0.1 SNMPv2-SMI::enterprises.8072.2.3.2.1 = INTEGER: 123456 and in LibreNMS your localhost device eventlog like: 2020-03-09 16:22:59 SNMP trap received: SNMPv2-SMI::enterprises.8072.2.3.0.1","title":"How to send SNMP v2 Trap"},{"location":"Extensions/SNMP-Trap-Handler/#why-we-need-uptime","text":"When you send a trap, it must of course conform to a set of standards. Every trap needs an uptime value. Uptime is how long the system has been running since boot. Sometimes this is the operating system, other devices might use the SNMP engine uptime. Regardless, a value will be sent. So what value should you type in the commands below? Oddly enough, simply supplying no value by using two single quotes '' will instruct the command to obtain the value from the operating system you are executing this on.","title":"Why we need Uptime"},{"location":"Extensions/SNMP-Trap-Handler/#event-logging","text":"You can configure generic event logging for snmp traps. This will log an event of the type trap for received traps. These events can be used for alerting. By default, only the TrapOID is logged. But you can enable the \"detailed\" variant, and all the data received with the trap will be logged. The parameter can be found in General Settings / External / SNMP Traps Integration. It can also be configured in your config. external/snmptrapd lnms config:set snmptraps.eventlog 'unhandled' lnms config:set snmptraps.eventlog_detailed false Valid options are: unhandled only unhandled traps will be logged (default value) all log all traps none no traps will create a generic event log (handled traps may still log events)","title":"Event logging"},{"location":"Extensions/Services/","text":"Nagios Plugins - Services Services within LibreNMS provides the ability to leverage Nagios plugins to perform additional monitoring outside of SNMP. Services can also be used in conjunction with your SNMP monitoring for larger monitoring functionality. Setting up Services Services must be tied to a device to function properly. A good generic option is to use localhost , but it is suggested to attach the check to the device you are monitoring. Nagios plugins source Plugins come from two main sources: monitoring-plugins pkg-nagios-plugins-contrib Note: Plugins will only load if they are prefixed with check_ . The check_ prefix is stripped out when displaying in the \"Add Service\" GUI \"Type\" dropdown list. Service Templates Service Templates within LibreNMS provides the same ability as Nagios does with Host Groups. Known as Device Groups in LibreNMS. They are applied devices that belong to the specified Device Group. Use the Apply buttons to manually create or update Services for the Service Template. Use the Remove buttons to manually remove Services for the Service Template. After you Edit a Service Template, and then use Apply, all relevant changes are pushed to existing Services previously created. You can also enable Service Templates Auto Discovery to have Services added / removed / updated on regular discover intervals. When a Device is a member of multiple Device Groups, templates from all of those Device Groups are applied. If a Device is added or removed from a Device Group, when the Apply button is used or Auto Discovery runs Services will be added / removed as appropriate. Service Templates are tied into Device Groups, you need at least one Device Group to be able to add Service Templates - You can define a dummy one. The Device Group does not need members to add Service Templates. Service Auto Discovery To automatically create services for devices with available checks. You need to enable the discover services within config.php with the following: $config [ 'discover_services' ] = true ; Service Templates Auto Discovery To automatically create services for devices with configured Service Templates. You need to enable the discover services within config.php with the following: $config [ 'discover_services_templates' ] = true ; Setup Service checks are now distributable if you run a distributed setup. To leverage this, use the dispatch service. Alternatively, you could also replace check-services.php with services-wrapper.py in cron instead to run across all polling nodes. If you need to debug the output of services-wrapper.py then you can add -d to the end of the command - it is NOT recommended to do this in cron. Firstly, install Nagios plugins. Debian / Ubuntu: sudo apt install monitoring-plugins Centos: yum install nagios-plugins-all Note: The plugins are bundled with the pre-build VM and Docker images. Next, you need to enable the services within config.php with the following: $config [ 'show_services' ] = 1 ; This will enable a new service menu within your navbar. Debian/Ubuntu: $config [ 'nagios_plugins' ] = \"/usr/lib/nagios/plugins\" ; Centos: $config [ 'nagios_plugins' ] = \"/usr/lib64/nagios/plugins\" ; This will point LibreNMS at the location of the nagios plugins - please ensure that any plugins you use are set to executable. For example: Debian/Ubuntu: chmod +x /usr/lib/nagios/plugins/* Centos: chmod +x /usr/lib64/nagios/plugins/* Finally, you now need to add services-wrapper.py to the current cron file (/etc/cron.d/librenms typically) like: */5 * * * * librenms /opt/librenms/services-wrapper.py 1 Now you can add services via the main Services link in the navbar, or via the 'Add Service' link within the device, services page. Note that some services (procs, inodes, load and similar) will always poll the local LibreNMS server it's running on, regardless of which device you add it to. Performance data By default, the check-services script will collect all performance data that the Nagios script returns and display each datasource on a separate graph. LibreNMS expects scripts to return using Nagios convention for the response message structure: AEN200 However for some modules it would be better if some of this information was consolidated on a single graph. An example is the ICMP check. This check returns: Round Trip Average (rta), Round Trip Min (rtmin) and Round Trip Max (rtmax). These have been combined onto a single graph. If you find a check script that would benefit from having some datasources graphed together, please log an issue on GitHub with the debug information from the script, and let us know which DS's should go together. Example below: ./check-services.php -d -- snip -- Nagios Service - 26 Request: /usr/lib/nagios/plugins/check_icmp localhost Perf Data - DS: rta, Value: 0.016, UOM: ms Perf Data - DS: pl, Value: 0, UOM: % Perf Data - DS: rtmax, Value: 0.044, UOM: ms Perf Data - DS: rtmin, Value: 0.009, UOM: ms Response: OK - localhost: rta 0.016ms, lost 0% Service DS: { \"rta\": \"ms\", \"pl\": \"%\", \"rtmax\": \"ms\", \"rtmin\": \"ms\" } OK u:0.00 s:0.00 r:40.67 RRD[update /opt/librenms/rrd/localhost/services-26.rrd N:0.016:0:0.044:0.009] -- snip -- Alerting Services uses the Nagios Alerting scheme where exit code: 0 = Ok, 1 = Warning, 2 = Critical, To create an alerting rule to alert on service=critical, your alerting rule would look like: %services.service_status = \"2\" Debug Change user to librenms for example su - librenms then you can run the following command to help troubleshoot services. ./check-services.php -d Related Polling / Discovery Options These settings are related and should be investigated and set accordingly. The below values are not defaults or recommended. $config [ 'service_poller_enabled' ] = true ; $config [ 'service_poller_workers' ] = 16 ; $config [ 'service_poller_frequency' ] = 300 ; $config [ 'service_poller_down_retry' ] = 5 ; $config [ 'service_discovery_enabled' ] = true ; $config [ 'service_discovery_workers' ] = 16 ; $config [ 'service_discovery_frequency' ] = 3600 ; $config [ 'service_services_enabled' ] = true ; $config [ 'service_services_workers' ] = 16 ; $config [ 'service_services_frequency' ] = 60 ; Service checks polling logic Service check is skipped when the associated device is not pingable, and an appropriate entry is populated in the event log. Service check is polled if it's IP address parameter is not equal to associated device's IP address, even when the associated device is not pingable. To override the default logic and always poll service checks, you can disable ICMP testing for any device by switching Disable ICMP Test setting (Edit -> Misc) to ON. Service checks will never be polled on disabled devices. CHECK_MRPE In most cases, only Nagios plugins that run against a remote host with the -H option are available as services. However, if you're remote host is running the Check_MK agent you may be able to use MRPE to monitor Nagios plugins that only execute locally as services. For example, consider the fairly common check_cpu.sh Nagios plugin. If you added.. cpu_check /usr/lib/nagios/plugins/check_cpu.sh -c 95 -w 75 ...to /etc/check_mk/mrpe.cfg on your remote host, you should be able to check its output by configuring a service using the check_mrpe script. Add check_mrpe to the Nagios plugins directory on your LibreNMS server and make it executable. In LibreNMS, add a new service to the desired device with the type mrpe. Enter the IP address of the remote host and in parameters enter -a cpu_check (this should match the name used at the beginning of the line in the mrpe.cfg file).","title":"Nagios Plugins"},{"location":"Extensions/Services/#nagios-plugins-services","text":"Services within LibreNMS provides the ability to leverage Nagios plugins to perform additional monitoring outside of SNMP. Services can also be used in conjunction with your SNMP monitoring for larger monitoring functionality.","title":"Nagios Plugins - Services"},{"location":"Extensions/Services/#setting-up-services","text":"Services must be tied to a device to function properly. A good generic option is to use localhost , but it is suggested to attach the check to the device you are monitoring.","title":"Setting up Services"},{"location":"Extensions/Services/#nagios-plugins-source","text":"Plugins come from two main sources: monitoring-plugins pkg-nagios-plugins-contrib Note: Plugins will only load if they are prefixed with check_ . The check_ prefix is stripped out when displaying in the \"Add Service\" GUI \"Type\" dropdown list.","title":"Nagios plugins source"},{"location":"Extensions/Services/#service-templates","text":"Service Templates within LibreNMS provides the same ability as Nagios does with Host Groups. Known as Device Groups in LibreNMS. They are applied devices that belong to the specified Device Group. Use the Apply buttons to manually create or update Services for the Service Template. Use the Remove buttons to manually remove Services for the Service Template. After you Edit a Service Template, and then use Apply, all relevant changes are pushed to existing Services previously created. You can also enable Service Templates Auto Discovery to have Services added / removed / updated on regular discover intervals. When a Device is a member of multiple Device Groups, templates from all of those Device Groups are applied. If a Device is added or removed from a Device Group, when the Apply button is used or Auto Discovery runs Services will be added / removed as appropriate. Service Templates are tied into Device Groups, you need at least one Device Group to be able to add Service Templates - You can define a dummy one. The Device Group does not need members to add Service Templates.","title":"Service Templates"},{"location":"Extensions/Services/#service-auto-discovery","text":"To automatically create services for devices with available checks. You need to enable the discover services within config.php with the following: $config [ 'discover_services' ] = true ;","title":"Service Auto Discovery"},{"location":"Extensions/Services/#service-templates-auto-discovery","text":"To automatically create services for devices with configured Service Templates. You need to enable the discover services within config.php with the following: $config [ 'discover_services_templates' ] = true ;","title":"Service Templates Auto Discovery"},{"location":"Extensions/Services/#setup","text":"Service checks are now distributable if you run a distributed setup. To leverage this, use the dispatch service. Alternatively, you could also replace check-services.php with services-wrapper.py in cron instead to run across all polling nodes. If you need to debug the output of services-wrapper.py then you can add -d to the end of the command - it is NOT recommended to do this in cron. Firstly, install Nagios plugins. Debian / Ubuntu: sudo apt install monitoring-plugins Centos: yum install nagios-plugins-all Note: The plugins are bundled with the pre-build VM and Docker images. Next, you need to enable the services within config.php with the following: $config [ 'show_services' ] = 1 ; This will enable a new service menu within your navbar. Debian/Ubuntu: $config [ 'nagios_plugins' ] = \"/usr/lib/nagios/plugins\" ; Centos: $config [ 'nagios_plugins' ] = \"/usr/lib64/nagios/plugins\" ; This will point LibreNMS at the location of the nagios plugins - please ensure that any plugins you use are set to executable. For example: Debian/Ubuntu: chmod +x /usr/lib/nagios/plugins/* Centos: chmod +x /usr/lib64/nagios/plugins/* Finally, you now need to add services-wrapper.py to the current cron file (/etc/cron.d/librenms typically) like: */5 * * * * librenms /opt/librenms/services-wrapper.py 1 Now you can add services via the main Services link in the navbar, or via the 'Add Service' link within the device, services page. Note that some services (procs, inodes, load and similar) will always poll the local LibreNMS server it's running on, regardless of which device you add it to.","title":"Setup"},{"location":"Extensions/Services/#performance-data","text":"By default, the check-services script will collect all performance data that the Nagios script returns and display each datasource on a separate graph. LibreNMS expects scripts to return using Nagios convention for the response message structure: AEN200 However for some modules it would be better if some of this information was consolidated on a single graph. An example is the ICMP check. This check returns: Round Trip Average (rta), Round Trip Min (rtmin) and Round Trip Max (rtmax). These have been combined onto a single graph. If you find a check script that would benefit from having some datasources graphed together, please log an issue on GitHub with the debug information from the script, and let us know which DS's should go together. Example below: ./check-services.php -d -- snip -- Nagios Service - 26 Request: /usr/lib/nagios/plugins/check_icmp localhost Perf Data - DS: rta, Value: 0.016, UOM: ms Perf Data - DS: pl, Value: 0, UOM: % Perf Data - DS: rtmax, Value: 0.044, UOM: ms Perf Data - DS: rtmin, Value: 0.009, UOM: ms Response: OK - localhost: rta 0.016ms, lost 0% Service DS: { \"rta\": \"ms\", \"pl\": \"%\", \"rtmax\": \"ms\", \"rtmin\": \"ms\" } OK u:0.00 s:0.00 r:40.67 RRD[update /opt/librenms/rrd/localhost/services-26.rrd N:0.016:0:0.044:0.009] -- snip --","title":"Performance data"},{"location":"Extensions/Services/#alerting","text":"Services uses the Nagios Alerting scheme where exit code: 0 = Ok, 1 = Warning, 2 = Critical, To create an alerting rule to alert on service=critical, your alerting rule would look like: %services.service_status = \"2\"","title":"Alerting"},{"location":"Extensions/Services/#debug","text":"Change user to librenms for example su - librenms then you can run the following command to help troubleshoot services. ./check-services.php -d","title":"Debug"},{"location":"Extensions/Services/#related-polling-discovery-options","text":"These settings are related and should be investigated and set accordingly. The below values are not defaults or recommended. $config [ 'service_poller_enabled' ] = true ; $config [ 'service_poller_workers' ] = 16 ; $config [ 'service_poller_frequency' ] = 300 ; $config [ 'service_poller_down_retry' ] = 5 ; $config [ 'service_discovery_enabled' ] = true ; $config [ 'service_discovery_workers' ] = 16 ; $config [ 'service_discovery_frequency' ] = 3600 ; $config [ 'service_services_enabled' ] = true ; $config [ 'service_services_workers' ] = 16 ; $config [ 'service_services_frequency' ] = 60 ;","title":"Related Polling / Discovery Options"},{"location":"Extensions/Services/#service-checks-polling-logic","text":"Service check is skipped when the associated device is not pingable, and an appropriate entry is populated in the event log. Service check is polled if it's IP address parameter is not equal to associated device's IP address, even when the associated device is not pingable. To override the default logic and always poll service checks, you can disable ICMP testing for any device by switching Disable ICMP Test setting (Edit -> Misc) to ON. Service checks will never be polled on disabled devices.","title":"Service checks polling logic"},{"location":"Extensions/Services/#check_mrpe","text":"In most cases, only Nagios plugins that run against a remote host with the -H option are available as services. However, if you're remote host is running the Check_MK agent you may be able to use MRPE to monitor Nagios plugins that only execute locally as services. For example, consider the fairly common check_cpu.sh Nagios plugin. If you added.. cpu_check /usr/lib/nagios/plugins/check_cpu.sh -c 95 -w 75 ...to /etc/check_mk/mrpe.cfg on your remote host, you should be able to check its output by configuring a service using the check_mrpe script. Add check_mrpe to the Nagios plugins directory on your LibreNMS server and make it executable. In LibreNMS, add a new service to the desired device with the type mrpe. Enter the IP address of the remote host and in parameters enter -a cpu_check (this should match the name used at the beginning of the line in the mrpe.cfg file).","title":"CHECK_MRPE"},{"location":"Extensions/Smokeping/","text":"Smokeping integration SmokePing is a tool which lets us keep track of network latency, and visualise this through RRD graphs. LibreNMS has support for both new and pre-existing SmokePing installations. For new installations, we can use the lnms cli to generate a Smokeping configuration file. Pre-Existing Smokeping Installation If you have an existing smokeping server, follow the instructions, you only need to look at Configure LibreNMS - All Operating Systems . New Installation All installation steps assume a clean configuration - if you have an existing smokeping setup, you'll need to adapt these steps somewhat. Install and integrate Smokeping Backend - RHEL, CentOS and alike Smokeping is available via EPEL, which if you're running LibreNMS, you probably already have. If you want to do something like run Smokeping on a seperate host and ship data via RRCached though, here's the install command: sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm sudo yum install smokeping Once installed, you should need a cron script installed to make sure that the configuration file is updated. You can find an example in misc/librenms-smokeping-rhel.example . Put this into /etc/cron.d/hourly, and mark it executable: sudo cp /opt/librenms/misc/smokeping-rhel.example /etc/cron.hourly/librenms-smokeping sudo chmod +x /etc/cron.hourly/librenms-smokeping Finally, update the default configuration. Strip everything from the *** Probes *** and *** Targets *** stanza's, and replace with: *** Probes *** @include /etc/smokeping/librenms-probes.conf *** Targets *** probe = FPing menu = Top title = Network Latency Grapher remark = Welcome to the SmokePing website of Insert Company Name Here. \\ Here you will learn all about the latency of our network. @include /etc/smokeping/librenms-targets.conf Note there may be other stanza's (possibly *** Slaves *** ) between the *** Probes *** and *** Targets *** stanza's - leave these intact. Leave everything else untouched. If you need to add other configuration, make sure it comes after the LibreNMS configuration, and keep in mind that Smokeping does not allow duplicate modules, and cares about the configuration file sequence. Once you're happy, manually kick off the cron once, then enable and start smokeping: sudo /etc/cron.hourly/librenms-smokeping sudo systemctl enable --now smokeping Install and integrate Smokeping Backend - Ubuntu, Debian and alike Smokeping is available via the default repositories. sudo apt-get install smokeping Once installed, you should need a cron script installed to make sure that the configuration file is updated. You can find an example in misc/librenms-smokeping-debian.example . Put this into /etc/cron.d/hourly, and mark it executable: sudo cp /opt/librenms/misc/smokeping-debian.example /etc/cron.hourly/librenms-smokeping sudo chmod +x /etc/cron.hourly/librenms-smokeping Finally, update the default configuration. Strip everything from /etc/smokeping/config.d/Probes and replace with: *** Probes *** @include /etc/smokeping/config.d/librenms-probes.conf Strip everything from /etc/smokeping/config.d/Targets and replace with: *** Targets *** probe = FPing menu = Top title = Network Latency Grapher remark = Welcome to the SmokePing website of Insert Company Name Here. \\ Here you will learn all about the latency of our network. @include /etc/smokeping/config.d/librenms-targets.conf Leave everything else untouched. If you need to add other configuration, make sure it comes after the LibreNMS configuration, and keep in mind that Smokeping does not allow duplicate modules, and cares about the configuration file sequence. Configure LibreNMS - All Operating Systems external/smokeping lnms config:set smokeping.dir '/var/lib/smokeping' lnms config:set smokeping.pings 20 lnms config:set smokeping.probes 2 lnms config:set smokeping.integration true lnms config:set smokeping.url 'smokeping/' dir should match the location that smokeping writes RRD's to pings should match the default smokeping value, default 20 probes should be the number of processes to spread pings over, default 2 These settings can also be set in the Web UI. Configure Smokeping's Web UI - Optional This section covers the required configuration for your web server of choice. This covers the required configuration for either Apache or Nginx. LibreNMS does not need the Web UI - you can find the graphs in LibreNMS on the latency tab. Apache Configuration - Ubuntu, Debian and alike Edit the General configuration file's Owner and contact , and cgiurl hostname details: nano /etc/smokeping/config.d/General owner = LibreNMS-Admin contact = admin@ACME.xxx cgiurl = http://yourlibrenms/cgi-bin/smokeping.cgi Smokeping should automatically install an Apache configuration file in /etc/apache2/conf-available/ . Verify this using : librenms@librenms:~/scripts$ ls /etc/apache2/conf-available/ | grep smokeping smokeping.conf If you don't see smokeping.conf listed, you'll need to create a symlink for it: ln -s /etc/smokeping/apache2.conf /etc/apache2/conf-available/smokeping.conf After creating the symlink, restart Apache with sudo systemctl apache2 restart You should be able to load the Smokeping web interface at http://yourhost/cgi-bin/smokeping.cgi Nginx Configuration - RHEL, CentOS and alike This section assumes you have configured LibreNMS with Nginx as specified in Configure Nginx . Note, you need to install fcgiwrap for CGI wrapper interact with Nginx yum install fcgiwrap Then create a new configuration file for fcgiwrap in /etc/nginx/fcgiwrap.conf # Include this file on your nginx.conf to support debian cgi-bin scripts using # fcgiwrap location /cgi-bin/ { # Disable gzip (it makes scripts feel slower since they have to complete # before getting gzipped) gzip off; # Set the root to /usr/lib (inside this location this means that we are # giving access to the files under /usr/lib/cgi-bin) #root /usr/lib; root /usr/share/nginx; # Fastcgi socket fastcgi_pass unix:/var/run/fcgiwrap.socket; # Fastcgi parameters, include the standard ones include /etc/nginx/fastcgi_params; # Adjust non standard parameters (SCRIPT_FILENAME) fastcgi_param SCRIPT_FILENAME /usr/lib$fastcgi_script_name; } Be sure to create the folder cgi-bin folder with required permissions (755) mkdir /usr/share/nginx/cgi-bin Create fcgiwrap systemd service in /usr/lib/systemd/system/fcgiwrap.service # create new [Unit] Description=Simple CGI Server After=nss-user-lookup.target Requires=fcgiwrap.socket [Service] EnvironmentFile=/etc/sysconfig/fcgiwrap ExecStart=/usr/sbin/fcgiwrap ${DAEMON_OPTS} -c ${DAEMON_PROCS} User=librenms Group=librenms [Install] Also=fcgiwrap.socket The socket file in /usr/lib/systemd/system/fcgiwrap.socket # create new [Unit] Description=fcgiwrap Socket [Socket] ListenStream=/var/run/fcgiwrap.socket [Install] WantedBy=sockets.target Enable fcgiwrap systemctl enable --now fcgiwrap Add the following configuration to your /etc/nginx/conf.d/librenms.conf file within server section. The following will configure Nginx to respond to http://yourlibrenms/smokeping : location = /smokeping/ { fastcgi_intercept_errors on; fastcgi_param SCRIPT_FILENAME /usr/share/smokeping/cgi/smokeping.fcgi; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_param HTTPS $https if_not_empty; fastcgi_pass unix:/var/run/fcgiwrap.socket; } location ^~ /smokeping/ { alias /usr/share/smokeping/cgi/; index smokeping.fcgi; gzip off; } If images/js/css don't load, you might have to add location ^~ /smokeping/css { alias /usr/share/smokeping/htdocs/css/; gzip off; } location ^~ /smokeping/js { alias /usr/share/smokeping/htdocs/js/; gzip off; } location ^~ /smokeping/images { alias /opt/librenms/rrd/smokeping/images; gzip off; } After saving the configuration file, verify your Nginx configuration file syntax is OK with sudo nginx -t , then restart Nginx with sudo systemctl restart nginx You should be able to load the Smokeping web interface at http://yourlibrenms/smokeping Nginx Configuration - Ubuntu, Debian and alike This section assumes you have configured LibreNMS with Nginx as specified in Configure Nginx . Note, you need to install fcgiwrap for CGI wrapper interact with Nginx apt install fcgiwrap Then configure Nginx with the default configuration cp /usr/share/doc/fcgiwrap/examples/nginx.conf /etc/nginx/fcgiwrap.conf Add the following configuration to your /etc/nginx/conf.d/librenms.conf file within server section. The following will configure Nginx to respond to http://yourlibrenms/smokeping : # Browsing to `http://yourlibrenms/smokeping/` should bring up the smokeping web interface location = /smokeping/ { fastcgi_intercept_errors on; fastcgi_param SCRIPT_FILENAME /usr/lib/cgi-bin/smokeping.cgi; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_param HTTPS $https if_not_empty; fastcgi_pass unix:/var/run/fcgiwrap.socket; } location ^~ /smokeping/ { alias /usr/share/smokeping/www/; index smokeping.cgi; gzip off; } After saving the configuration file, verify your Nginx configuration file syntax is OK with sudo nginx -t , then restart Nginx with sudo systemctl restart nginx You should be able to load the Smokeping web interface at http://yourlibrenms/smokeping Nginx Password Authentication You can use the purpose-made htpasswd utility included in the apache2-utils package (Nginx password files use the same format as Apache). You can install it on Ubuntu with apt install apache2-utils After that you need to create password for your user htpasswd -c /etc/nginx/.htpasswd USER You can verify your user and password with cat /etc/nginx/.htpasswd Then you just need to add to your config auth_basic parameters location ^~ /smokeping/ { alias /usr/share/smokeping/www/; index smokeping.cgi; gzip off; auth_basic \"Private Property\"; auth_basic_user_file /etc/nginx/.htpasswd; } Common Problems RRDs::update ERROR: opening ... Permission denied There is a problem writing to the RRD directory. This is somewhat out of scope of LibreNMS, but make sure that file permissions and SELinux labels allow the smokeping user to write to the directory. If you're using RRDCacheD, make sure that the permissions are correct there too, and that if you're using -B that the smokeping RRD's are inside the base directory; update the smokeping rrd directory if required. It's not recommended to run RRDCachedD without the -B switch. Share RRDCached with LibreNMS Move the RRD's and give smokeping access rights to the LibreNMS RRD directory: sudo systemctl stop smokeping sudo mv /var/lib/smokeping /opt/librenms/rrd/ sudo usermod -a -G librenms smokeping Update data directory in /etc/smokeping : datadir = /opt/librenms/rrd/smokeping dyndir = /opt/librenms/rrd/smokeping/__cgi If you have SELinux on, see next section before starting smokeping. Finally restart the smokeping service: sudo systemctl start smokeping Remember to update your config with the new locations. Configure SELinux to allow smokeping to write in LibreNMS directory on Centos / RHEL If you are using RRDCached with the -B switch and smokeping RRD's inside the LibreNMS RRD base directory, you can install this SELinux profile: cat > smokeping_librenms.te << EOF module smokeping_librenms 1.0; require { type httpd_t; type smokeping_t; type smokeping_var_lib_t; type var_run_t; type httpd_sys_rw_content_t; class dir { add_name create getattr read remove_name search write }; class file { create getattr ioctl lock open read rename setattr unlink write }; } #============= httpd_t ============== allow httpd_t smokeping_var_lib_t:dir read; allow httpd_t var_run_t:file { read write }; #============= smokeping_t ============== allow smokeping_t httpd_sys_rw_content_t:dir { add_name create getattr remove_name search write }; allow smokeping_t httpd_sys_rw_content_t:file { create getattr ioctl lock open read rename setattr unlink write }; EOF checkmodule -M -m -o smokeping_librenms.mod smokeping_librenms.te semodule_package -o smokeping_librenms.pp -m smokeping_librenms.mod semodule -i smokeping_librenms.pp Probe FPing missing missing from the probes section Take a look at the instructions again - something isn't correct in your configuration. Section or variable already exists Most likely, content wasn't fully removed from the *** Probes *** *** Targets*** stanza's as instructed. If you're trying to integrate LibreNMS, smokeping and another source of configuration, you're probably trying to redefine a module (e.g. '+ FPing' more than once) or stanza. Otherwise, look again at the instructions. Mandatory variable 'probe' not defined The target block must have a default probe. If you follow the instructions you will have one. If you're trying to integrate LibreNMS, smokeping and another source of configuration, you need to make sure there are no duplicate or missing definitions. File '/usr/sbin/sendmail' does not exist` If you got this error at the end of the installation, simply edit or comment out the sendmail entry in the configuration: -sendmail = /usr/sbin/sendmail +#sendmail = /usr/sbin/sendmail","title":"Smokeping"},{"location":"Extensions/Smokeping/#smokeping-integration","text":"SmokePing is a tool which lets us keep track of network latency, and visualise this through RRD graphs. LibreNMS has support for both new and pre-existing SmokePing installations. For new installations, we can use the lnms cli to generate a Smokeping configuration file.","title":"Smokeping integration"},{"location":"Extensions/Smokeping/#pre-existing-smokeping-installation","text":"If you have an existing smokeping server, follow the instructions, you only need to look at Configure LibreNMS - All Operating Systems .","title":"Pre-Existing Smokeping Installation"},{"location":"Extensions/Smokeping/#new-installation","text":"All installation steps assume a clean configuration - if you have an existing smokeping setup, you'll need to adapt these steps somewhat.","title":"New Installation"},{"location":"Extensions/Smokeping/#install-and-integrate-smokeping-backend-rhel-centos-and-alike","text":"Smokeping is available via EPEL, which if you're running LibreNMS, you probably already have. If you want to do something like run Smokeping on a seperate host and ship data via RRCached though, here's the install command: sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm sudo yum install smokeping Once installed, you should need a cron script installed to make sure that the configuration file is updated. You can find an example in misc/librenms-smokeping-rhel.example . Put this into /etc/cron.d/hourly, and mark it executable: sudo cp /opt/librenms/misc/smokeping-rhel.example /etc/cron.hourly/librenms-smokeping sudo chmod +x /etc/cron.hourly/librenms-smokeping Finally, update the default configuration. Strip everything from the *** Probes *** and *** Targets *** stanza's, and replace with: *** Probes *** @include /etc/smokeping/librenms-probes.conf *** Targets *** probe = FPing menu = Top title = Network Latency Grapher remark = Welcome to the SmokePing website of Insert Company Name Here. \\ Here you will learn all about the latency of our network. @include /etc/smokeping/librenms-targets.conf Note there may be other stanza's (possibly *** Slaves *** ) between the *** Probes *** and *** Targets *** stanza's - leave these intact. Leave everything else untouched. If you need to add other configuration, make sure it comes after the LibreNMS configuration, and keep in mind that Smokeping does not allow duplicate modules, and cares about the configuration file sequence. Once you're happy, manually kick off the cron once, then enable and start smokeping: sudo /etc/cron.hourly/librenms-smokeping sudo systemctl enable --now smokeping","title":"Install and integrate Smokeping Backend - RHEL, CentOS and alike"},{"location":"Extensions/Smokeping/#install-and-integrate-smokeping-backend-ubuntu-debian-and-alike","text":"Smokeping is available via the default repositories. sudo apt-get install smokeping Once installed, you should need a cron script installed to make sure that the configuration file is updated. You can find an example in misc/librenms-smokeping-debian.example . Put this into /etc/cron.d/hourly, and mark it executable: sudo cp /opt/librenms/misc/smokeping-debian.example /etc/cron.hourly/librenms-smokeping sudo chmod +x /etc/cron.hourly/librenms-smokeping Finally, update the default configuration. Strip everything from /etc/smokeping/config.d/Probes and replace with: *** Probes *** @include /etc/smokeping/config.d/librenms-probes.conf Strip everything from /etc/smokeping/config.d/Targets and replace with: *** Targets *** probe = FPing menu = Top title = Network Latency Grapher remark = Welcome to the SmokePing website of Insert Company Name Here. \\ Here you will learn all about the latency of our network. @include /etc/smokeping/config.d/librenms-targets.conf Leave everything else untouched. If you need to add other configuration, make sure it comes after the LibreNMS configuration, and keep in mind that Smokeping does not allow duplicate modules, and cares about the configuration file sequence.","title":"Install and integrate Smokeping Backend - Ubuntu, Debian and alike"},{"location":"Extensions/Smokeping/#configure-librenms-all-operating-systems","text":"external/smokeping lnms config:set smokeping.dir '/var/lib/smokeping' lnms config:set smokeping.pings 20 lnms config:set smokeping.probes 2 lnms config:set smokeping.integration true lnms config:set smokeping.url 'smokeping/' dir should match the location that smokeping writes RRD's to pings should match the default smokeping value, default 20 probes should be the number of processes to spread pings over, default 2 These settings can also be set in the Web UI.","title":"Configure LibreNMS - All Operating Systems"},{"location":"Extensions/Smokeping/#configure-smokepings-web-ui-optional","text":"This section covers the required configuration for your web server of choice. This covers the required configuration for either Apache or Nginx. LibreNMS does not need the Web UI - you can find the graphs in LibreNMS on the latency tab.","title":"Configure Smokeping's Web UI - Optional"},{"location":"Extensions/Smokeping/#apache-configuration-ubuntu-debian-and-alike","text":"Edit the General configuration file's Owner and contact , and cgiurl hostname details: nano /etc/smokeping/config.d/General owner = LibreNMS-Admin contact = admin@ACME.xxx cgiurl = http://yourlibrenms/cgi-bin/smokeping.cgi Smokeping should automatically install an Apache configuration file in /etc/apache2/conf-available/ . Verify this using : librenms@librenms:~/scripts$ ls /etc/apache2/conf-available/ | grep smokeping smokeping.conf If you don't see smokeping.conf listed, you'll need to create a symlink for it: ln -s /etc/smokeping/apache2.conf /etc/apache2/conf-available/smokeping.conf After creating the symlink, restart Apache with sudo systemctl apache2 restart You should be able to load the Smokeping web interface at http://yourhost/cgi-bin/smokeping.cgi","title":"Apache Configuration - Ubuntu, Debian and alike"},{"location":"Extensions/Smokeping/#nginx-configuration-rhel-centos-and-alike","text":"This section assumes you have configured LibreNMS with Nginx as specified in Configure Nginx . Note, you need to install fcgiwrap for CGI wrapper interact with Nginx yum install fcgiwrap Then create a new configuration file for fcgiwrap in /etc/nginx/fcgiwrap.conf # Include this file on your nginx.conf to support debian cgi-bin scripts using # fcgiwrap location /cgi-bin/ { # Disable gzip (it makes scripts feel slower since they have to complete # before getting gzipped) gzip off; # Set the root to /usr/lib (inside this location this means that we are # giving access to the files under /usr/lib/cgi-bin) #root /usr/lib; root /usr/share/nginx; # Fastcgi socket fastcgi_pass unix:/var/run/fcgiwrap.socket; # Fastcgi parameters, include the standard ones include /etc/nginx/fastcgi_params; # Adjust non standard parameters (SCRIPT_FILENAME) fastcgi_param SCRIPT_FILENAME /usr/lib$fastcgi_script_name; } Be sure to create the folder cgi-bin folder with required permissions (755) mkdir /usr/share/nginx/cgi-bin Create fcgiwrap systemd service in /usr/lib/systemd/system/fcgiwrap.service # create new [Unit] Description=Simple CGI Server After=nss-user-lookup.target Requires=fcgiwrap.socket [Service] EnvironmentFile=/etc/sysconfig/fcgiwrap ExecStart=/usr/sbin/fcgiwrap ${DAEMON_OPTS} -c ${DAEMON_PROCS} User=librenms Group=librenms [Install] Also=fcgiwrap.socket The socket file in /usr/lib/systemd/system/fcgiwrap.socket # create new [Unit] Description=fcgiwrap Socket [Socket] ListenStream=/var/run/fcgiwrap.socket [Install] WantedBy=sockets.target Enable fcgiwrap systemctl enable --now fcgiwrap Add the following configuration to your /etc/nginx/conf.d/librenms.conf file within server section. The following will configure Nginx to respond to http://yourlibrenms/smokeping : location = /smokeping/ { fastcgi_intercept_errors on; fastcgi_param SCRIPT_FILENAME /usr/share/smokeping/cgi/smokeping.fcgi; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_param HTTPS $https if_not_empty; fastcgi_pass unix:/var/run/fcgiwrap.socket; } location ^~ /smokeping/ { alias /usr/share/smokeping/cgi/; index smokeping.fcgi; gzip off; } If images/js/css don't load, you might have to add location ^~ /smokeping/css { alias /usr/share/smokeping/htdocs/css/; gzip off; } location ^~ /smokeping/js { alias /usr/share/smokeping/htdocs/js/; gzip off; } location ^~ /smokeping/images { alias /opt/librenms/rrd/smokeping/images; gzip off; } After saving the configuration file, verify your Nginx configuration file syntax is OK with sudo nginx -t , then restart Nginx with sudo systemctl restart nginx You should be able to load the Smokeping web interface at http://yourlibrenms/smokeping","title":"Nginx Configuration - RHEL, CentOS and alike"},{"location":"Extensions/Smokeping/#nginx-configuration-ubuntu-debian-and-alike","text":"This section assumes you have configured LibreNMS with Nginx as specified in Configure Nginx . Note, you need to install fcgiwrap for CGI wrapper interact with Nginx apt install fcgiwrap Then configure Nginx with the default configuration cp /usr/share/doc/fcgiwrap/examples/nginx.conf /etc/nginx/fcgiwrap.conf Add the following configuration to your /etc/nginx/conf.d/librenms.conf file within server section. The following will configure Nginx to respond to http://yourlibrenms/smokeping : # Browsing to `http://yourlibrenms/smokeping/` should bring up the smokeping web interface location = /smokeping/ { fastcgi_intercept_errors on; fastcgi_param SCRIPT_FILENAME /usr/lib/cgi-bin/smokeping.cgi; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_param HTTPS $https if_not_empty; fastcgi_pass unix:/var/run/fcgiwrap.socket; } location ^~ /smokeping/ { alias /usr/share/smokeping/www/; index smokeping.cgi; gzip off; } After saving the configuration file, verify your Nginx configuration file syntax is OK with sudo nginx -t , then restart Nginx with sudo systemctl restart nginx You should be able to load the Smokeping web interface at http://yourlibrenms/smokeping","title":"Nginx Configuration - Ubuntu, Debian and alike"},{"location":"Extensions/Smokeping/#nginx-password-authentication","text":"You can use the purpose-made htpasswd utility included in the apache2-utils package (Nginx password files use the same format as Apache). You can install it on Ubuntu with apt install apache2-utils After that you need to create password for your user htpasswd -c /etc/nginx/.htpasswd USER You can verify your user and password with cat /etc/nginx/.htpasswd Then you just need to add to your config auth_basic parameters location ^~ /smokeping/ { alias /usr/share/smokeping/www/; index smokeping.cgi; gzip off; auth_basic \"Private Property\"; auth_basic_user_file /etc/nginx/.htpasswd; }","title":"Nginx Password Authentication"},{"location":"Extensions/Smokeping/#common-problems","text":"","title":"Common Problems"},{"location":"Extensions/Smokeping/#rrdsupdate-error-opening-permission-denied","text":"There is a problem writing to the RRD directory. This is somewhat out of scope of LibreNMS, but make sure that file permissions and SELinux labels allow the smokeping user to write to the directory. If you're using RRDCacheD, make sure that the permissions are correct there too, and that if you're using -B that the smokeping RRD's are inside the base directory; update the smokeping rrd directory if required. It's not recommended to run RRDCachedD without the -B switch.","title":"RRDs::update ERROR: opening ... Permission denied"},{"location":"Extensions/Smokeping/#share-rrdcached-with-librenms","text":"Move the RRD's and give smokeping access rights to the LibreNMS RRD directory: sudo systemctl stop smokeping sudo mv /var/lib/smokeping /opt/librenms/rrd/ sudo usermod -a -G librenms smokeping Update data directory in /etc/smokeping : datadir = /opt/librenms/rrd/smokeping dyndir = /opt/librenms/rrd/smokeping/__cgi If you have SELinux on, see next section before starting smokeping. Finally restart the smokeping service: sudo systemctl start smokeping Remember to update your config with the new locations.","title":"Share RRDCached with LibreNMS"},{"location":"Extensions/Smokeping/#configure-selinux-to-allow-smokeping-to-write-in-librenms-directory-on-centos-rhel","text":"If you are using RRDCached with the -B switch and smokeping RRD's inside the LibreNMS RRD base directory, you can install this SELinux profile: cat > smokeping_librenms.te << EOF module smokeping_librenms 1.0; require { type httpd_t; type smokeping_t; type smokeping_var_lib_t; type var_run_t; type httpd_sys_rw_content_t; class dir { add_name create getattr read remove_name search write }; class file { create getattr ioctl lock open read rename setattr unlink write }; } #============= httpd_t ============== allow httpd_t smokeping_var_lib_t:dir read; allow httpd_t var_run_t:file { read write }; #============= smokeping_t ============== allow smokeping_t httpd_sys_rw_content_t:dir { add_name create getattr remove_name search write }; allow smokeping_t httpd_sys_rw_content_t:file { create getattr ioctl lock open read rename setattr unlink write }; EOF checkmodule -M -m -o smokeping_librenms.mod smokeping_librenms.te semodule_package -o smokeping_librenms.pp -m smokeping_librenms.mod semodule -i smokeping_librenms.pp","title":"Configure SELinux to allow smokeping to write in LibreNMS directory on Centos / RHEL"},{"location":"Extensions/Smokeping/#probe-fping-missing-missing-from-the-probes-section","text":"Take a look at the instructions again - something isn't correct in your configuration.","title":"Probe FPing missing missing from the probes section"},{"location":"Extensions/Smokeping/#section-or-variable-already-exists","text":"Most likely, content wasn't fully removed from the *** Probes *** *** Targets*** stanza's as instructed. If you're trying to integrate LibreNMS, smokeping and another source of configuration, you're probably trying to redefine a module (e.g. '+ FPing' more than once) or stanza. Otherwise, look again at the instructions.","title":"Section or variable already exists"},{"location":"Extensions/Smokeping/#mandatory-variable-probe-not-defined","text":"The target block must have a default probe. If you follow the instructions you will have one. If you're trying to integrate LibreNMS, smokeping and another source of configuration, you need to make sure there are no duplicate or missing definitions.","title":"Mandatory variable 'probe' not defined"},{"location":"Extensions/Smokeping/#file-usrsbinsendmail-does-not-exist","text":"If you got this error at the end of the installation, simply edit or comment out the sendmail entry in the configuration: -sendmail = /usr/sbin/sendmail +#sendmail = /usr/sbin/sendmail","title":"File '/usr/sbin/sendmail' does not exist`"},{"location":"Extensions/Sub-Directory/","text":"To run LibreNMS under a subdirectory on your Apache server, the directives for the LibreNMS directory are placed in the base server configuration, or in a virtual host container of your choosing. If using a virtual host, place the directives in the file where the virtual host is configured. If using the base server on RHEL distributions (CentOS, Scientific Linux, etc.) the directives can be placed in /etc/httpd/conf.d/librenms.conf . For Debian distributions (Ubuntu, etc.) place the directives in /etc/apache2/sites-available/default . #These directives can be inside a virtual host or in the base server configuration AllowEncodedSlashes On Alias /librenms /opt/librenms/html AllowOverride All Options FollowSymLinks MultiViews The RewriteBase directive in html/.htaccess must be rewritten to reference the subdirectory name. Assuming LibreNMS is running at http://example.com/librenms/ , you will need to change RewriteBase / to RewriteBase /librenms . Finally, set APP_URL=/librenms/ in .env and lnms config:set base_url '/librenms/' .","title":"Sub-directory Support"},{"location":"Extensions/Supermicro/","text":"Supermicro For some Supermicro information to show up in LibreNMS, you will need to install an agent. Supermicro SuperDoctor Install Supermicro SuperDoctor onto the device you want to monitor. Then add the following to /etc/snmp/snmpd.conf: pass .1.3.6.1.4.1.10876 /usr/bin/sudo /opt/Supermicro/SuperDoctor5/libs/native/snmpagent Restart net-snmp: service snmpd restart","title":"Supermicro"},{"location":"Extensions/Supermicro/#supermicro","text":"For some Supermicro information to show up in LibreNMS, you will need to install an agent.","title":"Supermicro"},{"location":"Extensions/Supermicro/#supermicro-superdoctor","text":"Install Supermicro SuperDoctor onto the device you want to monitor. Then add the following to /etc/snmp/snmpd.conf: pass .1.3.6.1.4.1.10876 /usr/bin/sudo /opt/Supermicro/SuperDoctor5/libs/native/snmpagent Restart net-snmp: service snmpd restart","title":"Supermicro SuperDoctor"},{"location":"Extensions/Syslog/","text":"Syslog support Syslog integration variants This section explain different ways to recieve and process syslog with LibreNMS. Except of graylog, all Syslogs variants store their logs in the LibreNMS database. You need to enable the Syslog extension in config.php : $config [ 'enable_syslog' ] = 1 ; A Syslog integration gives you a centralized view of information within the LibreNMS (device view, traps, event). Further more you can trigger alerts based on syslog messages (see rule collections). Traditional Syslog server syslog-ng Debian / Ubuntu CentOS / RedHat apt-get install syslog-ng-core yum install syslog-ng Once syslog-ng is installed, create the config file (/etc/syslog-ng/conf.d/librenms.conf) and paste the following: source s_net { tcp ( port ( 514 ) flags ( syslog-protocol )) ; udp ( port ( 514 ) flags ( syslog-protocol )) ; } ; destination d_librenms { program ( \"/opt/librenms/syslog.php\" template ( \" $HOST || $FACILITY || $PRIORITY || $LEVEL || $TAG || $R_YEAR - $R_MONTH - $R_DAY $R_HOUR : $R_MIN : $R_SEC || $MSG || $PROGRAM \\n\" ) template-escape ( yes )) ; } ; log { source ( s_net ) ; source ( s_src ) ; destination ( d_librenms ) ; } ; Next start syslog-ng: service syslog-ng restart If no messages make it to the syslog tab in LibreNMS, chances are you experience an issue with SELinux. If so, create a file mycustom-librenms-rsyslog.te , with the following content: module mycustom-librenms-rsyslog 1.0; require { type syslogd_t; type httpd_sys_rw_content_t; type ping_exec_t; class process execmem; class dir { getattr search write }; class file { append getattr execute open read }; } #============= syslogd_t ============== allow syslogd_t httpd_sys_rw_content_t:dir { getattr search write }; allow syslogd_t httpd_sys_rw_content_t:file { open read append getattr }; allow syslogd_t self:process execmem; allow syslogd_t ping_exec_t:file execute; Then, as root, execute the following commands: checkmodule -M -m -o mycustom-librenms-rsyslog.mod mycustom-librenms-rsyslog.te semodule_package -o mycustom-librenms-rsyslog.pp -m mycustom-librenms-rsyslog.mod semodule -i mycustom-librenms-rsyslog.pp rsyslog If you prefer rsyslog, here are some hints on how to get it working. Add the following to your rsyslog config somewhere (could be at the top of the file in the step below, could be in rsyslog.conf if you are using remote logs for something else on this host) # Listen for syslog messages on UDP:514 $ModLoad imudp $UDPServerRun 514 Create a file called /etc/rsyslog.d/30-librenms.conf and add the following depending on your version of rsyslog. Version 8 Version 7 Legacy # Feed syslog messages to librenms module(load=\"omprog\") template(name=\"librenms\" type=\"string\" string= \"%fromhost%||%syslogfacility%||%syslogpriority%||%syslogseverity%||%syslogtag%||%$year%-%$month%-%$day% %timegenerated:8:25%||%msg%||%programname%\\n\") action(type=\"omprog\" binary=\"/opt/librenms/syslog.php\" template=\"librenms\") & stop #Feed syslog messages to librenms $ModLoad omprog $template librenms,\"%fromhost%||%syslogfacility%||%syslogpriority%||%syslogseverity%||%syslogtag%||%$year%-%$month%-%$day% %timegenerated:8:25%||%msg%||%programname%\\n\" *.* action(type=\"omprog\" binary=\"/opt/librenms/syslog.php\" template=\"librenms\") & stop # Feed syslog messages to librenms $ModLoad omprog $template librenms,\"%FROMHOST%||%syslogfacility-text%||%syslogpriority-text%||%syslogseverity%||%syslogtag%||%$YEAR%-%$MONTH%-%$DAY% %timegenerated:8:25%||%msg%||%programname%\\n\" $ActionOMProgBinary /opt/librenms/syslog.php *.* :omprog:;librenms If your rsyslog server is receiving messages relayed by another syslog server, you may try replacing %fromhost% with %hostname% , since fromhost is the host the message was received from, not the host that generated the message. The fromhost property is preferred as it avoids problems caused by devices sending incorrect hostnames in syslog messages. Local Logstash If you prefer logstash, and it is installed on the same server as LibreNMS, here are some hints on how to get it working. First, install the output-exec plugin for logstash: /usr/share/logstash/bin/logstash-plugin install logstash-output-exec Next, create a logstash configuration file (ex. /etc/logstash/conf.d/logstash-simple.conf), and add the following: input { syslog { port => 514 } } output { exec { command => \"echo `echo %{host},,,,%{facility},,,,%{priority},,,,%{severity},,,,%{facility_label},,,,``date --date='%{timestamp}' '+%Y-%m-%d %H:%M:%S'``echo ',,,,%{message}'``echo ,,,,%{program} | sed 's/\\x25\\x7b\\x70\\x72\\x6f\\x67\\x72\\x61\\x6d\\x7d/%{facility_label}/'` | sed 's/,,,,/||/g' | /opt/librenms/syslog.php &\" } elasticsearch { hosts => [\"10.10.10.10:9200\"] index => \"syslog-%{+YYYY.MM.dd}\" } } Replace 10.10.10.10 with your primary elasticsearch server IP, and set the incoming syslog port. Alternatively, if you already have a logstash config file that works except for the LibreNMS export, take only the \"exec\" section from output and add it. Remote Logstash (or any json source) If you have a large logstash / elastic installation for collecting and filtering syslogs, you can simply pass the relevant logs as json to the LibreNMS API \"syslog sink\". This variant may be more flexible and secure in transport. It does not require any major changes to existing ELK setup. You can also pass simple json kv messages from any kind of application or script (example below) to this sink. For long term or advanced aggregation searches you might still use Kibana/Grafana/Graylog etc. It is recommended to keep config['syslog_purge'] short. A schematic setup can look like this: \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502Device\u251c\u2500\u25ba\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502Logstash Cluster \u251c\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502ElasticSearch \u251c\u2510 \u2502 RabbitMQ \u2502\u2502 \u2502 Cluster \u2502\u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u25ba\u2502 Filtering etc \u2502\u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2502 \u2502Device\u2502 \u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2502 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u25bc ~~~WAN~~~ \u2502 \u250c\u2500\u253c\u2500\u2510 \u2502\u253c\u253c\u253c\u2502 LB / Firewall / etc \u2514\u2500\u253c\u2500\u2518 \u2502 \u25bc \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502LibreNMS Sink \u251c\u252c\u2500\u2500\u25ba\u2502LibreNMS Master \u2502 \u2502/api/v0/syslogsink/ \u2502\u2502 \u2502 MariaDB \u2502 \u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 A minimal Logstash http output configuration can look like this: output { .... #feed it to LibreNMS http { http_method => \"post\" url => \"https://sink.librenms.org/api/v0/syslogsink/ # replace with your librenms host format => \"json_batch\" # put multiple syslogs in on HTTP message retry_failed => false # if true, logstash is blocking if the API is unavailable, be careful! headers => [\"X-Auth-Token\",\"xxxxxxxLibreNMSApiToken] # optional if your mapping is not already done before or does not match. \"msg\" and \"host\" is mandatory. # you might also use out the clone {} function to duplicate your log stream and a dedicated log filtering/mapping etc. # mapping => { # \"host\"=> \"%{host}\" # \"program\" => \"%{program}\" # \"facility\" => \"%{facility_label}\" # \"priority\" => \"%{syslog5424_pri}\" # \"level\" => \"%{facility_label}\" # \"tag\" => \"%{topic}\" # \"msg\" => \"%{message}\" # \"timestamp\" => \"%{@timestamp}\" # } } } Sample test data: curl -L -X POST 'https://sink.librenms.org/api/v0/syslogsink/' -H 'X-Auth-Token: xxxxxxxLibreNMSApiToken' --data-raw '[ { \"msg\": \"kernel: minimum Message\", \"host\": \"mydevice.fqdn.com\" }, { \"msg\": \"Line protocol on Interface GigabitEthernet1/0/41, changed state to up\", \"facility\": 23, \"priority\": \"189\", \"program\": \"LINEPROTO-5-UPDOWN\", \"host\": \"172.29.10.24\", \"@timestamp\": \"2022-12-01T20:14:28.257Z\", \"severity\": 5, \"level\": \"ERROR\" }, { \"msg\": \"kernel: a unknown host\", \"host\": \"unknown.fqdn.com\" } ]' msg and host are the minimum keys. Graylog This variant method use a external Graylog installation and its database. Please refer to the dedicated Graylog documentation. Client configuration Below are sample configurations for a variety of clients. You should understand the config before using it as you may want to make some slight changes. Further configuration hints may be found in the file Graylog.md. Replace librenms.ip with IP or hostname of your LibreNMS install. Replace any variables in with the relevant information. syslog *.* @librenms.ip rsyslog *.* @librenms.ip:514 Cisco ASA logging enable logging timestamp logging buffer-size 200000 logging buffered debugging logging trap notifications logging host librenms.ip Cisco IOS logging trap debugging logging facility local6 logging librenms.ip Cisco NXOS logging server librenms.ip 5 use-vrf default facility local6 Juniper Junos set system syslog host librenms.ip authorization any set system syslog host librenms.ip daemon any set system syslog host librenms.ip kernel any set system syslog host librenms.ip user any set system syslog host librenms.ip change-log any set system syslog host librenms.ip source-address set system syslog host librenms.ip exclude-hostname set system syslog time-format Huawei VRP info-center loghost librenms.ip info-center timestamp debugging short-date without-timezone // Optional info-center timestamp log short-date // Optional info-center timestamp trap short-date // Optional //This is optional config, especially if the device is in public ip and you dont'want to get a lot of messages of ACL info-center filter-id bymodule-alias VTY ACL_DENY info-center filter-id bymodule-alias SSH SSH_FAIL info-center filter-id bymodule-alias SNMP SNMP_FAIL info-center filter-id bymodule-alias SNMP SNMP_IPLOCK info-center filter-id bymodule-alias SNMP SNMP_IPUNLOCK info-center filter-id bymodule-alias HTTP ACL_DENY Huawei SmartAX (GPON OLT) loghost add librenms.ip librenms loghost activate name librenms Allied Telesis Alliedware Plus log date-format iso // Required so syslog-ng/LibreNMS can correctly interpret the log message formatting. log host x.x.x.x log host x.x.x.x level // Required. A log-level must be specified for syslog messages to send. log host x.x.x.x level notices program imish // Useful for seeing all commands executed by users. log host x.x.x.x level notices program imi // Required for Oxidized Syslog hook log message. log host source HPE/Aruba Procurve configure logging severity warning logging facility local6 logging librenms.ip control-descr \u201cLibreNMS\u201d logging notify running-config-change write memory If you have permitted udp and tcp 514 through any firewall then that should be all you need. Logs should start appearing and displayed within the LibreNMS web UI. Windows By Default windows has no native way to send logs to a remote syslog server. Using this how to you can download Datagram-Syslog Agent to send logs to a remote syslog server (LibreNMS). Note Keep in mind you can use any agent or program to send the logs. We are just using this Datagram-Syslog Agent for this example. Link to How to You will need to download and install \"Datagram-Syslog Agent\" for this how to Link to Download External hooks Trigger external scripts based on specific syslog patterns being matched with syslog hooks. Add the following to your LibreNMS config.php to enable hooks: $config['enable_syslog_hooks'] = 1; The below are some example hooks to call an external script in the event of a configuration change on Cisco ASA, IOS, NX-OS and IOS-XR devices. Add to your config.php file to enable. Cisco ASA $config['os']['asa']['syslog_hook'][] = Array('regex' => '/%ASA-(config-)?5-111005/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php'); Cisco IOS $config['os']['ios']['syslog_hook'][] = Array('regex' => '/%SYS-(SW[0-9]+-)?5-CONFIG_I/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php'); Cisco NXOS $config['os']['nxos']['syslog_hook'][] = Array('regex' => '/%VSHD-5-VSHD_SYSLOG_CONFIG_I/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php'); Cisco IOSXR $config['os']['iosxr']['syslog_hook'][] = Array('regex' => '/%GBL-CONFIG-6-DB_COMMIT/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php'); Juniper Junos $config['os']['junos']['syslog_hook'][] = Array('regex' => '/UI_COMMIT:/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php'); Juniper ScreenOS $config['os']['screenos']['syslog_hook'][] = Array('regex' => '/System configuration saved/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php'); Allied Telesis Alliedware Plus Note: At least software version 5.4.8-2.1 is required. log host x.x.x.x level notices program imi may also be required depending on configuration. This is to ensure the syslog hook log message gets sent to the syslog server. $config['os']['awplus']['syslog_hook'][] = Array('regex' => '/IMI.+.Startup-config saved on/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php'); HPE/Aruba Procurve $config['os']['procurve']['syslog_hook'][] = Array('regex' => '/Running Config Change/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php'); Configuration Options Syslog Clean Up Can be set inside of config.php $config [ 'syslog_purge' ] = 30 ; The cleanup is run by daily.sh and any entries over X days old are automatically purged. Values are in days. See here for more Clean Up Options Link Matching syslogs to hosts with different names In some cases, you may get logs that aren't being associated with the device in LibreNMS. For example, in LibreNMS the device is known as \"ne-core-01\", and that's how DNS resolves. However, the received syslogs are for \"loopback.core-nw\". To fix this issue, you can configure LibreNMS to translate the incoming syslog hostname into another hostname, so that the logs get associated with the correct device. Example: $config['syslog_xlate'] = array( 'loopback0.core7k1.noc.net' => 'n7k1-core7k1', 'loopback0.core7k2.noc.net' => 'n7k2-core7k2' );","title":"Syslog"},{"location":"Extensions/Syslog/#syslog-support","text":"","title":"Syslog support"},{"location":"Extensions/Syslog/#syslog-integration-variants","text":"This section explain different ways to recieve and process syslog with LibreNMS. Except of graylog, all Syslogs variants store their logs in the LibreNMS database. You need to enable the Syslog extension in config.php : $config [ 'enable_syslog' ] = 1 ; A Syslog integration gives you a centralized view of information within the LibreNMS (device view, traps, event). Further more you can trigger alerts based on syslog messages (see rule collections).","title":"Syslog integration variants"},{"location":"Extensions/Syslog/#traditional-syslog-server","text":"","title":"Traditional Syslog server"},{"location":"Extensions/Syslog/#syslog-ng","text":"Debian / Ubuntu CentOS / RedHat apt-get install syslog-ng-core yum install syslog-ng Once syslog-ng is installed, create the config file (/etc/syslog-ng/conf.d/librenms.conf) and paste the following: source s_net { tcp ( port ( 514 ) flags ( syslog-protocol )) ; udp ( port ( 514 ) flags ( syslog-protocol )) ; } ; destination d_librenms { program ( \"/opt/librenms/syslog.php\" template ( \" $HOST || $FACILITY || $PRIORITY || $LEVEL || $TAG || $R_YEAR - $R_MONTH - $R_DAY $R_HOUR : $R_MIN : $R_SEC || $MSG || $PROGRAM \\n\" ) template-escape ( yes )) ; } ; log { source ( s_net ) ; source ( s_src ) ; destination ( d_librenms ) ; } ; Next start syslog-ng: service syslog-ng restart If no messages make it to the syslog tab in LibreNMS, chances are you experience an issue with SELinux. If so, create a file mycustom-librenms-rsyslog.te , with the following content: module mycustom-librenms-rsyslog 1.0; require { type syslogd_t; type httpd_sys_rw_content_t; type ping_exec_t; class process execmem; class dir { getattr search write }; class file { append getattr execute open read }; } #============= syslogd_t ============== allow syslogd_t httpd_sys_rw_content_t:dir { getattr search write }; allow syslogd_t httpd_sys_rw_content_t:file { open read append getattr }; allow syslogd_t self:process execmem; allow syslogd_t ping_exec_t:file execute; Then, as root, execute the following commands: checkmodule -M -m -o mycustom-librenms-rsyslog.mod mycustom-librenms-rsyslog.te semodule_package -o mycustom-librenms-rsyslog.pp -m mycustom-librenms-rsyslog.mod semodule -i mycustom-librenms-rsyslog.pp","title":"syslog-ng"},{"location":"Extensions/Syslog/#rsyslog","text":"If you prefer rsyslog, here are some hints on how to get it working. Add the following to your rsyslog config somewhere (could be at the top of the file in the step below, could be in rsyslog.conf if you are using remote logs for something else on this host) # Listen for syslog messages on UDP:514 $ModLoad imudp $UDPServerRun 514 Create a file called /etc/rsyslog.d/30-librenms.conf and add the following depending on your version of rsyslog. Version 8 Version 7 Legacy # Feed syslog messages to librenms module(load=\"omprog\") template(name=\"librenms\" type=\"string\" string= \"%fromhost%||%syslogfacility%||%syslogpriority%||%syslogseverity%||%syslogtag%||%$year%-%$month%-%$day% %timegenerated:8:25%||%msg%||%programname%\\n\") action(type=\"omprog\" binary=\"/opt/librenms/syslog.php\" template=\"librenms\") & stop #Feed syslog messages to librenms $ModLoad omprog $template librenms,\"%fromhost%||%syslogfacility%||%syslogpriority%||%syslogseverity%||%syslogtag%||%$year%-%$month%-%$day% %timegenerated:8:25%||%msg%||%programname%\\n\" *.* action(type=\"omprog\" binary=\"/opt/librenms/syslog.php\" template=\"librenms\") & stop # Feed syslog messages to librenms $ModLoad omprog $template librenms,\"%FROMHOST%||%syslogfacility-text%||%syslogpriority-text%||%syslogseverity%||%syslogtag%||%$YEAR%-%$MONTH%-%$DAY% %timegenerated:8:25%||%msg%||%programname%\\n\" $ActionOMProgBinary /opt/librenms/syslog.php *.* :omprog:;librenms If your rsyslog server is receiving messages relayed by another syslog server, you may try replacing %fromhost% with %hostname% , since fromhost is the host the message was received from, not the host that generated the message. The fromhost property is preferred as it avoids problems caused by devices sending incorrect hostnames in syslog messages.","title":"rsyslog"},{"location":"Extensions/Syslog/#local-logstash","text":"If you prefer logstash, and it is installed on the same server as LibreNMS, here are some hints on how to get it working. First, install the output-exec plugin for logstash: /usr/share/logstash/bin/logstash-plugin install logstash-output-exec Next, create a logstash configuration file (ex. /etc/logstash/conf.d/logstash-simple.conf), and add the following: input { syslog { port => 514 } } output { exec { command => \"echo `echo %{host},,,,%{facility},,,,%{priority},,,,%{severity},,,,%{facility_label},,,,``date --date='%{timestamp}' '+%Y-%m-%d %H:%M:%S'``echo ',,,,%{message}'``echo ,,,,%{program} | sed 's/\\x25\\x7b\\x70\\x72\\x6f\\x67\\x72\\x61\\x6d\\x7d/%{facility_label}/'` | sed 's/,,,,/||/g' | /opt/librenms/syslog.php &\" } elasticsearch { hosts => [\"10.10.10.10:9200\"] index => \"syslog-%{+YYYY.MM.dd}\" } } Replace 10.10.10.10 with your primary elasticsearch server IP, and set the incoming syslog port. Alternatively, if you already have a logstash config file that works except for the LibreNMS export, take only the \"exec\" section from output and add it.","title":"Local Logstash"},{"location":"Extensions/Syslog/#remote-logstash-or-any-json-source","text":"If you have a large logstash / elastic installation for collecting and filtering syslogs, you can simply pass the relevant logs as json to the LibreNMS API \"syslog sink\". This variant may be more flexible and secure in transport. It does not require any major changes to existing ELK setup. You can also pass simple json kv messages from any kind of application or script (example below) to this sink. For long term or advanced aggregation searches you might still use Kibana/Grafana/Graylog etc. It is recommended to keep config['syslog_purge'] short. A schematic setup can look like this: \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502Device\u251c\u2500\u25ba\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502Logstash Cluster \u251c\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502ElasticSearch \u251c\u2510 \u2502 RabbitMQ \u2502\u2502 \u2502 Cluster \u2502\u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u25ba\u2502 Filtering etc \u2502\u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2502 \u2502Device\u2502 \u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2502 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u25bc ~~~WAN~~~ \u2502 \u250c\u2500\u253c\u2500\u2510 \u2502\u253c\u253c\u253c\u2502 LB / Firewall / etc \u2514\u2500\u253c\u2500\u2518 \u2502 \u25bc \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502LibreNMS Sink \u251c\u252c\u2500\u2500\u25ba\u2502LibreNMS Master \u2502 \u2502/api/v0/syslogsink/ \u2502\u2502 \u2502 MariaDB \u2502 \u2514\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 A minimal Logstash http output configuration can look like this: output { .... #feed it to LibreNMS http { http_method => \"post\" url => \"https://sink.librenms.org/api/v0/syslogsink/ # replace with your librenms host format => \"json_batch\" # put multiple syslogs in on HTTP message retry_failed => false # if true, logstash is blocking if the API is unavailable, be careful! headers => [\"X-Auth-Token\",\"xxxxxxxLibreNMSApiToken] # optional if your mapping is not already done before or does not match. \"msg\" and \"host\" is mandatory. # you might also use out the clone {} function to duplicate your log stream and a dedicated log filtering/mapping etc. # mapping => { # \"host\"=> \"%{host}\" # \"program\" => \"%{program}\" # \"facility\" => \"%{facility_label}\" # \"priority\" => \"%{syslog5424_pri}\" # \"level\" => \"%{facility_label}\" # \"tag\" => \"%{topic}\" # \"msg\" => \"%{message}\" # \"timestamp\" => \"%{@timestamp}\" # } } } Sample test data: curl -L -X POST 'https://sink.librenms.org/api/v0/syslogsink/' -H 'X-Auth-Token: xxxxxxxLibreNMSApiToken' --data-raw '[ { \"msg\": \"kernel: minimum Message\", \"host\": \"mydevice.fqdn.com\" }, { \"msg\": \"Line protocol on Interface GigabitEthernet1/0/41, changed state to up\", \"facility\": 23, \"priority\": \"189\", \"program\": \"LINEPROTO-5-UPDOWN\", \"host\": \"172.29.10.24\", \"@timestamp\": \"2022-12-01T20:14:28.257Z\", \"severity\": 5, \"level\": \"ERROR\" }, { \"msg\": \"kernel: a unknown host\", \"host\": \"unknown.fqdn.com\" } ]' msg and host are the minimum keys.","title":"Remote Logstash (or any json source)"},{"location":"Extensions/Syslog/#graylog","text":"This variant method use a external Graylog installation and its database. Please refer to the dedicated Graylog documentation.","title":"Graylog"},{"location":"Extensions/Syslog/#client-configuration","text":"Below are sample configurations for a variety of clients. You should understand the config before using it as you may want to make some slight changes. Further configuration hints may be found in the file Graylog.md. Replace librenms.ip with IP or hostname of your LibreNMS install. Replace any variables in with the relevant information.","title":"Client configuration"},{"location":"Extensions/Syslog/#syslog","text":"*.* @librenms.ip","title":"syslog"},{"location":"Extensions/Syslog/#rsyslog_1","text":"*.* @librenms.ip:514","title":"rsyslog"},{"location":"Extensions/Syslog/#cisco-asa","text":"logging enable logging timestamp logging buffer-size 200000 logging buffered debugging logging trap notifications logging host librenms.ip","title":"Cisco ASA"},{"location":"Extensions/Syslog/#cisco-ios","text":"logging trap debugging logging facility local6 logging librenms.ip","title":"Cisco IOS"},{"location":"Extensions/Syslog/#cisco-nxos","text":"logging server librenms.ip 5 use-vrf default facility local6","title":"Cisco NXOS"},{"location":"Extensions/Syslog/#juniper-junos","text":"set system syslog host librenms.ip authorization any set system syslog host librenms.ip daemon any set system syslog host librenms.ip kernel any set system syslog host librenms.ip user any set system syslog host librenms.ip change-log any set system syslog host librenms.ip source-address set system syslog host librenms.ip exclude-hostname set system syslog time-format","title":"Juniper Junos"},{"location":"Extensions/Syslog/#huawei-vrp","text":"info-center loghost librenms.ip info-center timestamp debugging short-date without-timezone // Optional info-center timestamp log short-date // Optional info-center timestamp trap short-date // Optional //This is optional config, especially if the device is in public ip and you dont'want to get a lot of messages of ACL info-center filter-id bymodule-alias VTY ACL_DENY info-center filter-id bymodule-alias SSH SSH_FAIL info-center filter-id bymodule-alias SNMP SNMP_FAIL info-center filter-id bymodule-alias SNMP SNMP_IPLOCK info-center filter-id bymodule-alias SNMP SNMP_IPUNLOCK info-center filter-id bymodule-alias HTTP ACL_DENY","title":"Huawei VRP"},{"location":"Extensions/Syslog/#huawei-smartax-gpon-olt","text":"loghost add librenms.ip librenms loghost activate name librenms","title":"Huawei SmartAX (GPON OLT)"},{"location":"Extensions/Syslog/#allied-telesis-alliedware-plus","text":"log date-format iso // Required so syslog-ng/LibreNMS can correctly interpret the log message formatting. log host x.x.x.x log host x.x.x.x level // Required. A log-level must be specified for syslog messages to send. log host x.x.x.x level notices program imish // Useful for seeing all commands executed by users. log host x.x.x.x level notices program imi // Required for Oxidized Syslog hook log message. log host source ","title":"Allied Telesis Alliedware Plus"},{"location":"Extensions/Syslog/#hpearuba-procurve","text":"configure logging severity warning logging facility local6 logging librenms.ip control-descr \u201cLibreNMS\u201d logging notify running-config-change write memory If you have permitted udp and tcp 514 through any firewall then that should be all you need. Logs should start appearing and displayed within the LibreNMS web UI.","title":"HPE/Aruba Procurve"},{"location":"Extensions/Syslog/#windows","text":"By Default windows has no native way to send logs to a remote syslog server. Using this how to you can download Datagram-Syslog Agent to send logs to a remote syslog server (LibreNMS).","title":"Windows"},{"location":"Extensions/Syslog/#note","text":"Keep in mind you can use any agent or program to send the logs. We are just using this Datagram-Syslog Agent for this example. Link to How to You will need to download and install \"Datagram-Syslog Agent\" for this how to Link to Download","title":"Note"},{"location":"Extensions/Syslog/#external-hooks","text":"Trigger external scripts based on specific syslog patterns being matched with syslog hooks. Add the following to your LibreNMS config.php to enable hooks: $config['enable_syslog_hooks'] = 1; The below are some example hooks to call an external script in the event of a configuration change on Cisco ASA, IOS, NX-OS and IOS-XR devices. Add to your config.php file to enable.","title":"External hooks"},{"location":"Extensions/Syslog/#cisco-asa_1","text":"$config['os']['asa']['syslog_hook'][] = Array('regex' => '/%ASA-(config-)?5-111005/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php');","title":"Cisco ASA"},{"location":"Extensions/Syslog/#cisco-ios_1","text":"$config['os']['ios']['syslog_hook'][] = Array('regex' => '/%SYS-(SW[0-9]+-)?5-CONFIG_I/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php');","title":"Cisco IOS"},{"location":"Extensions/Syslog/#cisco-nxos_1","text":"$config['os']['nxos']['syslog_hook'][] = Array('regex' => '/%VSHD-5-VSHD_SYSLOG_CONFIG_I/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php');","title":"Cisco NXOS"},{"location":"Extensions/Syslog/#cisco-iosxr","text":"$config['os']['iosxr']['syslog_hook'][] = Array('regex' => '/%GBL-CONFIG-6-DB_COMMIT/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php');","title":"Cisco IOSXR"},{"location":"Extensions/Syslog/#juniper-junos_1","text":"$config['os']['junos']['syslog_hook'][] = Array('regex' => '/UI_COMMIT:/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php');","title":"Juniper Junos"},{"location":"Extensions/Syslog/#juniper-screenos","text":"$config['os']['screenos']['syslog_hook'][] = Array('regex' => '/System configuration saved/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php');","title":"Juniper ScreenOS"},{"location":"Extensions/Syslog/#allied-telesis-alliedware-plus_1","text":"Note: At least software version 5.4.8-2.1 is required. log host x.x.x.x level notices program imi may also be required depending on configuration. This is to ensure the syslog hook log message gets sent to the syslog server. $config['os']['awplus']['syslog_hook'][] = Array('regex' => '/IMI.+.Startup-config saved on/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php');","title":"Allied Telesis Alliedware Plus"},{"location":"Extensions/Syslog/#hpearuba-procurve_1","text":"$config['os']['procurve']['syslog_hook'][] = Array('regex' => '/Running Config Change/', 'script' => '/opt/librenms/scripts/syslog-notify-oxidized.php');","title":"HPE/Aruba Procurve"},{"location":"Extensions/Syslog/#configuration-options","text":"","title":"Configuration Options"},{"location":"Extensions/Syslog/#syslog-clean-up","text":"Can be set inside of config.php $config [ 'syslog_purge' ] = 30 ; The cleanup is run by daily.sh and any entries over X days old are automatically purged. Values are in days. See here for more Clean Up Options Link","title":"Syslog Clean Up"},{"location":"Extensions/Syslog/#matching-syslogs-to-hosts-with-different-names","text":"In some cases, you may get logs that aren't being associated with the device in LibreNMS. For example, in LibreNMS the device is known as \"ne-core-01\", and that's how DNS resolves. However, the received syslogs are for \"loopback.core-nw\". To fix this issue, you can configure LibreNMS to translate the incoming syslog hostname into another hostname, so that the logs get associated with the correct device. Example: $config['syslog_xlate'] = array( 'loopback0.core7k1.noc.net' => 'n7k1-core7k1', 'loopback0.core7k2.noc.net' => 'n7k2-core7k2' );","title":"Matching syslogs to hosts with different names"},{"location":"Extensions/Two-Factor-Auth/","text":"Two-Factor Authentication Over the last couple of years, the primary attack vector for internet accounts has been static passwords. Therefore static passwords are no longer sufficient to protect unauthorized access to accounts. Two Factor Authentication adds a variable part in authentication procedures. A user is now required to supply a changing 6-digit passcode in addition to their password to obtain access to the account. LibreNMS has a RFC4226 conformant implementation of both Time and Counter based One-Time-Passwords. It also allows the administrator to configure a throttle time to enforce after 3 failures exceeded. Unlike RFC4226 suggestions, this throttle time will not stack on the amount of failures. Types In general, these two types do not differ in algorithmic terms. The types only differ in the variable being used to derive the passcodes from. The underlying HMAC-SHA1 remains the same for both types, security advantages or disadvantages of each are discussed further down. Timebased One-Time-Password (TOTP) Like the name suggests, this type uses the current Time or a subset of it to generate the passcodes. These passcodes solely rely on the secrecy of their Secretkey in order to provide passcodes. An attacker only needs to guess that Secretkey and the other variable part is any given time, presumably the time upon login. RFC4226 suggests a resynchronization attempt in case the passcode mismatches, providing the attacker a range of up to +/- 3 Minutes to create passcodes. Counterbased One-Time-Password (HOTP) This type uses an internal counter that needs to be in sync with the server's counter to successfully authenticate the passcodes. The main advantage over timebased OTP is the attacker doesn't only need to know the Secretkey but also the server's Counter in order to create valid passcodes. RFC4226 suggests a resynchronization attempt in case the passcode mismatches, providing the attacker a range of up to +4 increments from the actual counter to create passcodes. Configuration WebUI Enable 'Two-Factor' Via Global Settings in the Web UI under Authentication -> General Authentication Settings. Optionally enter a throttle timer in seconds. This will unlock an account after this time once it has failed 3 attempt to authenticate. Set to 0 (default) to disable this feature, meaning accounts will remain locked after 3 attempts and will need an administrator to clear. CLI Enable Two-Factor: ./lnms config:set twofactor true Set throttle-time (in seconds): ./lnms config:set twofactor_lock 300 User Administation If Two-Factor is enabled, the Settings -> Manage Users grid will show a '2FA' column containing a green tick for users with active 2FA. There is no functionality to mandate 2FA for users. If a user has failed 3 attempts, their account can be unlocked or 2FA disabled by editing the user from the Manage Users table. If a throttle timer is set, it will unlock accounts after this time. If set to the default of 0, accounts will need to be manually unlocked by an administrator after 3 failed attempts. Locked accounts will report to the user stating to wait for the throttle time period, or to contact the administrator if no timer set. End-User Enrolment These steps imply that Two-Factor has been enabled system wide as above under Configuration. 2FA is enabled by each user once they are logged in normally: Go to 'My Settings' (/preferences/) Choose TwoFactor type Click on 'Generate TwoFactor Secret Key' If your browser didn't reload, reload manually Scan provided QR or click on 'Manual' to see the Key Google Authenticator Installation guides for Google Authenticator can be found here . Usage: Create a key as described above Scan provided QR or click on 'Manual' and enter the Secret On next login, enter the passcode that the App provides LastPass Authenticator LastPass Authenticator is confirmed to work with Timebased One-Time Passwords (TOTP). Installation guide for LastPass Authenticator can be found here . Usage: Create a Timerbased key as described above Click Add (+) and scan provided QR or click on 'NO QR CODE?' and enter naming details and the Secret On next login, enter the passcode that the App provides","title":"Two-Factor Auth"},{"location":"Extensions/Two-Factor-Auth/#two-factor-authentication","text":"Over the last couple of years, the primary attack vector for internet accounts has been static passwords. Therefore static passwords are no longer sufficient to protect unauthorized access to accounts. Two Factor Authentication adds a variable part in authentication procedures. A user is now required to supply a changing 6-digit passcode in addition to their password to obtain access to the account. LibreNMS has a RFC4226 conformant implementation of both Time and Counter based One-Time-Passwords. It also allows the administrator to configure a throttle time to enforce after 3 failures exceeded. Unlike RFC4226 suggestions, this throttle time will not stack on the amount of failures.","title":"Two-Factor Authentication"},{"location":"Extensions/Two-Factor-Auth/#types","text":"In general, these two types do not differ in algorithmic terms. The types only differ in the variable being used to derive the passcodes from. The underlying HMAC-SHA1 remains the same for both types, security advantages or disadvantages of each are discussed further down.","title":"Types"},{"location":"Extensions/Two-Factor-Auth/#timebased-one-time-password-totp","text":"Like the name suggests, this type uses the current Time or a subset of it to generate the passcodes. These passcodes solely rely on the secrecy of their Secretkey in order to provide passcodes. An attacker only needs to guess that Secretkey and the other variable part is any given time, presumably the time upon login. RFC4226 suggests a resynchronization attempt in case the passcode mismatches, providing the attacker a range of up to +/- 3 Minutes to create passcodes.","title":"Timebased One-Time-Password (TOTP)"},{"location":"Extensions/Two-Factor-Auth/#counterbased-one-time-password-hotp","text":"This type uses an internal counter that needs to be in sync with the server's counter to successfully authenticate the passcodes. The main advantage over timebased OTP is the attacker doesn't only need to know the Secretkey but also the server's Counter in order to create valid passcodes. RFC4226 suggests a resynchronization attempt in case the passcode mismatches, providing the attacker a range of up to +4 increments from the actual counter to create passcodes.","title":"Counterbased One-Time-Password (HOTP)"},{"location":"Extensions/Two-Factor-Auth/#configuration","text":"","title":"Configuration"},{"location":"Extensions/Two-Factor-Auth/#webui","text":"Enable 'Two-Factor' Via Global Settings in the Web UI under Authentication -> General Authentication Settings. Optionally enter a throttle timer in seconds. This will unlock an account after this time once it has failed 3 attempt to authenticate. Set to 0 (default) to disable this feature, meaning accounts will remain locked after 3 attempts and will need an administrator to clear.","title":"WebUI"},{"location":"Extensions/Two-Factor-Auth/#cli","text":"Enable Two-Factor: ./lnms config:set twofactor true Set throttle-time (in seconds): ./lnms config:set twofactor_lock 300","title":"CLI"},{"location":"Extensions/Two-Factor-Auth/#user-administation","text":"If Two-Factor is enabled, the Settings -> Manage Users grid will show a '2FA' column containing a green tick for users with active 2FA. There is no functionality to mandate 2FA for users. If a user has failed 3 attempts, their account can be unlocked or 2FA disabled by editing the user from the Manage Users table. If a throttle timer is set, it will unlock accounts after this time. If set to the default of 0, accounts will need to be manually unlocked by an administrator after 3 failed attempts. Locked accounts will report to the user stating to wait for the throttle time period, or to contact the administrator if no timer set.","title":"User Administation"},{"location":"Extensions/Two-Factor-Auth/#end-user-enrolment","text":"These steps imply that Two-Factor has been enabled system wide as above under Configuration. 2FA is enabled by each user once they are logged in normally: Go to 'My Settings' (/preferences/) Choose TwoFactor type Click on 'Generate TwoFactor Secret Key' If your browser didn't reload, reload manually Scan provided QR or click on 'Manual' to see the Key","title":"End-User Enrolment"},{"location":"Extensions/Two-Factor-Auth/#google-authenticator","text":"Installation guides for Google Authenticator can be found here . Usage: Create a key as described above Scan provided QR or click on 'Manual' and enter the Secret On next login, enter the passcode that the App provides","title":"Google Authenticator"},{"location":"Extensions/Two-Factor-Auth/#lastpass-authenticator","text":"LastPass Authenticator is confirmed to work with Timebased One-Time Passwords (TOTP). Installation guide for LastPass Authenticator can be found here . Usage: Create a Timerbased key as described above Click Add (+) and scan provided QR or click on 'NO QR CODE?' and enter naming details and the Secret On next login, enter the passcode that the App provides","title":"LastPass Authenticator"},{"location":"Extensions/Varnish/","text":"Varnish Installation Guide This document explains how to install Varnish Reverse Proxy for LibreNMS. Varnish is caching software that sits logically between an HTTP client and an HTTP server. Varnish caches HTTP responses from the HTTP server. If an HTTP request can not be responded to by the Varnish cache it directs the request to the HTTP Server. This type of HTTP caching is called a reverse proxy server. Caching your HTTP server can decrease page load times significantly. Architecture Simplified block diagram of an Apache HTTP server with Varnish 4.0 Reverse Proxy CentOS 7 Varnish Installation In this example we will assume your Apache 2.4.X HTTP server is working and configured to process HTTP requests on port 80. If not, please see Installing LibreNMS Install Varnish 4.0 RPM Enable the Varnish CentOS 7 repo and install rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el7.rpm yum install varnish By default Varnish listens for HTTP requests on port 6081. Temporarily add a firewalld rule for testing Varnish. firewall-cmd --zone = public --add-port = 6081 /tcp Test Varnish Start Varnish systemctl start varnish Using a web browser navigate to :6081 or 127.0.0.1:6081. You should see a Varnish error message, this shows that Varnish is working. Example error message: Error 503 Backend fetch failed Backend fetch failed Guru Meditation: XID: 3 Varnish cache server Edit Varnish Parameters Now we need to configure Varnish to listen to HTTP requests on port 80 and relay those requests to the Apache HTTP server on port 8080 (see block diagram). Stop Varnish. systemctl stop varnish Create a back-up of varnish.params just in case you make a mistake. cp /etc/varnish/varnish.params /etc/varnish/varnish.params.bak Edit the varnish.params config. vim /etc/varnish/varnish.params Set the VCL location, IP address, port, and cache location and size. malloc sets the cache location to RAM, and 512M sets the cache size to 512MB. VARNISH_LISTEN_ADDRESS = 192 . 168 . 1 . 10 VARNISH_LISTEN_PORT = 80 VARNISH_VCL_CONF =/ etc / varnish / librenms . vcl VARNISH_STORAGE = \"malloc,512M\" Example varnish.params: # Set this to 1 to make systemd reload try to switch vcl without restart. RELOAD_VCL = 1 # Main configuration file. You probably want to change it. VARNISH_VCL_CONF =/ etc / varnish / librenms . vcl # Default address and port to bind to. Blank address means all IPv4 # and IPv6 interfaces, otherwise specify a host name, an IPv4 dotted # quad, or an IPv6 address in brackets. VARNISH_LISTEN_ADDRESS = 192 . 168 . 1 . 10 VARNISH_LISTEN_PORT = 80 # Admin interface listen address and port VARNISH_ADMIN_LISTEN_ADDRESS = 127 . 0 . 0 . 1 VARNISH_ADMIN_LISTEN_PORT = 6082 # Shared secret file for admin interface VARNISH_SECRET_FILE =/ etc / varnish / secret # Backend storage specification, see Storage Types in the varnishd(5) # man page for details. VARNISH_STORAGE = \"malloc,512M\" # Default TTL used when the backend does not specify one VARNISH_TTL = 120 # User and group for the varnishd worker processes VARNISH_USER = varnish VARNISH_GROUP = varnish # Other options, see the man page varnishd(1) DAEMON_OPTS = \"-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300\" Configure Apache for Varnish Edit librenms.conf and modify the Apache Virtual Host listening port. Modify: to vim /etc/httpd/conf.d/librenms.conf Varnish can not share a port with Apache. Change the Apache listening port to 8080. Modify: Listen 80 to Listen 8080 vim /etc/httpd/conf/httpd.conf Create the librenms.vcl cd /etc/varnish touch librenms.vcl Set ownership and permissions for Varnish files. chown varnish:varnish default.vcl varnish.params secret chmod 644 default.vcl varnish.params secret Edit the librenms.vcl. vim librenms.vcl Paste example VCL config, read config comments for more information. # # This is an example VCL file for Varnish. # # It does not do anything by default, delegating control to the # builtin VCL. The builtin VCL is called when there is no explicit # return statement. # # See the VCL chapters in the Users Guide at https://www.varnish-cache.org/docs/ # and http://varnish-cache.org/trac/wiki/VCLExamples for more examples. # Marker to tell the VCL compiler that this VCL has been adapted to the # new 4.0 format. vcl 4.0 ; # Default backend definition. Set this to point to your Apache server. backend librenms { .host = \"127.0.0.1\" ; .port = \"8080\" ; } # In this example our objective is to cache static content with Varnish and temporarily # cache dynamic content in the client web browser. sub vcl_recv { # HTTP requests from client web browser. # Here we remove any cookie HTTP requests for the 'librenms.domain.net' host # containing the matching file extensions. We don't have to match by host if you # only have LibreNMS running on Apache. # If the cookies are not removed from the HTTP request then Varnish will not cache # the files. 'else' function is set to 'pass', or don't cache anything that doesn't # match. if ( req.http.host ~ \"^librenms.domain.net\" ) { set req.backend_hint = librenms ; if ( req.url ~ \"\\.(png|gif|jpg|jpeg|ico|pdf|js|css|svg|eot|otf|woff|woff2|ttf)$\" ) { unset req.http.Cookie ; } else { return ( pass ); } } } sub vcl_backend_response { # 'sub vcl_backend_response' is the same function as 'sub vcl_fetch' in Varnish 3, however, # the syntax is slightly different # This function happens after we read the response headers from the backend (Apache). # First function 'if (bereq.url ~ \"\\' removes cookies from the Apache HTTP responses # that match the file extensions that are between the quotes, and cache the files for 24 hours. # This assumes you update LibreNMS once a day, otherwise restart Varnish to clear cache. # Second function 'if (bereq.url ~ \"^/' removes the Pragma no-cache statements and sets the age # of how long the client browser will cache the matching urls. # LibreNMS graphs are updated every 300 seconds, 'max-age=300' is set to match this behavior. # We could cache these URLs in Varnish but it would add to the complexity of the config. if ( bereq.http.host ~ \"^librenms.domain.net\" ) { if ( bereq.url ~ \"\\.(png|gif|jpg|jpeg|ico|pdf|js|css|svg|eot|otf|woff|woff2|ttf)$\" ) { unset beresp.http.Set-cookie ; set beresp.ttl = 24h ; } if ( bereq.url ~ \"^/graph.php\" || \"^/device/\" || \"^/iftype/\" || \"^/customers/\" || \"^/health/\" || \"^/apps/\" || \"^/(plugin)$\" || \"^/(alert)$\" || \"^/eventlog/\" || \"^/graphs/\" || \"^/ports/\" ) { unset beresp.http.Pragma ; set beresp.http.Cache-Control = \"max-age=300\" ; } } } sub vcl_deliver { # Happens when we have all the pieces we need, and are about to send the # response to the client. # You can do accounting or modifying the final object here. return ( deliver ); } Reload rules to remove the temporary port rule we added earlier. firewall-cmd --reload Varnish caching does not take effect immediately. You will need to browse the LibreNMS website to build up the cache. Use the command varnishstat to monitor Varnish caching. Over time you should see 'MAIN.cache_hit' and 'MAIN.client_req' increase. With the above VCL the hit to request ratio is approximately 84%. Session based VCL (coming soon) Testing and debugging VCL (coming soon)","title":"Varnish"},{"location":"Extensions/Varnish/#varnish-installation-guide","text":"This document explains how to install Varnish Reverse Proxy for LibreNMS. Varnish is caching software that sits logically between an HTTP client and an HTTP server. Varnish caches HTTP responses from the HTTP server. If an HTTP request can not be responded to by the Varnish cache it directs the request to the HTTP Server. This type of HTTP caching is called a reverse proxy server. Caching your HTTP server can decrease page load times significantly.","title":"Varnish Installation Guide"},{"location":"Extensions/Varnish/#architecture","text":"Simplified block diagram of an Apache HTTP server with Varnish 4.0 Reverse Proxy","title":"Architecture"},{"location":"Extensions/Varnish/#centos-7-varnish-installation","text":"In this example we will assume your Apache 2.4.X HTTP server is working and configured to process HTTP requests on port 80. If not, please see Installing LibreNMS","title":"CentOS 7 Varnish Installation"},{"location":"Extensions/Varnish/#install-varnish-40-rpm","text":"Enable the Varnish CentOS 7 repo and install rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el7.rpm yum install varnish By default Varnish listens for HTTP requests on port 6081. Temporarily add a firewalld rule for testing Varnish. firewall-cmd --zone = public --add-port = 6081 /tcp","title":"Install Varnish 4.0 RPM"},{"location":"Extensions/Varnish/#test-varnish","text":"Start Varnish systemctl start varnish Using a web browser navigate to :6081 or 127.0.0.1:6081. You should see a Varnish error message, this shows that Varnish is working. Example error message: Error 503 Backend fetch failed Backend fetch failed Guru Meditation: XID: 3 Varnish cache server","title":"Test Varnish"},{"location":"Extensions/Varnish/#edit-varnish-parameters","text":"Now we need to configure Varnish to listen to HTTP requests on port 80 and relay those requests to the Apache HTTP server on port 8080 (see block diagram). Stop Varnish. systemctl stop varnish Create a back-up of varnish.params just in case you make a mistake. cp /etc/varnish/varnish.params /etc/varnish/varnish.params.bak Edit the varnish.params config. vim /etc/varnish/varnish.params Set the VCL location, IP address, port, and cache location and size. malloc sets the cache location to RAM, and 512M sets the cache size to 512MB. VARNISH_LISTEN_ADDRESS = 192 . 168 . 1 . 10 VARNISH_LISTEN_PORT = 80 VARNISH_VCL_CONF =/ etc / varnish / librenms . vcl VARNISH_STORAGE = \"malloc,512M\" Example varnish.params: # Set this to 1 to make systemd reload try to switch vcl without restart. RELOAD_VCL = 1 # Main configuration file. You probably want to change it. VARNISH_VCL_CONF =/ etc / varnish / librenms . vcl # Default address and port to bind to. Blank address means all IPv4 # and IPv6 interfaces, otherwise specify a host name, an IPv4 dotted # quad, or an IPv6 address in brackets. VARNISH_LISTEN_ADDRESS = 192 . 168 . 1 . 10 VARNISH_LISTEN_PORT = 80 # Admin interface listen address and port VARNISH_ADMIN_LISTEN_ADDRESS = 127 . 0 . 0 . 1 VARNISH_ADMIN_LISTEN_PORT = 6082 # Shared secret file for admin interface VARNISH_SECRET_FILE =/ etc / varnish / secret # Backend storage specification, see Storage Types in the varnishd(5) # man page for details. VARNISH_STORAGE = \"malloc,512M\" # Default TTL used when the backend does not specify one VARNISH_TTL = 120 # User and group for the varnishd worker processes VARNISH_USER = varnish VARNISH_GROUP = varnish # Other options, see the man page varnishd(1) DAEMON_OPTS = \"-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300\"","title":"Edit Varnish Parameters"},{"location":"Extensions/Varnish/#configure-apache-for-varnish","text":"Edit librenms.conf and modify the Apache Virtual Host listening port. Modify: to vim /etc/httpd/conf.d/librenms.conf Varnish can not share a port with Apache. Change the Apache listening port to 8080. Modify: Listen 80 to Listen 8080 vim /etc/httpd/conf/httpd.conf Create the librenms.vcl cd /etc/varnish touch librenms.vcl Set ownership and permissions for Varnish files. chown varnish:varnish default.vcl varnish.params secret chmod 644 default.vcl varnish.params secret Edit the librenms.vcl. vim librenms.vcl Paste example VCL config, read config comments for more information. # # This is an example VCL file for Varnish. # # It does not do anything by default, delegating control to the # builtin VCL. The builtin VCL is called when there is no explicit # return statement. # # See the VCL chapters in the Users Guide at https://www.varnish-cache.org/docs/ # and http://varnish-cache.org/trac/wiki/VCLExamples for more examples. # Marker to tell the VCL compiler that this VCL has been adapted to the # new 4.0 format. vcl 4.0 ; # Default backend definition. Set this to point to your Apache server. backend librenms { .host = \"127.0.0.1\" ; .port = \"8080\" ; } # In this example our objective is to cache static content with Varnish and temporarily # cache dynamic content in the client web browser. sub vcl_recv { # HTTP requests from client web browser. # Here we remove any cookie HTTP requests for the 'librenms.domain.net' host # containing the matching file extensions. We don't have to match by host if you # only have LibreNMS running on Apache. # If the cookies are not removed from the HTTP request then Varnish will not cache # the files. 'else' function is set to 'pass', or don't cache anything that doesn't # match. if ( req.http.host ~ \"^librenms.domain.net\" ) { set req.backend_hint = librenms ; if ( req.url ~ \"\\.(png|gif|jpg|jpeg|ico|pdf|js|css|svg|eot|otf|woff|woff2|ttf)$\" ) { unset req.http.Cookie ; } else { return ( pass ); } } } sub vcl_backend_response { # 'sub vcl_backend_response' is the same function as 'sub vcl_fetch' in Varnish 3, however, # the syntax is slightly different # This function happens after we read the response headers from the backend (Apache). # First function 'if (bereq.url ~ \"\\' removes cookies from the Apache HTTP responses # that match the file extensions that are between the quotes, and cache the files for 24 hours. # This assumes you update LibreNMS once a day, otherwise restart Varnish to clear cache. # Second function 'if (bereq.url ~ \"^/' removes the Pragma no-cache statements and sets the age # of how long the client browser will cache the matching urls. # LibreNMS graphs are updated every 300 seconds, 'max-age=300' is set to match this behavior. # We could cache these URLs in Varnish but it would add to the complexity of the config. if ( bereq.http.host ~ \"^librenms.domain.net\" ) { if ( bereq.url ~ \"\\.(png|gif|jpg|jpeg|ico|pdf|js|css|svg|eot|otf|woff|woff2|ttf)$\" ) { unset beresp.http.Set-cookie ; set beresp.ttl = 24h ; } if ( bereq.url ~ \"^/graph.php\" || \"^/device/\" || \"^/iftype/\" || \"^/customers/\" || \"^/health/\" || \"^/apps/\" || \"^/(plugin)$\" || \"^/(alert)$\" || \"^/eventlog/\" || \"^/graphs/\" || \"^/ports/\" ) { unset beresp.http.Pragma ; set beresp.http.Cache-Control = \"max-age=300\" ; } } } sub vcl_deliver { # Happens when we have all the pieces we need, and are about to send the # response to the client. # You can do accounting or modifying the final object here. return ( deliver ); } Reload rules to remove the temporary port rule we added earlier. firewall-cmd --reload Varnish caching does not take effect immediately. You will need to browse the LibreNMS website to build up the cache. Use the command varnishstat to monitor Varnish caching. Over time you should see 'MAIN.cache_hit' and 'MAIN.client_req' increase. With the above VCL the hit to request ratio is approximately 84%. Session based VCL (coming soon) Testing and debugging VCL (coming soon)","title":"Configure Apache for Varnish"},{"location":"Extensions/VisJS-Config/","text":"Vis JS Configuration The Network Maps and Dependency Maps all use a common configuration for the vis.js library, which affects the way the maps are rendered, as well as the way that users can interact with the maps. This configuration can be adjusted by following the instructions below. This link will show you all the options and explain what they do. You may also access the dynamic configuration interface example here from within LibreNMS by adding the following to config.php $config [ 'network_map_vis_options' ] = '{ \"configure\": { \"enabled\": true}, }' ; Note You may want to disable the automatic page refresh while you're tweaking your configuration, as the refresh will reset the dynamic configuration UI to the values currently saved in config.php This can be done by clicking on the Settings Icon then Refresh Pause. Configurator Output Once you've achieved your desired map appearance, click the generate options button at the bottom to be given the necessary parameters to add to your config.php file. You will need to paste the generated config into config.php the format will need to look something like this. Note that the configurator will output the config with var options you will need to strip them out and at the end of the config you need to add an }'; see the example below. $config [ 'network_map_vis_options' ] = '{ \"nodes\": { \"color\": { \"background\": \"rgba(20,252,18,1)\" }, \"font\": { \"face\": \"tahoma\" }, \"physics\": false }, \"edges\": { \"smooth\": { \"forceDirection\": \"none\" } }, \"interaction\": { \"hover\": true, \"multiselect\": true, \"navigationButtons\": true }, \"manipulation\": { \"enabled\": true }, \"physics\": { \"barnesHut\": { \"avoidOverlap\": 0.11 }, \"minVelocity\": 0.75 } }' ;","title":"VisJS Config"},{"location":"Extensions/VisJS-Config/#vis-js-configuration","text":"The Network Maps and Dependency Maps all use a common configuration for the vis.js library, which affects the way the maps are rendered, as well as the way that users can interact with the maps. This configuration can be adjusted by following the instructions below. This link will show you all the options and explain what they do. You may also access the dynamic configuration interface example here from within LibreNMS by adding the following to config.php $config [ 'network_map_vis_options' ] = '{ \"configure\": { \"enabled\": true}, }' ;","title":"Vis JS Configuration"},{"location":"Extensions/VisJS-Config/#note","text":"You may want to disable the automatic page refresh while you're tweaking your configuration, as the refresh will reset the dynamic configuration UI to the values currently saved in config.php This can be done by clicking on the Settings Icon then Refresh Pause.","title":"Note"},{"location":"Extensions/VisJS-Config/#configurator-output","text":"Once you've achieved your desired map appearance, click the generate options button at the bottom to be given the necessary parameters to add to your config.php file. You will need to paste the generated config into config.php the format will need to look something like this. Note that the configurator will output the config with var options you will need to strip them out and at the end of the config you need to add an }'; see the example below. $config [ 'network_map_vis_options' ] = '{ \"nodes\": { \"color\": { \"background\": \"rgba(20,252,18,1)\" }, \"font\": { \"face\": \"tahoma\" }, \"physics\": false }, \"edges\": { \"smooth\": { \"forceDirection\": \"none\" } }, \"interaction\": { \"hover\": true, \"multiselect\": true, \"navigationButtons\": true }, \"manipulation\": { \"enabled\": true }, \"physics\": { \"barnesHut\": { \"avoidOverlap\": 0.11 }, \"minVelocity\": 0.75 } }' ;","title":"Configurator Output"},{"location":"Extensions/Weathermap/","text":"Network-WeatherMap with LibreNMS Integrating LibreNMS with Network-Weathermap , allows you to build network maps to help visulaize network traffic flow rates. Prerequisites Network-WeatherMap requires php pear to work. Installing Network-WeatherMap Step 1 Extract to your LibreNMS plugins directory /opt/librenms/html/plugins so you should see something like /opt/librenms/html/plugins/Weathermap/ The best way to do this is via git. Go to your install directory and then /opt/librenms/html/plugins enter: git clone https://github.com/librenms-plugins/Weathermap.git Step 2 Inside the html/plugins directory, change the ownership of the Weathermap directory by typing chown -R librenms:librenms Weathermap/ Make the configs directory writeable. chmod 775 /opt/librenms/html/plugins/Weathermap/configs Note if you are using SELinux you need to input the following command chcon -R -t httpd_cache_t Weathermap/ Step 3 Enable the cron process by editing your current LibreNMS cron file (typically /etc/cron.d/librenms) and add the following: */5 * * * * librenms /opt/librenms/html/plugins/Weathermap/map-poller.php >> /dev/null 2>&1 Step 4 Enable the plugin from LibreNMS Web UI in OverView -> Plugins -> Plugin Admin menu. Step 5 Now you should see Weathermap Overview -> Plugins -> Weathermap Create your maps, please note when you create a MAP, please click Map Style, ensure Overlib is selected for HTML Style and click submit. Also, ensure you set an output image filename and output HTML filename in Map Properties. I'd recommend you use the output folder as this is excluded from git updates (i.e. use output/mymap.png and output/mymap.html ). Optional: If your install is in another directory than standard, set $basehref within map-poller.php . WeatherMapper Automatically generate weathermaps from a LibreNMS database using WeatherMapper . Adding your Network Weathermaps to the Dashboards Once you have created your Network Weather Map you can add it to a dashboard page by doing the following. Step 1 When you create the Weathermap make sure to export as HTML and PNG you will need this for the out to the dashboard. In the Weathermap Plugin page, you will see the output maps. Right click on one of the maps and click on copy image address . Example URL: http://yourlibrenms.org/plugins/Weathermap/output/yourmap.html Step 2 Then go back to your Dashboard, create a new dashboard and give it a name. select the widget as External Images . Give the Widget a Title. The Image URL will need to be the address you copied but at the end remove the .html and replace it with .png Example Image URL http://yourlibrenms.org/plugins/Weathermap/output/yourmap.png The Target URL will be the URL you copied but with the .html at the end of the URL. Example Target URL http://yourlibrenms.org/plugins/Weathermap/output/yourmap.html Then Click on Set You should now be able to see the Weathermap you have created in your list of dashboards. You could also add this to existing dashboards.","title":"Weathermap"},{"location":"Extensions/Weathermap/#network-weathermap-with-librenms","text":"Integrating LibreNMS with Network-Weathermap , allows you to build network maps to help visulaize network traffic flow rates.","title":"Network-WeatherMap with LibreNMS"},{"location":"Extensions/Weathermap/#prerequisites","text":"Network-WeatherMap requires php pear to work.","title":"Prerequisites"},{"location":"Extensions/Weathermap/#installing-network-weathermap","text":"","title":"Installing Network-WeatherMap"},{"location":"Extensions/Weathermap/#step-1","text":"Extract to your LibreNMS plugins directory /opt/librenms/html/plugins so you should see something like /opt/librenms/html/plugins/Weathermap/ The best way to do this is via git. Go to your install directory and then /opt/librenms/html/plugins enter: git clone https://github.com/librenms-plugins/Weathermap.git","title":"Step 1"},{"location":"Extensions/Weathermap/#step-2","text":"Inside the html/plugins directory, change the ownership of the Weathermap directory by typing chown -R librenms:librenms Weathermap/ Make the configs directory writeable. chmod 775 /opt/librenms/html/plugins/Weathermap/configs Note if you are using SELinux you need to input the following command chcon -R -t httpd_cache_t Weathermap/","title":"Step 2"},{"location":"Extensions/Weathermap/#step-3","text":"Enable the cron process by editing your current LibreNMS cron file (typically /etc/cron.d/librenms) and add the following: */5 * * * * librenms /opt/librenms/html/plugins/Weathermap/map-poller.php >> /dev/null 2>&1","title":"Step 3"},{"location":"Extensions/Weathermap/#step-4","text":"Enable the plugin from LibreNMS Web UI in OverView -> Plugins -> Plugin Admin menu.","title":"Step 4"},{"location":"Extensions/Weathermap/#step-5","text":"Now you should see Weathermap Overview -> Plugins -> Weathermap Create your maps, please note when you create a MAP, please click Map Style, ensure Overlib is selected for HTML Style and click submit. Also, ensure you set an output image filename and output HTML filename in Map Properties. I'd recommend you use the output folder as this is excluded from git updates (i.e. use output/mymap.png and output/mymap.html ). Optional: If your install is in another directory than standard, set $basehref within map-poller.php .","title":"Step 5"},{"location":"Extensions/Weathermap/#weathermapper","text":"Automatically generate weathermaps from a LibreNMS database using WeatherMapper .","title":"WeatherMapper"},{"location":"Extensions/Weathermap/#adding-your-network-weathermaps-to-the-dashboards","text":"Once you have created your Network Weather Map you can add it to a dashboard page by doing the following.","title":"Adding your Network Weathermaps to the Dashboards"},{"location":"Extensions/Weathermap/#step-1_1","text":"When you create the Weathermap make sure to export as HTML and PNG you will need this for the out to the dashboard. In the Weathermap Plugin page, you will see the output maps. Right click on one of the maps and click on copy image address . Example URL: http://yourlibrenms.org/plugins/Weathermap/output/yourmap.html","title":"Step 1"},{"location":"Extensions/Weathermap/#step-2_1","text":"Then go back to your Dashboard, create a new dashboard and give it a name. select the widget as External Images . Give the Widget a Title. The Image URL will need to be the address you copied but at the end remove the .html and replace it with .png Example Image URL http://yourlibrenms.org/plugins/Weathermap/output/yourmap.png The Target URL will be the URL you copied but with the .html at the end of the URL. Example Target URL http://yourlibrenms.org/plugins/Weathermap/output/yourmap.html Then Click on Set You should now be able to see the Weathermap you have created in your list of dashboards. You could also add this to existing dashboards.","title":"Step 2"},{"location":"Extensions/World-Map/","text":"World Map Configuration LibreNMS comes with a configurable Geo Map based on World Map Widget to visualize where your equipment is located geographically. World Map Widget World Map Widget, requires you to have properly formatted addresses in sysLocation or sysLocation override. As part of the standard poller these addresses will be Geocoded by Google and stored in the database. Location resolution happens as follows If device['location'] contains [lat, lng] (note the square brackets), that is used If there is a location overide for the device in the WebUI and it contains [lat, lng] (note the square brackets), that is used. Attempt to resolve lat, lng using lnms config:set geoloc.engine Properly formatted addresses in sysLocation or sysLocation override, under device settings. Example: [40.424521, -86.912755] or 1100 Congress Ave, Austin, TX 78701 (3rd floor cabinet) Information inside parentheses is ignored during GEO lookup We have two current mapping engines available: Leaflet (default) Jquery-Mapael World Map Widget Settings Initial Latitude / Longitude : The map will be centered on those coordinates. Initial Zoom : Initial zoom of the map. More information about zoom levels . Grouping radius : Markers are grouped by area. This value define the maximum size of grouping areas. Show devices : Show devices based on status. Example Settings: Device Overview World Map Settings If a device has a location with a valid latitude and logitude, the device overview page will have a panel showing the device on a world map. The following settings affect this map: # Does the world map start opened, or does the user need to clivk to view lnms config:set device_location_map_open false # Do we show all other devices on the map as well lnms config:set device_location_map_show_devices false # Do we show a network map based on device dependencies lnms config:set device_location_map_show_device_dependencies false Offline OpenStreet Map If you can't access OpenStreet map directly you can run a local tile server . To specify a different url you can set: lnms config:set leaflet.tile_url 'localhost.com' Additional Leaflet config lnms config:set map.engine leaflet lnms config:set leaflet.default_lat \"51.981074\" lnms config:set leaflet.default_lng \"5.350342\" lnms config:set leaflet.default_zoom 8 # Device grouping radius in KM default 80KM lnms config:set leaflet.group_radius 1 # Enable network map on world map lnms config:set network_map_show_on_worldmap true # Use CDP/LLDP for network map, or device dependencies lnms config:set network_map_worldmap_link_type xdp/depends # Do not show devices that have notifications disabled lnms config:set network_map_worldmap_show_disabled_alerts false Geocode engine config external/location lnms config:set geoloc.engine google lnms config:set geoloc.api_key 'abcdefghijklmnopqrstuvwxyz' Google: Pros: fast, accurate Cons: requires a credit card even for a free account MapQuest: Pros: free, no credit card required Cons: inaccurate: most addresses are returned as locations at the center of the US Bing: Pros: free, no credit card required, accurate Cons: Microsoft (debatable) Jquery-Mapael config Further custom options are available to load different maps of the world, set default coordinates of where the map will zoom and the zoom level by default. An example of this is: lnms config:set map.engine jquery-mapael lnms config:set mapael.default_map 'mapael-maps/united_kingdom/united_kingdom.js' lnms config:set mapael.map_width 400 lnms config:set mapael.default_lat '50.898482' lnms config:set mapael.default_lng '-3.401402' lnms config:set mapael.default_zoom 20 A list of maps can be found in html/js/maps/ or html/js/mapael-maps/ .","title":"World Map"},{"location":"Extensions/World-Map/#world-map-configuration","text":"LibreNMS comes with a configurable Geo Map based on World Map Widget to visualize where your equipment is located geographically.","title":"World Map Configuration"},{"location":"Extensions/World-Map/#world-map-widget","text":"World Map Widget, requires you to have properly formatted addresses in sysLocation or sysLocation override. As part of the standard poller these addresses will be Geocoded by Google and stored in the database. Location resolution happens as follows If device['location'] contains [lat, lng] (note the square brackets), that is used If there is a location overide for the device in the WebUI and it contains [lat, lng] (note the square brackets), that is used. Attempt to resolve lat, lng using lnms config:set geoloc.engine Properly formatted addresses in sysLocation or sysLocation override, under device settings. Example: [40.424521, -86.912755] or 1100 Congress Ave, Austin, TX 78701 (3rd floor cabinet) Information inside parentheses is ignored during GEO lookup We have two current mapping engines available: Leaflet (default) Jquery-Mapael","title":"World Map Widget"},{"location":"Extensions/World-Map/#world-map-widget-settings","text":"Initial Latitude / Longitude : The map will be centered on those coordinates. Initial Zoom : Initial zoom of the map. More information about zoom levels . Grouping radius : Markers are grouped by area. This value define the maximum size of grouping areas. Show devices : Show devices based on status. Example Settings:","title":"World Map Widget Settings"},{"location":"Extensions/World-Map/#device-overview-world-map-settings","text":"If a device has a location with a valid latitude and logitude, the device overview page will have a panel showing the device on a world map. The following settings affect this map: # Does the world map start opened, or does the user need to clivk to view lnms config:set device_location_map_open false # Do we show all other devices on the map as well lnms config:set device_location_map_show_devices false # Do we show a network map based on device dependencies lnms config:set device_location_map_show_device_dependencies false","title":"Device Overview World Map Settings"},{"location":"Extensions/World-Map/#offline-openstreet-map","text":"If you can't access OpenStreet map directly you can run a local tile server . To specify a different url you can set: lnms config:set leaflet.tile_url 'localhost.com'","title":"Offline OpenStreet Map"},{"location":"Extensions/World-Map/#additional-leaflet-config","text":"lnms config:set map.engine leaflet lnms config:set leaflet.default_lat \"51.981074\" lnms config:set leaflet.default_lng \"5.350342\" lnms config:set leaflet.default_zoom 8 # Device grouping radius in KM default 80KM lnms config:set leaflet.group_radius 1 # Enable network map on world map lnms config:set network_map_show_on_worldmap true # Use CDP/LLDP for network map, or device dependencies lnms config:set network_map_worldmap_link_type xdp/depends # Do not show devices that have notifications disabled lnms config:set network_map_worldmap_show_disabled_alerts false","title":"Additional Leaflet config"},{"location":"Extensions/World-Map/#geocode-engine-config","text":"external/location lnms config:set geoloc.engine google lnms config:set geoloc.api_key 'abcdefghijklmnopqrstuvwxyz' Google: Pros: fast, accurate Cons: requires a credit card even for a free account MapQuest: Pros: free, no credit card required Cons: inaccurate: most addresses are returned as locations at the center of the US Bing: Pros: free, no credit card required, accurate Cons: Microsoft (debatable)","title":"Geocode engine config"},{"location":"Extensions/World-Map/#jquery-mapael-config","text":"Further custom options are available to load different maps of the world, set default coordinates of where the map will zoom and the zoom level by default. An example of this is: lnms config:set map.engine jquery-mapael lnms config:set mapael.default_map 'mapael-maps/united_kingdom/united_kingdom.js' lnms config:set mapael.map_width 400 lnms config:set mapael.default_lat '50.898482' lnms config:set mapael.default_lng '-3.401402' lnms config:set mapael.default_zoom 20 A list of maps can be found in html/js/maps/ or html/js/mapael-maps/ .","title":"Jquery-Mapael config"},{"location":"Extensions/metrics/Graphite/","text":"Enabling support for Graphite This module sends all metrics to a remote graphite service. You need something like Grafana for graphing. What you don't get Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana. RRD will continue to function as normal so LibreNMS itself should continue to function as normal. Configuration poller/graphite lnms config:set graphite.enable true lnms config:set graphite.host 'your.graphite.server' lnms config:set graphite.port 2003 lnms config:set graphite.prefix 'your.metric.prefix' Your metric path can be prefixed if required, otherwise the metric path for Graphite will be in the form of hostname.measurement.fieldname , interfaces will be stored as hostname.ports.ifName.fieldname . The same data then stored within rrd will be sent to Graphite and recorded. You can then create graphs within Grafana to display the information you need. Graphite Configuration As LibreNMS updates its metrics every 5 minutes, the following addition to your storage-schemas.conf is suggested. [network] pattern = your\\.metric\\.prefix\\..* retentions = 5m:30d,15m:90d,1h:1y","title":"Graphite"},{"location":"Extensions/metrics/Graphite/#enabling-support-for-graphite","text":"This module sends all metrics to a remote graphite service. You need something like Grafana for graphing.","title":"Enabling support for Graphite"},{"location":"Extensions/metrics/Graphite/#what-you-dont-get","text":"Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana. RRD will continue to function as normal so LibreNMS itself should continue to function as normal.","title":"What you don't get"},{"location":"Extensions/metrics/Graphite/#configuration","text":"poller/graphite lnms config:set graphite.enable true lnms config:set graphite.host 'your.graphite.server' lnms config:set graphite.port 2003 lnms config:set graphite.prefix 'your.metric.prefix' Your metric path can be prefixed if required, otherwise the metric path for Graphite will be in the form of hostname.measurement.fieldname , interfaces will be stored as hostname.ports.ifName.fieldname . The same data then stored within rrd will be sent to Graphite and recorded. You can then create graphs within Grafana to display the information you need.","title":"Configuration"},{"location":"Extensions/metrics/Graphite/#graphite-configuration","text":"As LibreNMS updates its metrics every 5 minutes, the following addition to your storage-schemas.conf is suggested. [network] pattern = your\\.metric\\.prefix\\..* retentions = 5m:30d,15m:90d,1h:1y","title":"Graphite Configuration"},{"location":"Extensions/metrics/InfluxDB/","text":"Enabling support for InfluxDB Before we get started it is important that you know and understand that InfluxDB support is currently alpha at best. All it provides is the sending of data to a InfluxDB install. Due to the current changes that are constantly being made to InfluxDB itself then we cannot guarantee that your data will be ok so enabling this support is at your own risk! Requirements InfluxDB >= 0.94 < 2.0 Grafana The setup of the above is completely out of scope here and we aren't really able to provide any help with this side of things. What you don't get Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana. Support for InfluxDB or Grafana, we would highly recommend that you have some level of experience with these. RRD will continue to function as normal so LibreNMS itself should continue to function as normal. Configuration poller/influxdb lnms config:set influxdb.enable true lnms config:set influxdb.transport http lnms config:set influxdb.host '127.0.0.1' lnms config:set influxdb.port 8086 lnms config:set influxdb.db 'librenms' lnms config:set influxdb.username 'admin' lnms config:set influxdb.password 'admin' lnms config:set influxdb.timeout 0 lnms config:set influxdb.verifySSL false No credentials are needed if you don't use InfluxDB authentication. The same data then stored within rrd will be sent to InfluxDB and recorded. You can then create graphs within Grafana to display the information you need.","title":"InfluxDB"},{"location":"Extensions/metrics/InfluxDB/#enabling-support-for-influxdb","text":"Before we get started it is important that you know and understand that InfluxDB support is currently alpha at best. All it provides is the sending of data to a InfluxDB install. Due to the current changes that are constantly being made to InfluxDB itself then we cannot guarantee that your data will be ok so enabling this support is at your own risk!","title":"Enabling support for InfluxDB"},{"location":"Extensions/metrics/InfluxDB/#requirements","text":"InfluxDB >= 0.94 < 2.0 Grafana The setup of the above is completely out of scope here and we aren't really able to provide any help with this side of things.","title":"Requirements"},{"location":"Extensions/metrics/InfluxDB/#what-you-dont-get","text":"Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana. Support for InfluxDB or Grafana, we would highly recommend that you have some level of experience with these. RRD will continue to function as normal so LibreNMS itself should continue to function as normal.","title":"What you don't get"},{"location":"Extensions/metrics/InfluxDB/#configuration","text":"poller/influxdb lnms config:set influxdb.enable true lnms config:set influxdb.transport http lnms config:set influxdb.host '127.0.0.1' lnms config:set influxdb.port 8086 lnms config:set influxdb.db 'librenms' lnms config:set influxdb.username 'admin' lnms config:set influxdb.password 'admin' lnms config:set influxdb.timeout 0 lnms config:set influxdb.verifySSL false No credentials are needed if you don't use InfluxDB authentication. The same data then stored within rrd will be sent to InfluxDB and recorded. You can then create graphs within Grafana to display the information you need.","title":"Configuration"},{"location":"Extensions/metrics/InfluxDBv2/","text":"Enabling support for InfluxDBv2 Before we get started it is important that you know and understand that InfluxDBv2 support is currently alpha at best. All it provides is the sending of data to a InfluxDBv2 bucket. Due to the current changes that are constantly being made to InfluxDB itself then we cannot guarantee that your data will be ok so enabling this support is at your own risk! It is also important to understand that InfluxDBv2 only supports the InfluxDBv2 API used in InfluxDB version 2.0 or higher. If you are looking to send data to any other version of InfluxDB than you should use the InfluxDB datastore instead. Requirements InfluxDB >= 2.0 The setup of the above is completely out of scope here and we aren't really able to provide any help with this side of things. What you don't get Support for InfluxDB, we would highly recommend that you have some level of experience with these. RRD will continue to function as normal so LibreNMS itself should continue to function as normal. Configuration poller/influxdbv2 lnms config:set influxdbv2.enable true lnms config:set influxdbv2.transport http lnms config:set influxdbv2.host '127.0.0.1' lnms config:set influxdbv2.port 8086 lnms config:set influxdbv2.bucket 'librenms' lnms config:set influxdbv2.token 'admin' lnms config:set influxdbv2.allow_redirect true lmns config:set influxdbv2.organization 'librenms' The same data stored within rrd will be sent to InfluxDB and recorded. You can then create graphs within Grafana or InfluxDB to display the information you need.","title":"InfluxDBv2"},{"location":"Extensions/metrics/InfluxDBv2/#enabling-support-for-influxdbv2","text":"Before we get started it is important that you know and understand that InfluxDBv2 support is currently alpha at best. All it provides is the sending of data to a InfluxDBv2 bucket. Due to the current changes that are constantly being made to InfluxDB itself then we cannot guarantee that your data will be ok so enabling this support is at your own risk! It is also important to understand that InfluxDBv2 only supports the InfluxDBv2 API used in InfluxDB version 2.0 or higher. If you are looking to send data to any other version of InfluxDB than you should use the InfluxDB datastore instead.","title":"Enabling support for InfluxDBv2"},{"location":"Extensions/metrics/InfluxDBv2/#requirements","text":"InfluxDB >= 2.0 The setup of the above is completely out of scope here and we aren't really able to provide any help with this side of things.","title":"Requirements"},{"location":"Extensions/metrics/InfluxDBv2/#what-you-dont-get","text":"Support for InfluxDB, we would highly recommend that you have some level of experience with these. RRD will continue to function as normal so LibreNMS itself should continue to function as normal.","title":"What you don't get"},{"location":"Extensions/metrics/InfluxDBv2/#configuration","text":"poller/influxdbv2 lnms config:set influxdbv2.enable true lnms config:set influxdbv2.transport http lnms config:set influxdbv2.host '127.0.0.1' lnms config:set influxdbv2.port 8086 lnms config:set influxdbv2.bucket 'librenms' lnms config:set influxdbv2.token 'admin' lnms config:set influxdbv2.allow_redirect true lmns config:set influxdbv2.organization 'librenms' The same data stored within rrd will be sent to InfluxDB and recorded. You can then create graphs within Grafana or InfluxDB to display the information you need.","title":"Configuration"},{"location":"Extensions/metrics/OpenTSDB/","text":"Enabling support for OpenTSDB This module sends all metrics to OpenTSDB server. You need something like Grafana for graphing. Requirements OpenTSDB Grafana What you don't get Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana. RRD will continue to function normally so LibreNMS itself should continue to function normally. You can add the following to your config: Configuration poller/opentsdb lnms config:set opentsdb.enable true lnms config:set opentsdb.host '127.0.0.1' lnms config:set opentsdb.port 4242 The same data than the one stored within rrd will be sent to OpenTSDB and recorded. You can then create graphs within Grafana to display the information you need.","title":"OpenTSDB"},{"location":"Extensions/metrics/OpenTSDB/#enabling-support-for-opentsdb","text":"This module sends all metrics to OpenTSDB server. You need something like Grafana for graphing.","title":"Enabling support for OpenTSDB"},{"location":"Extensions/metrics/OpenTSDB/#requirements","text":"OpenTSDB Grafana","title":"Requirements"},{"location":"Extensions/metrics/OpenTSDB/#what-you-dont-get","text":"Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana. RRD will continue to function normally so LibreNMS itself should continue to function normally. You can add the following to your config:","title":"What you don't get"},{"location":"Extensions/metrics/OpenTSDB/#configuration","text":"poller/opentsdb lnms config:set opentsdb.enable true lnms config:set opentsdb.host '127.0.0.1' lnms config:set opentsdb.port 4242 The same data than the one stored within rrd will be sent to OpenTSDB and recorded. You can then create graphs within Grafana to display the information you need.","title":"Configuration"},{"location":"Extensions/metrics/Prometheus/","text":"Enabling support for Prometheus Please be aware Prometheus support is alpha at best, It hasn't been extensively tested and is still in development All it provides is the sending of data to a a Prometheus PushGateway. Please be careful when enabling this support you use it at your own risk! Requirements (Older versions may work but haven't been tested Prometheus >= 2.0 PushGateway >= 0.4.0 Grafana PHP-CURL The setup of the above is completely out of scope here and we aren't really able to provide any help with this side of things. What you don't get Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana. Support for Prometheus or Grafana, we would highly recommend that you have some level of experience with these. RRD will continue to function as normal so LibreNMS itself should continue to function as normal. Configuration poller/prometheus lnms config:set prometheus.enable true lnms config:set prometheus.url 'http://127.0.0.1:9091' lnms config:set prometheus.job 'librenms' lnms config:set prometheus.prefix 'librenms' Prefix Setting the 'prefix' option will cause all metric names to begin with the configured value. For instance without setting this option metric names will be something like this: OUTUCASTPKTS ifOutUcastPkts_rate INOCTETS ifInErrors_rate Configuring a prefix name, for example 'librenms', instead caused those metrics to be exposed with the following names: librenms_OUTUCASTPKTS librenms_ifOutUcastPkts_rate librenms_INOCTETS librenms_ifInErrors_rate Sample Prometheus Scrape Config (for scraping the Push Gateway) - job_name: pushgateway scrape_interval: 300s honor_labels: true static_configs: - targets: ['127.0.0.1:9091'] The same data then stored within rrd will be sent to Prometheus and recorded. You can then create graphs within Grafana to display the information you need.","title":"Prometheus"},{"location":"Extensions/metrics/Prometheus/#enabling-support-for-prometheus","text":"Please be aware Prometheus support is alpha at best, It hasn't been extensively tested and is still in development All it provides is the sending of data to a a Prometheus PushGateway. Please be careful when enabling this support you use it at your own risk!","title":"Enabling support for Prometheus"},{"location":"Extensions/metrics/Prometheus/#requirements-older-versions-may-work-but-havent-been-tested","text":"Prometheus >= 2.0 PushGateway >= 0.4.0 Grafana PHP-CURL The setup of the above is completely out of scope here and we aren't really able to provide any help with this side of things.","title":"Requirements (Older versions may work but haven't been tested"},{"location":"Extensions/metrics/Prometheus/#what-you-dont-get","text":"Pretty graphs, this is why at present you need Grafana. You need to build your own graphs within Grafana. Support for Prometheus or Grafana, we would highly recommend that you have some level of experience with these. RRD will continue to function as normal so LibreNMS itself should continue to function as normal.","title":"What you don't get"},{"location":"Extensions/metrics/Prometheus/#configuration","text":"poller/prometheus lnms config:set prometheus.enable true lnms config:set prometheus.url 'http://127.0.0.1:9091' lnms config:set prometheus.job 'librenms' lnms config:set prometheus.prefix 'librenms'","title":"Configuration"},{"location":"Extensions/metrics/Prometheus/#prefix","text":"Setting the 'prefix' option will cause all metric names to begin with the configured value. For instance without setting this option metric names will be something like this: OUTUCASTPKTS ifOutUcastPkts_rate INOCTETS ifInErrors_rate Configuring a prefix name, for example 'librenms', instead caused those metrics to be exposed with the following names: librenms_OUTUCASTPKTS librenms_ifOutUcastPkts_rate librenms_INOCTETS librenms_ifInErrors_rate","title":"Prefix"},{"location":"Extensions/metrics/Prometheus/#sample-prometheus-scrape-config-for-scraping-the-push-gateway","text":"- job_name: pushgateway scrape_interval: 300s honor_labels: true static_configs: - targets: ['127.0.0.1:9091'] The same data then stored within rrd will be sent to Prometheus and recorded. You can then create graphs within Grafana to display the information you need.","title":"Sample Prometheus Scrape Config (for scraping the Push Gateway)"},{"location":"General/Acknowledgement/","text":"Acknowledgements LibreNMS wouldn't be what it is today without the use of some other amazing projects. We list below what we make use of including the license compliance. 3rd Party GPLv3 Compliant Bootstrap : MIT Font Awesome : MIT License Jquery Bootgrid : MIT License Pace : Open License Twitter typeahead : Open License Vis : MIT / Apache 2.0 TCPDF : LGPLv3 Bootstrap 3 Datepicker :MIT Bootstrap Dropdown Hover Plugin : MIT Bootstrap Switch : Apache 2.0 Handlebars : Open License Cycle2 : MIT/GPL Jquery : MIT Jquery UI : MIT Jquery QRCode : MIT Mktree : Open License Moment : MIT Tag Manager : MIT TW Sack : GPLv3 Gridster : MIT Pure PHP radius class : GPLv3 GeSHi - Generic Syntax Highlighter : GPLv2+ MalaysiaMap.svg - By Exiang CC BY 3.0 , via Wikimedia Commons Code for UBNT Devices Mark Gibbons mgibbons@oemcomp.com Initial code base submitted via PR721 Jquery LazyLoad : MIT License influxdb-php : MIT License influxdb-client-php : MIT License HTML Purifier : LGPL v2.1 Symfony Yaml : MIT PHPMailer : LGPL v2.1 pbin : GPLv2 (or later - see script header) CorsSlim : MIT Confluence HTTP Authenticator Graylog SSO Authentication Plugin Select2 : MIT License JustGage : MIT jQuery.extendext : MIT doT : MIT jQuery-queryBuilder : MIT sql-parser : MIT (Currently a custom build is used) 3rd Party GPLv3 Non-compliant JpGraph (html/includes/jpgraph): QPL 1.0 license MIBS (mibs): unknown/various html/graph-realtime.php: BSD (original?) html/includes/collectd/: GPLv2 only overLIB (html/js/overlib_mini.js): modified Artistic 1.0?","title":"3rd Party Libraries"},{"location":"General/Acknowledgement/#acknowledgements","text":"LibreNMS wouldn't be what it is today without the use of some other amazing projects. We list below what we make use of including the license compliance.","title":"Acknowledgements"},{"location":"General/Acknowledgement/#3rd-party-gplv3-compliant","text":"Bootstrap : MIT Font Awesome : MIT License Jquery Bootgrid : MIT License Pace : Open License Twitter typeahead : Open License Vis : MIT / Apache 2.0 TCPDF : LGPLv3 Bootstrap 3 Datepicker :MIT Bootstrap Dropdown Hover Plugin : MIT Bootstrap Switch : Apache 2.0 Handlebars : Open License Cycle2 : MIT/GPL Jquery : MIT Jquery UI : MIT Jquery QRCode : MIT Mktree : Open License Moment : MIT Tag Manager : MIT TW Sack : GPLv3 Gridster : MIT Pure PHP radius class : GPLv3 GeSHi - Generic Syntax Highlighter : GPLv2+ MalaysiaMap.svg - By Exiang CC BY 3.0 , via Wikimedia Commons Code for UBNT Devices Mark Gibbons mgibbons@oemcomp.com Initial code base submitted via PR721 Jquery LazyLoad : MIT License influxdb-php : MIT License influxdb-client-php : MIT License HTML Purifier : LGPL v2.1 Symfony Yaml : MIT PHPMailer : LGPL v2.1 pbin : GPLv2 (or later - see script header) CorsSlim : MIT Confluence HTTP Authenticator Graylog SSO Authentication Plugin Select2 : MIT License JustGage : MIT jQuery.extendext : MIT doT : MIT jQuery-queryBuilder : MIT sql-parser : MIT (Currently a custom build is used)","title":"3rd Party GPLv3 Compliant"},{"location":"General/Acknowledgement/#3rd-party-gplv3-non-compliant","text":"JpGraph (html/includes/jpgraph): QPL 1.0 license MIBS (mibs): unknown/various html/graph-realtime.php: BSD (original?) html/includes/collectd/: GPLv2 only overLIB (html/js/overlib_mini.js): modified Artistic 1.0?","title":"3rd Party GPLv3 Non-compliant"},{"location":"General/Callback-Stats-and-Privacy/","text":"Submitting Stats Stats data and your privacy This document has been put together to explain what LibreNMS does when it calls back home to report some anonymous statistics. Let's start off by saying, all of the code that processes the data and submits it is included in the standard LibreNMS branch you've installed, the code that accepts this data and in turn generates some pretty graphs is all open source and available on GitHub. Please feel free to review the code, comment on it and suggest changes / improvements. Also, don't forget - by default installations DO NOT call back home, you need to opt into this. Above all we respect users privacy which is why this system has been designed like it has. Now onto the bit you're interested in, what is submitted and what we do with that data. What is submitted All data is anonymous. Generic statistics are taken from the database, these include things like device count, device type, device OS, port types, port speeds, port count and BGP peer count. Take a look at the code for full details. Pairs of sysDescr and sysObjectID from devices with a small amount of sanitation to prevent things like hostnames from being submitted. We record version numbers of php, mysql, net-snmp and rrdtool A random UUID is generated on your own install. That's it! Your IP isn't logged, even via our web service accepting the data. We don't need to know who you are so we don't ask. What we do with the data We store it, not for long - 3 months at the moment although this could change. We use it to generate pretty graphs for people to see. We use it to help prioritise issues and features that need to be worked on. We use sysDescr and sysObjectID to create unit tests and improve OS discovery How do I enable stats submission? If you're happy with all of this - please consider switching the call back system on, you can do this within the About LibreNMS page within your control panel. In the Statistics section you will find a toggle switch to enable / disable the feature. If you've previously had it switched on and want to opt out and remove your data, click the 'Clear remote stats' button and on the next submission all the data you've sent us will be removed! Questions? How often is data submitted? We submit the data once a day according to running daily.sh via cron. If you disable this then opting in will not have any affect. Where can I see the data I submitted? You can't see the data raw, but we collate all of the data together and provide a dynamic site so you can see the results of all contributed stats here I want my data removed. That's easy, simply press 'Clear remote stats' in the About LibreNMS page of your control panel, the next time the call back script is run it will remove all the data we have. I clicked the 'Clear remote stats' button by accident. No problem, before daily.sh runs again - just opt back in, all of your existing data will stay. Hopefully this answers the questions you might have on why and what we are doing here, if not, please pop into our discord server or community forum and ask any questions you like.","title":"Submitting stats"},{"location":"General/Callback-Stats-and-Privacy/#submitting-stats","text":"","title":"Submitting Stats"},{"location":"General/Callback-Stats-and-Privacy/#stats-data-and-your-privacy","text":"This document has been put together to explain what LibreNMS does when it calls back home to report some anonymous statistics. Let's start off by saying, all of the code that processes the data and submits it is included in the standard LibreNMS branch you've installed, the code that accepts this data and in turn generates some pretty graphs is all open source and available on GitHub. Please feel free to review the code, comment on it and suggest changes / improvements. Also, don't forget - by default installations DO NOT call back home, you need to opt into this. Above all we respect users privacy which is why this system has been designed like it has. Now onto the bit you're interested in, what is submitted and what we do with that data.","title":"Stats data and your privacy"},{"location":"General/Callback-Stats-and-Privacy/#what-is-submitted","text":"All data is anonymous. Generic statistics are taken from the database, these include things like device count, device type, device OS, port types, port speeds, port count and BGP peer count. Take a look at the code for full details. Pairs of sysDescr and sysObjectID from devices with a small amount of sanitation to prevent things like hostnames from being submitted. We record version numbers of php, mysql, net-snmp and rrdtool A random UUID is generated on your own install. That's it! Your IP isn't logged, even via our web service accepting the data. We don't need to know who you are so we don't ask.","title":"What is submitted"},{"location":"General/Callback-Stats-and-Privacy/#what-we-do-with-the-data","text":"We store it, not for long - 3 months at the moment although this could change. We use it to generate pretty graphs for people to see. We use it to help prioritise issues and features that need to be worked on. We use sysDescr and sysObjectID to create unit tests and improve OS discovery","title":"What we do with the data"},{"location":"General/Callback-Stats-and-Privacy/#how-do-i-enable-stats-submission","text":"If you're happy with all of this - please consider switching the call back system on, you can do this within the About LibreNMS page within your control panel. In the Statistics section you will find a toggle switch to enable / disable the feature. If you've previously had it switched on and want to opt out and remove your data, click the 'Clear remote stats' button and on the next submission all the data you've sent us will be removed!","title":"How do I enable stats submission?"},{"location":"General/Callback-Stats-and-Privacy/#questions","text":"","title":"Questions?"},{"location":"General/Callback-Stats-and-Privacy/#how-often-is-data-submitted","text":"We submit the data once a day according to running daily.sh via cron. If you disable this then opting in will not have any affect.","title":"How often is data submitted?"},{"location":"General/Callback-Stats-and-Privacy/#where-can-i-see-the-data-i-submitted","text":"You can't see the data raw, but we collate all of the data together and provide a dynamic site so you can see the results of all contributed stats here","title":"Where can I see the data I submitted?"},{"location":"General/Callback-Stats-and-Privacy/#i-want-my-data-removed","text":"That's easy, simply press 'Clear remote stats' in the About LibreNMS page of your control panel, the next time the call back script is run it will remove all the data we have.","title":"I want my data removed."},{"location":"General/Callback-Stats-and-Privacy/#i-clicked-the-clear-remote-stats-button-by-accident","text":"No problem, before daily.sh runs again - just opt back in, all of your existing data will stay. Hopefully this answers the questions you might have on why and what we are doing here, if not, please pop into our discord server or community forum and ask any questions you like.","title":"I clicked the 'Clear remote stats' button by accident."},{"location":"General/Changelog/","text":"24.2.0 (2024-02-27) A big thank you to the following 46 contributors this last month: rudybroersma (14) Npeca75 (10) eskyuu (6) electrocret (5) PipoCanaja (5) Jellyfrog (5) vhuk (5) murrant (5) bnerickson (3) fbouynot (3) FlyveHest (2) nickhilliard (2) dependabot (2) richard-ririe (2) laf (2) SourceDoctor (2) VVelox (2) VoipTelCH (1) fabriciotm (1) dirkx (1) swerveshot (1) jmesserli (1) lrizzi (1) Personwho (1) OSIRIS-REx (1) xorrkaz (1) jcostom (1) tevkar (1) descilla (1) arjitc (1) My-Random-Thoughts (1) dlangille (1) blknight88 (1) z0d1ac-RU (1) lferrerfmv (1) gil-obradors (1) gunkaaa (1) TvL2386 (1) santiag0z (1) EinGlasVollKakao (1) kakohegyi (1) i4networks (1) Bierchermuesli (1) mhamzak008 (1) nicklockhart-fullfibre (1) LoveSkylark (1) Thanks to maintainers and others that helped with pull requests this month: PipoCanaja (35) Jellyfrog (30) electrocret (26) laf (21) murrant (11) mpikzink (1) rudybroersma (1) ottorei (1) vhuk (1) Feature Additional custom map features ( #15806 ) - eskyuu Add/Remove devices from static devicegroups ( #15775 ) - richard-ririe Option to ignore device status ( #15697 ) - SourceDoctor Add functionality for custom maps (weathermaps) ( #15633 ) - eskyuu Alert Rule Editor: new notes field & SQL field improove ( #15631 ) - Bierchermuesli NAC - Improve search in WebUI - Keep Historical data ( #15629 ) - PipoCanaja Security Fix XSS in default example plugin ( #15711 ) - murrant Device Updated SLA poller for Cisco Nexus 9000 ( #15855 ) - FlyveHest Update geist-watchdog.yaml ( #15851 ) - fabriciotm Correctly identify FS Datacenter Switch N8560-48BC ( #15837 ) - rudybroersma Konica printers additional counters ( #15826 ) - Npeca75 Add HSRP state sensors for Cisco IOSXE on L3 switches ( #15823 ) - rudybroersma Add HSRP Sensor support for IOSXR ( #15821 ) - electrocret Add support for Cisco IE1000 ( #15820 ) - rudybroersma Initial support for Eltex mes24xx ( #15816 ) - Npeca75 Add support for Cadant E6000 ( #15813 ) - nickhilliard Add LRT-C / LCM-B / LRS-D / LCM-B modules to Luminato model ( #15812 ) - nickhilliard Add HSRP state sensors for Cisco IOS on L3 switches ( #15809 ) - rudybroersma [rfc1628] Add UPS Test (battery test) status sensor ( #15802 ) - Npeca75 Add build 22631 as Windows 11 23H2 ( #15800 ) - vhuk Zyxel ZynOS PoE Budget sensor support ( #15798 ) - rudybroersma Add Procurve NAC support ( #15794 ) - vhuk Add ArubaOS-CX VSF state sensor support ( #15793 ) - rudybroersma Support for new os/devices, CTS ( #15790 ) - OSIRIS-REx Support for new Lancom devices ( #15779 ) - rudybroersma Add NAC support for Powerconnect ( #15778 ) - vhuk Detect UniFi U7 APs as UniFi AP type ( #15776 ) - jcostom FS.com S5810 Discovery fix ( #15765 ) - rudybroersma Device - webpower smart II snmp UPS card ( #15764 ) - Npeca75 Support for temp sensors - WUT Thermometers - W57605 and W57614 ( #15757 ) - rudybroersma Initial support for Supermicro BMC ( #15750 ) - Npeca75 ArubaOS-CX PSU state sensor support & OS and serial detection ( #15738 ) - rudybroersma Add FortiSwitch PSU state sensor support ( #15735 ) - rudybroersma Added support for Dlink dgs-1250-28x ( #15734 ) - Npeca75 Add FortiGate DHCP Scope usage percentage sensors ( #15727 ) - rudybroersma Added MES 2348B ( #15725 ) - z0d1ac-RU Add FortiGate license status sensors ( #15722 ) - rudybroersma Handle icmpjitter SLA parsing for iosxe ( #15707 ) - FlyveHest Zyxel Wireless Controller OS ( Zyxel NXC series ) ( #15694 ) - kakohegyi Device - fix Counter64 octets value in 32bit column bgpPeerInTotalMessages ( #15621 ) - PipoCanaja Fix tp-link jetstream FDB discovery ( #14321 ) - Npeca75 Webui Disable Page Refresh on Oxidized Tools Page ( #15831 ) - electrocret Modify the date selector to use the session timezone ( #15783 ) - eskyuu Switch bill_notes input to textarea ( #15749 ) - arjitc Sort smart app disks by label ( #15686 ) - SourceDoctor Alerting Add support for Webex max message length. ( #15789 ) - xorrkaz Rename JiraServiceManagement.php to Jiraservicemanagement.php ( #15717 ) - gil-obradors Add JiraServiceManagement Transport ( #15593 ) - mhamzak008 Transport - Jira transport rewrite ( #15561 ) - LoveSkylark Graphs Fixed graphs for icmp service showing PL 4 times ( #15856 ) - VoipTelCH Socket Statistic Application cleanup and application page graph fixes. ( #15845 ) - bnerickson Applications Deliver output for a specific memcached instance ( #15759 ) - tevkar Update nvidia.inc.php ( #15756 ) - descilla Add BorgBackup monitoring support ( #15591 ) - VVelox Add dhcp-stats tests and update for v3 of the extend ( #15378 ) - VVelox Billing Updated bill_data table, alter indexes and add new column ( #15751 ) - laf Api Add API endpoints to update and delete Device Groups ( #15774 ) - richard-ririe Add port description API endpoints and documentation ( #15578 ) - nicklockhart-fullfibre Settings Fix twofactor default value ( #15772 ) - murrant Add isis module to os schema ( #15710 ) - murrant Discovery Fall back to IPV6-MIB IPv6 address discovery if IP-MIB IPv6 address discovery doesn't return any valid addresses ( #15714 ) - gunkaaa Oxidized Add PollerGroup as an option for OxidizedMap ( #15696 ) - electrocret Bug Update Port Real Time Graph error ( #15846 ) - electrocret [bugfix] Fix json-app-tool.php to work with Oid class. ( #15844 ) - bnerickson Fix for linkDown/linkUp ifOperStatus ( #15835 ) - PipoCanaja Fix \"Tempurature\" Typo ( #15811 ) - lrizzi Bug fixes for the custom maps ( #15810 ) - eskyuu Remove dumpRawSql() function in AlertUtil.php ( #15803 ) - Personwho Make all image URLs absolute and fix path for viewer ( #15788 ) - eskyuu Prevent ansi colors in key:generate output ( #15773 ) - Jellyfrog VRP - avoid emptying bgpPeers description at discovery when manually set ( #15713 ) - PipoCanaja OSPF instances and missing mandatory fields fix attempt ( #15712 ) - PipoCanaja Fixed typo in misc/alert_rules.json with regards to \"Space on ...\" alerts ( #15708 ) - TvL2386 Don't escape leaflet tile url in location edit map ( #15695 ) - EinGlasVollKakao Show error if \"Check Type\" field is empty when creating new service template ( #15685 ) - vhuk Refactor Rewrite ups-nut discovery to SnmpQuery:: ( #15850 ) - Npeca75 Rewrite lmsensors discovery to SnmpQuery:: ( #15833 ) - Npeca75 Rewrite ipv4 address discovery to Eloquent ( #15830 ) - Npeca75 Documentation Applications.md formatting update for better readability. ( #15849 ) - bnerickson Update Images.md ( #15824 ) - swerveshot More precise OAuth group/role claim information ( #15817 ) - jmesserli Add selinux open directory permission for rrdcached in RRDCached.md ( #15755 ) - fbouynot Missing dir read permission in sepolicy in RRDCached.md ( #15754 ) - fbouynot Update SQL override section after switch to SQL strict mode ( #15736 ) - blknight88 Add CentOS option to SMART dependency install ( #15704 ) - fbouynot Misc Add kelvin to celcius conversion ( #15836 ) - dirkx Mibs Update watchguard MIBs ( #15719 ) - lferrerfmv Dependencies Bump composer/composer from 2.6.6 to 2.7.0 ( #15808 ) - dependabot Update PHP dependencies ( #15737 ) - murrant Bump follow-redirects from 1.15.3 to 1.15.4 ( #15724 ) - dependabot 24.1.0 (2024-01-07) A big thank you to the following 37 contributors this last month: PipoCanaja (12) murrant (7) laf (5) electrocret (3) peejaychilds (3) Jellyfrog (2) vhuk (2) MittWillson (2) Bierchermuesli (2) netravnen (1) iliessens (1) sarcastic6 (1) SourceDoctor (1) altf4arnold (1) robje (1) rudybroersma (1) mtentilucci (1) tuxgasy (1) craig-nokia (1) brianegge (1) amyjohn000 (1) VirTechSystems (1) atj (1) lhwolfarth (1) bonzo81 (1) Sweeny42 (1) jduke-halls (1) pjordanovic (1) dependabot (1) TheMysteriousX (1) swiftnode-linden (1) cguillaumie (1) luc-ass (1) VVelox (1) Leo-FJ (1) MaxPecc (1) jerji (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (20) murrant (16) PipoCanaja (15) electrocret (12) craig-nokia (1) ottorei (1) Device Ignore nameless health sensors for Fortigate ( #15678 ) - iliessens Add support for RoomAlert 32S device ( #15676 ) - sarcastic6 Device - Add Cisco REP Segment state sensor ( #15666 ) - rudybroersma Added better support for some HiveOS Wireless devices ( #15661 ) - laf Fix HPE iLO CPU Status Sensor Description ( #15660 ) - mtentilucci Fix OcNOS detection for recent firmware versions ( #15642 ) - murrant Add support for Fortinet FortiAPs ( #15641 ) - atj Fixing memory scale for datacom-dmos devices ( #15640 ) - lhwolfarth Add support for Forcepoint NGFW 6.10 and older ( #15632 ) - vhuk Add memory readings for Draytek OS ( #15618 ) - Sweeny42 Updated support for HiveOS Wireless newer models ( #15610 ) - laf Add HPE iLO 6 to discovery ( #15607 ) - jduke-halls Incorrect discovery APC Smart-UPS RT 3000 XL 4.1 ( APC Web/SNMP Management Card (AP9619 MB:v4.1.1 PF:v3.9.4) as multi-phase ups ( #15602 ) - pjordanovic Device - McAfee Web Gateway -> SkyHigh Web Gateway ( #15596 ) - PipoCanaja Add and extend support for Hirshmann devices ( #15588 ) - cguillaumie Updated regex for HWG STE2 r2 to better detect hardware and software version ( #15573 ) - luc-ass Update entity-sensor.inc.php for xos' os ( #15552 ) - Leo-FJ Added support of new OS for NTP/PTP systems: Meinberg OS, Safran (Orolia), Oscilloquartz (Adva) ( #15453 ) - MaxPecc Zhone health ( #15276 ) - jerji Fix wrong ASN discovery on non-BGP Devices ( #14948 ) - Bierchermuesli Webui Clarify In/Out on Ports table. ( #15680 ) - electrocret WebUI - Filter FDB and ARP tabs in port page if empty ( #15653 ) - PipoCanaja Update Pushover.php ( #15652 ) - brianegge Mark old alert email settings as deprecated ( #15650 ) - murrant Add bad port settings to webui ( #15649 ) - murrant Bug - FDB Table - allow empty searchby as well ( #15626 ) - PipoCanaja Update alertlog query to be more efficient ( #15622 ) - laf Add vendor to searchby rules function ( #15619 ) - bonzo81 Fix grabled characters when oid already UTF-8 ( #15615 ) - MittWillson Graphs Change default graph image to SVG ( #15586 ) - electrocret Api API add_device: Add ping_ping fallback option ( #15637 ) - murrant More filter options for the BGP peer API endpoint ( #15599 ) - Bierchermuesli Discovery Set array before use to stop discovery erroring ( #15604 ) - laf Authentication Add support for Okta Group claims to set Roles ( #15592 ) - peejaychilds Output Roles in auth_test script ( #15587 ) - peejaychilds Bug Fix Rancid error messages ( #15683 ) - vhuk Fix smart application parsing ( #15672 ) - SourceDoctor Fix pagination in alert rules page ( #15659 ) - tuxgasy Bug - \"null\" checks for SAR 7705 release 8.X ( #15657 ) - craig-nokia Bug - missing \"use\" statement in NTP Cisco ( #15656 ) - PipoCanaja Bug - Fix Cisco NTP values ( #15639 ) - PipoCanaja Bug - TPLink - fix null exception for LLDP discovery WIP ( #15628 ) - PipoCanaja Bug - timos MPLS - more poller fixes ( #15624 ) - PipoCanaja Bug - bgp-peers error in Timos -> dbFacile cleanup ( #15620 ) - PipoCanaja Bug - ADSL ifIndex to port error not handled ( #15617 ) - PipoCanaja Bug - XDSL adslAtucCurrOutputPwr exception (Cisco CSCvj53634) ( #15614 ) - PipoCanaja Bug - null checks in Nokia MPLS polling ( #15613 ) - PipoCanaja Bug - Nokia discovery protocols ( #15606 ) - PipoCanaja Make vminfo.vmwVmGuestOS wider ( #15595 ) - TheMysteriousX Fixed state flag causing sql issues in test-template.php ( #15589 ) - laf Documentation Add traceroute to the installed packages doc ( #15645 ) - VirTechSystems Fix documentation formatting ( #15635 ) - Jellyfrog Fix formatting in OAuth-SAML.md ( #15616 ) - peejaychilds Update Debian 12 Installation Instructions. ( #15590 ) - swiftnode-linden Add Debian 12 to install docs ( #15559 ) - VVelox Misc Updating the logo to higher resolution one ( #15669 ) - altf4arnold Update the type of nummonbssid column in the access_points table ( #15647 ) - amyjohn000 Fix device format missing display field ( #15623 ) - MittWillson Link Model ( #15611 ) - murrant Add space to Oxidized error msg ( #15603 ) - electrocret Internal Features New utility Number::constrainInteger() ( #15663 ) - murrant Mibs Update MIKROTIK-MIB ( #15690 ) - netravnen Dependencies Update javascript dependencies ( #15651 ) - murrant Bump phpseclib/phpseclib from 3.0.21 to 3.0.34 ( #15600 ) - dependabot 24.1.0 (2024-01-07) A big thank you to the following 37 contributors this last month: PipoCanaja (12) murrant (7) laf (5) electrocret (3) peejaychilds (3) Jellyfrog (2) vhuk (2) MittWillson (2) Bierchermuesli (2) netravnen (1) iliessens (1) sarcastic6 (1) SourceDoctor (1) altf4arnold (1) robje (1) rudybroersma (1) mtentilucci (1) tuxgasy (1) craig-nokia (1) brianegge (1) amyjohn000 (1) VirTechSystems (1) atj (1) lhwolfarth (1) bonzo81 (1) Sweeny42 (1) jduke-halls (1) pjordanovic (1) dependabot (1) TheMysteriousX (1) swiftnode-linden (1) cguillaumie (1) luc-ass (1) VVelox (1) Leo-FJ (1) MaxPecc (1) jerji (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (20) murrant (16) PipoCanaja (15) electrocret (12) craig-nokia (1) ottorei (1) Device Ignore nameless health sensors for Fortigate ( #15678 ) - iliessens Add support for RoomAlert 32S device ( #15676 ) - sarcastic6 Device - Add Cisco REP Segment state sensor ( #15666 ) - rudybroersma Added better support for some HiveOS Wireless devices ( #15661 ) - laf Fix HPE iLO CPU Status Sensor Description ( #15660 ) - mtentilucci Fix OcNOS detection for recent firmware versions ( #15642 ) - murrant Add support for Fortinet FortiAPs ( #15641 ) - atj Fixing memory scale for datacom-dmos devices ( #15640 ) - lhwolfarth Bug - Fix Cisco NTP values ( #15639 ) - PipoCanaja Add support for Forcepoint NGFW 6.10 and older ( #15632 ) - vhuk Bug - timos MPLS - more poller fixes ( #15624 ) - PipoCanaja Add memory readings for Draytek OS ( #15618 ) - Sweeny42 Updated support for HiveOS Wireless newer models ( #15610 ) - laf Add HPE iLO 6 to discovery ( #15607 ) - jduke-halls Incorrect discovery APC Smart-UPS RT 3000 XL 4.1 ( APC Web/SNMP Management Card (AP9619 MB:v4.1.1 PF:v3.9.4) as multi-phase ups ( #15602 ) - pjordanovic Device - McAfee Web Gateway -> SkyHigh Web Gateway ( #15596 ) - PipoCanaja Add and extend support for Hirshmann devices ( #15588 ) - cguillaumie Updated regex for HWG STE2 r2 to better detect hardware and software version ( #15573 ) - luc-ass Update entity-sensor.inc.php for xos' os ( #15552 ) - Leo-FJ Added support of new OS for NTP/PTP systems: Meinberg OS, Safran (Orolia), Oscilloquartz (Adva) ( #15453 ) - MaxPecc Zhone health ( #15276 ) - jerji Fix wrong ASN discovery on non-BGP Devices ( #14948 ) - Bierchermuesli Webui Clarify In/Out on Ports table. ( #15680 ) - electrocret WebUI - Filter FDB and ARP tabs in port page if empty ( #15653 ) - PipoCanaja Update Pushover.php ( #15652 ) - brianegge Mark old alert email settings as deprecated ( #15650 ) - murrant Add bad port settings to webui ( #15649 ) - murrant Bug - FDB Table - allow empty searchby as well ( #15626 ) - PipoCanaja Update alertlog query to be more efficient ( #15622 ) - laf Add vendor to searchby rules function ( #15619 ) - bonzo81 Fix grabled characters when oid already UTF-8 ( #15615 ) - MittWillson Graphs Change default graph image to SVG ( #15586 ) - electrocret Api API add_device: Add ping_ping fallback option ( #15637 ) - murrant More filter options for the BGP peer API endpoint ( #15599 ) - Bierchermuesli Discovery Set array before use to stop discovery erroring ( #15604 ) - laf Authentication Add support for Okta Group claims to set Roles ( #15592 ) - peejaychilds Output Roles in auth_test script ( #15587 ) - peejaychilds Bug Fix Rancid error messages ( #15683 ) - vhuk Fix smart application parsing ( #15672 ) - SourceDoctor Fix pagination in alert rules page ( #15659 ) - tuxgasy Bug - \"null\" checks for SAR 7705 release 8.X ( #15657 ) - craig-nokia Bug - missing \"use\" statement in NTP Cisco ( #15656 ) - PipoCanaja Bug - TPLink - fix null exception for LLDP discovery WIP ( #15628 ) - PipoCanaja Bug - bgp-peers error in Timos -> dbFacile cleanup ( #15620 ) - PipoCanaja Bug - ADSL ifIndex to port error not handled ( #15617 ) - PipoCanaja Bug - XDSL adslAtucCurrOutputPwr exception (Cisco CSCvj53634) ( #15614 ) - PipoCanaja Bug - null checks in Nokia MPLS polling ( #15613 ) - PipoCanaja Bug - Nokia discovery protocols ( #15606 ) - PipoCanaja Make vminfo.vmwVmGuestOS wider ( #15595 ) - TheMysteriousX Fixed state flag causing sql issues in test-template.php ( #15589 ) - laf Documentation Add traceroute to the installed packages doc ( #15645 ) - VirTechSystems Fix documentation formatting ( #15635 ) - Jellyfrog Fix formatting in OAuth-SAML.md ( #15616 ) - peejaychilds Update Debian 12 Installation Instructions. ( #15590 ) - swiftnode-linden Add Debian 12 to install docs ( #15559 ) - VVelox Misc Updating the logo to higher resolution one ( #15669 ) - altf4arnold Update the type of nummonbssid column in the access_points table ( #15647 ) - amyjohn000 Fix device format missing display field ( #15623 ) - MittWillson Link Model ( #15611 ) - murrant Add space to Oxidized error msg ( #15603 ) - electrocret Internal Features New utility Number::constrainInteger() ( #15663 ) - murrant Mibs Update MIKROTIK-MIB ( #15690 ) - netravnen Dependencies Update javascript dependencies ( #15651 ) - murrant Bump phpseclib/phpseclib from 3.0.21 to 3.0.34 ( #15600 ) - dependabot 23.11.0 (2023-11-17) A big thank you to the following 37 contributors this last month: murrant (26) PipoCanaja (5) jepke (3) peelman (3) dependabot (2) Galileo77 (2) tim427 (2) ottorei (2) eskyuu (1) arjenz (1) electrocret (1) GramThanos (1) bnerickson (1) peejaychilds (1) laf (1) luttermann (1) helppp (1) slalomsk8er (1) VirTechSystems (1) westerterp (1) cmadamsgit (1) lhwolfarth (1) webtroter (1) fbouynot (1) Wooboy (1) kmodzel (1) jaannnis (1) Fehler12 (1) not-known (1) drykov-ttc (1) tydal-borge (1) iNuc1ear (1) mpikzink (1) WilliamDEdwards (1) RandGH (1) underscoredje (1) Schouwenburg (1) Thanks to maintainers and others that helped with pull requests this month: murrant (40) Jellyfrog (10) electrocret (9) laf (2) ottorei (2) kwangsing3 (1) Feature Mail Transport: option to use BCC ( #15554 ) - murrant New command: lnms report:devices ( #15539 ) - murrant Breaking Change Plugin update (breaking) ( #15498 ) - murrant Security Fix a few XSS vulnerabilities in device group popups ( #15581 ) - murrant Disable GET login by default ( #15558 ) - murrant Use GitHub for vulnerability reporting ( #15555 ) - murrant Device [APC sensor] Actual state of alarm contact beside config state ( #15576 ) - jepke Vertiv PDU show power graph in mouesover and device overview ( #15543 ) - Galileo77 Cisco WLC: fetch LWAPP SSIDs for client counts ( #15531 ) - murrant Add sysObjectIDs for other models of PSS shelves ( #15525 ) - peelman Added values from SFP DDM values for awplus switches ( #15522 ) - luttermann Add support for Nokia 1830 PSS Optical gear ( #15516 ) - peelman Add Support for Samlex America PSR-1200-48 Inverters ( #15515 ) - peelman TrueNAS no longer supports zpool space usage ( #15490 ) - murrant Vertiv pdu mg02e4w1 ( #15484 ) - Galileo77 Add FortiGate Environment stats ( #15464 ) - westerterp Add support for FiberStore \"data center\" switches ( #15445 ) - cmadamsgit Adding basic support for Datacom DmOS devices. ( #15436 ) - lhwolfarth Apc ap 7900b ( #15392 ) - webtroter Add definition fujifilmprinter ( #15381 ) - Wooboy Initial support for Moxa EDS-4000 Series switches ( #15293 ) - kmodzel Cisco SB Switch Temp and Fanspeed fix ( #15225 ) - Fehler12 Add support eltex more devices ( #15108 ) - drykov-ttc Add support for Security Radar ( #15053 ) - tydal-borge Add disk sensors for Oceanstor ( #15010 ) - iNuc1ear Fix Fortinet HA-status polling state translations ( #14921 ) - ottorei Add Quantum Scalar I6000 Tape Library ( #14915 ) - mpikzink Add liebert detailsv2 ( #14746 ) - RandGH Zyxel AP wireless client discovery enhancement ( #14704 ) - underscoredje Dantherm hostname ( #14223 ) - Schouwenburg Add Panorama log collection write rate ( #13864 ) - ottorei Webui Device links formatting changes ( #15580 ) - eskyuu Only set user roles if they are defined ( #15577 ) - murrant Fix Down/Up time error if device is unpolled ( #15545 ) - murrant Fix health temperature degree display ( #15541 ) - murrant Fixed BGP Remote peer link and graph in Routing Overview, or just static text when not a device in LibreNMS ( #15535 ) - tim427 Added BGP Remote peer link and graph in Routing Overview ( #15532 ) - tim427 Respect web_mouseover setting in popup component ( #15530 ) - murrant Prefetch devices in group to avoid cost of subquery ( #15511 ) - slalomsk8er Alerting Give reason for alert template fallback ( #15583 ) - murrant Add option to disable the send of acknowledgement alerts. ( #15208 ) - not-known Applications [bugfix] Passing $device into data_update_helper functions instead of declaring it as global. ( #15542 ) - bnerickson Api API Oxidized http source optimization ( #15560 ) - murrant Get poller group ( #15493 ) - VirTechSystems Discovery UCD buffers and cache discovered with inverted free/used values ( #15538 ) - murrant Polling Prevent non-unicode characters in ifAlias ( #15585 ) - murrant BGP-peers if no data, skip ( #15548 ) - murrant UCD-MIB polling check isset ( #15547 ) - murrant Fix Ciscowlc error when bsnApIfNoOfUsers is not present ( #15529 ) - murrant Authentication Add auth_ldap_cacertfile and auth_ldap_ignorecert options ( #15526 ) - peejaychilds Bug Bug - Fix API Content-Type Header handling ( #15574 ) - PipoCanaja Huawei Controllers - Exception removed and changed OID for AP Type ( #15564 ) - PipoCanaja Fix graphs device check before auth ( #15551 ) - murrant Prometheus on failure, disable for rest of run ( #15546 ) - murrant Bug - Fix missing device_id in NAC tab view ( #15534 ) - PipoCanaja Bug - string VS array ( #15533 ) - PipoCanaja OSPF tables fix integer types ( #15528 ) - murrant Fixed the wrong field being used for join ( #15524 ) - laf Dark mode fix routing tabs & pages ( #15485 ) - jepke Minor fix and tweak for graylog integration ( #15455 ) - jepke Smokeping menu and title use device displayname ( #15387 ) - fbouynot Increase max package name length to 128 characters ( #14895 ) - WilliamDEdwards Cleanup Remove api_demo config setting ( #15563 ) - electrocret Wifi module does not exist anymore ( #15549 ) - murrant Misc device column cleanups ( #15518 ) - murrant Documentation Update Docker docs ( #15556 ) - GramThanos Changed log item, source(s_sys) to source(s_src) ( #15521 ) - helppp Translation Change spelling disc -> disk ( #15569 ) - arjenz Misc Update renamehost to include more logging if a folder already exists# ( #15280 ) - jaannnis Internal Features Print stack trace in error dumps ( #15514 ) - murrant SnmpQuery runtime cache ( #15512 ) - murrant Dependencies Bump axios from 0.25.0 to 1.6.0 ( #15571 ) - dependabot Bump browserify-sign from 4.2.1 to 4.2.2 ( #15510 ) - dependabot 23.10.0 (2023-10-26) A big thank you to the following 30 contributors this last month: murrant (84) SourceDoctor (6) tim427 (4) electrocret (3) dependabot (3) noaheroufus (3) PipoCanaja (3) Galileo77 (2) fbouynot (2) Jellyfrog (2) peejaychilds (1) cwispy (1) qwerin (1) lhwolfarth (1) CTV-2023 (1) barryodonovan (1) MrShunz (1) brointhemix (1) I-FGSD (1) Ac0lyte (1) Jimmy-Cl (1) waddles (1) bnerickson (1) netravnen (1) jepke (1) TheMysteriousX (1) rolfbergheim (1) VVelox (1) davromaniak (1) metrojworthington (1) Thanks to maintainers and others that helped with pull requests this month: murrant (30) Jellyfrog (23) electrocret (21) PipoCanaja (2) RafalNiewinski (1) rcmcronny (1) Feature Muteable acknowledged alert notifications ( #15456 ) - SourceDoctor Throttle error reporting ( #15391 ) - murrant Deprecate poller.php ( #15370 ) - murrant Security Fix MAC search sql injection ( #15402 ) - murrant Validate secure cookies ( #15401 ) - murrant Fix xss in device groups overview ( #15399 ) - murrant Update Tnmsne table backend ( #15384 ) - murrant Fix unescaped output in ipv6 search page ( #15327 ) - murrant Device Fix websensor temp user_func ( #15492 ) - murrant Discover AEN with sysobjectid instead of sysdescr ( #15482 ) - fbouynot Huawei VRP AP controller fixes ( #15450 ) - murrant Timos MPLS nullables round 2 ( #15448 ) - murrant Fortimail add mail queues message count ( #15444 ) - cwispy Fix timos mpls, add checks ( #15430 ) - murrant Fix VRP polling ( #15428 ) - murrant Updating Datacom logo ( #15427 ) - lhwolfarth Moxa EDS improve discovery ( #15375 ) - murrant Fix Raisecom devices having not increasing OIDs on snmpwalk ( #15365 ) - MrShunz Aviat svg logos ( #15360 ) - murrant Add Fortinet logo ( #15359 ) - murrant Added support for Cambium cnWave60 gear ( #15358 ) - noaheroufus Added support for Cambium cnMatrix switches ( #15351 ) - noaheroufus Update Windows version naming ( #15350 ) - I-FGSD Calix logo update ( #15348 ) - murrant Calix AXOS Sensor Changes ( #15343 ) - noaheroufus Adding Active Power in Watts to APCs ( #15337 ) - Jimmy-Cl Device stulz WIB8000 ( #15271 ) - jepke Added some groups and corrected some references ( #15129 ) - rolfbergheim Add model for Christie Digital projectors ( #15088 ) - davromaniak Vmware vminfo modernize ( #15008 ) - murrant Mcc valere ( #14753 ) - metrojworthington Webui Do not update device IP when DNS resolution fails ( #15499 ) - murrant Fix FDB table ip addresses missing ( #15481 ) - murrant Fix bug saving snmpv3 device changes ( #15419 ) - murrant Fix graph errors ( #15407 ) - murrant Calculate downtime from device_outages table ( #15397 ) - murrant Sort services by type and name ( #15367 ) - SourceDoctor Vertically center device icons ( #15361 ) - murrant Fix BGP peer IP missing in Routing page ( #15352 ) - tim427 Fix incorrect pages offset on app ntp page ( #15349 ) - Ac0lyte Show Temperature Graphs on Smart App Overview ( #15342 ) - SourceDoctor Show never polled Information on Widget and in Device itself ( #15341 ) - SourceDoctor Show device group on device overview ( #15338 ) - SourceDoctor FDB Tables improve performance ( #15333 ) - murrant Fix some issues with admin self settings ( #15332 ) - murrant Fix eventlog debug code left in ( #15331 ) - murrant Device NAC page to Laravel Blade ( #15329 ) - PipoCanaja Alerting Send event log when alert rule fails ( #15440 ) - murrant Fix Linemessagingapi class name ( #15356 ) - murrant Fix alerting find owner contacts on old SQL server versions ( #15355 ) - murrant Add alert transport for Grafana Oncall ( #15330 ) - waddles Show which host marked a device as down. ( #15209 ) - TheMysteriousX Graphs Fix rrd exists check ( #15466 ) - murrant Scale disk spezific SMART Graph from 0 ( #15339 ) - SourceDoctor Applications Unix Agent and Application fixes ( #15460 ) - murrant Adding Socket Statistics Application Support ( #15307 ) - bnerickson Update docs for osupdate when being used as a script for the agent ( #15099 ) - VVelox Api Fix API get_location by ID ( #15506 ) - murrant Allow add device to set location ( #15469 ) - murrant Settings Rearrange AD auth settings ( #15363 ) - murrant Polling IS-IS polling handle missing data ( #15491 ) - murrant Fix polling down retry (and other items) ( #15483 ) - murrant Ports min polled period of 1 ( #15472 ) - murrant Ports module: fix nulls not updating ( #15467 ) - murrant Always create rrd folder on localhost ( #15457 ) - murrant Fix port module wrong null ( #15431 ) - murrant Fix an agent bug if a process ran more than 999 days ( #15411 ) - murrant Type safety check ( #15409 ) - murrant Add rewrites include for legacy modules ( #15405 ) - murrant Fix last polled in wrong column ( #15398 ) - murrant Fix last polled ( #15396 ) - murrant Availability module fixes ( #15369 ) - murrant Bug Add Wrong Type work around to snmp_get function ( #15509 ) - peejaychilds Ospf metrics fix ( #15508 ) - murrant IP::fromHexString handle ascii ( #15504 ) - murrant Fix poller perf graph time ( #15500 ) - murrant Fix auth_ad_url validation ( #15487 ) - murrant Fix regression causing wall of ping latency ( #15486 ) - fbouynot Fix Device ip address mutator ( #15480 ) - murrant Fix Typo in FdbTablesController ( #15477 ) - electrocret Allow inserting null values for sensors ( #15470 ) - Jellyfrog Never set bgp and ports delta fields to unsigned ( #15468 ) - murrant Error when device is not found ( #15459 ) - murrant Restore _delta fields to signed ( #15458 ) - murrant Change port and BGP stats fields to unsigned ( #15449 ) - murrant Fix Top menu search on mobile respo ( #15439 ) - qwerin Packages fixes (+pacman) ( #15415 ) - murrant Fix bug in graphite ( #15393 ) - murrant Fixing Private eBGP visualization, corrected 16bit ASN private range, added 32bit ASN range ( #15357 ) - tim427 Improve \"count\" graphs for F5OS ( #15335 ) - PipoCanaja Refactor Refactor MAC utilities into a single class ( #15379 ) - murrant Refactor discovery-protocols with SnmpQuery ( #15324 ) - PipoCanaja Cleanup ARP Discovery use MacHelper ( #15479 ) - electrocret Ports ifPhysAddress use MAC helper ( #15478 ) - murrant Module status cleanups ( #15461 ) - murrant Use modern device attrib handling ( #15429 ) - murrant Remove some lightly used or unused dbFacile functions ( #15418 ) - murrant Misc fixes 42 ( #15413 ) - murrant Remove snmp functions that are barely used ( #15377 ) - murrant Remove legacy addhost code ( #15376 ) - murrant Remove unused functions ( #15371 ) - murrant Documentation Redirect old install docs ( #15505 ) - murrant Update supported OS list ( #15426 ) - Jellyfrog Documentation - Smokeping Integration in Centos - Update Smokeping.md ( #15390 ) - CTV-2023 Specify radius attributes for auth roles ( #15374 ) - barryodonovan Add unzip to all install docs dependencies ( #15354 ) - brointhemix Docs security secure session cookie ( #15328 ) - murrant Stable release update clarification ( #15326 ) - murrant Bird2 set timeformat protocols ( #15292 ) - netravnen Translation German and English typo correction ( #15503 ) - Galileo77 German translation corrected and some visual improvements added. ( #15502 ) - Galileo77 Missing device ip translation ( #15465 ) - murrant Tests Exclude availability module from default testing ( #15462 ) - murrant Misc Fixes check_dns against localhost when a search-domain is configured ( #15373 ) - tim427 Added extra ASN-range comments, added Priv eBGP on host details, changed color to light-blue instead of red ( #15372 ) - tim427 Internal Features Add application metrics model and relationships ( #15417 ) - murrant Error Reporting: Log instead of dump ( #15412 ) - murrant Dependencies Bump @babel/traverse from 7.16.10 to 7.23.2 ( #15473 ) - dependabot Bump postcss from 8.4.19 to 8.4.31 ( #15380 ) - dependabot Bump composer/composer from 2.5.8 to 2.6.4 ( #15364 ) - dependabot 23.9.0 (2023-09-15) A big thank you to the following 16 contributors this last month: murrant (33) SourceDoctor (3) VVelox (3) eskyuu (2) PipoCanaja (2) MrMoCoDev (1) electrocret (1) Pelt10 (1) LoveSkylark (1) slashdoom (1) jepke (1) hanserasmus (1) adamsweet (1) fbourqui (1) fbouynot (1) Fehler12 (1) Thanks to maintainers and others that helped with pull requests this month: murrant (10) Jellyfrog (9) electrocret (8) PipoCanaja (3) VVelox (1) cltnoc (1) ottorei (1) Feature Additional contact options for email transports ( #15266 ) - murrant Implement RBAC (only built in roles) ( #15212 ) - murrant Security Fix injection vulnerability in fdb search page ( #15315 ) - murrant Fix injection vulnerability in ports pages ( #15314 ) - murrant Fix another addcslashes incorrect escape in eventlog ( #15313 ) - murrant Fix another injection in ipv4 search page ( #15312 ) - murrant Fix injection in search pages ipv4, etc ( #15311 ) - murrant Fix improperly escaped output in outages page ( #15310 ) - murrant Device Fix smartos-dcp-m.yaml ( #15295 ) - electrocret Use mtxrGaugeTable instead of mtxrHealthGroup ( #15289 ) - murrant Added support for Nutanix VM count, disk state, CPU usage and RAM usage ( #15252 ) - eskyuu Initial support for f5os ( #15241 ) - fbouynot Webui Fix login page HTML ( #15321 ) - murrant Fix device display name in top interfaces widget ( #15319 ) - murrant Timezone, fix user set no timezone ( #15296 ) - murrant Availability Map: Show ignored device up when up ( #15283 ) - SourceDoctor Custom ssh,telnet port with oxidized ( #15255 ) - jepke WebUI Services, generate more compact table ( #15243 ) - fbourqui Added empty string check ( #15235 ) - Fehler12 Use full name for vendor_oui ( #15234 ) - PipoCanaja Add global NAC page ( #15228 ) - PipoCanaja Alerting Fix error when mail-contact is missing ( #15305 ) - murrant Hide token, keys and passwords in Transports ( #15274 ) - LoveSkylark Applications For the applications table set the defaults for app_instance and app_instance to '' ( #15278 ) - VVelox Application Soft Delete ( #15270 ) - VVelox Api Allow port search API to search ifAlias again ( #15320 ) - murrant Fix API availability graph duration ( #15250 ) - murrant Settings Add ui description for reporting dump_errors ( #15264 ) - murrant Polling Fix port ifAlias polling ( #15279 ) - murrant Fix ifSpeed override not being applied ( #15237 ) - murrant Authentication ADAuthorizer auth skip count entry ( #15322 ) - murrant Radius enforce roles ( #15294 ) - murrant Bug FIX TP-Link JetStream 3.0.0 Build 20180511 Rel.36491(s) T1500-28PCT 3.0 ( #15318 ) - MrMoCoDev Fix issue with rrdcached application and bad input ( #15301 ) - murrant Fix .env quoting issue ( #15298 ) - murrant Fix typo in default mibs for SnmpQuery ( #15297 ) - murrant Readd missing key ( #15291 ) - SourceDoctor Fix missing keys for new status ( #15284 ) - SourceDoctor Revert \"Added empty string check\" ( #15249 ) - murrant Fix manual port speed storage ( #15238 ) - murrant Make the service template controller re-evaluate dynamic membership when apply all button is pushed ( #15214 ) - eskyuu Cleanup Return an 5XX error when an exception is raise ( #15285 ) - Pelt10 Documentation Note the package install command for dhcpd-pools for FreeBSD ( #15247 ) - VVelox Update severity colours in SNMP-Traps.md ( #15244 ) - adamsweet Misc Another OR statement in GrayLog API ( #15246 ) - hanserasmus Dispatcher option to log output ( #15230 ) - murrant 23.8.0 (2023-08-19) A big thank you to the following 32 contributors this last month: murrant (31) VVelox (5) Jellyfrog (4) electrocret (4) santiag0z (3) laf (3) viptampa (3) arjenz (2) knpo (1) WhiteyDude (1) jacobw (1) jepke (1) sjtarik (1) pjordanovic (1) Schouwenburg (1) eggbeater98 (1) i4networks (1) fbourqui (1) hirose003 (1) richard-ririe (1) robje (1) peejaychilds (1) bonzo81 (1) slashdoom (1) eskyuu (1) j796160836 (1) TheMysteriousX (1) VirTechSystems (1) fufroma (1) zappiehost (1) jgelinas (1) mwobst (1) Thanks to maintainers and others that helped with pull requests this month: murrant (26) Jellyfrog (25) electrocret (23) PipoCanaja (3) laf (2) VVelox (2) ottorei (1) streamthing (1) Feature Add FDB table vendor search drop down ( #15072 ) - bonzo81 Port_error_perc macro ( #15016 ) - electrocret Security Fix unsanitized input injection ( #15184 ) - murrant Fix some xss injection for sysLocation and some other fields ( #15183 ) - murrant Device Fix version comparison for RouterOS ( #15227 ) - knpo Netscaler, don't use 0 divisor ( #15204 ) - murrant Update Alpine Linux logos to SVG ( #15185 ) - murrant APC new sensors and fix ( #15179 ) - jepke Add SHARP BP series of devices ( #15169 ) - pjordanovic Fix Timos SAR Cellular RSRP and RSSI sensors ( #15163 ) - Schouwenburg Update bgp-peers.inc.php for timos ( #15154 ) - i4networks Fortigate ipv6 ipsec ( #15150 ) - fbourqui Add Calix E7 (EXA) PON port sensors ( #15145 ) - murrant Add os check in discovery for aix/freenas storage and cisco cdp ( #15104 ) - peejaychilds Add VLAN Discovery for arubaos-cx ( #15055 ) - slashdoom Openmanage enterprise modular ( #14408 ) - jgelinas Webui Fixed CSS error causing generic image widgets not to do height correctly ( #15220 ) - WhiteyDude Fix error when there is an untranslated sensor type ( #15176 ) - murrant Fix select2 search field focus ( #15171 ) - murrant Update text color in dark.css ( #15155 ) - eggbeater98 Alerting Discord Transport user configurable embed fields ( #15068 ) - murrant Implement LINE Messaging API ( #14867 ) - j796160836 Graphs Fix Memmory spelling ( #15231 ) - arjenz Add generic stats graph munging support and make uptime display as days again ( #15097 ) - VVelox Applications Add the Mojo CAPE Submit app ( #15140 ) - VVelox Logsize monitoring for LibreNMS ( #15137 ) - VVelox Update SMART monitoring to the use JSON ( #15132 ) - VVelox Add a flag for adding app data to tests generated via scripts/json-app-tool.php ( #15080 ) - VVelox Add BIRD2 BGP Peers application support ( #14466 ) - zappiehost Billing Fixed a zero value data insertion for billing ( #15194 ) - laf Updated poll-billing.php to only query for data via snmp when the device and port are both up ( #15164 ) - laf Added basic support for distributing billing ( #15156 ) - laf Api Add API endpoint to get service graphs ( #15138 ) - richard-ririe API get_location ( #14779 ) - VirTechSystems Discovery Always mark device last_discovered ( #15218 ) - murrant Polling Allow dispatcher service master timeout to be set ( #15161 ) - murrant Fix fping 4.0+ prefers IPv6 ( #14825 ) - TheMysteriousX Add module support for wrapper script calls ( #14055 ) - mwobst Authentication Remove user_id cast to int ( #15205 ) - jacobw Bug Print a useful error if logfile is not writable ( #15233 ) - murrant Make the installer use the schema dump ( #15211 ) - Jellyfrog Change leaflet.default_zoom to Float ( #15207 ) - electrocret Handle empty dbSchema table ( #15198 ) - murrant Fix timezone controller bad return ( #15191 ) - murrant Graylog API properly throw errors ( #15188 ) - murrant Fixing the mac/vendor database download from wireshark, updated file \u2026 ( #15175 ) - sjtarik Fix alert.macros.rule ( #15172 ) - electrocret Miscellaneous fixes ( #15162 ) - murrant Change display query of list_devices to pattern match ( #15147 ) - hirose003 Change rrd_prune find command to exlcude .gitignore ( #15134 ) - robje Apply service templates on a per-device basis ( #15024 ) - eskyuu RFC1628 - Force cast on some values before doing arithmetic ( #14613 ) - fufroma Refactor Fix sensor discovery fetch issue ( #15193 ) - murrant MAC Vendor OUI use scheduler ( #15187 ) - murrant Cleanup Misc fixes 2 ( #15190 ) - murrant Severity Enum ( #14620 ) - murrant Documentation [DOC] Added social links in footer ( #15195 ) - santiag0z OS discovery clarification ( #15182 ) - murrant [DOC] Remove ~$ from BIND9 code block aka named ( #15181 ) - santiag0z Fix settings titles in dark mode ( #15174 ) - murrant Update Routeros.md ( #15165 ) - viptampa Update Routeros.md ( #15160 ) - viptampa RouterOS Vlan agent script clarification ( #15158 ) - viptampa Fix bad link in Install-LibreNMS.md ( #15152 ) - arjenz Tests Only dump snmp logs on failure ( #15200 ) - murrant Misc Use Laravel schema migration command directly ( #14039 ) - Jellyfrog Internal Features Set mibs explicitly in SnmpQuery ( #15199 ) - murrant Editor yaml indent fine tuning ( #15189 ) - murrant Dependencies Update composer dependencies ( #15167 ) - Jellyfrog Update Ziggy ( #15151 ) - murrant Dependency Updates ( #15149 ) - murrant 23.7.0 (2023-07-16) A big thank you to the following 19 contributors this last month: peejaychilds (4) tuxgasy (3) murrant (3) jepke (2) VVelox (2) laf (1) PipoCanaja (1) eggbeater98 (1) illogik (1) elianmanzueta (1) peelman (1) Blinq-SanderBlom (1) vincent5753 (1) electrocret (1) mtentilucci (1) edgesite (1) davromaniak (1) TheMysteriousX (1) sjtarik (1) Thanks to maintainers and others that helped with pull requests this month: murrant (12) electrocret (6) Jellyfrog (6) ottorei (4) laf (3) PipoCanaja (1) FadhliRais (1) VVelox (1) PJGuyTen (1) Device Fix MPLS Tab Display for Nokia devices using LDP and not RSVP ( #15128 ) - peelman Change state value for unplugged linecard ( #15126 ) - Blinq-SanderBlom Convert several JunOS sensors to yaml ( #15118 ) - murrant Update Trellix NSP discovery ( #15117 ) - mtentilucci APC new sensors ( #15090 ) - jepke Add regex for Supermicro switches running firmware 2.0 or newer, now called \"SuperSwitch\" ( #15083 ) - davromaniak Add support for PrimeKey Software Appliance ( #15059 ) - TheMysteriousX Webui Update Dark theme for readability on availability map ( #15141 ) - eggbeater98 Add Oxidized search clarification ( #15124 ) - electrocret Sort port by interface name while list ports. ( #15093 ) - edgesite Alerting Alert transport slack config fixes ( #15131 ) - illogik Transport Messagebird voice message API ( #15115 ) - jepke Applications Add Privoxy stats support ( #15114 ) - VVelox Add Suricata Extract submission stats app ( #15105 ) - VVelox Api Adding human readable version of /api/v0/fdb/{mac}/detail ( #15045 ) - sjtarik Discovery Fix bogus reply from snmpwalk in ipNetToPhysicalPhysAddress ( #15142 ) - PipoCanaja Polling Fix for hrStorageIndex agility ( #15028 ) - peejaychilds Bug Skip hostnames which are blank when generating the smokeping config ( #15144 ) - laf Change chunk to chunkById ( #15139 ) - peejaychilds Use lock ports_purge in ports_purge rather than syslog_purge lock ( #15135 ) - peejaychilds Fix validation: memcached required only if it is configured in .env ( #15122 ) - tuxgasy Exit non-zero if composer bin not found ( #15120 ) - tuxgasy Documentation Update openwrt doc following PR #15096 ( #15119 ) - tuxgasy Translation Fix typo in delhost.inc.php ( #15130 ) - elianmanzueta Added missing zh-tw translation. ( #15125 ) - vincent5753 Internal Features Yaml value filling improvements ( #15116 ) - murrant 23.6.0 (2023-06-23) A big thank you to the following 14 contributors this last month: VVelox (4) Jellyfrog (4) murrant (2) si458 (1) netravnen (1) tuxgasy (1) jepke (1) ajsiersema (1) wrongecho (1) peejaychilds (1) tim427 (1) kg6uyz (1) d-k-7 (1) electrocret (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (9) murrant (6) electrocret (4) ottorei (2) Feature Alert transport cleanup, no_proxy support and other proxy cleanups ( #14763 ) - murrant Device Improve OpenWRT detection ( #15096 ) - tuxgasy TEG-S50ES and TPE-P521ES device detection ( #15052 ) - kg6uyz Add sensor support for cefcModuleOperStatus ( #15026 ) - d-k-7 Extend Avocent Support ( #14914 ) - electrocret Alerting Messagebird transport ( #15079 ) - jepke Remove asterisk from recurring input ( #15074 ) - wrongecho Fix syslog transport output format ( #15070 ) - peejaychilds Fixed Markdown/Parse mode for Telegram ( #15066 ) - tim427 Applications Add ZFS L2 support ( #15095 ) - VVelox Add Linux Softnet Stat app ( #15094 ) - VVelox Add Sneck support, making it very trivial to use Nagios style checks in a NRPE like manner ( #13954 ) - VVelox Bug Fixes #14975 Services in Device Groups not displayed correctly in Availability widget ( #15076 ) - ajsiersema Fix Dusk tests after 13626 ( #15057 ) - Jellyfrog Cleanup Add AllowDynamicProperties to DynamicConfigItem ( #15058 ) - Jellyfrog Documentation Add archlinux example ( #15113 ) - si458 Fix minor typo in Applications.md ( #15111 ) - VVelox Mibs Update MIKROTIK-MIB to v7.10 release ( #15110 ) - netravnen Dependencies Laravel 10.x Shift ( #14995 ) - Jellyfrog 23.5.0 (2023-05-19) A big thank you to the following 37 contributors this last month: murrant (29) Jellyfrog (6) mtentilucci (5) peelman (4) electrocret (4) laf (3) cjsoftuk (3) alchemyx (2) Bierchermuesli (2) bakerds (2) mpikzink (2) TheMysteriousX (2) QuadPiece (1) elipsion (1) etiennewan (1) jlo-lirmm (1) dscw (1) fbouynot (1) santiag0z (1) dependabot (1) VoipTelCH (1) otkd (1) ajsiersema (1) JStandiford (1) PipoCanaja (1) arjenz (1) maticomba (1) SourceDoctor (1) pjroehl (1) cjwbath (1) MajesticFalcon (1) bnerickson (1) bestlong (1) Olen (1) mboehn (1) ollb (1) eskyuu (1) Thanks to maintainers and others that helped with pull requests this month: murrant (47) electrocret (18) Jellyfrog (16) ottorei (1) PipoCanaja (1) JohnnyBBravo (1) Feature Set focus to Global Search on Ctrl-F ( #14947 ) - Bierchermuesli Add link to hosts mgmt (ipmi) interface ( #14905 ) - mpikzink Implement authentication for Redis/Sentinel ( #14805 ) - TheMysteriousX Security Convert the inventory page to Laravel ( #15004 ) - murrant Device Add RoomAlert 12E Switch Sensors, fix Humidity Sensor ( #15049 ) - peelman Fix WISI over graphs ( #15040 ) - peelman Fix inventory display for Calix AXOS devices ( #15039 ) - peelman Map GPS lat and lon to os module ( #15033 ) - QuadPiece Firebrick CPU Monitoring ( #15030 ) - cjsoftuk Fix Firebrick mempool polling ( #15022 ) - cjsoftuk Add support for memory monitoring on Firebrick platform ( #15021 ) - cjsoftuk Fix vsolution discovery yaml ( #14970 ) - murrant Fix tait tnadmin processors ( #14969 ) - murrant Fix Raisecom Processor ( #14968 ) - murrant Fix Raisecom ROS processor collection ( #14966 ) - murrant Add support for Trellix ATD devices ( #14965 ) - mtentilucci Add support for Trellix NSP devices ( #14964 ) - mtentilucci Cisco QFP polling fixes ( #14961 ) - Bierchermuesli Add version, hardware and serial collection ( #14956 ) - JStandiford Add Rubrik Discovery ( #14951 ) - mtentilucci Add Nutanix AOS discovery ( #14950 ) - mtentilucci RouterOS runtime quirk on first discovery ( #14945 ) - murrant Added sensor support for older APC InfraStruXure PDUs ( #14944 ) - bakerds Expand discovery of gigavue os ( #14933 ) - mtentilucci Add discovery of NVT Phybridge FLEX24 ( #14913 ) - pjroehl Add initial OS detection for LoadBalancer.org ( #14902 ) - cjwbath Added graphing of DDoS-protection related OIDs for PAN-OS ( #14847 ) - bakerds Add support for Alpha CXC HP Controller ( #14829 ) - MajesticFalcon Change ESXi port naming to be stable ( #14639 ) - TheMysteriousX Add advantech icr-os for advantech routers ( #14171 ) - mboehn Fix cisco dbm sensors port link on discovery (NCS55A2) ( #13965 ) - ollb Webui Ondemand popup graphs ( #15050 ) - murrant Add a global setting for Ctrl-F focus (improve #14947) ( #15023 ) - etiennewan [About] Link to LinkedIn ( #14991 ) - santiag0z Clarify Alert Notify Settings ( #14974 ) - electrocret Fix Legacy vars Processing ( #14967 ) - murrant Correct PowerConsumed SI Units in Overview ( #14425 ) - mpikzink Added support for user timezones and user browser timezone by default (incomplete) ( #13626 ) - eskyuu Alerting Fix undefined array key ( #15025 ) - Jellyfrog Graphs Php implode arg mismatch ( #15014 ) - jlo-lirmm Fix availability graphs to 100% ( #15013 ) - laf Fix scale_rigid accidentally being set to false ( #14992 ) - murrant Set device ping_perf scale_min to 0 ( #14989 ) - murrant Poller perf: add per device average ( #14940 ) - murrant Stacked graphs on zoom to speed ( #14928 ) - electrocret Applications Adding linux_config_files application support ( #14776 ) - bnerickson Agent support OS Updates ( #14687 ) - bestlong Api Allow device ignore to be set via API ( #14985 ) - electrocret Enable disabling a device via api ( #14983 ) - VoipTelCH Discovery Snmp-scan filter for dns resolved devices ( #14934 ) - SourceDoctor Polling Fixes #14957 missing IPv6 BGP peers ( #14959 ) - ajsiersema Fix SnmpQuery and max_oid ( #14955 ) - murrant Bug Fix timetaken columns too small ( #15042 ) - murrant Fix some undefined constants ( #14993 ) - murrant Fix routes after Laravel9 ( #14977 ) - Jellyfrog Fix more divide by zero issues ( #14954 ) - murrant Bug - wrong type in ports.inc.php ( #14952 ) - PipoCanaja Solves error in discovering services module ( #14939 ) - maticomba Ensure irc fifo-file is shared between dispatcher and core containers ( #14647 ) - Olen Refactor Add a validation for checking if the scheduler is running ( #14987 ) - Jellyfrog Refactor billing ( #14979 ) - murrant Cleanup Remove old unused adduser page and script ( #15035 ) - murrant Adopt anonymous migrations ( #15005 ) - Jellyfrog Remove unused port fields ( #14963 ) - murrant Cleanup enable bgp setting ( #14931 ) - electrocret Documentation Re-add the Ubuntu Image page and links ( #15041 ) - laf Remove references to VM images ( #15031 ) - murrant Updated WebUI config options in docs to support direct linking to installs ( #15009 ) - laf Fix spelling error in Graylog section ( #15002 ) - dscw Update OAuth-SAML.md to prevent http code 419 error ( #15000 ) - fbouynot Update Smokeping.md with better nginx config instructions ( #14999 ) - alchemyx Update Copyright year to 2023 in README.md ( #14972 ) - otkd Update Install-LibreNMS.md ( #14949 ) - alchemyx Tests Reduce OS module test noise ( #15046 ) - murrant Test PHP 8.2 and MariaDB 10.11 ( #15007 ) - murrant Slightly better OS module test output ( #15001 ) - murrant Fix a bug when creating test data; if a community contained the strin\u2026 ( #14739 ) - peelman Mibs Bump VMware MIBs ( #15029 ) - elipsion Dependencies Bump guzzlehttp/psr7 from 2.4.4 to 2.5.0 ( #14986 ) - dependabot Laravel 9.x Shift ( #14504 ) - Jellyfrog 23.5.0 (2023-05-19) A big thank you to the following 37 contributors this last month: murrant (29) Jellyfrog (6) mtentilucci (5) peelman (4) electrocret (4) laf (3) cjsoftuk (3) alchemyx (2) Bierchermuesli (2) bakerds (2) mpikzink (2) TheMysteriousX (2) QuadPiece (1) elipsion (1) etiennewan (1) jlo-lirmm (1) dscw (1) fbouynot (1) santiag0z (1) dependabot (1) VoipTelCH (1) otkd (1) ajsiersema (1) JStandiford (1) PipoCanaja (1) arjenz (1) maticomba (1) SourceDoctor (1) pjroehl (1) cjwbath (1) MajesticFalcon (1) bnerickson (1) bestlong (1) Olen (1) mboehn (1) ollb (1) eskyuu (1) Thanks to maintainers and others that helped with pull requests this month: murrant (47) electrocret (18) Jellyfrog (16) ottorei (1) PipoCanaja (1) JohnnyBBravo (1) Feature Set focus to Global Search on Ctrl-F ( #14947 ) - Bierchermuesli Add link to hosts mgmt (ipmi) interface ( #14905 ) - mpikzink Security Convert the inventory page to Laravel ( #15004 ) - murrant Device Add RoomAlert 12E Switch Sensors, fix Humidity Sensor ( #15049 ) - peelman Fix WISI over graphs ( #15040 ) - peelman Fix inventory display for Calix AXOS devices ( #15039 ) - peelman Map GPS lat and lon to os module ( #15033 ) - QuadPiece Fix vsolution discovery yaml ( #14970 ) - murrant Fix tait tnadmin processors ( #14969 ) - murrant Fix Raisecom Processor ( #14968 ) - murrant Fix Raisecom ROS processor collection ( #14966 ) - murrant Add support for Trellix ATD devices ( #14965 ) - mtentilucci Add support for Trellix NSP devices ( #14964 ) - mtentilucci Cisco QFP polling fixes ( #14961 ) - Bierchermuesli Add version, hardware and serial collection ( #14956 ) - JStandiford Add Rubrik Discovery ( #14951 ) - mtentilucci Add Nutanix AOS discovery ( #14950 ) - mtentilucci RouterOS runtime quirk on first discovery ( #14945 ) - murrant Added sensor support for older APC InfraStruXure PDUs ( #14944 ) - bakerds Expand discovery of gigavue os ( #14933 ) - mtentilucci Add discovery of NVT Phybridge FLEX24 ( #14913 ) - pjroehl Add initial OS detection for LoadBalancer.org ( #14902 ) - cjwbath Added graphing of DDoS-protection related OIDs for PAN-OS ( #14847 ) - bakerds Add support for Alpha CXC HP Controller ( #14829 ) - MajesticFalcon Add advantech icr-os for advantech routers ( #14171 ) - mboehn Fix cisco dbm sensors port link on discovery (NCS55A2) ( #13965 ) - ollb Webui Ondemand popup graphs ( #15050 ) - murrant Clarify Alert Notify Settings ( #14974 ) - electrocret Fix Legacy vars Processing ( #14967 ) - murrant Correct PowerConsumed SI Units in Overview ( #14425 ) - mpikzink Added support for user timezones and user browser timezone by default (incomplete) ( #13626 ) - eskyuu Alerting Fix undefined array key ( #15025 ) - Jellyfrog Graphs Php implode arg mismatch ( #15014 ) - jlo-lirmm Fix availability graphs to 100% ( #15013 ) - laf Fix scale_rigid accidentally being set to false ( #14992 ) - murrant Set device ping_perf scale_min to 0 ( #14989 ) - murrant Poller perf: add per device average ( #14940 ) - murrant Stacked graphs on zoom to speed ( #14928 ) - electrocret Applications Agent support OS Updates ( #14687 ) - bestlong Api Allow device ignore to be set via API ( #14985 ) - electrocret Enable disabling a device via api ( #14983 ) - VoipTelCH Discovery Snmp-scan filter for dns resolved devices ( #14934 ) - SourceDoctor Polling Fixes #14957 missing IPv6 BGP peers ( #14959 ) - ajsiersema Fix SnmpQuery and max_oid ( #14955 ) - murrant Bug Fix timetaken columns too small ( #15042 ) - murrant Fix some undefined constants ( #14993 ) - murrant Fix routes after Laravel9 ( #14977 ) - Jellyfrog Fix more divide by zero issues ( #14954 ) - murrant Bug - wrong type in ports.inc.php ( #14952 ) - PipoCanaja Solves error in discovering services module ( #14939 ) - maticomba Refactor Add a validation for checking if the scheduler is running ( #14987 ) - Jellyfrog Refactor billing ( #14979 ) - murrant Cleanup Remove old unused adduser page and script ( #15035 ) - murrant Remove unused port fields ( #14963 ) - murrant Cleanup enable bgp setting ( #14931 ) - electrocret Documentation Re-add the Ubuntu Image page and links ( #15041 ) - laf Remove references to VM images ( #15031 ) - murrant Updated WebUI config options in docs to support direct linking to installs ( #15009 ) - laf Fix spelling error in Graylog section ( #15002 ) - dscw Update OAuth-SAML.md to prevent http code 419 error ( #15000 ) - fbouynot Update Smokeping.md with better nginx config instructions ( #14999 ) - alchemyx Update Copyright year to 2023 in README.md ( #14972 ) - otkd Update Install-LibreNMS.md ( #14949 ) - alchemyx Tests Reduce OS module test noise ( #15046 ) - murrant Test PHP 8.2 and MariaDB 10.11 ( #15007 ) - murrant Slightly better OS module test output ( #15001 ) - murrant Fix a bug when creating test data; if a community contained the strin\u2026 ( #14739 ) - peelman Misc Firebrick CPU Monitoring ( #15030 ) - cjsoftuk Add a global setting for Ctrl-F focus (improve #14947) ( #15023 ) - etiennewan Fix Firebrick mempool polling ( #15022 ) - cjsoftuk Add support for memory monitoring on Firebrick platform ( #15021 ) - cjsoftuk Adopt anonymous migrations ( #15005 ) - Jellyfrog [About] Link to LinkedIn ( #14991 ) - santiag0z Implement authentication for Redis/Sentinel ( #14805 ) - TheMysteriousX Adding linux_config_files application support ( #14776 ) - bnerickson Ensure irc fifo-file is shared between dispatcher and core containers ( #14647 ) - Olen Change ESXi port naming to be stable ( #14639 ) - TheMysteriousX Laravel 9.x Shift ( #14504 ) - Jellyfrog Mibs Bump VMware MIBs ( #15029 ) - elipsion Dependencies Bump guzzlehttp/psr7 from 2.4.4 to 2.5.0 ( #14986 ) - dependabot 23.4.0 (2023-04-06) A big thank you to the following 25 contributors this last month: electrocret (8) VVelox (6) Jellyfrog (5) mtentilucci (4) Bierchermuesli (3) murrant (2) GeantRA (2) mwobst (2) dependabot (2) not-known (2) torbeckattsp (1) d-k-7 (1) arjenz (1) kirk444 (1) robje (1) pjroehl (1) peejaychilds (1) lukeofthetauri (1) fbouynot (1) bakerds (1) westerterp (1) peelman (1) jellejans (1) LoveSkylark (1) hvanoch (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (31) murrant (14) ottorei (6) electrocret (3) PipoCanaja (1) Feature Indicator on Port Notes tab when Port has notes ( #14923 ) - electrocret Syslog sink over http for logstash (or any json source) ( #14424 ) - Bierchermuesli Device Update hikvision camera detection ( #14943 ) - torbeckattsp APC UPS UIO sensor discovery bug ( #14942 ) - d-k-7 Add additional MOS / 7130 devices ( #14922 ) - kirk444 Add support for WTI console products ( #14920 ) - robje Update junos discovery yaml to reference total memory instead of buff\u2026 ( #14919 ) - GeantRA Add support for Trellix FireEye OS ( #14908 ) - mtentilucci Added cisco FTD 1150 to ftd.yaml ( #14907 ) - pjroehl Add more OIDs for determining hardware and serial attributes correctly ( #14904 ) - mwobst Add Cisco FTD Support for security appliances (x3) ( #14893 ) - mwobst Update test data to account for new vertiv.svg icon ( #14892 ) - mtentilucci Improve Corero CMS support ( #14876 ) - electrocret Add Avocent MergePoint Unity KVM Switch Support ( #14874 ) - mtentilucci Add Fortigate Webfilter stats ( #14873 ) - electrocret Add Cisco Firepower 4112 Support ( #14872 ) - lukeofthetauri Added PoE controller load and status sensors for Junos devices ( #14868 ) - bakerds Add Montclair EDFA Support ( #14852 ) - peelman Device - Add support for Scalance SC646-2C ( #14835 ) - jellejans Add Fortigate packet loss monitoring for Link-Monitor and SD-WAN ( #14828 ) - not-known Refactored Juniper SLA to include support for TWAMP and remove ambigu\u2026 ( #14787 ) - GeantRA Deltanet Lambdatrail LT2-S,HS ( #14661 ) - Bierchermuesli Add support for Battery Recommended Days Remaining ( #14653 ) - Jellyfrog Webui Pseudowires refresh ( #14882 ) - Bierchermuesli Alerting Jira transport: use template title ( #14883 ) - not-known Remove Time Elapsed extra space ( #14880 ) - electrocret Fix Alertlog messaging ( #14861 ) - electrocret Graphs Add graph_stat_percentile_disable config item to disable percentile lines/value printing ( #14887 ) - VVelox Convert NTP freq to use generic_stats ( #14834 ) - VVelox Update fail2ban to have better stat graphs and and fix generic_stats graph.php ( #14818 ) - VVelox Update various device graphs to to have better stats ( #14815 ) - VVelox Applications Add more docker stats ( #14767 ) - hvanoch Bug SnmpQuery, respect snmp.max_oid ( #14894 ) - murrant Add poller_groups (served) to the poller_cluster table ( #14886 ) - peejaychilds Actually use the stats graph for ntp-server_freq now, which as missed in #14834 ( #14884 ) - VVelox Add type checking to generic_stats.inc.php for $vars['to'] and $vars['from'] ( #14871 ) - VVelox Fix graphs for a search query ( #14864 ) - westerterp Fix interface parse unsets ( #14860 ) - electrocret Fix dbm calculation to return -60 instead of 0 ( #14858 ) - electrocret Cleanup Store empty user_func as null ( #14900 ) - Jellyfrog Documentation Fix typo in lnms device:add help ( #14937 ) - arjenz Add Azure example configuration for SAML authentication in documentation ( #14870 ) - fbouynot Tests Re-throw exceptions if we're in CI ( #14890 ) - Jellyfrog Misc Reorder check_icmp command to follow documented usage ( #14910 ) - mtentilucci Add multi-PR GitHub-apply ( #14875 ) - electrocret Allows GEO lookup with detailed internal Location information wrapped inside parentheses. ( #14799 ) - LoveSkylark Dependencies PHP dependency update ( #14927 ) - murrant Bump phpseclib/phpseclib from 3.0.18 to 3.0.19 ( #14903 ) - dependabot Bump webpack from 5.66.0 to 5.76.1 ( #14901 ) - dependabot 22.4.0 (2023-04-06) A big thank you to the following 180 contributors this last month: murrant (230) Jellyfrog (73) electrocret (29) PipoCanaja (25) fbouynot (24) VVelox (21) Npeca75 (17) dependabot (15) bnerickson (11) gs-kamnas (10) bonzo81 (8) santiag0z (8) rhinoau (8) mwobst (7) Martin22 (7) westerterp (6) peelman (6) laf (6) LoveSkylark (5) TheMysteriousX (5) SourceDoctor (5) KayckMatias (5) mtentilucci (4) not-known (4) Bierchermuesli (4) hanserasmus (4) noaheroufus (4) opalivan (4) geg347 (4) ottorei (4) Fehler12 (4) ppasserini (4) tim427 (3) fcqpl (3) kimhaak (3) luc-ass (3) bp0 (3) loopodoopo (3) earendilfr (3) bl3nd3r (3) charlyforot (3) GeantRA (2) systeembeheerder (2) dennypage (2) jasoncheng7115 (2) carbinefreak (2) gdepeyrot (2) bogdanrotariu (2) mabra94 (2) josh-silvas (2) mprins-RAM (2) SirMaple (2) quentinsch (2) Schouwenburg (2) aztec102 (2) wrongecho (2) bennet-esyoil (2) duhow (2) Mar974 (2) QuadPiece (2) kruczek8989 (2) slimey99uk (2) Jimmy-Cl (2) si458 (2) torbeckattsp (1) d-k-7 (1) arjenz (1) kirk444 (1) robje (1) pjroehl (1) peejaychilds (1) lukeofthetauri (1) bakerds (1) guipoletto (1) goebelmeier (1) MarlinMr (1) florisvdk (1) jellejans (1) kylegordon (1) zenbeam (1) gilrim (1) AleksNovak (1) tristanbob (1) da-me (1) fdomain (1) jaannnis (1) knpo (1) trs80 (1) MANT5149 (1) support-capensis (1) zeroservices (1) hvanoch (1) angeletdemon (1) alchemyx (1) rinsekloek (1) gewuerfelt (1) tuxgasy (1) hugalafutro (1) Blinq-SanderBlom (1) nightcore500 (1) mrwold (1) koocotte (1) VoipTelCH (1) cfitzw (1) jaaruizgu (1) pertruccio (1) ianhodgson (1) talkstraightuk (1) fufroma (1) fuzzbawl (1) otkd (1) kiwibrew (1) andrekeller (1) Olen (1) Frazew (1) jgelinas (1) mpikzink (1) squidly (1) daniel-franca (1) sashashura (1) tuomari (1) sembeek (1) huntr-helper (1) ktims (1) VirTechSystems (1) washcroft (1) Laplacence (1) Jarod2801 (1) ciscoqid (1) enferas (1) 00gh (1) PedroChaps (1) ajsiersema (1) prahal (1) paulgear (1) mostdaysarebaddays (1) dagbdagb (1) bile0026 (1) hjcday (1) spyfly (1) Bobdave (1) DaftBrit (1) nox-x (1) SanderBlom (1) thecityofguanyu (1) nsn-amagruder (1) mkuurstra (1) booth-f (1) sajiby3k (1) skandragon (1) glance- (1) twelch24 (1) kevinwallace (1) lfkeitel (1) steffann (1) p4k8 (1) micko (1) cliffalbert (1) HolgerHees (1) frenchie (1) claude191 (1) Cormoran96 (1) WillIrvine (1) lucalo72 (1) ssasso (1) dandare100 (1) ospfbgp (1) MrXermon (1) pandalion98 (1) eskyuu (1) martinberg (1) lpailhas (1) jonathanjdavis (1) IVI053 (1) LTangaF (1) dlangille (1) pfromme25 (1) woidi (1) manonfgoo (1) mzacchi (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (328) murrant (260) PipoCanaja (50) ottorei (36) laf (18) SourceDoctor (7) VVelox (6) electrocret (3) mpikzink (3) santiag0z (2) crazy-max (1) westerterp (1) SeeMyPing (1) fbouynot (1) Cormoran96 (1) bennet-esyoil (1) f0o (1) haxmeadroom (1) bboy8012 (1) Feature Indicator on Port Notes tab when Port has notes ( #14923 ) - electrocret Add display query to list_devices function ( #14747 ) - bonzo81 Split out lnms snmp convenience commands ( #14603 ) - murrant Add --forgot-key to key:rotate command ( #14495 ) - murrant Syslog sink over http for logstash (or any json source) ( #14424 ) - Bierchermuesli Improved Modern Modules ( #14315 ) - murrant Add @signedGraphTag() and @signedGraphUrl() blade directives ( #14269 ) - murrant Device settings: attempt to open related tab ( #14250 ) - murrant Error reporting ( #14190 ) - Jellyfrog Prepare for PHP 8.1 ( #14156 ) - Jellyfrog New Poller validations ( #14148 ) - murrant New lnms command to enable and disable plugins ( #14147 ) - murrant Support for SSL/TLS protected connections to MySQL databases ( #14142 ) - gs-kamnas Collect OS distro and LibreNMS version ( #14138 ) - murrant Lnms device:poll better feedback ( #14130 ) - murrant Per-App data storage ( #14087 ) - VVelox SnmpQuery walk multiple oids ( #14015 ) - murrant Add support to REST API for creating Maintenance Schedules for Device Groups ( #13985 ) - thecityofguanyu Automatic fixes for validation failures ( #13930 ) - murrant Allow unordered OIDs (global and per-os) ( #13923 ) - murrant Pre-Install settings ( #13906 ) - murrant Add ISIS discovery and polling for iosxe devices ( #13880 ) - WillIrvine Device_add support display field ( #13846 ) - murrant Add configuration support for IPMIv2 Kg key ( #13845 ) - pandalion98 Display Name in availability map ( #13841 ) - murrant Added --ping-only to snmp-scan.py ( #13810 ) - IVI053 Implement OAuth and SAML2 support ( #13764 ) - Jellyfrog Security Fix Service Template XSS ( #14659 ) - murrant Fix neighbours XSS ( #14658 ) - murrant Fix SNMP trap -> Eventlog XSS ( #14657 ) - murrant Fix XSS in api access ( #14551 ) - murrant XSS sanitize pwrstatd application script inputs ( #14545 ) - bnerickson Block disabled user session auth ( #14473 ) - murrant Fix group delete xss ( #14472 ) - murrant Fix alert rules XSS ( #14471 ) - murrant Fix xss in browser push transport ( #14470 ) - murrant Fix users xss ( #14469 ) - murrant Fix user mass assignment vulnerability ( #14468 ) - murrant Fix billing xss ( #14465 ) - murrant Fix memcached unserialize vulnerability ( #14459 ) - murrant Fix possible RSS XSS ( #14457 ) - murrant GitHub Workflows security hardening ( #14388 ) - sashashura Fix scheduled maintenance xss ( #14360 ) - murrant Add huntr.dev to SECURITY.md ( #14359 ) - huntr-helper Security fixes XSS in oxidized-cfg-check.inc.php and print-customoid.php ( #14126 ) - enferas Bumpver handlebars.js to 4.7.7 to resolve CVE-2021-23369 ( #13990 ) - gs-kamnas Fix services command injection ( #13932 ) - murrant Fix Graylog XSS ( #13931 ) - murrant Bump minimist from 1.2.5 to 1.2.6 ( #13872 ) - dependabot Fix SQL injection in get-host-dependencies ( #13868 ) - Jellyfrog Resolved XSS issue from alert rule list modal ( #13805 ) - laf Device Update hikvision camera detection ( #14943 ) - torbeckattsp APC UPS UIO sensor discovery bug ( #14942 ) - d-k-7 Add additional MOS / 7130 devices ( #14922 ) - kirk444 Add support for WTI console products ( #14920 ) - robje Update junos discovery yaml to reference total memory instead of buff\u2026 ( #14919 ) - GeantRA Add support for Trellix FireEye OS ( #14908 ) - mtentilucci Added cisco FTD 1150 to ftd.yaml ( #14907 ) - pjroehl Add more OIDs for determining hardware and serial attributes correctly ( #14904 ) - mwobst Add Cisco FTD Support for security appliances (x3) ( #14893 ) - mwobst Update test data to account for new vertiv.svg icon ( #14892 ) - mtentilucci Improve Corero CMS support ( #14876 ) - electrocret Add Avocent MergePoint Unity KVM Switch Support ( #14874 ) - mtentilucci Add Fortigate Webfilter stats ( #14873 ) - electrocret Add Cisco Firepower 4112 Support ( #14872 ) - lukeofthetauri Added PoE controller load and status sensors for Junos devices ( #14868 ) - bakerds Fortigate IPS Intrusions detected stats ( #14857 ) - electrocret Add support for Vsol v1600d EPON OLT ( #14853 ) - guipoletto Add Montclair EDFA Support ( #14852 ) - peelman Fix discovery for apc ats ( #14837 ) - florisvdk Device - Add support for Scalance SC646-2C ( #14835 ) - jellejans Include Samsung X Series printers ( #14831 ) - kylegordon Add Fortigate packet loss monitoring for Link-Monitor and SD-WAN ( #14828 ) - not-known EdgeOS OLT new sensors and changes ( #14807 ) - noaheroufus Update XDP string to exclude modern Cisco lightweight APs from discovery ( #14803 ) - tristanbob Extend filtering of graphs device_bits on cisco ASA ( #14796 ) - PipoCanaja Changed discovery OID in ets.yaml ( #14795 ) - da-me Added Support for SNS-3615-K9 ( #14792 ) - jaannnis Routeros fix lldp discovery on 7.7+ ( #14791 ) - knpo Refactored Juniper SLA to include support for TWAMP and remove ambigu\u2026 ( #14787 ) - GeantRA Fix cisco-flash ( #14772 ) - electrocret Eaton matrix wattage fix ( #14770 ) - peelman Add Universal Input Output support for APC ( #14766 ) - dennypage Eltek Enexus; Fix SmartpackS divisor and hardware discovery ( #14762 ) - peelman Nokia PMC Microwave Improvements ( #14761 ) - carbinefreak Additional sensors ( #14756 ) - peelman Add AXOS sensor data for PON Transceivers (the only transceivers Cali\u2026 ( #14741 ) - peelman Adding discovery of LSI MegaRAID Device Media Errors, Other Errors, a\u2026 ( #14729 ) - bnerickson Update fs-nmu.inc.php ( #14702 ) - gewuerfelt Stop net-snmp from interpreting the octet-string from rttMonEchoAdmin\u2026 ( #14676 ) - not-known Add state of the Fortigate link monitor health checks ( #14675 ) - not-known Adding support for loop-telecom devices ( #14674 ) - Blinq-SanderBlom Support Huawei SMU02B ( #14673 ) - nightcore500 Use 'counter' RRD type for some TrueNAS sensors ( #14670 ) - TheMysteriousX Device - Add support for \"Smartpack R\" ( #14665 ) - mrwold Deltanet Lambdatrail LT2-S,HS ( #14661 ) - Bierchermuesli Added divisor to SAF Integra-X temp sensors ( #14655 ) - noaheroufus Corrected ICT MPS hardware detection ( #14654 ) - noaheroufus Add support for Battery Recommended Days Remaining ( #14653 ) - Jellyfrog Adjusted PMP to accomodate various other 450 models. ( #14652 ) - noaheroufus Added support for Eltek Micropack 1U ( #14645 ) - fcqpl Added support for Eltek Flatpack S ( #14643 ) - fcqpl Added Moxa switching ifAlias/portName mapping ( #14633 ) - rhinoau Improve VRP power display ( #14624 ) - PipoCanaja Edgeos picked up as generic device ( #14612 ) - ianhodgson Added Moxa EDS-G516E optical sensors ( #14610 ) - rhinoau Fix eNexus total current for Smartpack S ( #14606 ) - murrant Disable SNMP Bulk for Delta UPS devices ( #14599 ) - fufroma Improved AIX os information collection ( #14595 ) - murrant More inclusive Cisco SB os detection ( #14594 ) - murrant IP Infusion OcNOS basic detection ( #14588 ) - murrant Fix APC current divide by zero ( #14578 ) - murrant Extend EfficientIP SolidServer support ( #14549 ) - PipoCanaja TAIT-Infra93 - Fix state + skip_values for Battery ( #14541 ) - opalivan Timos - Improve SAP stats graphing ( #14534 ) - mabra94 McAfee Web Proxy with COUNTER rrd_type on sensors ( #14529 ) - PipoCanaja Fix 'bke.yaml' discovery file ( #14524 ) - PipoCanaja Added support for additional Moxa EDS-P model ( #14523 ) - rhinoau Fix awplus ntp polling bug ( #14521 ) - murrant Add discovery support for Riedo Networks UPDU ( #14496 ) - andrekeller Use correct description oid ( #14489 ) - Jellyfrog Correct upsBypassVoltage oid ( #14488 ) - Jellyfrog Correct variable typo ( #14486 ) - Jellyfrog Hpe ilo: fix filesystem type regex ( #14485 ) - Jellyfrog Added Fortigate SD-WAN Health checks ( #14456 ) - mprins-RAM Dont include empty storage sensor ( #14453 ) - Jellyfrog Remove undefined sensors ( #14449 ) - Jellyfrog Use correct low warn limit variable ( #14447 ) - Jellyfrog Correct aviatModemCurModulationRx oid ( #14446 ) - Jellyfrog Fortinet FortiADC detection and basic statistics ( #14434 ) - westerterp MNI Microwave OS Add ( #14427 ) - carbinefreak Add OS tait-tnadmin for TN9300 ( #14413 ) - opalivan Skip empty drac state sensors ( #14409 ) - jgelinas Added support for additional Moxa EDS-G models ( #14405 ) - rhinoau Device - Add support for Vultan Environmental Monitoring units ( #14401 ) - squidly Issue samsung printer m4080 fx ( #14391 ) - daniel-franca Added status checks for (BWCC) battery status and condition for onboa\u2026 ( #14349 ) - quentinsch Enexus system output current fix ( #14324 ) - loopodoopo UHP VSAT modems ( #14317 ) - loopodoopo Ray2 - Oid repair at ber ( #14302 ) - Martin22 Routeros - Fix displaying distance in charts ( #14300 ) - Martin22 Added support for Ubiquiti UFiber OLT ( #14256 ) - Martin22 Fix ciena-sds inventory bugs ( #14252 ) - murrant F5 partition ram ( #14226 ) - fbouynot Add Cisco Flash storage support ( #14219 ) - fbouynot Fix luminato port poll ( #14217 ) - murrant Teltonika RUT fix ( #14202 ) - loopodoopo Initial support for Moxa AWK Industrial APs ( #14197 ) - rhinoau Mikrotik wifi station mode sensors ( #14193 ) - Npeca75 Update mellanox os image ( #14184 ) - Laplacence Change state_name for Racoms modulation ( #14174 ) - Martin22 Cisco SB/CBS environment sensors ( #14154 ) - Fehler12 Fix Rocky Linux and AlmaLinux icons and logos ( #14150 ) - murrant Add additional sysObjectIDs for variants of the Arista 7130 ( #14144 ) - gs-kamnas Eltex MES 2324p Add ( #14135 ) - aztec102 Solid Optics EDFAMUX support ( #14129 ) - murrant Merge netmanplus and riello and improve device support ( #14125 ) - murrant Device - Basic hatteras dslam integration ( #14115 ) - Bierchermuesli Bats support ( #14108 ) - Schouwenburg Solved aos6 problem where Librenms wasn't identifying all vlans ( #14107 ) - PedroChaps Fix Cisco polling BGP peers in non-default VRF ( #14105 ) - ajsiersema Added support for CheckPoint 1100, 1450 & 1490 models. ( #14074 ) - quentinsch Missing \"s\" in NsBsd.php ( #14067 ) - Mar974 Add full version of Mikrotik logo ( #14063 ) - QuadPiece Ns-bsd updated for SNS LTSB 3.7.19 ( #14060 ) - Mar974 Add apc battery operation time, including display in WebUI ( #14058 ) - mwobst Fix the parsing of the temperature unit value (CMCIII devices) ( #14056 ) - mwobst ZTE ZXA10 Update (Added dBm graphs) ( #14049 ) - aztec102 Update Mikrotik logo ( #14045 ) - QuadPiece Fix use of incorrect variable to retrieve current sensor value ( #14037 ) - dennypage Support Huawei SMU11B ( #14029 ) - murrant Update Teltonika Sensors for FW R_00.07.02 ( #14012 ) - hjcday Procurve hardware description cleanup ( #14007 ) - murrant Racom Ray2 and Ray3 - Modulation states added ( #14001 ) - Martin22 Fix OS Detection for USW-Flex-XG ( #13999 ) - spyfly Add support for Cisco Nexus 3550 series (formerly Exalink Fusion) devices ( #13992 ) - gs-kamnas Improve support for Arista/Metamako MOS devices ( #13988 ) - gs-kamnas Add Cisco Business Wirless to ciscowlc.yaml ( #13984 ) - nsn-amagruder Add Eaton SC200 OS model ( #13978 ) - slimey99uk Fortigate LTE sensor addition ( #13977 ) - slimey99uk Added BKE power supply support. ( #13972 ) - Martin22 Workaround issues with lldp information from GS108Tv1 ( #13971 ) - glance- Add additional OpenBSD PF graphs ( #13963 ) - kevinwallace Don't use bulk-walk for PrimeKey Appliances ( #13958 ) - bl3nd3r Fix avtech12e sensors ( #13943 ) - lfkeitel Support tplink routers ( #13922 ) - si458 Aviat WTM reduce snmp load ( #13918 ) - murrant Fix Hytera error ( #13909 ) - murrant [mikrotik] fixed RouterOS ipv4/ipv6 routes ( #13902 ) - Npeca75 PrimeKey Improvements ( #13901 ) - bl3nd3r Enhancements for Zyxel OS ( #13897 ) - Jimmy-Cl Added support for Dell PowerVault ME4024 ( #13883 ) - laf Add support for Riello NetMan 204 ( #13878 ) - lucalo72 Fix usw flex switch hardware detection ( #13877 ) - Fehler12 Added Polycom Lens SNMP support. ( #13876 ) - Fehler12 Fix for PFSense state table removals field ( #13863 ) - dandare100 Add support for VOSS 8.6 ( #13857 ) - ospfbgp McAfee Proxy Sensor name update ( #13853 ) - PipoCanaja Device - HWG-WLD version 2 support ( #13849 ) - PipoCanaja Fix an issue with the APC current discovery ( #13837 ) - eskyuu Add VS state for Gaia ( #13831 ) - martinberg [new OS] Alpine OptoElectronics TDCM-EDFA support ( #13825 ) - charlyforot Fix db delete on cisco-vrf-lite discovery ( #13823 ) - lpailhas Add rocky linux OS identification ( #13815 ) - hanserasmus Detect truenas scale ( #13812 ) - si458 Add support for PrimeKey Hardware Appliance ( #13806 ) - bl3nd3r [comware] dropped dbfetch from discovery/sensors ( #13796 ) - Npeca75 BGP unnumbered support for Cumulus ( #13785 ) - charlyforot Correct divisor in discovery definition vertiv-pdu.yaml ( #13768 ) - woidi Netscaler new counter metrics ( #13323 ) - mzacchi Webui Pseudowires refresh ( #14882 ) - Bierchermuesli Fix port speed setting feedback ( #14743 ) - murrant Fix Cimc on Overview ( #14727 ) - electrocret Search devices also in display ( #14714 ) - gdepeyrot Fix check rrd file exists with remote rrdcached ( #14690 ) - tuxgasy Use displayname instead of hostname for Device Maintenance Modal Title ( #14681 ) - electrocret Remove ungrouped devices panel ( #14664 ) - murrant Custom port view fix ( #14637 ) - SourceDoctor Fix billing graph divide by zero when the period is zero or doesn't exist ( #14623 ) - jaaruizgu Fix port neighbors missing ( #14586 ) - murrant Fix some icons ( #14584 ) - murrant [About] Open Laravel and RRDtool link in new tab ( #14568 ) - santiag0z [About] Open the contributor list link in a new tab ( #14553 ) - santiag0z Fix v2 plugins ( #14506 ) - murrant Check if service_name is empty or equal to service_type ( #14499 ) - luc-ass Show id on device dependencies ( #14497 ) - SourceDoctor Userlist description fix ( #14482 ) - mprins-RAM Sort alert transport by name ( #14464 ) - SourceDoctor Fix missing device_id from device alert logs ( #14460 ) - ottorei Fix about date display ( #14442 ) - murrant Fix pseudowires pages ( #14441 ) - murrant Enhanced Service Overview on Device Overview Page ( #14410 ) - luc-ass Disable plugins that have errors ( #14383 ) - murrant Fix Inventory table for Dark theme ( #14377 ) - electrocret Add initselect2 to locations ports ( #14375 ) - KayckMatias Update devices filter in alert-logs to init_select2 ( #14361 ) - KayckMatias Load device selection dynamically on Ports page ( #14353 ) - KayckMatias Port pages fixes and cleanups ( #14310 ) - murrant Remove Caffeine ( #14277 ) - murrant Updated brother.svg to make it render in Safari ( #14271 ) - luc-ass Fix for Cisco group device health tab ( #14265 ) - fbouynot Fix dashboard widgets becoming unlocked (especially when using a touchscreen) ( #14222 ) - tim427 Migrate xDSL code to module, and add support for VDSL2 MIB ( #14207 ) - PipoCanaja Fix ports display ( #14183 ) - murrant Ports by device group ( #14175 ) - electrocret Empty Outages table ( #14167 ) - Npeca75 View Ports in Portgroups ( #14141 ) - electrocret Fix eventlog filtering ( #14136 ) - murrant Fix device filtering false values ( #14103 ) - murrant [gui] enable permanent vertical scroll ( #14102 ) - Npeca75 Minor visual changes to the apps-overview page ( #14090 ) - bennet-esyoil Improved sorting options for Availability Map ( #14073 ) - mwobst Search device by MAC via URL ( #14072 ) - duhow Add BGP description to eventlog BGP Peers messages ( #14061 ) - mostdaysarebaddays Slightly easier validation page error access ( #14044 ) - murrant Dashboard code cleanup ( #13996 ) - murrant Update dark mode to fix BGP and Peering page ( #13951 ) - Jimmy-Cl Validate base_url and server_name ( #13941 ) - murrant Fix snmp.timeout setting via Web UI ( #13937 ) - murrant Add ISIS-details to alert details ( #13920 ) - ottorei Fix port mini graphs ( #13911 ) - murrant Replaced OpenWRT icon with new logo ( #13891 ) - frenchie Add \"Ping Response\" graph to \"Ping Only\" Device Overview page ( #13886 ) - westerterp Remove fix size for column mac adresse ( #13881 ) - Cormoran96 Fixed the top port errors widget returning bits graphs instead ( #13860 ) - laf Fix class error name prevents to show BER graph ( #13833 ) - charlyforot Fixed displaying hostname in create bill when port is passed ( #13830 ) - laf Fix Oxidized Config tab showing when Device OS or Device Type is disabled ( #13809 ) - westerterp Position the buttons in the center on user preferences page ( #13802 ) - santiag0z Add usage hints for Display Name placeholder usage ( #13801 ) - LTangaF Fix second menu bar in Apps screens ( #13800 ) - westerterp WebUI - Search results for ports ( #13787 ) - PipoCanaja Device Types Widget ( #13670 ) - SourceDoctor Alerting Jira transport: use template title ( #14883 ) - not-known Remove Time Elapsed extra space ( #14880 ) - electrocret Fix Alertlog messaging ( #14861 ) - electrocret Fix MS Teams alert transport, correct HTTP header ( #14843 ) - goebelmeier Add support for topics ( #14804 ) - AleksNovak Adding sample alert for systemd application ( #14711 ) - bnerickson Polling poller debug ( #14691 ) - electrocret Add -I flag to Traceroute cmd ( #14667 ) - electrocret Alert map location fix ( #14380 ) - KayckMatias Populate the alert rule field with the builder json ( #14374 ) - murrant Discord ability to attach graph images ( #14276 ) - murrant Email Transport: embed graphs by default ( #14270 ) - murrant Correct logic for recurring alert rules that span UTC days ( #14145 ) - gs-kamnas Improvements to PagerDuty alert formatting ( #14143 ) - gs-kamnas Example rules for diskspace on / ( #14082 ) - VVelox Add rich (=html) support for messages via Matrix ( #14054 ) - mwobst Add macro.past_20m macro ( #14023 ) - kruczek8989 Allow the use of a custom URL for accessing the PagerDuty API and correct API schema violation ( #14010 ) - gs-kamnas Setting MSteams card summary to alert title ( #13989 ) - DaftBrit More realistic alert test data ( #13969 ) - murrant Use display name when sending alerts to Sensu ( #13967 ) - TheMysteriousX Correct type hint ( #13915 ) - TheMysteriousX Improve alert template saving ( #13910 ) - murrant Added Basic authentication capability to Alertmanager Transport ( #13867 ) - geg347 Newer versions of Jira use HTTP code 201 fore created issues ( #13852 ) - MrXermon Add extra dynamic values alerttransport alertmanager ( #13828 ) - geg347 Add generic PSU status failed alert rule template ( #13821 ) - geg347 Graphs Add graph_stat_percentile_disable config item to disable percentile lines/value printing ( #14887 ) - VVelox Convert NTP freq to use generic_stats ( #14834 ) - VVelox Update fail2ban to have better stat graphs and and fix generic_stats graph.php ( #14818 ) - VVelox Update various device graphs to to have better stats ( #14815 ) - VVelox Update HV::Monitor support to use generic_stats.inc.php ( #14814 ) - VVelox Only show Eth errors when Etherlike is enabled ( #14784 ) - electrocret Fix graph output base64 ( #14701 ) - murrant Fix some graphs not respecting device display name ( #14684 ) - murrant Adding Average into graphs ( #14679 ) - bogdanrotariu Fix device poller modules graph ( #14640 ) - murrant Bug - XDSL module - rrd_def and rrd file definition issue for Actual rate ( #14597 ) - PipoCanaja Fix graph errors wrong content type ( #14574 ) - murrant Improve graph embedded title handling ( #14544 ) - murrant Graphing cleanup ( #14492 ) - murrant Return GraphImage to include more metadata ( #14307 ) - murrant Fix unauth application graphs ( #14216 ) - murrant Allow specifying the background colour in graph images ( #14192 ) - washcroft Ping perf ( #14117 ) - 00gh [RRD] fix IPv6 folder name ( #13945 ) - Npeca75 Snmp Traps Adds Cisco DHCP Server SNMP MIB and Trap Handlers. ( #14618 ) - josh-silvas Improve LinkUp and LinkDown trap handling incomplete traps ( #14385 ) - tuomari Add Cisco Err-Disable interface event trap handler ( #13855 ) - bonzo81 Add APC SmartAvrReducing trap handlers ( #13839 ) - bonzo81 Add APC upsOnBattery & powerRestored trap handler ( #13836 ) - bonzo81 Add OspfTxRetransmit Trap Handler ( #13824 ) - bonzo81 Cisco Mac address violation trap handler ( #13811 ) - bonzo81 Applications Add a few more graphs for CAPEv2 ( #14813 ) - VVelox CAPEv2 support ( #14801 ) - VVelox Add more docker stats ( #14767 ) - hvanoch Update Nvidia application - values in wrong charts ( #14736 ) - fcqpl Removing max polling restriction for wireguard traffic RRD data ( #14710 ) - bnerickson Alarm Flag on UPS-Nut Application ( #14635 ) - SourceDoctor Adding wireguard app to the apps overview page ( #14629 ) - bnerickson Adding wireguard application support ( #14625 ) - bnerickson Adding systemd service status application ( #14540 ) - bnerickson Memcached application: improve error visibility ( #14536 ) - murrant Fix memcached polling bug ( #14501 ) - murrant Add pwrstatd application ( #14365 ) - bnerickson Add HV Monitor, a generic means for monitoring hypvervisors ( #14218 ) - VVelox Add possibility to monitor redis application through the unix-agent ( #14182 ) - earendilfr Fix error between application module and unix-agent ( #14177 ) - earendilfr Add possibility to monitor the php-fpm service with the unix agent ( #14173 ) - earendilfr Base64 gzip compression support for json_app_get ( #14169 ) - VVelox [apps] Docker only show current containers ( #14152 ) - Npeca75 Fix app docker ( #14080 ) - prahal Add support for Sagan ( #14070 ) - VVelox Add Opensearch\\Elasticsearch monitoring ( #14053 ) - VVelox Add error-state to non-responsive mysql-servers ( #13993 ) - bennet-esyoil Remove alert keys from component for Suricata ( #13959 ) - VVelox Fix a few issues with variable names for Suricata ( #13956 ) - VVelox Scripts/json-app-tool.php JSON generation fix and add -S for SNMP extend name ( #13948 ) - VVelox Add Suricata monitoring ( #13942 ) - VVelox Api Fix for RIPE NCC API Tools ( #14757 ) - LoveSkylark Use Oxidized API client and add support for groups on config get ( #14750 ) - electrocret API list_devices update with sysName, location_id and type ( #14731 ) - bonzo81 Port search API search more than one fields ( #14646 ) - murrant Added disable_notify and location_id ( #14619 ) - pertruccio Add sortorder parameter to list_logs ( #14600 ) - talkstraightuk API restore ability to update purpose and override_sysLocation ( #14596 ) - murrant API graphs, variable whitelist ( #14552 ) - murrant Graph API use new code path ( #14493 ) - murrant Adding device's field in get_alert_rule and list-alert-rules API function (new) ( #14481 ) - geg347 Fix update_device hostname handling #14435 ( #14448 ) - rhinoau Fix port search with slashes ( #14403 ) - murrant Add Columns to search_ports API function ( #14348 ) - electrocret Allow delete location by id ( #14334 ) - bp0 API update_device, make location field work (as does location_id) ( #14325 ) - bp0 Standardize device and device group maintenance API ( #14153 ) - rhinoau Fix maintenance APIs not associating device or group ( #14127 ) - murrant Ensure 'add_device' API returns indexed-array (as per doco) ( #13887 ) - claude191 Adds API call to update port notes on devices. ( #13834 ) - josh-silvas Discovery Prevent spurious MAC changes on multi-interface devices ( #14671 ) - TheMysteriousX Fix discovery ignores custom ipmi port ( #14660 ) - VoipTelCH Cisco NAC fix ( #14440 ) - murrant Fix legacy os extends ( #14220 ) - murrant Sensors - Allow changing RRD type in YAML and PHP sensor discovery ( #14208 ) - PipoCanaja Sensors, convert hex to strings ( #14121 ) - murrant Fix printer count sensors when extra garbage is returned ( #14014 ) - murrant Fix polling and discovery of FortiGate cluster sensors ( #13980 ) - mkuurstra Polling Fix ArubaInstance channel decode issue ( #14732 ) - murrant Don't poll sysDescr, sysObjectID, and sysName so frequently ( #14562 ) - murrant Add connection exception handling to all redis calls ( #14467 ) - Frazew Fix bgp-peers bgpPeerIface bug and update test data ( #14420 ) - murrant Fix ping.php skipped results ( #14368 ) - sembeek Fix for number in sensor string ( #14185 ) - Schouwenburg Increase traceroute timeout ( #14084 ) - murrant Fix STP polling bug ( #13924 ) - murrant Print full error message in poller/discovery output ( #13903 ) - murrant Rancid Add MRV OptiDriver support in gen_rancid ( #13900 ) - cliffalbert Add support for VyOS on Rancid conf ( #13874 ) - ssasso Oxidized Show display name in Oxidized config search ( #14800 ) - electrocret Adding Fortigate switches to Oxidized model mapping config ( #14782 ) - LoveSkylark Fix oxidized web requests unclosed connections or responding fast enough ( #14370 ) - fbouynot Oxidized \"allow purpose and notes\" ( #14352 ) - LoveSkylark Syslog-notify-oxidized.php now always notifies Oxidized ( #14011 ) - murrant Fix Oxidized syslog change notifier when the change was made via snmp. ( #14005 ) - kruczek8989 Oxidized API to return groups based on device purpose or notes ( #13976 ) - sajiby3k Authentication Update Radius auth to accept permissions attributes ( #14531 ) - kimhaak Rework socialite integration ( #14367 ) - Jellyfrog AD Auth PHP 8.1 fixes ( #14215 ) - murrant Add option STARTTLS for authentication via AD ( #14051 ) - dagbdagb Auth_ldap_skip_group_check when ldap_compare is not supported ( #13926 ) - micko Implement support for usernames coming from reverse proxies ( #13894 ) - HolgerHees Add LDAP bind and userlist filter support to ldap-authorization ( #13788 ) - pfromme25 Bug SnmpQuery, respect snmp.max_oid ( #14894 ) - murrant Add poller_groups (served) to the poller_cluster table ( #14886 ) - peejaychilds Actually use the stats graph for ntp-server_freq now, which as missed in #14834 ( #14884 ) - VVelox Add type checking to generic_stats.inc.php for $vars['to'] and $vars['from'] ( #14871 ) - VVelox Fix graphs for a search query ( #14864 ) - westerterp Fix interface parse unsets ( #14860 ) - electrocret Fix dbm calculation to return -60 instead of 0 ( #14858 ) - electrocret Revert \"Fix entity-state polling/discovery\" ( #14811 ) - murrant Fix entity-state polling/discovery ( #14793 ) - fdomain Update PingCheck.php to remove duplicate \"Device status changed to ... from icmp check.\" event ( #14785 ) - MANT5149 Fix calculated dbm ( #14771 ) - electrocret Handle Division by 0 error for SvcFdbTableSize ( #14672 ) - mabra94 Fix sqlite test ( #14642 ) - murrant Remove extends and hardware detection support ( #14626 ) - murrant Set 0 as integer in loading of graylog. ( #14621 ) - kimhaak Fix GeocodingHelper type-hinting ( #14604 ) - Jellyfrog Bug in Ciscowlc AP graphs definition ( #14585 ) - PipoCanaja SnmpQuery fix mib directory order ( #14580 ) - murrant SnmpQuery Handle empty oids in get more gracefully ( #14577 ) - murrant Fix PTOPO mib in module discovery-protocols ( #14564 ) - PipoCanaja Fix Type error ( #14555 ) - fbouynot Correct variable use in billing ( #14533 ) - Jellyfrog Fix sensor limit linked port rules in collection ( #14520 ) - electrocret EES Rectifier various fixes from MIB + added tests ( #14519 ) - opalivan Fix fetch ifEntry logic ( #14483 ) - Jellyfrog Add a few breaks to avoid connection flooding for the irc-bot ( #14479 ) - Olen Snmpwalk functions: dont include invalid data ( #14438 ) - Jellyfrog Fix VRP duplicate BGP Peers ( #14431 ) - PipoCanaja Version and git helper improvements ( #14412 ) - murrant Cache version data ( #14404 ) - murrant Fix rpi codec state sensor ( #14400 ) - murrant Fix libvirt count() uncountable error ( #14398 ) - murrant Fix Firebrick local ASN ( #14397 ) - murrant Fix ups nut PHP 8 issue ( #14392 ) - murrant Fix cipsec-tunnels ftd bad data causes error ( #14366 ) - murrant Handle null in unix-agent ( #14358 ) - murrant Fix the case of 'Ungrouped' in smokeping integration ( #14351 ) - fbouynot Fix for smokeping integration with ping-only devices ( #14341 ) - fbouynot Match displayname source for graylog ( #14339 ) - fbouynot Check dot1dBasePortIfIndex exists before using it ( #14337 ) - Jellyfrog Prevent errors when hrStorageTable doesn't exist ( #14327 ) - Jellyfrog Revert \"ZTE ZXA10 Update (Added dBm graphs)\" ( #14320 ) - murrant Billing module fix/cleanup ( #14309 ) - electrocret SnmpResponse filterBadLines fix ( #14306 ) - murrant Fix ARP Table on Device overview ( #14304 ) - Npeca75 Disable error reporting when dependencies are outdated ( #14291 ) - murrant Don't send zeros to Graphite for missing metrics ( #14262 ) - ktims Fix removing all port groups ( #14253 ) - murrant Move cronjob time for daily.sh ( #14245 ) - Jellyfrog Firebrick bgp polling was broken ( #14237 ) - murrant Quick fix for cipsec-tunnels Cisco implementation ( #14232 ) - PipoCanaja Fix redeclare of function breaking tests in OS eltex-mes23xx ( #14227 ) - PipoCanaja Autodiscovery fix ( #14213 ) - Npeca75 Fix alert log clearing SQL query ( #14200 ) - Jellyfrog Fix error when ldap_search returns false ( #14199 ) - Jellyfrog Fix unnecessary Updates of DB when values are equal ( #14179 ) - opalivan Fix APP_KEY generation when using fpm ( #14168 ) - Jellyfrog Fix validation error ( #14163 ) - TheMysteriousX IPv6 Debug typo ( #14162 ) - Npeca75 Replace git show --no-patch option with --quiet ( #14160 ) - ciscoqid Fix 500 error in validation when UI containers and poller containers have differing node_ids ( #14146 ) - gs-kamnas Use --no-patch to support old git clients ( #14137 ) - Jellyfrog Prevent duplicate plugin table entries ( #14120 ) - murrant Fix auth_test.php debug ( #14118 ) - murrant Fix config seeder will never run ( #14113 ) - murrant Reset the opcache after install ( #14098 ) - murrant Update config cache on install finalize step ( #14097 ) - murrant Fix more webserver validation issues ( #14096 ) - murrant Revert \"Add apc battery operation time, including display in WebUI\" ( #14068 ) - PipoCanaja Use --no-patch instead ( #14047 ) - Jellyfrog Git version validation improvement ( #14042 ) - murrant Server name validation, handle ports better ( #14041 ) - murrant Fix some broken migrations ( #14040 ) - Jellyfrog Fix rrd version validation check ( #14036 ) - murrant Fix DB timezone validation ( #14035 ) - murrant Regression fix from #13596 ( #14034 ) - Jellyfrog Fix an issue when getting the local version from git ( #14020 ) - murrant Fix migrations failing one time after dashboard cleanup ( #14002 ) - murrant Fix Netscaler VServer database updates during polling ( #13995 ) - Bobdave Fix 500 error in validations when capabilities are not supported or set ( #13991 ) - gs-kamnas Inconsistency in ldap starttls config parameter ( #13987 ) - nox-x Fix version check error ( #13981 ) - murrant Use full sudo path ( #13975 ) - skandragon Fix IPv6 in service check host ( #13939 ) - steffann Validate fixes ( #13935 ) - murrant Lnms device:add handle snmp.community bad format ( #13914 ) - murrant Fix install icons ( #13904 ) - murrant Handle bad uptime input ( #13899 ) - murrant Fix custom error messages ( #13898 ) - murrant Migrate addhost.php to lnms device:add ( #13870 ) - murrant Rewrite agent packages parsing code ( #13840 ) - murrant Fix snmpv3 context when empty SnmpQuery ( #13832 ) - murrant Regression fix from b6a8b602b891d9eb8633f62632c17bdc559cd620 ( #13819 ) - Jellyfrog Fix PHPStan Deprecated test ( #13794 ) - Jellyfrog Refactor Unify time interval formatting ( #14733 ) - murrant Remove Log::event ( #14526 ) - Jellyfrog Cleanup and optimize the availability widget ( #14329 ) - murrant Fix a few Db* to Eloquent requests ( #14278 ) - PipoCanaja Use \"database version\" instead of \"mysql version\" ( #14158 ) - Jellyfrog Improve the efficiency of some queries ( #13974 ) - murrant Move Config loading to a service provider ( #13927 ) - murrant Port Validation Page to Laravel ( #13921 ) - murrant Remove addHost from ModuleTestHelper ( #13847 ) - murrant New device:add code ( #13842 ) - murrant Cleanup Store empty user_func as null ( #14900 ) - Jellyfrog Consolidate and improve snmptranslate usage ( #14567 ) - murrant Remove graph_min ( #14561 ) - murrant Remove $_GET from graphs ( #14554 ) - murrant Undefined array key fixes ( #14532 ) - Jellyfrog Use Collection instead of collect() ( #14527 ) - Jellyfrog Convert string references to ::class ( #14508 ) - Jellyfrog Miscellaneous cleanup - part 5 ( #14502 ) - Jellyfrog Type API methods and properties ( #14476 ) - fbouynot Miscellaneous cleanup - part 4 ( #14452 ) - Jellyfrog Miscellaneous cleanup - part 3 ( #14450 ) - Jellyfrog Miscellaneous cleanup, mostly undefined variables - part2 ( #14445 ) - Jellyfrog Remove tabs from yaml ( #14437 ) - Jellyfrog Miscellaneous fixes, mostly undefined variables ( #14432 ) - Jellyfrog Trim whitespaces from device data ( #14429 ) - Jellyfrog Fix bgp_peer array_merge error ( #14416 ) - PipoCanaja Defer loading cli option defaults ( #14363 ) - Jellyfrog Remove call to Config from artisan ( #14362 ) - Jellyfrog Mibs - Cleanup names ( #14323 ) - PipoCanaja Enable more checks ( #14318 ) - Jellyfrog Do not include _token in legacy vars ( #14313 ) - murrant Don't include null os when loading defs ( #14312 ) - murrant 2fa not all routes have names ( #14311 ) - murrant Cache astext for 1 day ( #14303 ) - murrant Linux distro images require feature field ( #14301 ) - murrant Silence return type mismatch ( #14298 ) - Jellyfrog Fix more percent calculations ( #14294 ) - murrant Fix rounding null in mempools module ( #14290 ) - murrant Check if polling module exists ( #14289 ) - murrant Fix undefined variable ( #14287 ) - murrant Handle connection timed out errors in unix agent ( #14286 ) - murrant Remove unused function ( #14283 ) - murrant Remove reference to unused variable ( #14280 ) - murrant Cleanup some RunAlerts issues ( #14274 ) - murrant Fix a bunch of \"Since fakerphp/faker 1.14: Accessing property..\" ( #14267 ) - Jellyfrog Fix more error exceptions ( #14266 ) - Jellyfrog Fix hrStorageType being undefined ( #14260 ) - Jellyfrog Misc errors cleanup ( #14257 ) - Jellyfrog Fix ipv6 hexdec error ( #14254 ) - murrant Use empty string instead of null for routes ( #14247 ) - Jellyfrog Sort device types alphabetically ( #14244 ) - VirTechSystems Misc webui code cleanups ( #14242 ) - murrant Fix some ErrorExceptions ( #14241 ) - Jellyfrog Fix os_group unset errors ( #14238 ) - murrant Juniper bgp-peers cleanup ( #14236 ) - murrant Percentage calculation helper ( #14235 ) - murrant Memcached app undefined vars ( #14225 ) - Npeca75 Fix Undefined variable/key warnings ( #14134 ) - murrant Remove mib poller module remnants ( #14077 ) - murrant Remove traceroute6, it is unused ( #14019 ) - murrant Remove DefaultWidgetSeeder ( #14006 ) - murrant Better device:add error output ( #13913 ) - murrant Remove non-working Dell specific alert rules from the collection ( #13706 ) - Fehler12 Documentation Fix typo in lnms device:add help ( #14937 ) - arjenz Add Azure example configuration for SAML authentication in documentation ( #14870 ) - fbouynot Fix Okta image in docs ( #14848 ) - westerterp Change socialite settings URI ( #14845 ) - fbouynot Fix possible confusion around php-fpm settings ( #14844 ) - hanserasmus Use docker compose v2 ( #14841 ) - MarlinMr Fix typo in Oauth doc ( #14840 ) - fbouynot Add Zenduty Integration info to Transports.md docs ( #14826 ) - zenbeam Update config docs - dump current config ( #14820 ) - hanserasmus Add SELinux instructions for nginx monitoring ( #14812 ) - fbouynot Add SELinux instructions for systemd monitoring ( #14809 ) - fbouynot Add SELinux instructions for systemd monitoring ( #14806 ) - fbouynot Debian 11 Sury DPA provides PHP 8.2 ( #14798 ) - tim427 Update Syslog.md ( #14794 ) - systeembeheerder Update Authentication.md ( #14788 ) - trs80 Fix Doc Link for Canopsis transport ( #14778 ) - support-capensis Update ElasticSearch Index pattern for php 8.1 changes ( #14775 ) - zeroservices Install updates for Rocky8 ( #14722 ) - angeletdemon Updating certificate script documentation ( #14721 ) - bnerickson Update Docker.md with proper path to unzipped files ( #14717 ) - alchemyx Fix typo: purge-port.php file name ( #14712 ) - santiag0z Alert template example uses incorrect variable ( #14683 ) - electrocret Correct squid snmpd.conf proxy host syntax ( #14678 ) - hugalafutro Fix Traceroute debug alert template snippet ( #14668 ) - electrocret Update Dispatcher docs for Debian and for non /opt/librenms installation ( #14663 ) - koocotte Fix Location mapping docs ( #14644 ) - electrocret Update config name for the default device display ( #14641 ) - cfitzw Update Dispatcher-Service.md ( #14632 ) - systeembeheerder Updating postgres application documentation ( #14627 ) - bnerickson Documentation for Observium Migration ( #14601 ) - LoveSkylark Add snmp_flags and tips on string oids to the docs ( #14579 ) - murrant Clarify Dispatcher-Service.md for systemd ( #14575 ) - fuzzbawl Update license section of readme ( #14571 ) - otkd Remove outdated rules videos ( #14505 ) - kiwibrew Docker quick install ( #14475 ) - murrant Updating details of my LibreNMS install ( #14458 ) - SirMaple Fix php7.2 occurence in Performance.md documentation ( #14394 ) - fbouynot Fix documentation for php8.1 and bad package name ( #14393 ) - fbouynot Move list_locations from devices to locations ( #14328 ) - bp0 Cisco-sla module was renamed to slas ( #14288 ) - murrant Update docs around APP_URL ( #14282 ) - murrant Update to mkdocs-material 8.3.9 ( #14189 ) - Jellyfrog SNMP extend / fix mdadm documentation ( #14186 ) - Npeca75 Update index.md ( #14178 ) - Jarod2801 Add instructions for PHP 8.1 and Ubuntu 22.04 ( #14166 ) - Jellyfrog Update php installation instruction for CentOS 8 to reflect the minim\u2026 ( #14159 ) - fbouynot Fix typo in Smokeping SELinux documentation ( #14155 ) - fbouynot Add device_default_display info ( #14151 ) - murrant Change SELinux context for logs ( #14128 ) - fbouynot Small documentation typos ( #14101 ) - wrongecho Documentation typos ( #14099 ) - wrongecho Add SELinux configuration for SNMPd on Centos8 in the documentation ( #14095 ) - fbouynot Add SELinux configuration for LDAP/AD authentication on Centos8 in the documentation ( #14094 ) - fbouynot Add SELinux configuration for Smokeping on Centos8 in the documentation ( #14093 ) - fbouynot Add SELinux configuration for RRDCached on Centos8 in the documentation ( #14092 ) - fbouynot Corrected API devicegroup curl creation examples ( #14081 ) - rhinoau Minor grammar fixes in doc ( #14078 ) - paulgear Add documentation for Chrony application monitoring ( #14066 ) - ottorei Okta saml ( #14038 ) - bile0026 HPE Comware snmp config example ( #13997 ) - murrant Fix typo in dispatcher service doc ( #13979 ) - booth-f Fix a typo in alerting doc ( #13970 ) - twelch24 DOCS, switch to dark or light mode ( #13953 ) - santiag0z Assorted cleanups to alerting docs, primarily to make mdl happier ( #13950 ) - VVelox Update test doc making it more mdl happy and add a section on writing JSON app tests ( #13949 ) - VVelox Docs, fix code block in oxidized group ( #13908 ) - santiag0z [DOC] Fix Code blocks Step 2 Installing Network-WeatherMap ( #13905 ) - santiag0z [DOC] Styling the .env word quote ( #13889 ) - santiag0z Docs, fix Linux SNMP example only listening on ::1 ( #13882 ) - murrant Script that describes how to migrate traffic bills from observium. ( #13757 ) - manonfgoo Translation Update zh-TW.json ( #14765 ) - jasoncheng7115 Create files with Traditional Chinese translation ( #14764 ) - jasoncheng7115 Fix Typo in Settings ( #14443 ) - electrocret Serbian translation, part3 ( #14205 ) - Npeca75 More Serbian translation ( #14181 ) - Npeca75 Enable translation on Eventlog & Component-status widgets ( #14180 ) - Npeca75 Initial support for Serbian language ( #14165 ) - Npeca75 Enable translation in 3 Alert widget ( #14164 ) - Npeca75 Few more updates to Ita lang ( #14091 ) - ppasserini Italian language update ( #14085 ) - ppasserini Adjustments to german translation ( #14083 ) - mwobst Small Italian lang update ( #13960 ) - ppasserini Ukrainian translation update ( #13933 ) - p4k8 Few more language (ITA) updates ( #13890 ) - ppasserini Tests Re-throw exceptions if we're in CI ( #14890 ) - Jellyfrog Adding certificate application tests ( #14708 ) - bnerickson Mock astext ( #14581 ) - murrant Github tests log improvement ( #14559 ) - murrant Improve trap testing ( #14546 ) - murrant Remove unused phpstan tests ( #14503 ) - Jellyfrog Speed up tests ( #14421 ) - murrant Fix cisco-pw test capture ( #14415 ) - murrant Test supported PHP versions only ( #14389 ) - murrant Run CI on ubuntu 22.04 ( #14379 ) - Jellyfrog Do not allow sysDescr to be fetched in os module yaml ( #14331 ) - murrant Remove PHP version constraint ( #14314 ) - Jellyfrog Lnms dev:simulate check simulated device exists ( #14243 ) - murrant Save-test-data to refresh all variants of an OS ( #14231 ) - PipoCanaja Allow save-test-data.php to run all modules explicitely ( #14212 ) - PipoCanaja Increase OS detection time, sometimes it is not ready by 5s ( #14133 ) - murrant Test PHP 8.1 ( #14109 ) - murrant Fix tests failing when device with IP 127.1.6.1 exists ( #14016 ) - murrant PHP8 phpstan fix ( #13843 ) - murrant Fix tests for MariaDB > 10.5.15 ( #13829 ) - Jellyfrog Misc Reorder check_icmp command to follow documented usage ( #14910 ) - mtentilucci Add multi-PR GitHub-apply ( #14875 ) - electrocret Use Device displayname on VRF page ( #14851 ) - electrocret Fix empty output on validation test ( #14822 ) - hanserasmus Allows GEO lookup with detailed internal Location information wrapped inside parentheses. ( #14799 ) - LoveSkylark Add MAC OUI caching when code updates are disabled ( #14713 ) - gdepeyrot New schema dump ( #14630 ) - Jellyfrog Add check_hetzner_storagebox to includes/services ( #14463 ) - SirMaple Add instance id to error reports ( #14444 ) - murrant Update ports_purge docs and definitions ( #14402 ) - KayckMatias Added Ubuntu and Raspbian to ifAlias script ( #14399 ) - tim427 Defer loading cli option values ( #14354 ) - murrant Allow dumping of errors and warnings ( #14275 ) - murrant Allow reapply yaml config via env ( #14100 ) - murrant Lnms scan respect -q parameter ( #14027 ) - murrant Improve lnms shortcut validation ( #13982 ) - murrant Internal Features Number Casting allow preceding space ( #14699 ) - murrant DeviceCache::get() allow hostname ( #14649 ) - murrant Improve SnmpResponse value() ( #14605 ) - murrant SnmpQuery numeric accept a boolean ( #14565 ) - murrant Support regex in os field replace ( #14563 ) - murrant More Replacement Capabilities for sensor index computation ( #14522 ) - PipoCanaja Ignore CommandNotFoundException from reporting ( #14342 ) - Jellyfrog Allow SnmpQuery to optionally abort walks if one fails ( #14255 ) - murrant Mibs Add CISCO-ENTITY-ALARM-MIB file ( #14754 ) - bonzo81 Update Nokia MIBs to release R22.2 ( #14734 ) - peelman More MIB fixing ( #14018 ) - Jellyfrog Update MIBs ( #14017 ) - Jellyfrog Updated existing Siemens MIBs and added trap MIB ( #13986 ) - SanderBlom Dependencies PHP dependency update ( #14927 ) - murrant Bump phpseclib/phpseclib from 3.0.18 to 3.0.19 ( #14903 ) - dependabot Bump webpack from 5.66.0 to 5.76.1 ( #14901 ) - dependabot Bump symfony/http-kernel from 5.4.16 to 5.4.20 ( #14824 ) - dependabot Bump json5 from 1.0.1 to 1.0.2 ( #14774 ) - dependabot Update PHP dependencies (fix dependencies on PHP 8.2) ( #14759 ) - murrant Bump qs and express ( #14705 ) - dependabot Bump loader-utils from 1.4.0 to 1.4.2 ( #14628 ) - dependabot Increase minimum version to PHP 8.1 ( #14378 ) - murrant Update dependencies ( #14319 ) - murrant Bump php-cs-fixer to 3.4.0 ( #14224 ) - murrant Bump terser from 4.8.0 to 4.8.1 ( #14123 ) - dependabot Bump guzzlehttp/guzzle from 7.4.4 to 7.4.5 ( #14059 ) - dependabot Update Larastan ( #14031 ) - murrant Update PHP dependencies ( #14028 ) - murrant Bump guzzlehttp/guzzle from 7.4.3 to 7.4.4 ( #14025 ) - dependabot Bump guzzlehttp/guzzle from 7.4.1 to 7.4.3 ( #13994 ) - dependabot Bump async from 2.6.3 to 2.6.4 ( #13947 ) - dependabot Bump composer/composer from 2.2.4 to 2.3.5 ( #13944 ) - dependabot Bump guzzlehttp/psr7 from 2.1.0 to 2.2.1 ( #13879 ) - dependabot Bump jpgraph version to 4 ( #13875 ) - ottorei Bump node-forge from 1.2.1 to 1.3.0 ( #13869 ) - dependabot 23.2.0 (2023-02-23) A big thank you to the following 20 contributors this last month: electrocret (5) fbouynot (5) hanserasmus (3) VVelox (3) guipoletto (1) westerterp (1) goebelmeier (1) MarlinMr (1) florisvdk (1) kylegordon (1) zenbeam (1) dependabot (1) gilrim (1) murrant (1) noaheroufus (1) AleksNovak (1) tristanbob (1) tim427 (1) PipoCanaja (1) bonzo81 (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (22) murrant (9) ottorei (4) crazy-max (1) VVelox (1) westerterp (1) Feature Add display query to list_devices function ( #14747 ) - bonzo81 Device Fortigate IPS Intrusions detected stats ( #14857 ) - electrocret Add support for Vsol v1600d EPON OLT ( #14853 ) - guipoletto Fix discovery for apc ats ( #14837 ) - florisvdk Include Samsung X Series printers ( #14831 ) - kylegordon EdgeOS OLT new sensors and changes ( #14807 ) - noaheroufus Update XDP string to exclude modern Cisco lightweight APs from discovery ( #14803 ) - tristanbob Extend filtering of graphs device_bits on cisco ASA ( #14796 ) - PipoCanaja Alerting Fix MS Teams alert transport, correct HTTP header ( #14843 ) - goebelmeier Add support for topics ( #14804 ) - AleksNovak Graphs Update HV::Monitor support to use generic_stats.inc.php ( #14814 ) - VVelox Only show Eth errors when Etherlike is enabled ( #14784 ) - electrocret Applications Add a few more graphs for CAPEv2 ( #14813 ) - VVelox CAPEv2 support ( #14801 ) - VVelox Api Use Oxidized API client and add support for groups on config get ( #14750 ) - electrocret Oxidized Show display name in Oxidized config search ( #14800 ) - electrocret Bug Revert \"Fix entity-state polling/discovery\" ( #14811 ) - murrant Documentation Fix Okta image in docs ( #14848 ) - westerterp Change socialite settings URI ( #14845 ) - fbouynot Fix possible confusion around php-fpm settings ( #14844 ) - hanserasmus Use docker compose v2 ( #14841 ) - MarlinMr Fix typo in Oauth doc ( #14840 ) - fbouynot Add Zenduty Integration info to Transports.md docs ( #14826 ) - zenbeam Update config docs - dump current config ( #14820 ) - hanserasmus Add SELinux instructions for nginx monitoring ( #14812 ) - fbouynot Add SELinux instructions for systemd monitoring ( #14809 ) - fbouynot Add SELinux instructions for systemd monitoring ( #14806 ) - fbouynot Debian 11 Sury DPA provides PHP 8.2 ( #14798 ) - tim427 Misc Use Device displayname on VRF page ( #14851 ) - electrocret Fix empty output on validation test ( #14822 ) - hanserasmus Dependencies Bump symfony/http-kernel from 5.4.16 to 5.4.20 ( #14824 ) - dependabot 23.1.0 (2023-01-24) A big thank you to the following 19 contributors this last month: electrocret (3) peelman (3) jasoncheng7115 (2) not-known (2) da-me (1) systeembeheerder (1) fdomain (1) jaannnis (1) knpo (1) trs80 (1) MANT5149 (1) LoveSkylark (1) support-capensis (1) zeroservices (1) dependabot (1) dennypage (1) carbinefreak (1) bnerickson (1) Blinq-SanderBlom (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (23) murrant (2) SourceDoctor (1) PipoCanaja (1) Device Changed discovery OID in ets.yaml ( #14795 ) - da-me Added Support for SNS-3615-K9 ( #14792 ) - jaannnis Routeros fix lldp discovery on 7.7+ ( #14791 ) - knpo Fix cisco-flash ( #14772 ) - electrocret Eaton matrix wattage fix ( #14770 ) - peelman Add Universal Input Output support for APC ( #14766 ) - dennypage Eltek Enexus; Fix SmartpackS divisor and hardware discovery ( #14762 ) - peelman Nokia PMC Microwave Improvements ( #14761 ) - carbinefreak Add AXOS sensor data for PON Transceivers (the only transceivers Cali\u2026 ( #14741 ) - peelman Adding discovery of LSI MegaRAID Device Media Errors, Other Errors, a\u2026 ( #14729 ) - bnerickson Stop net-snmp from interpreting the octet-string from rttMonEchoAdmin\u2026 ( #14676 ) - not-known Add state of the Fortigate link monitor health checks ( #14675 ) - not-known Adding support for loop-telecom devices ( #14674 ) - Blinq-SanderBlom Oxidized Adding Fortigate switches to Oxidized model mapping config ( #14782 ) - LoveSkylark Bug Fix entity-state polling/discovery ( #14793 ) - fdomain Update PingCheck.php to remove duplicate \"Device status changed to ... from icmp check.\" event ( #14785 ) - MANT5149 Fix calculated dbm ( #14771 ) - electrocret Documentation Update Syslog.md ( #14794 ) - systeembeheerder Update Authentication.md ( #14788 ) - trs80 Fix Doc Link for Canopsis transport ( #14778 ) - support-capensis Update ElasticSearch Index pattern for php 8.1 changes ( #14775 ) - zeroservices Translation Update zh-TW.json ( #14765 ) - jasoncheng7115 Create files with Traditional Chinese translation ( #14764 ) - jasoncheng7115 Misc Use displayname instead of hostname for Device Maintenance Modal Title ( #14681 ) - electrocret Dependencies Bump json5 from 1.0.1 to 1.0.2 ( #14774 ) - dependabot 22.12.0 (2022-12-28) A big thank you to the following 21 contributors this last month: murrant (10) electrocret (4) bnerickson (4) peelman (2) bonzo81 (2) gdepeyrot (2) bogdanrotariu (2) TheMysteriousX (2) LoveSkylark (1) fcqpl (1) angeletdemon (1) alchemyx (1) rinsekloek (1) SantiagoSilvaZ (1) dependabot (1) gewuerfelt (1) tuxgasy (1) hugalafutro (1) nightcore500 (1) mrwold (1) rhinoau (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (15) murrant (14) PipoCanaja (3) ottorei (3) SeeMyPing (1) Feature Pre-Install settings ( #13906 ) - murrant Device Additional sensors ( #14756 ) - peelman Update fs-nmu.inc.php ( #14702 ) - gewuerfelt Support Huawei SMU02B ( #14673 ) - nightcore500 Use 'counter' RRD type for some TrueNAS sensors ( #14670 ) - TheMysteriousX Device - Add support for \"Smartpack R\" ( #14665 ) - mrwold Added Moxa switching ifAlias/portName mapping ( #14633 ) - rhinoau Webui Fix port speed setting feedback ( #14743 ) - murrant Fix Cimc on Overview ( #14727 ) - electrocret Search devices also in display ( #14714 ) - gdepeyrot Fix check rrd file exists with remote rrdcached ( #14690 ) - tuxgasy Alerting Adding sample alert for systemd application ( #14711 ) - bnerickson Polling poller debug ( #14691 ) - electrocret Add -I flag to Traceroute cmd ( #14667 ) - electrocret Graphs Fix graph output base64 ( #14701 ) - murrant Fix some graphs not respecting device display name ( #14684 ) - murrant Adding Average into graphs ( #14679 ) - bogdanrotariu Applications Update Nvidia application - values in wrong charts ( #14736 ) - fcqpl Removing max polling restriction for wireguard traffic RRD data ( #14710 ) - bnerickson Api Fix for RIPE NCC API Tools ( #14757 ) - LoveSkylark API list_devices update with sysName, location_id and type ( #14731 ) - bonzo81 Discovery Prevent spurious MAC changes on multi-interface devices ( #14671 ) - TheMysteriousX Polling Fix ArubaInstance channel decode issue ( #14732 ) - murrant Refactor Unify time interval formatting ( #14733 ) - murrant Documentation Install updates for Rocky8 ( #14722 ) - angeletdemon Updating certificate script documentation ( #14721 ) - bnerickson Update Docker.md with proper path to unzipped files ( #14717 ) - alchemyx Fix typo: purge-port.php file name ( #14712 ) - SantiagoSilvaZ Alert template example uses incorrect variable ( #14683 ) - electrocret Correct squid snmpd.conf proxy host syntax ( #14678 ) - hugalafutro Tests Adding certificate application tests ( #14708 ) - bnerickson Misc Add MAC OUI caching when code updates are disabled ( #14713 ) - gdepeyrot Internal Features Number Casting allow preceding space ( #14699 ) - murrant Improve SnmpResponse value() ( #14605 ) - murrant Mibs Add CISCO-ENTITY-ALARM-MIB file ( #14754 ) - bonzo81 Update Nokia MIBs to release R22.2 ( #14734 ) - peelman Dependencies Update PHP dependencies (fix dependencies on PHP 8.2) ( #14759 ) - murrant Bump qs and express ( #14705 ) - dependabot 22.11.0 (2022-11-24) A big thank you to the following 40 contributors this last month: murrant (52) Jellyfrog (23) PipoCanaja (9) bnerickson (5) electrocret (4) SourceDoctor (4) noaheroufus (3) rhinoau (3) mabra94 (2) fcqpl (2) kimhaak (2) SantiagoSilvaZ (2) fbouynot (2) opalivan (2) mprins-RAM (2) VVelox (2) koocotte (1) VoipTelCH (1) cfitzw (1) systeembeheerder (1) dependabot (1) jaaruizgu (1) pertruccio (1) josh-silvas (1) ianhodgson (1) LoveSkylark (1) talkstraightuk (1) fufroma (1) fuzzbawl (1) otkd (1) kiwibrew (1) luc-ass (1) andrekeller (1) geg347 (1) Olen (1) Frazew (1) SirMaple (1) westerterp (1) squidly (1) Bierchermuesli (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (53) murrant (44) PipoCanaja (15) ottorei (1) VVelox (1) SantiagoSilvaZ (1) fbouynot (1) Feature Split out lnms snmp convenience commands ( #14603 ) - murrant Add --forgot-key to key:rotate command ( #14495 ) - murrant Security Fix Service Template XSS ( #14659 ) - murrant Fix neighbours XSS ( #14658 ) - murrant Fix SNMP trap -> Eventlog XSS ( #14657 ) - murrant Fix XSS in api access ( #14551 ) - murrant XSS sanitize pwrstatd application script inputs ( #14545 ) - bnerickson Device Added divisor to SAF Integra-X temp sensors ( #14655 ) - noaheroufus Corrected ICT MPS hardware detection ( #14654 ) - noaheroufus Adjusted PMP to accomodate various other 450 models. ( #14652 ) - noaheroufus Added support for Eltek Micropack 1U ( #14645 ) - fcqpl Added support for Eltek Flatpack S ( #14643 ) - fcqpl Improve VRP power display ( #14624 ) - PipoCanaja Edgeos picked up as generic device ( #14612 ) - ianhodgson Added Moxa EDS-G516E optical sensors ( #14610 ) - rhinoau Fix eNexus total current for Smartpack S ( #14606 ) - murrant Disable SNMP Bulk for Delta UPS devices ( #14599 ) - fufroma Improved AIX os information collection ( #14595 ) - murrant More inclusive Cisco SB os detection ( #14594 ) - murrant IP Infusion OcNOS basic detection ( #14588 ) - murrant Fix APC current divide by zero ( #14578 ) - murrant Extend EfficientIP SolidServer support ( #14549 ) - PipoCanaja TAIT-Infra93 - Fix state + skip_values for Battery ( #14541 ) - opalivan Timos - Improve SAP stats graphing ( #14534 ) - mabra94 McAfee Web Proxy with COUNTER rrd_type on sensors ( #14529 ) - PipoCanaja Fix 'bke.yaml' discovery file ( #14524 ) - PipoCanaja Added support for additional Moxa EDS-P model ( #14523 ) - rhinoau Fix awplus ntp polling bug ( #14521 ) - murrant Add discovery support for Riedo Networks UPDU ( #14496 ) - andrekeller Use correct description oid ( #14489 ) - Jellyfrog Correct upsBypassVoltage oid ( #14488 ) - Jellyfrog Correct variable typo ( #14486 ) - Jellyfrog Hpe ilo: fix filesystem type regex ( #14485 ) - Jellyfrog Added Fortigate SD-WAN Health checks ( #14456 ) - mprins-RAM Dont include empty storage sensor ( #14453 ) - Jellyfrog Remove undefined sensors ( #14449 ) - Jellyfrog Use correct low warn limit variable ( #14447 ) - Jellyfrog Fortinet FortiADC detection and basic statistics ( #14434 ) - westerterp Device - Add support for Vultan Environmental Monitoring units ( #14401 ) - squidly Device - Basic hatteras dslam integration ( #14115 ) - Bierchermuesli Webui Remove ungrouped devices panel ( #14664 ) - murrant Custom port view fix ( #14637 ) - SourceDoctor Fix billing graph divide by zero when the period is zero or doesn't exist ( #14623 ) - jaaruizgu Fix port neighbors missing ( #14586 ) - murrant Fix some icons ( #14584 ) - murrant [About] Open Laravel and RRDtool link in new tab ( #14568 ) - SantiagoSilvaZ [About] Open the contributor list link in a new tab ( #14553 ) - SantiagoSilvaZ Fix v2 plugins ( #14506 ) - murrant Check if service_name is empty or equal to service_type ( #14499 ) - luc-ass Show id on device dependencies ( #14497 ) - SourceDoctor Userlist description fix ( #14482 ) - mprins-RAM Sort alert transport by name ( #14464 ) - SourceDoctor Graphs Fix device poller modules graph ( #14640 ) - murrant Bug - XDSL module - rrd_def and rrd file definition issue for Actual rate ( #14597 ) - PipoCanaja Fix graph errors wrong content type ( #14574 ) - murrant Improve graph embedded title handling ( #14544 ) - murrant Graphing cleanup ( #14492 ) - murrant Snmp Traps Adds Cisco DHCP Server SNMP MIB and Trap Handlers. ( #14618 ) - josh-silvas Applications Alarm Flag on UPS-Nut Application ( #14635 ) - SourceDoctor Adding wireguard app to the apps overview page ( #14629 ) - bnerickson Adding wireguard application support ( #14625 ) - bnerickson Adding systemd service status application ( #14540 ) - bnerickson Memcached application: improve error visibility ( #14536 ) - murrant Fix memcached polling bug ( #14501 ) - murrant Add HV Monitor, a generic means for monitoring hypvervisors ( #14218 ) - VVelox Base64 gzip compression support for json_app_get ( #14169 ) - VVelox Api Port search API search more than one fields ( #14646 ) - murrant Added disable_notify and location_id ( #14619 ) - pertruccio Add sortorder parameter to list_logs ( #14600 ) - talkstraightuk API restore ability to update purpose and override_sysLocation ( #14596 ) - murrant API graphs, variable whitelist ( #14552 ) - murrant Graph API use new code path ( #14493 ) - murrant Adding device's field in get_alert_rule and list-alert-rules API function (new) ( #14481 ) - geg347 Fix update_device hostname handling #14435 ( #14448 ) - rhinoau Add Columns to search_ports API function ( #14348 ) - electrocret Discovery Fix discovery ignores custom ipmi port ( #14660 ) - VoipTelCH Sensors - Allow changing RRD type in YAML and PHP sensor discovery ( #14208 ) - PipoCanaja Polling Don't poll sysDescr, sysObjectID, and sysName so frequently ( #14562 ) - murrant Add connection exception handling to all redis calls ( #14467 ) - Frazew Authentication Update Radius auth to accept permissions attributes ( #14531 ) - kimhaak Bug Handle Division by 0 error for SvcFdbTableSize ( #14672 ) - mabra94 Fix sqlite test ( #14642 ) - murrant Remove extends and hardware detection support ( #14626 ) - murrant Set 0 as integer in loading of graylog. ( #14621 ) - kimhaak Fix GeocodingHelper type-hinting ( #14604 ) - Jellyfrog Bug in Ciscowlc AP graphs definition ( #14585 ) - PipoCanaja SnmpQuery fix mib directory order ( #14580 ) - murrant SnmpQuery Handle empty oids in get more gracefully ( #14577 ) - murrant Fix PTOPO mib in module discovery-protocols ( #14564 ) - PipoCanaja Fix Type error ( #14555 ) - fbouynot Correct variable use in billing ( #14533 ) - Jellyfrog Fix sensor limit linked port rules in collection ( #14520 ) - electrocret EES Rectifier various fixes from MIB + added tests ( #14519 ) - opalivan Fix fetch ifEntry logic ( #14483 ) - Jellyfrog Add a few breaks to avoid connection flooding for the irc-bot ( #14479 ) - Olen Refactor Remove Log::event ( #14526 ) - Jellyfrog Cleanup Fix snmp_disable type ( #14650 ) - murrant Consolidate and improve snmptranslate usage ( #14567 ) - murrant Remove graph_min ( #14561 ) - murrant Remove $_GET from graphs ( #14554 ) - murrant Undefined array key fixes ( #14532 ) - Jellyfrog Use Collection instead of collect() ( #14527 ) - Jellyfrog Convert string references to ::class ( #14508 ) - Jellyfrog Miscellaneous cleanup - part 5 ( #14502 ) - Jellyfrog Type API methods and properties ( #14476 ) - fbouynot Miscellaneous cleanup - part 4 ( #14452 ) - Jellyfrog Miscellaneous cleanup - part 3 ( #14450 ) - Jellyfrog Miscellaneous cleanup, mostly undefined variables - part2 ( #14445 ) - Jellyfrog Documentation Fix Traceroute debug alert template snippet ( #14668 ) - electrocret Update Dispatcher docs for Debian and for non /opt/librenms installation ( #14663 ) - koocotte Fix Location mapping docs ( #14644 ) - electrocret Update config name for the default device display ( #14641 ) - cfitzw Update Dispatcher-Service.md ( #14632 ) - systeembeheerder Updating postgres application documentation ( #14627 ) - bnerickson Documentation for Observium Migration ( #14601 ) - LoveSkylark Add snmp_flags and tips on string oids to the docs ( #14579 ) - murrant Clarify Dispatcher-Service.md for systemd ( #14575 ) - fuzzbawl Update license section of readme ( #14571 ) - otkd Remove outdated rules videos ( #14505 ) - kiwibrew Docker quick install ( #14475 ) - murrant Tests Mock astext ( #14581 ) - murrant Github tests log improvement ( #14559 ) - murrant Improve trap testing ( #14546 ) - murrant Remove unused phpstan tests ( #14503 ) - Jellyfrog Misc New schema dump ( #14630 ) - Jellyfrog Add check_hetzner_storagebox to includes/services ( #14463 ) - SirMaple Add instance id to error reports ( #14444 ) - murrant Internal Features DeviceCache::get() allow hostname ( #14649 ) - murrant SnmpQuery numeric accept a boolean ( #14565 ) - murrant Support regex in os field replace ( #14563 ) - murrant More Replacement Capabilities for sensor index computation ( #14522 ) - PipoCanaja Dependencies Bump loader-utils from 1.4.0 to 1.4.2 ( #14628 ) - dependabot 22.10.0 (2022-10-17) A big thank you to the following 22 contributors this last month: murrant (29) Jellyfrog (8) KayckMatias (4) Martin22 (3) PipoCanaja (3) fbouynot (3) electrocret (2) ottorei (1) SirMaple (1) carbinefreak (1) opalivan (1) luc-ass (1) jgelinas (1) mpikzink (1) rhinoau (1) tim427 (1) daniel-franca (1) sashashura (1) tuomari (1) kimhaak (1) bnerickson (1) loopodoopo (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (20) murrant (16) PipoCanaja (11) ottorei (3) VVelox (2) SantiagoSilvaZ (1) Security Block disabled user session auth ( #14473 ) - murrant Fix group delete xss ( #14472 ) - murrant Fix alert rules XSS ( #14471 ) - murrant Fix xss in browser push transport ( #14470 ) - murrant Fix users xss ( #14469 ) - murrant Fix user mass assignment vulnerability ( #14468 ) - murrant Fix billing xss ( #14465 ) - murrant Fix memcached unserialize vulnerability ( #14459 ) - murrant Fix possible RSS XSS ( #14457 ) - murrant GitHub Workflows security hardening ( #14388 ) - sashashura Device Correct aviatModemCurModulationRx oid ( #14446 ) - Jellyfrog MNI Microwave OS Add ( #14427 ) - carbinefreak Add OS tait-tnadmin for TN9300 ( #14413 ) - opalivan Skip empty drac state sensors ( #14409 ) - jgelinas Added support for additional Moxa EDS-G models ( #14405 ) - rhinoau Issue samsung printer m4080 fx ( #14391 ) - daniel-franca Enexus system output current fix ( #14324 ) - loopodoopo Routeros - Fix displaying distance in charts ( #14300 ) - Martin22 Added support for Ubiquiti UFiber OLT ( #14256 ) - Martin22 Webui Fix missing device_id from device alert logs ( #14460 ) - ottorei Fix about date display ( #14442 ) - murrant Fix pseudowires pages ( #14441 ) - murrant Enhanced Service Overview on Device Overview Page ( #14410 ) - luc-ass Disable plugins that have errors ( #14383 ) - murrant Fix Inventory table for Dark theme ( #14377 ) - electrocret Add initselect2 to locations ports ( #14375 ) - KayckMatias Update devices filter in alert-logs to init_select2 ( #14361 ) - KayckMatias Alerting Alert map location fix ( #14380 ) - KayckMatias Populate the alert rule field with the builder json ( #14374 ) - murrant Snmp Traps Improve LinkUp and LinkDown trap handling incomplete traps ( #14385 ) - tuomari Applications Add pwrstatd application ( #14365 ) - bnerickson Api Fix port search with slashes ( #14403 ) - murrant Discovery Cisco NAC fix ( #14440 ) - murrant Polling Fix bgp-peers bgpPeerIface bug and update test data ( #14420 ) - murrant Oxidized Fix oxidized web requests unclosed connections or responding fast enough ( #14370 ) - fbouynot Authentication Rework socialite integration ( #14367 ) - Jellyfrog Bug Snmpwalk functions: dont include invalid data ( #14438 ) - Jellyfrog Fix VRP duplicate BGP Peers ( #14431 ) - PipoCanaja Version and git helper improvements ( #14412 ) - murrant Cache version data ( #14404 ) - murrant Fix rpi codec state sensor ( #14400 ) - murrant Fix libvirt count() uncountable error ( #14398 ) - murrant Fix Firebrick local ASN ( #14397 ) - murrant Fix ups nut PHP 8 issue ( #14392 ) - murrant Refactor Fix a few Db* to Eloquent requests ( #14278 ) - PipoCanaja Cleanup Remove tabs from yaml ( #14437 ) - Jellyfrog Miscellaneous fixes, mostly undefined variables ( #14432 ) - Jellyfrog Trim whitespaces from device data ( #14429 ) - Jellyfrog Fix bgp_peer array_merge error ( #14416 ) - PipoCanaja Documentation Updating details of my LibreNMS install ( #14458 ) - SirMaple Fix php7.2 occurence in Performance.md documentation ( #14394 ) - fbouynot Fix documentation for php8.1 and bad package name ( #14393 ) - fbouynot Translation Fix Typo in Settings ( #14443 ) - electrocret Tests Speed up tests ( #14421 ) - murrant Fix cisco-pw test capture ( #14415 ) - murrant Test supported PHP versions only ( #14389 ) - murrant Run CI on ubuntu 22.04 ( #14379 ) - Jellyfrog Misc Update ports_purge docs and definitions ( #14402 ) - KayckMatias Added Ubuntu and Raspbian to ifAlias script ( #14399 ) - tim427 Dependencies Increase minimum version to PHP 8.1 ( #14378 ) - murrant 22.9.0 (2022-09-21) A big thank you to the following 19 contributors this last month: murrant (53) Jellyfrog (17) PipoCanaja (7) fbouynot (6) bp0 (3) Npeca75 (2) sembeek (1) huntr-helper (1) KayckMatias (1) LoveSkylark (1) quentinsch (1) loopodoopo (1) electrocret (1) Martin22 (1) luc-ass (1) ktims (1) VirTechSystems (1) tim427 (1) mwobst (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (43) murrant (39) PipoCanaja (9) ottorei (4) SourceDoctor (1) Feature Improved Modern Modules ( #14315 ) - murrant Add @signedGraphTag() and @signedGraphUrl() blade directives ( #14269 ) - murrant Device settings: attempt to open related tab ( #14250 ) - murrant Error reporting ( #14190 ) - Jellyfrog Security Fix scheduled maintenance xss ( #14360 ) - murrant Add huntr.dev to SECURITY.md ( #14359 ) - huntr-helper Device Added status checks for (BWCC) battery status and condition for onboa\u2026 ( #14349 ) - quentinsch UHP VSAT modems ( #14317 ) - loopodoopo Ray2 - Oid repair at ber ( #14302 ) - Martin22 Fix ciena-sds inventory bugs ( #14252 ) - murrant F5 partition ram ( #14226 ) - fbouynot Add Cisco Flash storage support ( #14219 ) - fbouynot Webui Load device selection dynamically on Ports page ( #14353 ) - KayckMatias Port pages fixes and cleanups ( #14310 ) - murrant Remove Caffeine ( #14277 ) - murrant Updated brother.svg to make it render in Safari ( #14271 ) - luc-ass Fix for Cisco group device health tab ( #14265 ) - fbouynot Fix dashboard widgets becoming unlocked (especially when using a touchscreen) ( #14222 ) - tim427 Migrate xDSL code to module, and add support for VDSL2 MIB ( #14207 ) - PipoCanaja Improved sorting options for Availability Map ( #14073 ) - mwobst Alerting Discord ability to attach graph images ( #14276 ) - murrant Email Transport: embed graphs by default ( #14270 ) - murrant Graphs Return GraphImage to include more metadata ( #14307 ) - murrant Api Allow delete location by id ( #14334 ) - bp0 API update_device, make location field work (as does location_id) ( #14325 ) - bp0 Polling Fix ping.php skipped results ( #14368 ) - sembeek Oxidized Oxidized \"allow purpose and notes\" ( #14352 ) - LoveSkylark Bug Fix cipsec-tunnels ftd bad data causes error ( #14366 ) - murrant Handle null in unix-agent ( #14358 ) - murrant Fix the case of 'Ungrouped' in smokeping integration ( #14351 ) - fbouynot Fix for smokeping integration with ping-only devices ( #14341 ) - fbouynot Match displayname source for graylog ( #14339 ) - fbouynot Check dot1dBasePortIfIndex exists before using it ( #14337 ) - Jellyfrog Prevent errors when hrStorageTable doesn't exist ( #14327 ) - Jellyfrog Revert \"ZTE ZXA10 Update (Added dBm graphs)\" ( #14320 ) - murrant Billing module fix/cleanup ( #14309 ) - electrocret SnmpResponse filterBadLines fix ( #14306 ) - murrant Fix ARP Table on Device overview ( #14304 ) - Npeca75 Disable error reporting when dependencies are outdated ( #14291 ) - murrant Don't send zeros to Graphite for missing metrics ( #14262 ) - ktims Fix removing all port groups ( #14253 ) - murrant Move cronjob time for daily.sh ( #14245 ) - Jellyfrog Firebrick bgp polling was broken ( #14237 ) - murrant Quick fix for cipsec-tunnels Cisco implementation ( #14232 ) - PipoCanaja Fix redeclare of function breaking tests in OS eltex-mes23xx ( #14227 ) - PipoCanaja Refactor Cleanup and optimize the availability widget ( #14329 ) - murrant Cleanup Defer loading cli option defaults ( #14363 ) - Jellyfrog Remove call to Config from artisan ( #14362 ) - Jellyfrog Mibs - Cleanup names ( #14323 ) - PipoCanaja Enable more checks ( #14318 ) - Jellyfrog Do not include _token in legacy vars ( #14313 ) - murrant Don't include null os when loading defs ( #14312 ) - murrant 2fa not all routes have names ( #14311 ) - murrant Cache astext for 1 day ( #14303 ) - murrant Linux distro images require feature field ( #14301 ) - murrant Silence return type mismatch ( #14298 ) - Jellyfrog Fix more percent calculations ( #14294 ) - murrant Fix rounding null in mempools module ( #14290 ) - murrant Check if polling module exists ( #14289 ) - murrant Fix undefined variable ( #14287 ) - murrant Handle connection timed out errors in unix agent ( #14286 ) - murrant Remove unused function ( #14283 ) - murrant Remove reference to unused variable ( #14280 ) - murrant Cleanup some RunAlerts issues ( #14274 ) - murrant Fix a bunch of \"Since fakerphp/faker 1.14: Accessing property..\" ( #14267 ) - Jellyfrog Fix more error exceptions ( #14266 ) - Jellyfrog Fix hrStorageType being undefined ( #14260 ) - Jellyfrog Misc errors cleanup ( #14257 ) - Jellyfrog Fix ipv6 hexdec error ( #14254 ) - murrant Use empty string instead of null for routes ( #14247 ) - Jellyfrog Sort device types alphabetically ( #14244 ) - VirTechSystems Misc webui code cleanups ( #14242 ) - murrant Fix some ErrorExceptions ( #14241 ) - Jellyfrog Fix os_group unset errors ( #14238 ) - murrant Juniper bgp-peers cleanup ( #14236 ) - murrant Percentage calculation helper ( #14235 ) - murrant Memcached app undefined vars ( #14225 ) - Npeca75 Fix Undefined variable/key warnings ( #14134 ) - murrant Documentation Move list_locations from devices to locations ( #14328 ) - bp0 Cisco-sla module was renamed to slas ( #14288 ) - murrant Update docs around APP_URL ( #14282 ) - murrant Tests Do not allow sysDescr to be fetched in os module yaml ( #14331 ) - murrant Remove PHP version constraint ( #14314 ) - Jellyfrog Lnms dev:simulate check simulated device exists ( #14243 ) - murrant Save-test-data to refresh all variants of an OS ( #14231 ) - PipoCanaja Misc Defer loading cli option values ( #14354 ) - murrant Ignore CommandNotFoundException from reporting ( #14342 ) - Jellyfrog Allow dumping of errors and warnings ( #14275 ) - murrant Allow SnmpQuery to optionally abort walks if one fails ( #14255 ) - murrant Dependencies Update dependencies ( #14319 ) - murrant Bump php-cs-fixer to 3.4.0 ( #14224 ) - murrant 22.8.0 (2022-08-19) A big thank you to the following 26 contributors this last month: murrant (18) Npeca75 (12) Jellyfrog (9) gs-kamnas (5) earendilfr (3) fbouynot (3) VVelox (3) rhinoau (2) Schouwenburg (2) electrocret (2) aztec102 (2) PipoCanaja (1) loopodoopo (1) washcroft (1) Laplacence (1) opalivan (1) Jarod2801 (1) Martin22 (1) TheMysteriousX (1) ciscoqid (1) Fehler12 (1) PedroChaps (1) ajsiersema (1) quentinsch (1) Mar974 (1) mwobst (1) Thanks to maintainers and others that helped with pull requests this month: murrant (46) Jellyfrog (26) PipoCanaja (2) VVelox (1) Cormoran96 (1) bennet-esyoil (1) ottorei (1) Feature Prepare for PHP 8.1 ( #14156 ) - Jellyfrog New Poller validations ( #14148 ) - murrant New lnms command to enable and disable plugins ( #14147 ) - murrant Support for SSL/TLS protected connections to MySQL databases ( #14142 ) - gs-kamnas Collect OS distro and LibreNMS version ( #14138 ) - murrant Lnms device:poll better feedback ( #14130 ) - murrant Per-App data storage ( #14087 ) - VVelox Device Fix luminato port poll ( #14217 ) - murrant Teltonika RUT fix ( #14202 ) - loopodoopo Initial support for Moxa AWK Industrial APs ( #14197 ) - rhinoau Mikrotik wifi station mode sensors ( #14193 ) - Npeca75 Update mellanox os image ( #14184 ) - Laplacence Change state_name for Racoms modulation ( #14174 ) - Martin22 Cisco SB/CBS environment sensors ( #14154 ) - Fehler12 Fix Rocky Linux and AlmaLinux icons and logos ( #14150 ) - murrant Add additional sysObjectIDs for variants of the Arista 7130 ( #14144 ) - gs-kamnas Eltex MES 2324p Add ( #14135 ) - aztec102 Solid Optics EDFAMUX support ( #14129 ) - murrant Merge netmanplus and riello and improve device support ( #14125 ) - murrant Bats support ( #14108 ) - Schouwenburg Solved aos6 problem where Librenms wasn't identifying all vlans ( #14107 ) - PedroChaps Fix Cisco polling BGP peers in non-default VRF ( #14105 ) - ajsiersema Added support for CheckPoint 1100, 1450 & 1490 models. ( #14074 ) - quentinsch Ns-bsd updated for SNS LTSB 3.7.19 ( #14060 ) - Mar974 ZTE ZXA10 Update (Added dBm graphs) ( #14049 ) - aztec102 Webui Fix ports display ( #14183 ) - murrant Ports by device group ( #14175 ) - electrocret Empty Outages table ( #14167 ) - Npeca75 View Ports in Portgroups ( #14141 ) - electrocret Fix eventlog filtering ( #14136 ) - murrant [gui] enable permanent vertical scroll ( #14102 ) - Npeca75 Alerting Correct logic for recurring alert rules that span UTC days ( #14145 ) - gs-kamnas Improvements to PagerDuty alert formatting ( #14143 ) - gs-kamnas Add rich (=html) support for messages via Matrix ( #14054 ) - mwobst Graphs Fix unauth application graphs ( #14216 ) - murrant Allow specifying the background colour in graph images ( #14192 ) - washcroft Applications Add possibility to monitor redis application through the unix-agent ( #14182 ) - earendilfr Fix error between application module and unix-agent ( #14177 ) - earendilfr Add possibility to monitor the php-fpm service with the unix agent ( #14173 ) - earendilfr [apps] Docker only show current containers ( #14152 ) - Npeca75 Add support for Sagan ( #14070 ) - VVelox Add Opensearch\\Elasticsearch monitoring ( #14053 ) - VVelox Api Standardize device and device group maintenance API ( #14153 ) - rhinoau Fix maintenance APIs not associating device or group ( #14127 ) - murrant Discovery Fix legacy os extends ( #14220 ) - murrant Sensors, convert hex to strings ( #14121 ) - murrant Polling Fix for number in sensor string ( #14185 ) - Schouwenburg Authentication AD Auth PHP 8.1 fixes ( #14215 ) - murrant Bug Autodiscovery fix ( #14213 ) - Npeca75 Fix alert log clearing SQL query ( #14200 ) - Jellyfrog Fix error when ldap_search returns false ( #14199 ) - Jellyfrog Fix unnecessary Updates of DB when values are equal ( #14179 ) - opalivan Fix APP_KEY generation when using fpm ( #14168 ) - Jellyfrog Fix validation error ( #14163 ) - TheMysteriousX IPv6 Debug typo ( #14162 ) - Npeca75 Replace git show --no-patch option with --quiet ( #14160 ) - ciscoqid Fix 500 error in validation when UI containers and poller containers have differing node_ids ( #14146 ) - gs-kamnas Use --no-patch to support old git clients ( #14137 ) - Jellyfrog Refactor Use \"database version\" instead of \"mysql version\" ( #14158 ) - Jellyfrog Documentation Update to mkdocs-material 8.3.9 ( #14189 ) - Jellyfrog SNMP extend / fix mdadm documentation ( #14186 ) - Npeca75 Update index.md ( #14178 ) - Jarod2801 Add instructions for PHP 8.1 and Ubuntu 22.04 ( #14166 ) - Jellyfrog Update php installation instruction for CentOS 8 to reflect the minim\u2026 ( #14159 ) - fbouynot Fix typo in Smokeping SELinux documentation ( #14155 ) - fbouynot Add device_default_display info ( #14151 ) - murrant Change SELinux context for logs ( #14128 ) - fbouynot Translation Serbian translation, part3 ( #14205 ) - Npeca75 More Serbian translation ( #14181 ) - Npeca75 Enable translation on Eventlog & Component-status widgets ( #14180 ) - Npeca75 Initial support for Serbian language ( #14165 ) - Npeca75 Enable translation in 3 Alert widget ( #14164 ) - Npeca75 Tests Allow save-test-data.php to run all modules explicitely ( #14212 ) - PipoCanaja Increase OS detection time, sometimes it is not ready by 5s ( #14133 ) - murrant 22.7.0 (2022-07-20) A big thank you to the following 21 contributors this last month: murrant (12) fbouynot (4) mwobst (3) dependabot (2) wrongecho (2) ppasserini (2) QuadPiece (2) Jellyfrog (2) enferas (1) 00gh (1) bennet-esyoil (1) VVelox (1) rhinoau (1) prahal (1) paulgear (1) duhow (1) PipoCanaja (1) Mar974 (1) ottorei (1) mostdaysarebaddays (1) dagbdagb (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (19) murrant (14) ottorei (2) PipoCanaja (2) mpikzink (1) VVelox (1) Security Security fixes XSS in oxidized-cfg-check.inc.php and print-customoid.php ( #14126 ) - enferas Device Missing \"s\" in NsBsd.php ( #14067 ) - Mar974 Add full version of Mikrotik logo ( #14063 ) - QuadPiece Add apc battery operation time, including display in WebUI ( #14058 ) - mwobst Fix the parsing of the temperature unit value (CMCIII devices) ( #14056 ) - mwobst Update Mikrotik logo ( #14045 ) - QuadPiece Aviat WTM reduce snmp load ( #13918 ) - murrant Webui Fix device filtering false values ( #14103 ) - murrant Minor visual changes to the apps-overview page ( #14090 ) - bennet-esyoil Search device by MAC via URL ( #14072 ) - duhow Add BGP description to eventlog BGP Peers messages ( #14061 ) - mostdaysarebaddays Alerting Example rules for diskspace on / ( #14082 ) - VVelox Graphs Ping perf ( #14117 ) - 00gh Applications Fix app docker ( #14080 ) - prahal Polling Increase traceroute timeout ( #14084 ) - murrant Authentication Add option STARTTLS for authentication via AD ( #14051 ) - dagbdagb Bug Prevent duplicate plugin table entries ( #14120 ) - murrant Fix auth_test.php debug ( #14118 ) - murrant Fix config seeder will never run ( #14113 ) - murrant Reset the opcache after install ( #14098 ) - murrant Update config cache on install finalize step ( #14097 ) - murrant Fix more webserver validation issues ( #14096 ) - murrant Revert \"Add apc battery operation time, including display in WebUI\" ( #14068 ) - PipoCanaja Use --no-patch instead ( #14047 ) - Jellyfrog Cleanup Remove mib poller module remnants ( #14077 ) - murrant Documentation Small documentation typos ( #14101 ) - wrongecho Documentation typos ( #14099 ) - wrongecho Add SELinux configuration for SNMPd on Centos8 in the documentation ( #14095 ) - fbouynot Add SELinux configuration for LDAP/AD authentication on Centos8 in the documentation ( #14094 ) - fbouynot Add SELinux configuration for Smokeping on Centos8 in the documentation ( #14093 ) - fbouynot Add SELinux configuration for RRDCached on Centos8 in the documentation ( #14092 ) - fbouynot Corrected API devicegroup curl creation examples ( #14081 ) - rhinoau Minor grammar fixes in doc ( #14078 ) - paulgear Add documentation for Chrony application monitoring ( #14066 ) - ottorei Translation Few more updates to Ita lang ( #14091 ) - ppasserini Italian language update ( #14085 ) - ppasserini Adjustments to german translation ( #14083 ) - mwobst Tests Test PHP 8.1 ( #14109 ) - murrant Misc Allow reapply yaml config via env ( #14100 ) - murrant Mibs More MIB fixing ( #14018 ) - Jellyfrog Dependencies Bump terser from 4.8.0 to 4.8.1 ( #14123 ) - dependabot Bump guzzlehttp/guzzle from 7.4.4 to 7.4.5 ( #14059 ) - dependabot 22.6.0 (2022-06-14) A big thank you to the following 22 contributors this last month: murrant (22) gs-kamnas (5) Jellyfrog (4) dependabot (2) kruczek8989 (2) bile0026 (1) dennypage (1) hjcday (1) Martin22 (1) spyfly (1) Bobdave (1) bennet-esyoil (1) DaftBrit (1) SanderBlom (1) thecityofguanyu (1) glance- (1) duhow (1) TheMysteriousX (1) kevinwallace (1) HolgerHees (1) charlyforot (1) SourceDoctor (1) Thanks to maintainers and others that helped with pull requests this month: murrant (21) Jellyfrog (14) ottorei (5) PipoCanaja (2) mpikzink (1) f0o (1) Feature SnmpQuery walk multiple oids ( #14015 ) - murrant Add support to REST API for creating Maintenance Schedules for Device Groups ( #13985 ) - thecityofguanyu Automatic fixes for validation failures ( #13930 ) - murrant Security Bumpver handlebars.js to 4.7.7 to resolve CVE-2021-23369 ( #13990 ) - gs-kamnas Device Fix use of incorrect variable to retrieve current sensor value ( #14037 ) - dennypage Support Huawei SMU11B ( #14029 ) - murrant Update Teltonika Sensors for FW R_00.07.02 ( #14012 ) - hjcday Procurve hardware description cleanup ( #14007 ) - murrant Racom Ray2 and Ray3 - Modulation states added ( #14001 ) - Martin22 Fix OS Detection for USW-Flex-XG ( #13999 ) - spyfly Add support for Cisco Nexus 3550 series (formerly Exalink Fusion) devices ( #13992 ) - gs-kamnas Improve support for Arista/Metamako MOS devices ( #13988 ) - gs-kamnas Workaround issues with lldp information from GS108Tv1 ( #13971 ) - glance- Add additional OpenBSD PF graphs ( #13963 ) - kevinwallace BGP unnumbered support for Cumulus ( #13785 ) - charlyforot Webui Dashboard code cleanup ( #13996 ) - murrant Device Types Widget ( #13670 ) - SourceDoctor Alerting Add macro.past_20m macro ( #14023 ) - kruczek8989 Allow the use of a custom URL for accessing the PagerDuty API and correct API schema violation ( #14010 ) - gs-kamnas Setting MSteams card summary to alert title ( #13989 ) - DaftBrit Use display name when sending alerts to Sensu ( #13967 ) - TheMysteriousX Applications Add error-state to non-responsive mysql-servers ( #13993 ) - bennet-esyoil Discovery Fix printer count sensors when extra garbage is returned ( #14014 ) - murrant Oxidized Syslog-notify-oxidized.php now always notifies Oxidized ( #14011 ) - murrant Fix Oxidized syslog change notifier when the change was made via snmp. ( #14005 ) - kruczek8989 Authentication Implement support for usernames coming from reverse proxies ( #13894 ) - HolgerHees Bug Git version validation improvement ( #14042 ) - murrant Server name validation, handle ports better ( #14041 ) - murrant Fix some broken migrations ( #14040 ) - Jellyfrog Fix rrd version validation check ( #14036 ) - murrant Fix DB timezone validation ( #14035 ) - murrant Regression fix from #13596 ( #14034 ) - Jellyfrog Fix an issue when getting the local version from git ( #14020 ) - murrant Fix migrations failing one time after dashboard cleanup ( #14002 ) - murrant Fix Netscaler VServer database updates during polling ( #13995 ) - Bobdave Fix 500 error in validations when capabilities are not supported or set ( #13991 ) - gs-kamnas Cleanup Remove traceroute6, it is unused ( #14019 ) - murrant Remove DefaultWidgetSeeder ( #14006 ) - murrant Documentation Okta saml ( #14038 ) - bile0026 HPE Comware snmp config example ( #13997 ) - murrant Tests Fix tests failing when device with IP 127.1.6.1 exists ( #14016 ) - murrant Misc Slightly easier validation page error access ( #14044 ) - murrant Lnms scan respect -q parameter ( #14027 ) - murrant Custom OID processing of numeric strings with filters ( #13968 ) - duhow Validate base_url and server_name ( #13941 ) - murrant Mibs Update MIBs ( #14017 ) - Jellyfrog Updated existing Siemens MIBs and added trap MIB ( #13986 ) - SanderBlom Dependencies Update Larastan ( #14031 ) - murrant Update PHP dependencies ( #14028 ) - murrant Bump guzzlehttp/guzzle from 7.4.3 to 7.4.4 ( #14025 ) - dependabot Bump guzzlehttp/guzzle from 7.4.1 to 7.4.3 ( #13994 ) - dependabot 22.5.0 (2022-05-21) A big thank you to the following 23 contributors this last month: murrant (7) VVelox (6) slimey99uk (2) dependabot (2) Npeca75 (2) nox-x (1) nsn-amagruder (1) mkuurstra (1) booth-f (1) sajiby3k (1) skandragon (1) Martin22 (1) twelch24 (1) ppasserini (1) bl3nd3r (1) SantiagoSilvaZ (1) Jimmy-Cl (1) lfkeitel (1) steffann (1) micko (1) IVI053 (1) pfromme25 (1) mzacchi (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (19) murrant (16) ottorei (3) mpikzink (1) Feature Allow unordered OIDs (global and per-os) ( #13923 ) - murrant Added --ping-only to snmp-scan.py ( #13810 ) - IVI053 Device Add Cisco Business Wirless to ciscowlc.yaml ( #13984 ) - nsn-amagruder Add Eaton SC200 OS model ( #13978 ) - slimey99uk Fortigate LTE sensor addition ( #13977 ) - slimey99uk Added BKE power supply support. ( #13972 ) - Martin22 Don't use bulk-walk for PrimeKey Appliances ( #13958 ) - bl3nd3r Fix avtech12e sensors ( #13943 ) - lfkeitel [mikrotik] fixed RouterOS ipv4/ipv6 routes ( #13902 ) - Npeca75 Netscaler new counter metrics ( #13323 ) - mzacchi Webui Update dark mode to fix BGP and Peering page ( #13951 ) - Jimmy-Cl Fix snmp.timeout setting via Web UI ( #13937 ) - murrant Alerting More realistic alert test data ( #13969 ) - murrant Graphs [RRD] fix IPv6 folder name ( #13945 ) - Npeca75 Applications Remove alert keys from component for Suricata ( #13959 ) - VVelox Fix a few issues with variable names for Suricata ( #13956 ) - VVelox Scripts/json-app-tool.php JSON generation fix and add -S for SNMP extend name ( #13948 ) - VVelox Add Suricata monitoring ( #13942 ) - VVelox Discovery Fix polling and discovery of FortiGate cluster sensors ( #13980 ) - mkuurstra Oxidized Oxidized API to return groups based on device purpose or notes ( #13976 ) - sajiby3k Authentication Auth_ldap_skip_group_check when ldap_compare is not supported ( #13926 ) - micko Add LDAP bind and userlist filter support to ldap-authorization ( #13788 ) - pfromme25 Bug Inconsistency in ldap starttls config parameter ( #13987 ) - nox-x Fix version check error ( #13981 ) - murrant Use full sudo path ( #13975 ) - skandragon Fix IPv6 in service check host ( #13939 ) - steffann Refactor Improve the efficiency of some queries ( #13974 ) - murrant Move Config loading to a service provider ( #13927 ) - murrant Documentation Fix typo in dispatcher service doc ( #13979 ) - booth-f Fix a typo in alerting doc ( #13970 ) - twelch24 DOCS, switch to dark or light mode ( #13953 ) - SantiagoSilvaZ Assorted cleanups to alerting docs, primarily to make mdl happier ( #13950 ) - VVelox Update test doc making it more mdl happy and add a section on writing JSON app tests ( #13949 ) - VVelox Translation Small Italian lang update ( #13960 ) - ppasserini Misc Improve lnms shortcut validation ( #13982 ) - murrant Dependencies Bump async from 2.6.3 to 2.6.4 ( #13947 ) - dependabot Bump composer/composer from 2.2.4 to 2.3.5 ( #13944 ) - dependabot 22.4.0 (2022-04-21) A big thank you to the following 27 contributors this last month: murrant (18) SantiagoSilvaZ (3) laf (3) dependabot (3) Fehler12 (3) ottorei (2) bl3nd3r (2) p4k8 (1) si458 (1) TheMysteriousX (1) cliffalbert (1) Jimmy-Cl (1) frenchie (1) ppasserini (1) claude191 (1) westerterp (1) Cormoran96 (1) WillIrvine (1) lucalo72 (1) ssasso (1) Jellyfrog (1) geg347 (1) dandare100 (1) bonzo81 (1) PipoCanaja (1) jonathanjdavis (1) manonfgoo (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (25) murrant (16) laf (10) ottorei (3) PipoCanaja (3) SourceDoctor (2) haxmeadroom (1) Feature Add ISIS discovery and polling for iosxe devices ( #13880 ) - WillIrvine Security Fix services command injection ( #13932 ) - murrant Fix Graylog XSS ( #13931 ) - murrant Bump minimist from 1.2.5 to 1.2.6 ( #13872 ) - dependabot Fix SQL injection in get-host-dependencies ( #13868 ) - Jellyfrog Device Support tplink routers ( #13922 ) - si458 Fix Hytera error ( #13909 ) - murrant PrimeKey Improvements ( #13901 ) - bl3nd3r Enhancements for Zyxel OS ( #13897 ) - Jimmy-Cl Added support for Dell PowerVault ME4024 ( #13883 ) - laf Add support for Riello NetMan 204 ( #13878 ) - lucalo72 Fix usw flex switch hardware detection ( #13877 ) - Fehler12 Added Polycom Lens SNMP support. ( #13876 ) - Fehler12 Fix for PFSense state table removals field ( #13863 ) - dandare100 McAfee Proxy Sensor name update ( #13853 ) - PipoCanaja Add support for PrimeKey Hardware Appliance ( #13806 ) - bl3nd3r Webui Add ISIS-details to alert details ( #13920 ) - ottorei Fix port mini graphs ( #13911 ) - murrant Replaced OpenWRT icon with new logo ( #13891 ) - frenchie Add \"Ping Response\" graph to \"Ping Only\" Device Overview page ( #13886 ) - westerterp Remove fix size for column mac adresse ( #13881 ) - Cormoran96 Fixed the top port errors widget returning bits graphs instead ( #13860 ) - laf Alerting Correct type hint ( #13915 ) - TheMysteriousX Improve alert template saving ( #13910 ) - murrant Added Basic authentication capability to Alertmanager Transport ( #13867 ) - geg347 Snmp Traps Add Cisco Err-Disable interface event trap handler ( #13855 ) - bonzo81 Api Ensure 'add_device' API returns indexed-array (as per doco) ( #13887 ) - claude191 Polling Fix STP polling bug ( #13924 ) - murrant Print full error message in poller/discovery output ( #13903 ) - murrant Rancid Add MRV OptiDriver support in gen_rancid ( #13900 ) - cliffalbert Add support for VyOS on Rancid conf ( #13874 ) - ssasso Bug Validate fixes ( #13935 ) - murrant Lnms device:add handle snmp.community bad format ( #13914 ) - murrant Fix install icons ( #13904 ) - murrant Handle bad uptime input ( #13899 ) - murrant Fix custom error messages ( #13898 ) - murrant Migrate addhost.php to lnms device:add ( #13870 ) - murrant Refactor Port Validation Page to Laravel ( #13921 ) - murrant Cleanup Better device:add error output ( #13913 ) - murrant Remove non-working Dell specific alert rules from the collection ( #13706 ) - Fehler12 Documentation Docs, fix code block in oxidized group ( #13908 ) - SantiagoSilvaZ [DOC] Fix Code blocks Step 2 Installing Network-WeatherMap ( #13905 ) - SantiagoSilvaZ [DOC] Styling the .env word quote ( #13889 ) - SantiagoSilvaZ Docs, fix Linux SNMP example only listening on ::1 ( #13882 ) - murrant Script that describes how to migrate traffic bills from observium. ( #13757 ) - manonfgoo Translation Ukrainian translation update ( #13933 ) - p4k8 Few more language (ITA) updates ( #13890 ) - ppasserini Dependencies Bump guzzlehttp/psr7 from 2.1.0 to 2.2.1 ( #13879 ) - dependabot Bump jpgraph version to 4 ( #13875 ) - ottorei Bump node-forge from 1.2.1 to 1.3.0 ( #13869 ) - dependabot 22.3.0 (2022-03-17) A big thank you to the following 22 contributors this last month: murrant (7) Jellyfrog (5) bonzo81 (4) laf (3) PipoCanaja (2) charlyforot (2) geg347 (2) westerterp (2) ospfbgp (1) MrXermon (1) pandalion98 (1) eskyuu (1) josh-silvas (1) martinberg (1) lpailhas (1) hanserasmus (1) si458 (1) SantiagoSilvaZ (1) LTangaF (1) dlangille (1) Npeca75 (1) woidi (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (19) murrant (10) laf (8) SourceDoctor (3) ottorei (1) bboy8012 (1) PipoCanaja (1) Feature Device_add support display field ( #13846 ) - murrant Display Name in availability map ( #13841 ) - murrant Implement OAuth and SAML2 support ( #13764 ) - Jellyfrog Security Resolved XSS issue from alert rule list modal ( #13805 ) - laf Device Add support for VOSS 8.6 ( #13857 ) - ospfbgp Device - HWG-WLD version 2 support ( #13849 ) - PipoCanaja Fix an issue with the APC current discovery ( #13837 ) - eskyuu Add VS state for Gaia ( #13831 ) - martinberg [new OS] Alpine OptoElectronics TDCM-EDFA support ( #13825 ) - charlyforot Fix db delete on cisco-vrf-lite discovery ( #13823 ) - lpailhas Add rocky linux OS identification ( #13815 ) - hanserasmus Detect truenas scale ( #13812 ) - si458 [comware] dropped dbfetch from discovery/sensors ( #13796 ) - Npeca75 Correct divisor in discovery definition vertiv-pdu.yaml ( #13768 ) - woidi Webui Fixed displaying hostname in create bill when port is passed ( #13830 ) - laf Fix Oxidized Config tab showing when Device OS or Device Type is disabled ( #13809 ) - westerterp Position the buttons in the center on user preferences page ( #13802 ) - SantiagoSilvaZ Add usage hints for Display Name placeholder usage ( #13801 ) - LTangaF Fix second menu bar in Apps screens ( #13800 ) - westerterp WebUI - Search results for ports ( #13787 ) - PipoCanaja Alerting Newer versions of Jira use HTTP code 201 fore created issues ( #13852 ) - MrXermon Add extra dynamic values alerttransport alertmanager ( #13828 ) - geg347 Snmp Traps Add APC SmartAvrReducing trap handlers ( #13839 ) - bonzo81 Add APC upsOnBattery & powerRestored trap handler ( #13836 ) - bonzo81 Add OspfTxRetransmit Trap Handler ( #13824 ) - bonzo81 Cisco Mac address violation trap handler ( #13811 ) - bonzo81 Api Adds API call to update port notes on devices. ( #13834 ) - josh-silvas Bug Rewrite agent packages parsing code ( #13840 ) - murrant Fix snmpv3 context when empty SnmpQuery ( #13832 ) - murrant Regression fix from b6a8b602b891d9eb8633f62632c17bdc559cd620 ( #13819 ) - Jellyfrog Fix PHPStan Deprecated test ( #13794 ) - Jellyfrog Refactor Remove addHost from ModuleTestHelper ( #13847 ) - murrant Tests PHP8 phpstan fix ( #13843 ) - murrant Fix tests for MariaDB > 10.5.15 ( #13829 ) - Jellyfrog Add MIB to OS helper to tests ( #13795 ) - Jellyfrog Misc Add configuration support for IPMIv2 Kg key ( #13845 ) - pandalion98 New device:add code ( #13842 ) - murrant Fix class error name prevents to show BER graph ( #13833 ) - charlyforot Add generic PSU status failed alert rule template ( #13821 ) - geg347 Bump version to 22.2.1 ( #13798 ) - dlangille 22.2.0 (2022-02-16) A big thank you to the following 22 contributors this last month: Jellyfrog (22) murrant (11) PipoCanaja (7) Npeca75 (7) ilGino (6) SantiagoSilvaZ (4) laf (3) h-barnhart (2) aztec102 (2) Fehler12 (1) JKJameson (1) jepke (1) sGoico (1) dorkmatt (1) SourceDoctor (1) si458 (1) dfitton (1) Martin22 (1) fsmeets (1) dependabot (1) knpo (1) guipoletto (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (35) murrant (16) laf (14) PipoCanaja (10) ottorei (6) SourceDoctor (5) kkrumm1 (1) Feature Implement system for user packages in composer ( #13718 ) - Jellyfrog Security Hide community and make it XSS safer ( #13783 ) - PipoCanaja Moved some pages to be within admin route ( #13782 ) - laf XSS fix ( #13780 ),( #13778 ),( #13776 ),( #13775 ) - PipoCanaja Bump follow-redirects package from 1.14.7 to 1.14.8 ( #13774 ) - dependabot Device Support for Terra sdi410c / sdi480 devices ( #13759 ) - Npeca75 Added BER to Racom Ray and Ray3 ( #13758 ) - Martin22 Added system temperature support including state for Extreme VSP 4900 devices ( #13743 ) - laf Added ipv6 route discovery for Mikrotik devices ( #13737 ) - Npeca75 Fixed airos temp in 8.7.7 for ubnt devices ( #13731 ) - murrant Added sensors to ZXA OS ( #13724 ) - aztec102 Added support for Volius OS ( #13723 ) - aztec102 Updated DDM MIBs for Jetstream OS ( #13715 ) - Npeca75 Added support for Ubiquiti Airfiber60 devices ( #13680 ) - jepke Fixed Temperature Sensor for AirOS 8.7.4+ ( #13655 ) - JKJameson Added support for Lenovo think station devices ( #13617 ) - Fehler12 Added sensors for huawei vrp devices ( #13352 ) - guipoletto Webui Rewrite includes/html/pages/device/health.inc.php ( #13777 ) - Npeca75 Various fixes for STP ( #13773 ) - PipoCanaja Added missing icons for progressive web app ( #13771 ) - murrant Show selected selection option on graphs page in Mono theme ( #13765 ) - SantiagoSilvaZ Show selected option of devices-graphs-select in Mono theme ( #13752 ) - SantiagoSilvaZ Upgrade to font awesome 6 ( #13760 ) - Jellyfrog Upgrade to font awesome 5 ( #13754 ) - Jellyfrog Update dark.css to improve visibility ( #13749 ) - dfitton Removing colon symbol from multiple dialogs ( #13742 ) - ilGino Added the word Actions in the header of the oxidized-nodes table ( #13741 ) - SantiagoSilvaZ Updated icons of links pointing to Health pages ( #13729 ) - ilGino Updated to a more consistent Fontawesome icon for the Export to PDF ( #13713 ) - ilGino Removing the colon symbol to the right of a control labels ( #13704 ),( #13705 ) - ilGino Update to tailwind 3 ( #13695 ) - Jellyfrog Alerting Added better default sensor alert template ( #13703 ) - Jellyfrog Snmp Traps Added SNMP Traps for Brocade login traps ( #13770 ) - h-barnhart Added SNMP Traps for APC Overload Traps ( #13726 ) - h-barnhart Discovery Check for empty SLA tags so we skip bad entries ( #13679 ) - laf Bug Only try contexts in STP for Cisco devices ( #13767 ) - murrant Fix settings array initial value ( #13755 ) - Jellyfrog Use better filesystem functions to delete host rrd dir ( #13735 ) - Jellyfrog Device:poll log poll complete ( #13733 ) - murrant Fixed \\< 0 exception in ports poller ( #13732 ) - murrant Fixed ups-nut check ( #13722 ) - Jellyfrog Changed fping hardcoded binary to user defined fping ( #13720 ) - sGoico Refactor Oxidized reload called on Device update and remove ( #13730 ) - murrant Stp module rewrite ( #13570 ) - murrant Cleanup Dropped dbfetch from discovery/sensors for pbn devices ( #13789 ) - Npeca75 Dropped dbfetch from discovery/sensors for junos devices ( #13784 ) - Npeca75 Removed contrib directory ( #13727 ) - murrant Removed old vendor fix ( #13717 ) - Jellyfrog Replace Requests library with HTTP Client ( #13689 ) - Jellyfrog Use built in method to render a string with Blade ( #13688 ) - Jellyfrog Documentation Simple docs tweaking ( #13792 ) - Jellyfrog Update Switching API doc to fix link ( #13786 ) - knpo Rename DHCP Stats to ISC DHCP Stats ( #13756 ) - SourceDoctor Update Install-LibreNMS.md to include pip3 install ( #13746 ) - si458 validate-config-icon better positioning in the text ( #13744 ) - SantiagoSilvaZ Updated Debian install docs to include pip3 install ( #13721 ) - dorkmatt Full rework of documentation for better nav, cleanup and fixes ( #13709 ) - Jellyfrog Tests Bump test timeout to 2 hours ( #13769 ) - Jellyfrog Speed up tests by reducing snmp timeout ( #13725 ) - murrant Lnms dev:check add --os-modules-only option ( #13700 ) - murrant Misc Set default DB_TEST_PORT in database config ( #13793 ) - Jellyfrog Fixed links to connected devices in old style maps ( #13762 ) - fsmeets Updated Top Devices widget to include filtering on ifOperStatus ( #13748 ) - Npeca75 Correct prefix for \"kilo\" should be small k, not capital K ( #13714 ) - ilGino Remove old composer preinstall script ( #13712 ) - Jellyfrog Improve Proxy::shouldBeUsed ( #13702 ) - Jellyfrog Use commit date to compare pull requestes ( #13701 ) - Jellyfrog Dependencies Update JS deps ( #13694 ) - Jellyfrog Update dependencies ( #13684 ) - Jellyfrog 22.1.0 (2022-01-23) A big thank you to the following 26 contributors this last month: murrant (9) Npeca75 (4) loopodoopo (3) ilGino (2) Jellyfrog (2) SourceDoctor (2) laf (2) aztec102 (2) twelch24 (1) tkjaer (1) ssasso (1) TechieDylan (1) hvanoch (1) h-barnhart (1) gdepeyrot (1) k0079898 (1) efelon (1) westerterp (1) avermeer-tc (1) Fehler12 (1) bonzo81 (1) glance- (1) VirTechSystems (1) iopsthecloud (1) blubecks (1) thford89 (1) Thanks to maintainers and others that helped with pull requests this month: murrant (22) Jellyfrog (13) laf (10) PipoCanaja (6) ottorei (2) SourceDoctor (2) Feature Add Sla jitter packet loss percent graph ( #13600 ) - bonzo81 Add API-routes for listing MPLS SAPs and services ( #13561 ) - blubecks Device Merge enviromux-micro in existing NTI ( #13696 ) - Npeca75 Change the variable to detect version for mikrotik ups runtime device divisor ( #13678 ) - TechieDylan VRP BGP fixes ( #13675 ) - murrant Added new sensors to mes23xx ( #13671 ) - Npeca75 Added initial detection MES2324F or MES2324FB ( #13669 ) - aztec102 New OS: Adva XG 304 ( #13668 ) - h-barnhart Basic ZTE ZXA10 detection ( #13658 ) - murrant Added CET Power T2S TSI ( #13645 ) - aztec102 Eltek ospf poller disable ( #13635 ) - loopodoopo Smartoptics dcp m 40 zr ( #13634 ) - avermeer-tc Updated XOS (Extreme) processor data to use correct OID ( #13633 ) - laf Initial Support for Fujitsu RX300 with iRMC4 ( #13631 ) - Fehler12 Teleste Luminato ports & qam/asi output sensors & yaml ( #13616 ) - Npeca75 Workaround linksys always mapping to g1 ( #13595 ) - glance- Equallogic fix typo on os name in the storage module ( #13580 ) - iopsthecloud Webui [WebUI] Removing the colon symbol to the right of a control label ( #13698 ) - ilGino Remove unneccessary Section Description ( #13677 ) - SourceDoctor Device tracepath using wrong variables to check for traceroute output ( #13674 ) - laf Allow filter by display name in device list ( #13665 ) - gdepeyrot Sort Vlan Ports by ifName, ifDescr ( #13657 ) - SourceDoctor Fix horizontal scrollbar in device list always visible ( #13653 ) - efelon Alerting Use display name in alerts ( #13650 ) - murrant Graphs Timos sap dot1q graphing fix ( #13654 ) - loopodoopo Applications Add supervisord application ( #13673 ) - hvanoch Api API detect if new location should be fixed by default ( #13637 ) - murrant Set fixed_coordinates via api ( #13593 ) - VirTechSystems Polling Added oids.no_bulk os setting ( #13666 ) - Npeca75 Add consistent output of name and app_id to Poller for all Applications (fixes #13641) ( #13648 ) - westerterp Fix SnmpQuery bulk boolean backwards ( #13636 ) - murrant Rancid Gen RANCID host also for FS.com devices ( #13682 ) - ssasso Bug Use PHP_BINARY directly instead of trying to build path to PHP binary ( #13690 ) - Jellyfrog Small text change for misspelled Virtual ( #13686 ) - ilGino Snmp timeout is a float, allow in config ( #13676 ) - murrant Fix NULL device alert caused by services ( #13663 ) - k0079898 Disable VRP VLANs test, seems to be a bug in snmpsim snmpbulkwalk ( #13649 ) - murrant Remove extra rows with duplicate keys in SyncsModels trait ( #13632 ) - murrant Documentation Update rrdcached link ( #13692 ) - twelch24 Add missing python3-pip installation dependency for debian11 ( #13691 ) - tkjaer Translation Fix settings language file to include Distributed Poller labels. ( #13511 ) - thford89 Dependencies Update recommended PHP version to 8.0 ( #13687 ) - Jellyfrog 21.12.0 (2021-12-21) A big thank you to the following 30 contributors this last month: murrant (38) Npeca75 (6) Jellyfrog (3) twelch24 (3) johnstruse (2) nightcore500 (2) Martin22 (2) wkamlun (2) martinberg (1) mathieu-artic (1) dependabot (1) carranzamarioagustin (1) SourceDoctor (1) si458 (1) Cormoran96 (1) claude191 (1) ottorei (1) banachtarski-91 (1) RockyVod (1) enferas (1) jepke (1) duhow (1) Nocturr (1) hjcday (1) djamp42 (1) PipoCanaja (1) amanualgoldstein (1) pepperoni-pi (1) paulierco (1) TheGreatDoc (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (42) murrant (20) SourceDoctor (3) ottorei (3) bakerds (2) jaypo82 (1) mpikzink (1) troublestarter (1) PipoCanaja (1) Feature Catch all module errors ( #13542 ) - murrant Lnms snmp:fetch query multiple devices ( #13538 ) - murrant Configurable device display name ( #13528 ) - murrant RRD Allow specifying a source file and ds to fill data ( #13480 ) - murrant Security Fix unescaped strings XSS issues ( #13554 ) - enferas Device Fix EdgeOS hardware detection ( #13629 ) - johnstruse Add additional ICX 7150 devices ( #13627 ) - johnstruse Fix axiscam serial format ( #13620 ) - murrant Fix Cisco WLC AP cleanup ( #13615 ) - murrant CPU, HW type, HW ver, Fan state discovery ( #13608 ) - Npeca75 Initial Eltex-mes IPv6 address discovery ( #13594 ) - Npeca75 Add better support for Eaton UPS ( #13588 ) - mathieu-artic SmartAX supports IF-MIB, skip custom polling and fix polling GPON ports ( #13579 ) - carranzamarioagustin Add back Areca secondary hardware OID ( #13562 ) - murrant Ray3 - Added memory chart ( #13557 ) - Martin22 Add all Aviat WTM4k family devices ( #13556 ) - RockyVod Fix discovery and pooling Racom Ray2 ( #13553 ) - Martin22 Add version for ironware ( #13551 ) - wkamlun Add ICX 7150 description ( #13550 ) - wkamlun Add discovery for APC EPDU1132M ( #13545 ) - duhow Split Eltex-mes OS to mes21xx / mes23xx. + few improvements ( #13544 ) - Npeca75 Add Initial Support for VMware SD-WAN / Velocloud ( #13536 ) - Nocturr Arista EOS, use sysObjectID for detection (to include vEOS) ( #13534 ) - murrant RUTX fix sensor limits ( #13526 ) - hjcday Added support for Himoinsa gensets status state sensors ( #13456 ) - TheGreatDoc Webui VLANs sort in GUI ( #13628 ) - Npeca75 Fix broken links ( #13625 ) - murrant Fix the displayed unit for frequency and distance in the wireless section ( #13614 ) - nightcore500 Add more device fields to oxidized map configuration ( #13604 ) - martinberg Correct graph row component responsive layout for linked graphs ( #13587 ) - murrant Global search: search device display ( #13583 ) - murrant Availibility Map - show Display Name if set ( #13574 ) - SourceDoctor Do not show location in device overview if location is not found ( #13572 ) - murrant Don't use @lang() it doesn't escape the string ( #13566 ) - murrant Allow LegacyPlugin Pages to receive all parameters ( #13519 ) - PipoCanaja Alerting Use http for proxy urls via guzzle ( #13601 ) - Jellyfrog Twilio change text to show alert termplate msg ( #13521 ) - djamp42 Graphs Fix nototal graph option ( #13589 ) - nightcore500 Add additional type tag for Bind metrics ( #13581 ) - murrant Snmp Traps Veeam SNMP traps fix and extend ( #13549 ) - jepke Add Alcatel Omniswitch Traps Handlers ( #13492 ) - paulierco Applications PHP8 compatibility for ntp-server polling app ( #13513 ) - amanualgoldstein Billing Billing fix a couple divide by zero errors ( #13517 ) - murrant Api API 'list_parents_of_host' - mostly doco, but one small code enhancement ( #13567 ) - claude191 Discovery Q-bridge-mib, discover missing VLANs, v2 ( #13569 ) - Npeca75 Polling Ios-fdb-table-fix -- Fixed misnamed dictionary keys for dot1dTpFdbPor\u2026 ( #13559 ) - banachtarski-91 OSPF issue when devices don't support OSPF-MIB::ospfIfTable ( #13530 ) - murrant Poller command rewrite ( #13414 ) - murrant Bug Escape net-snmp unformatted strings, try 2 ( #13584 ) - murrant Workaround don't poll WLC on IOSXE ( #13563 ) - murrant Fix Ciscowlc AP-polling ( #13560 ) - ottorei Mark OID not increasing as invalid ( #13548 ) - murrant Skip invalid OSPF data ( #13547 ) - murrant Remove color markers when logging to files ( #13541 ) - murrant Fix plugin_active check when plugin is not found ( #13531 ) - murrant Remove unused buggy arp_discovery code ( #13529 ) - murrant Pseudowire cpwVcID can exceed database max value ( #13510 ) - pepperoni-pi Refactor Ipv6 discovery switch to new DB syntax ( #13591 ) - Npeca75 OSPF port module ( #13498 ) - murrant Cleanup Fix bad snmp context option ( #13497 ) - murrant Polling cleanup, fix PHP warnings ( #13460 ) - murrant Documentation Clarify docker app setup on debian/ubuntu ( #13573 ) - si458 Update winbox launcher doc (again) ( #13558 ) - twelch24 Add more detailed instructions to winbox launcher ( #13552 ) - twelch24 Link for can't check Python dependencies validation ( #13520 ) - murrant Elaborate on feeding Oxidized ( #13514 ) - murrant Tests Tests dont include empty tables ( #13619 ) - murrant Collect-snmp-data.php can now capture snmp context test data ( #13596 ) - murrant Snmp.unescape setting ( #13590 ) - murrant Use phpstan-deprecation-rules instead ( #13582 ) - Jellyfrog Mibs Update netapp mib ( #13571 ) - Cormoran96 Dependencies Bump symfony/http-kernel from 5.3.9 to 5.4.0 ( #13585 ) - dependabot 21.11.0 (2021-11-12) A big thank you to the following 49 contributors this last month: murrant (39) Jellyfrog (6) arrmo (4) Nocturr (4) PipoCanaja (3) TheGreatDoc (3) martinberg (3) robje (2) loopodoopo (2) Npeca75 (2) drshawnkwang (2) jul13579 (2) bakerds (2) SourceDoctor (2) deajan (2) jonathansm (1) lfkeitel (1) Deltawings (1) fcuello-gc (1) drommc (1) techladsjamie (1) duhow (1) hjcday (1) DanielMuller-TN (1) blagh (1) cenjui (1) TheGracens (1) eskyuu (1) nq5 (1) mjbnz (1) roycruse (1) ottorei (1) si458 (1) nmanzi (1) apokryphal (1) thford89 (1) arjitc (1) tuxgasy (1) kterobinson (1) bl3nd3r (1) hanserasmus (1) mpikzink (1) dagbdagb (1) sthen (1) ahmedsajid (1) dorkmatt (1) evheros (1) nightcore500 (1) CirnoT (1) Thanks to maintainers and others that helped with pull requests this month: murrant (53) Jellyfrog (47) PipoCanaja (7) SourceDoctor (5) ottorei (5) mpikzink (2) arjitc (1) salmayno (1) yoeunes (1) Aeet (1) oussama-aitmi (1) nightcore500 (1) drshawnkwang (1) Feature Discovery on Reboot ( #13422 ) - SourceDoctor Security Fix widget title injection vulnerability ( #13452 ) - murrant Kick other sessions when changing password ( #13194 ) - murrant Device APC Load, wrong low precision oid ( #13506 ) - jonathansm Nokia SAR HMC ( #13503 ) - loopodoopo Ciena 2 ( #13491 ) - loopodoopo Added initial IPv6 Address discovery for TP-LINK Jetstream ( #13484 ) - Npeca75 Update Windows Versions ( #13474 ) - arrmo Support for PDUMNV30HVLX with PADM 20 ( #13473 ) - drommc Opengear improvement, don't needlessly fetch ogEmdTemperatureTable ( #13471 ) - drshawnkwang RouterOS now returns the correct runtime ( #13461 ) - murrant Fix latitude having an extra - in the middle after the decimal point ( #13454 ) - techladsjamie Fix Sophos-XG OID for number of active tunnels ( #13444 ) - Nocturr Fix hwg poseidon state sensors ( #13438 ) - TheGreatDoc UniFi/EdgeSwitch OS support for fw 5.x ( #13434 ) - Nocturr Added support for Extreme SLX-OS switches ( #13431 ) - bakerds Mikrotik vlans discovery, v2 ( #13427 ) - Npeca75 Added sensor discovery for APC NetworkAIR FM and InfraStruXure ATS ( #13426 ) - bakerds Add Sophos-XG OID for monitoring HA, IPSec and license state ( #13423 ) - Nocturr Add more discovery components for Dell PowerConnect 28xx ( #13420 ) - duhow Added Wireless Sensors for Teltonika RUTX Routers ( #13419 ) - hjcday Add APC PowerChute sysObjectID ( #13406 ) - cenjui Fix APC high precision divisor ( #13405 ) - TheGracens Luminato device doesn't support alternative uptimes ( #13399 ) - eskyuu Update ports module to accept VDSL2 ifType in xDSL polling ( #13393 ) - roycruse Fix windows fanspeed ( #13376 ) - si458 Add support for Teltonika RUT360 ( #13375 ) - martinberg Add support for NTI Enviromux ( #13373 ) - martinberg Update Himoinsa Genset discovery ( #13356 ) - TheGreatDoc Improve Poweralert based devices support ( #13340 ) - arjitc Add iDrac physical disk state ( #13264 ) - tuxgasy Add opengear humidity to sensors ( #13226 ) - drshawnkwang IOS/IOSXE PoE stats ( #13213 ) - martinberg Poll SPU memory from Juniper SRX devices ( #13191 ) - bl3nd3r Extend support for Endrun Sonoma Meridian II devices. ( #13069 ) - hanserasmus Bintec be.IP plus support ( #12993 ) - jul13579 Eaton Network MS xups sensors ( #12992 ) - dagbdagb Don't hardcode index for Mikrotik LTE wireless statistics ( #12976 ) - sthen OS support for West Mountain 4005i DC PDU ( #12885 ) - dorkmatt FabOS remove disabled dbm sensors ( #12877 ) - evheros Raspberry Pi: Add SNMP extend to monitor IO pins or sensor modules connected to the GPIO header ( #12749 ) - nightcore500 Use high precision OIDs for APC UPS sensors ( #12594 ) - CirnoT Webui Increase default session lifetime to one month ( #13505 ) - murrant Fix maintenance mode button in Firefox ( #13500 ) - lfkeitel Only call htmlentities on port ifAlias,ifName, and ifDescr ( #13489 ) - murrant Merchandise shop link in about ( #13485 ) - murrant Tweak new notification appearance ( #13477 ) - murrant Add missing \\ ( #13459 ) - robje Fix syslog widget priority filtering ( #13411 ) - murrant PHP-Flasher for toast messages ( #13401 ) - murrant Update alertlog-widget to allow filtering by device group ( #13380 ) - ottorei Alerting Fix slack errors when variables are not set ( #13476 ) - murrant Fix api transport mult-line parsing ( #13469 ) - murrant Drop PDConnect Install links ( #13407 ) - blagh Port Speed degraded alert rule ( #13371 ) - murrant Added Unpolled Devices rule to collection ( #12896 ) - ahmedsajid Graphs Add missing graph definition for pf_matches (pfSense firewall) ( #13507 ) - robje Snmp Traps SNMP Trap handler: UpsTrapOnBattery ( #13482 ) - TheGreatDoc Applications Doc - MySQL Application ( #13495 ) - Deltawings Api Add get_ports_by_group API function ( #13361 ) - nmanzi Discovery Fix Dispatcher service not discovering poller groups ( #13377 ) - murrant Modified SQL delete statement for vrf is null ( #13199 ) - kterobinson Polling Added TOS support for fping ( #13496 ) - PipoCanaja Fix SnmpQuery mibdir from os group ( #13475 ) - murrant Fix application and storage query errors ( #13417 ) - murrant Fix uptime polling event ( #13388 ) - murrant Keep stats for snmptranslate ( #13379 ) - murrant Rewrite netstats polling ( #13368 ) - murrant Run Alert Rules on Service status change. ( #13348 ) - thford89 Rancid Show single quotes correcting for device configs ( #13360 ) - apokryphal Oxidized Syslog hook examples and documentation for Procurve devices ( #13397 ) - nq5 Bug Fix PyMySQL upstream dependency bug ( #13508 ) - murrant Fix net-snmp unformatted strings ( #13486 ) - murrant [bug] Fix & extend MAC OUI table updates ( #13479 ) - PipoCanaja Attempt to fix dispatcher stats thread exception ( #13478 ) - murrant PHP8, correct multiplication in packages application ( #13462 ) - arrmo Don't use proxy for localhost (Oxidized and Prometheus) ( #13450 ) - murrant Better handling of some alerting errors ( #13446 ) - murrant Fix PHP8 error in sensor unit conversion ( #13433 ) - arrmo PHP8 Unit Conversion, ups-nut ( #13432 ) - arrmo Services and ping not polling default groups ( #13403 ) - murrant Increase length of devices_attribs.attrib_type column ( #13395 ) - mjbnz Bug - Fix missing uptime in fillable (Device Model) ( #13387 ) - PipoCanaja Fix regression from #12998 ( #13385 ) - Jellyfrog Refactor Change how options are handled for SnmpQuery ( #13488 ) - murrant Rename concrete SnmpQuery class to avoid confusion ( #13412 ) - murrant Fully convert core to a modern module ( #13347 ) - murrant New plugin system based on Laravel Package Development ( #12998 ) - mpikzink Cleanup Fixes for misc unset variables ( #13421 ) - murrant Remove unused snom files ( #13369 ) - murrant Fix config fetch disrupted by stderr ( #13362 ) - deajan Use PHPStan level 6 ( #13308 ) - Jellyfrog Documentation Fix typo in filepath for unit-tests to work ( #13440 ) - Nocturr Debian 11 Install Docs ( #13430 ) - SourceDoctor Don't suggest running validate.php as root ( #13378 ) - murrant Tests Fix IPV6 test ( #13468 ) - Jellyfrog Ability to save cipsec-tunnels test data ( #13463 ) - murrant Run phpstan locally with lnms dev:check lint ( #13458 ) - murrant Dusk: improve speed and safety ( #13370 ) - murrant Dependencies Bump psutil=>5.6.0 to satifsy command_runner ( #13501 ) - Jellyfrog Update to Larastan 1.0 ( #13466 ) - Jellyfrog Update PHP dependencies ( #13396 ) - murrant Install new python dependencies during daily maintenance ( #13186 ) - deajan 21.10.0 (2021-10-16) A big thank you to the following 21 contributors this last month: murrant (40) SourceDoctor (9) Jellyfrog (5) loopodoopo (3) Cupidazul (3) maxnz (3) mpikzink (3) ottorei (2) gs-kamnas (2) topranks (2) mctaguma (1) DanielMuller-TN (1) hjcday (1) dependabot (1) calvinthefreak (1) si458 (1) Laplacence (1) peelman (1) noaheroufus (1) deajan (1) lutfisan (1) Thanks to maintainers and others that helped with pull requests this month: murrant (36) Jellyfrog (29) SourceDoctor (7) ottorei (1) PipoCanaja (1) Feature New SNMP code and lnms snmp:fetch command ( #13303 ) - murrant Add eventlog on_create device version 2 w/deps ( #13302 ) - Cupidazul Push Notifications (Mobile and PC) ( #13277 ) - murrant Modified Prometheus extension to support adding a prefix to metric names ( #13272 ) - topranks Config seeder ( #13259 ) - murrant Infer character encoding for ifAlias and sysLocation ( #13248 ) - murrant Log count of logged in users in database from HOST-RESOURCES-MIB ( #13137 ) - SourceDoctor Security Use the same error message for different kind of authentiction errors ( #13306 ) - Jellyfrog Device Added support for Teltonika RUTX series routers ( #13350 ) - hjcday Ericsson TN - Wireless MSE ( #13328 ) - loopodoopo Ciena 6500 Optics sensors ( #13324 ) - loopodoopo Ericsson Traffic Node support ( #13299 ) - loopodoopo Procurve E model prefix fix ( #13261 ) - maxnz Fix axis cam discovery ( #13258 ) - maxnz Wireless and GSM Basic Monitoring ( #13255 ) - Cupidazul Added SAF Integra-X OS Support ( #13236 ) - noaheroufus Arubaos cx hardware ( #13045 ) - maxnz MegaRaid controller in Linux (Broadcom/LSI) ( #12999 ) - mpikzink Add Ericsson IPOS router support ( #12625 ) - lutfisan Webui Alert detail display fix ( #13335 ) - SourceDoctor Show Detail by default Option on Alert Widget ( #13309 ) - SourceDoctor Fix various port links ( #13296 ) - murrant Add ORDER BY to the ports query when showing the ports list on device\u2026 ( #13276 ) - peelman Use local timezone for outages pages ( #13274 ) - ottorei Remove device dark mode detection ( #13273 ) - murrant Linkable graph component ( #13263 ) - murrant Improve tailwind dark theme colors ( #13262 ) - murrant Workaround for dashboard widgets showing over popups. ( #13257 ) - murrant Alerting Fix alert transport api with POST method ( #13288 ) - Laplacence Graphs Fix graphs showing bps instead of pps ( #13266 ) - Cupidazul Snmp Traps HP Fault Traps ( #13254 ) - mpikzink Veeam backup SNMP Traps ( #13170 ) - mpikzink Api Added conditional check for rules parameter on add_device_group ( #13353 ) - DanielMuller-TN API add_device: respond with more device array ( #13251 ) - SourceDoctor API Call to assign/remove a Portgroup to Ports ( #13245 ) - SourceDoctor API Call to set instant Maintenance mode ( #13237 ) - SourceDoctor API port search by arbitrary field ( #13231 ) - SourceDoctor Settings Automatically set rrdtool_version once ( #13327 ) - murrant Discovery Quick fix for route discovery on PHP8 ( #13284 ) - murrant Polling Dispatcher bugfix queues not being disabled properly ( #13364 ) - murrant Fix for cimc polling on PHP8 ( #13357 ) - murrant Dispatch Service: Don't stop dispatching if master moves to a node with a queue disabled ( #13355 ) - murrant Fix device query when last_polled_timetaken is null ( #13331 ) - murrant Restore accidentally removed code ( #13330 ) - murrant Allow non-snmp modules to run when snmp disabled ( #13321 ) - murrant Fix python config fetch disrupted by stderr output ( #13295 ) - murrant Fix poller wrapper error ( #13290 ) - murrant Oxidized Added OneOS map for Oxidized ( #13313 ) - calvinthefreak Authentication Improvements to SSO Authorization and logout handling ( #13311 ) - gs-kamnas Bug Fix poller groups reverting when setting via the Web UI. ( #13363 ) - murrant Rename config var auth_redirect_handler -> auth_logout_handler ( #13329 ) - gs-kamnas HrSystem Columns have to be optional ( #13316 ) - SourceDoctor Hrsystem write fix ( #13314 ) - SourceDoctor Check if vlan->port exists ( #13305 ) - Jellyfrog Fix html.device.links validation ( #13269 ) - murrant Fix lnms some commands throwing errors ( #13265 ) - murrant Refactor SnmpQuery updates and more tests ( #13359 ) - murrant Remove load_os and load_discovery functions ( #13345 ) - murrant Rename NetSnmp to SnmpQuery ( #13344 ) - murrant Use Measurements for all statistic collection ( #13333 ) - murrant Use built in trusted proxy functionality ( #13318 ) - murrant Connectivity Helper to check and record device reachability ( #13315 ) - murrant Cleanup config.php.default ( #13297 ) - murrant SNMP Capabilities ( #13289 ) - murrant Cleanup device type override code ( #13256 ) - murrant Full Python code fusion / refactor and hardening 2nd edition ( #13188 ) - deajan Convert all ports backend to Laravel style ajax table ( #13184 ) - murrant Documentation Change \"move\" to \"migrate\" to make it easier to find ( #13365 ) - murrant Updated link to Dan Brown's migration scripts ( #13354 ) - mctaguma Edit existing install url ( #13342 ) - murrant Oxidized doc update, links and ignore groups ( #13341 ) - murrant Update docs: Update Dispatcher service documentation ( #13339 ) - ottorei Send security researchers to Discord ( #13319 ) - murrant Fix to puppet snmp extend formatting ( #13312 ) - si458 Update formatting of Prometheus extension doc ( #13291 ) - topranks Tests Disallow usage of deprecated functions ( #13267 ) - Jellyfrog Dependencies Bump composer/composer from 2.1.8 to 2.1.9 ( #13336 ) - dependabot Update dependencies ( #13310 ) - Jellyfrog 21.9.0 (2021-09-16) A big thank you to the following 20 contributors this last month: murrant (29) Jellyfrog (5) ottorei (3) SourceDoctor (3) Galileo77 (2) paulierco (2) Fehler12 (2) Negatifff (2) deajan (2) mpikzink (2) vakartel (2) efelon (1) pimvanpelt (1) kimhaak (1) kevinwallace (1) noaheroufus (1) si458 (1) mzacchi (1) niddey (1) PipoCanaja (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (21) murrant (19) ottorei (3) SourceDoctor (2) PipoCanaja (2) mpikzink (1) Feature API alert transport can include Options variables in the Body for POST requests ( #13167 ) - mzacchi Show port speed on port graphs, optionally set scale ( #11858 ) - murrant Device Fix Dell server sensors ( #13247 ) - murrant Add mouseover mini graphs that makes sense for Liebert PDU ( #13246 ) - Galileo77 Add ifName to osag os ( #13243 ) - paulierco IfName to mcafeewebgateway ( #13242 ) - paulierco Add VPP logo ( #13230 ) - pimvanpelt Add Support for USW-Flex ( #13229 ) - Fehler12 Added Cisco CBS 250 Support ( #13228 ) - Fehler12 Update geist-watchdog.yaml ( #13223 ) - Galileo77 Add skip_values to Liebert capacity sensor definitions ( #13200 ) - kevinwallace Procurve add SysDescr Regex ( #13196 ) - mpikzink Updated OS Support: Dragonwave Horizon ( #13193 ) - noaheroufus ZTE ZXR10 define discovery for mempool and processor ( #13192 ) - vakartel Dell Network Virtual Link Trunk Status ( #13162 ) - mpikzink Webui Update to fix table row color and hover color for dark.css ( #13244 ) - efelon Fix port minigraph layout ( #13240 ) - murrant Sort dashboard entries alphabetically ( #13238 ) - ottorei Fix graph row columns ( #13232 ) - murrant Changed map functionality in device overview ( #13225 ) - kimhaak New Blade Components: x-device-link, x-port-link, x-graph-row, x-popup ( #13197 ) - murrant Add serial search in ajax search process ( #13185 ) - Negatifff Allow device actions to appear in device list and improve docs ( #13177 ) - murrant Show count of Ports in PortGroup display ( #13164 ) - SourceDoctor Change automatic widget updates to use bootgrid when possible ( #13159 ) - niddey Alerting Fix PagerDuty transport's group field ( #13235 ) - ottorei Format port speed changes in the event log ( #13174 ) - murrant Graphs Change default graph view to zoom in on traffic. ( #13173 ) - murrant Settings Dynamic Select setting ( #13179 ) - murrant Increase config value length limit ( #13178 ) - murrant Default port group in Settings ( #13175 ) - SourceDoctor Default port_group for new ports ( #13166 ) - SourceDoctor Add support for description texts in Settings page ( #13104 ) - Jellyfrog Discovery Mark snmp disabled devices as skipped ( #13202 ) - murrant Allow more compatibility in STP port discovery/polling ( #13109 ) - PipoCanaja Polling Fix snmp_bulk setting not being applied ( #13209 ) - murrant Do not poll passive ISIS-circuits ( #13168 ) - ottorei Common contexts for polling ( #13158 ) - murrant Rewrite ISIS Adjacency discovery/polling ( #13155 ) - murrant Oxidized Add sysobjectid and hardware fields into oxidized maps ( #13221 ) - Negatifff Bug Fix mempool unit display ( #13241 ) - murrant Select dynamic fixes ( #13187 ) - murrant Validate schema in utc ( #13182 ) - murrant Fix DB Inconsistent friendly error message ( #13163 ) - murrant Refactor Update configuration docs to use lnms config:set ( #13157 ) - murrant Rename nobulk -> snmp_bulk ( #13098 ) - Jellyfrog Documentation Add security context service ( #13218 ) - deajan Fix numbering in application docs ( #13183 ) - si458 Docs link to webui settings in user's install ( #13176 ) - murrant Misc Increase RestartSec time to a reasonable value ( #13217 ) - deajan Validate APP_KEY ( #13171 ) - murrant 21.8.0 (2021-08-22) A big thank you to the following 40 contributors this last month: PipoCanaja (12) murrant (10) Jellyfrog (8) paulierco (5) mpikzink (5) ottorei (3) fbourqui (2) facuxt (2) geg347 (2) dennypage (2) opalivan (2) keryazmi (2) wkamlun (2) si458 (2) martinberg (2) vakartel (1) SanderBlom (1) SourceDoctor (1) VirTechSystems (1) Talkabout (1) hannut (1) kevinwallace (1) jasoncheng7115 (1) arjitc (1) igorek24 (1) mtoupsUNO (1) Laplacence (1) tcwarn (1) deajan (1) Npeca75 (1) Negatifff (1) adamus1red (1) rhinoau (1) arrmo (1) e-caille (1) Sea-n (1) saschareichert (1) bennetgallein (1) loopodoopo (1) tikitaru (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (37) murrant (28) PipoCanaja (20) SourceDoctor (2) Feature Lnms config:set ability to set os settings ( #13151 ) - murrant Detect sending non-html emails as html ( #13114 ) - murrant Add peak in and out ( #13006 ) - bennetgallein Device Add OSAG new OS ( #13156 ) - paulierco More specific grandstream-ht detection ( #13152 ) - murrant Added voltage, cell states and wireless data for cell interface (GEMDS OS). ( #13142 ) - SanderBlom Opnsense detection ( #13097 ) - mpikzink Added OID for Extreme switch X350-48t ( #13096 ) - tcwarn Add Janitza power consumed ( #13095 ) - mpikzink Added/fixed LLDP discovery ( #13082 ) - Npeca75 Allow stack index other than '1.' for CiscoSB ( #13078 ) - dennypage Add logo for Scientific Linux ( #13075 ) - mpikzink Fix Cisco SLAs garbage entries ( #13068 ) - murrant Cisco ISE version, HW, SW and test-data ( #13062 ) - PipoCanaja Fixed Packetlight EDFA sensors and add test-data ( #13060 ) - opalivan Alcatel-Lucent AOS7 bgp fix2 ( #13059 ) - paulierco Add logo for Linux Mint ( #13055 ) - arrmo Alcatel-Lucent Aos6 ignore second power supply ( #13054 ) - paulierco Alcatel-Lucent Aos7 increase fan threshold ( #13053 ) - paulierco Use non numeric snmpwalk for nxos fan trays ( #13048 ) - e-caille Alcatel-Lucent Aos7 bgp fix ( #13047 ) - paulierco Add number of connected wireless client and number of connected FortiAP ( #13037 ) - wkamlun Update Sensors for ADVA FSP150CC + discovery fix ( #13020 ) - keryazmi Improve dell-compellent detection for newer firmwares ( #13019 ) - saschareichert Poll current connections for F5 ltm ( #12968 ) - martinberg Ericsson 6600 series ( #12931 ) - loopodoopo Fix WUT ThermoHygro with new hardware revisions ( #12913 ) - mpikzink Fix polling current on ICT2000DB-12IRC ( #12529 ) - tikitaru Webui Cleanup Port hover minigraph description when using \"Interface Description Parsing\" ( #13143 ) - fbourqui Dark mode improvements ( #13141 ) - facuxt Improvements to dark theme. ( #13139 ) - facuxt Adjust App String Pi-hole to project name ( #13136 ) - SourceDoctor Sort port selector dropdown ( #13135 ) - VirTechSystems Priority filtering for syslog widget ( #13134 ) - Talkabout Center new service window ( #13115 ) - arjitc Add urlencode for location link in device view ( #13076 ) - Negatifff Add device_group to availability widget hyperlink ( #13061 ) - rhinoau More sensor data on inventory page ( #13057 ) - PipoCanaja Api Adding API route to set bgpPeerDescr field ( #13056 ) - geg347 API mac search ( #12964 ) - mpikzink Alerting Add EU Service Region to PagerDuty transport ( #13154 ) - ottorei Fix HTML encoded characters in Slack ( #13120 ) - geg347 Add SignalWire (Twilio alternative) alert transport support ( #13107 ) - igorek24 Discovery Full Python code fusion / refactor and hardening ( #13094 ) - deajan Extend REGEX filtering option by sensor_class ( #13066 ) - opalivan Oxidized Follow redirects when reloading Oxidized nodes list ( #13051 ) - martinberg Bug Fix issue syslog_xlate containing dots ( #13148 ) - vakartel Enclose IPv6 literal in [brackets] for snmpget and unix-agent ( #13130 ) - kevinwallace Fix lnms scan, nets not detected ( #13129 ) - murrant Documentation Update docs for controlling modules ( #13147 ) - murrant Update docs: Example for optional data on templates ( #13128 ) - ottorei Update FAQs for large groups ( #13110 ) - ottorei Document new optional ups-nut arg1 ( #13072 ) - adamus1red Formatted applications docs for copy/paste ( #13049 ) - si458 Update cleanup config document ( #13026 ) - Sea-n Translation Updated Traditional Chinese Translation ( #13116 ) - jasoncheng7115 Tests Run PHPStan with higher level for new files ( #13108 ) - Jellyfrog Misc Added two indexes to 'syslog' table for performance ( #13105 ) - mtoupsUNO Remove timeouts for passthrough lnms commands ( #13080 ) - murrant Add Laravel task scheduling ( #13074 ) - Jellyfrog Mibs MIB cleaning (misc again) ( #13103 ) - PipoCanaja Added H3C / Comware MIB files ( #13102 ) - Laplacence Update Cisco Small Business (mostly) MIBs ( #13099 ) - dennypage Update NET-SNMP mibs ( #13093 ) - Jellyfrog MIB cleaning for Dell + Gandi ( #13089 ) - PipoCanaja MIB cleaning for Panasonic (1 file) and Avtech (11 files) ( #13088 ) - PipoCanaja MIB cleaning for OS \"Junose\" ( #13087 ) - PipoCanaja MIB cleaning (Misc) ( #13086 ) - PipoCanaja MIB cleaning for Junos ( #13085 ) - PipoCanaja MIB cleaning for HP ( #13084 ) - PipoCanaja MIB cleaning for equallogic ( #13083 ) - PipoCanaja Dependencies Bump super-linter ( #13073 ) - Jellyfrog Bump larastan ( #13071 ) - Jellyfrog 21.7.0 (2021-07-16) A big thank you to the following 27 contributors this last month: murrant (9) rhinoau (8) PipoCanaja (5) mpikzink (4) mathieu-artic (4) martinberg (3) Npeca75 (2) epiecs (2) Sea-n (2) paulierco (2) djamp42 (2) Jellyfrog (1) geg347 (1) ziodona85 (1) keryazmi (1) hanserasmus (1) edgetho007 (1) dagbdagb (1) jbronn (1) adamboutcher (1) VirTechSystems (1) skoobasteeve (1) dependabot (1) si458 (1) kdanev14 (1) cjsoftuk (1) jezekus (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (32) murrant (14) PipoCanaja (13) Feature Support multiple db servers ( #12963 ) - djamp42 Device Inital support for Eltex-MES switches ( #13036 ) - Npeca75 Add support for Ucopia Appliances ( #13031 ) - mathieu-artic Fixing irrelevant values rpm packetloss ( #13010 ) - geg347 Added Vlan discovery on LAG ports, Jetstream OS ( #13007 ) - Npeca75 Add showtime start for OneAccess SDSL routers ( #13005 ) - mathieu-artic Arista_mos-support ( #13003 ) - hanserasmus Add LTE/UMTS support for Oneaccess routers ( #13002 ) - mathieu-artic Add Sonicwall OS 7 ( #12997 ) - edgetho007 Added support for the Rittal LCP DX Chiller ( #12995 ) - epiecs Eaton M2 EMP g2 ( #12994 ) - dagbdagb TP-Link Jetstream DDM and PoE Support ( #12990 ) - jbronn Alcatel-Lucent AOS6 to yaml ( #12982 ) - paulierco Added logo svg for Rocky Linux ( #12977 ) - skoobasteeve Added VRP ICMP SLA (NQA in huawei naming) support ( #12973 ) - PipoCanaja EUROstor RAID ( #12969 ) - mpikzink Add support for Liebert humidity setpoint and UPS powerfactor ( #12965 ) - martinberg Added support to new device Controlbox TH-332B ( #12940 ) - kdanev14 Add OS Support for Siemens Scalance X Switching ( #12938 ) - rhinoau Alcatel-Lucent aos7 LLDP Neighbors ( #12886 ) - paulierco Add HPE-maPDU support ( #12550 ) - jezekus Webui Fix availability widget service backend error ( #13044 ) - rhinoau Fix availability widget device totals ( #13043 ) - rhinoau Don't add %3F=yes to the url ( #13041 ) - murrant Webui - Display app metric if available ( #13023 ) - PipoCanaja Webui - Fix application fault detail display ( #13016 ) - PipoCanaja Two-factor UI config and status display ( #13012 ) - rhinoau Leave it to generate_device_link for sysName/hostName/IP ( #13000 ) - PipoCanaja Filter out NULL lat/lng values from Geographical Map display queries ( #12985 ) - rhinoau Fix ldap/ad group webui settings ( #12967 ) - murrant Create Laravel Sessions Table ( #12962 ) - djamp42 Fix \"Sub-directory Support\" in small steps ( #12951 ) - mpikzink Api Return api error when device doesn't exist ( #12978 ) - VirTechSystems Discovery Fix an issue which led to duplication of BGP peers. ( #12932 ) - cjsoftuk Oxidized Option to filter Oxidized groups ( #12966 ) - martinberg Bug Fix scripts to allow pathname with space ( #13027 ) - Sea-n Wrong statement used for Oxidized ignore_groups ( #13001 ) - martinberg Fix typo in filename ( #12996 ) - Sea-n Make migrating after upgrading MySQL easier. ( #12971 ) - murrant Fix proxmox menu url ( #12970 ) - si458 Refactor Refractor health ( #13022 ) - mpikzink Cleanup PHPStan fixes ( #13038 ) - murrant Documentation Documentation cleanup of sections 4-6 ( #13018 ) - rhinoau Documentation cleanup of General, Install, Getting Started sections ( #13013 ) - rhinoau Update Applications.md for SQUID ( #12987 ) - adamboutcher Misc Aruba 8.8.0 MIBS ( #13042 ) - mpikzink Create HP-SN-AGENT-MIB ( #13009 ) - ziodona85 Update ADVA's MIB file ( #13004 ) - keryazmi Help users that did not upgrade MySQL try two ( #12989 ) - murrant Add renamehost function result handling and exit codes to renamehost.php ( #12980 ) - rhinoau Dependencies Php-cs-fixer 3 prep ( #13039 ) - murrant PHP dependencies update ( #13034 ) - murrant Bump phpmailer/phpmailer from 6.4.1 to 6.5.0 ( #12975 ) - dependabot 21.6.0 (2021-06-17) A big thank you to the following 23 contributors this last month: mpikzink (9) murrant (6) PipoCanaja (5) dust241999 (3) mathieu-artic (2) paulierco (2) paddy01 (2) andrzejmaczka (2) zombah (1) BennyE (1) Sea-n (1) jbronn (1) d-k-7 (1) systemcrash (1) loopodoopo (1) maesbrisa (1) thomseddon (1) cliffalbert (1) Jellyfrog (1) wolfraider (1) rpardim (1) geg347 (1) ottorei (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (31) PipoCanaja (15) murrant (10) tayyabali785 (1) Feature New module add juniper rpm support + reimplementation of cisco-sla module ( #12799 ) - geg347 ISIS-adjacency polling support ( #12461 ) - ottorei Device Add Serialnumber for some Dell ForceTen devices ( #12960 ) - mpikzink 2 more Rittal variants ( #12953 ) - mpikzink Added New-OS: Alcatel-Lucent Enterprise Stellar Wireless ( #12952 ) - BennyE Add SDSL Support for OneAccess routers ( #12948 ) - mathieu-artic Improve TP-Link JetStream Discovery ( #12946 ) - jbronn Alcatel-Lucent aos6 and aos7 fdb fix ( #12945 ) - paulierco Janitza UMG96 ( #12944 ) - mpikzink Imporoved raritan pdu support ( #12937 ) - d-k-7 Alcatel-Lucent Aos7 sensors nobulk ( #12935 ) - paulierco Add Epson Projector as new OS ( #12928 ) - mpikzink Add Barco Clickshare ( #12927 ) - mpikzink Fix nokia(TiMOS) memory ( #12925 ) - paddy01 Device - Vertiv-PDU - Issue 11608 ( #12923 ) - dust241999 Adding basic support for Vertiv PDUs and power graphs ( #12908 ) - dust241999 Ciena 6500 ( #12903 ) - loopodoopo Added support for PowerWalker VFI ( #12891 ) - andrzejmaczka Initial HAProxy ALOHA support ( #12889 ) - Jellyfrog HWG WaterLeak sensor support ( #12865 ) - PipoCanaja Added definition for Riello 204 ( #12861 ) - wolfraider Add support for oneaccess router ( #12850 ) - mathieu-artic Gaia VPN IPSEC discovery ( #12823 ) - rpardim Webui Human readable database inconsistent error ( #12950 ) - murrant Add TopErrors widget based on ifError_rate ( #12926 ) - PipoCanaja Fix \"Sub-directory Support\" in small steps ( #12911 ) - mpikzink Fix \"Sub-directory Support\" in small steps ( #12910 ) - mpikzink Fix \"Sub-directory Support\" in small steps ( #12905 ) - mpikzink FIX Alert rules: Import from Alert Rule ( #12897 ) - andrzejmaczka Fix port down alert toggle ( #12884 ) - murrant Authentication Add number sign to special character handling in ActiveDirectoryAuthorizer ( #12943 ) - paddy01 Applications Fix type error ( #12899 ) - murrant Api Add api call to list OSPF ports ( #12955 ) - zombah Alerting Add Signal CLI transport support ( #12954 ) - mpikzink Update device_component_down_junos macro ( #12898 ) - thomseddon Discovery LLDP - ifAlias should be last checked in function find_port_id ( #12904 ) - PipoCanaja LLDP - Extend discovery lldp code to support different subtypes ( #12901 ) - PipoCanaja Polling Nobulk setting in sensors yaml ( #12833 ) - murrant Rancid Support for fortiswitch in gen_rancid ( #12894 ) - cliffalbert Refactor Filter unwanted data in Routes Ajax reply ( #12847 ) - PipoCanaja Documentation Improve Markdown syntax in Document ( #12949 ) - Sea-n Add info about lnms config:set at top of Configuration page ( #12939 ) - murrant Update docs ( #12919 ) - systemcrash 21.5.0 (2021-05-17) A big thank you to the following 28 contributors this last month: murrant (34) Jellyfrog (14) PipoCanaja (14) dependabot (7) rpardim (3) wolfraider (2) TheGracens (2) si458 (2) mpikzink (2) Sea-n (2) Negatifff (1) backeby (1) SanderBlom (1) paddy01 (1) nightcore500 (1) arrmo (1) bennetgallein (1) Torch09 (1) m4rkov (1) Schultz (1) thegreatecheese (1) paulierco (1) rasssta (1) craig-nokia (1) dethmetaljeff (1) djamp42 (1) martinberg (1) SourceDoctor (1) Thanks to maintainers and others that helped with pull requests this month: murrant (43) Jellyfrog (42) PipoCanaja (8) SourceDoctor (1) martinberg (1) Feature Validate database during the install ( #12867 ) - murrant Collect OUI Database and do OUI lookups ( #12842 ) - PipoCanaja Show OS definition in lnms config:get ( #12819 ) - murrant Security Jquery upgrade ( #12802 ) - murrant Oxidized improvements ( #12773 ) - murrant Device Huawei MA5603T ( #12869 ) - Negatifff Unifi 5.60.1 sysObjectID changed ( #12862 ) - wolfraider Add better Unifi processors, supported on some models ( #12854 ) - murrant Added support for GE MDS devices ( #12834 ) - SanderBlom Tripplite snmp trap handling ( #12832 ) - murrant CyberPower UPS Updates ( #12827 ) - arrmo Fix for Gaia Storage duplicated ( #12824 ) - rpardim Checkpoint Gaia Sensor Count ( #12822 ) - rpardim Gaia SecureXL current status and Management Connected Gateways ( #12821 ) - rpardim Zywall - HW, Version, Serial and Tests ( #12788 ) - PipoCanaja Firebrick sensor rework ( #12783 ) - murrant Updated Nexus (nxos) os information and test data ( #12779 ) - Torch09 FabOS sensor fixes and add SFP dBm ( #12777 ) - murrant Vrp - Collect sticky mac addresses in fdb-table ( #12774 ) - PipoCanaja Pop returned value from snmpwalk_group for lldp on mikrotik routeros ( #12768 ) - thegreatecheese Adjust Alcatel-Lucent aos7 ( #12766 ) - paulierco Corrected Chassis Over Temp oid for state indexes ( #12764 ) - craig-nokia Fix outlet sensor indexes overwriting each other when there's more than one infeed ( #12763 ) - dethmetaljeff Calix (occamos) b6_316 and Calix (calix) 700 ( #12744 ) - PipoCanaja Additional data collection for GAIA ( #12713 ) - martinberg Webui Fix arp-search remote_interface display ( #12871 ) - PipoCanaja Fix empty label in generate_port_link ( #12870 ) - PipoCanaja Fix server stats widget ( #12864 ) - murrant Disable autocomplete for password in login-form ( #12851 ) - backeby Fix top devices widget storage graphs ( #12849 ) - murrant Fixes to Export CSV ( #12830 ) - paddy01 Alert rule delay/interval empty = 0 ( #12804 ) - murrant Webui - Services bootstrap enable + status ( #12736 ) - PipoCanaja Filter Ports out by Interface Type ( #12590 ) - SourceDoctor Graphs Fix graph argument issues ( #12868 ) - murrant RRD Graph optimization ( #12735 ) - murrant Applications Add mysql skip slave ( #12826 ) - si458 Added metric for MySQL Slave Lag (secs) ( #12765 ) - rasssta Api Fixing consistency across api endpoints ( #12795 ) - bennetgallein Alerting Missing columns in select for $alert->serial & $alert->features ( #12771 ) - PipoCanaja Notify if a sensor has been deleted ( #12755 ) - TheGracens Discovery Ignore Wrong Type errors in snpm_get and snmp_get_multi_oid ( #12800 ) - murrant Discovery - Compute num_oid to make os development easier ( #12576 ) - PipoCanaja Polling Fix issue with sensor class case ( #12782 ) - murrant Bug Fix database validations ( #12882 ) - murrant PHP 8 Unit Conversion Fix ( #12857 ) - wolfraider Debug and collect-snmp-data.php fixes ( #12837 ) - murrant Fix allow_unauth_graphs ( #12829 ) - nightcore500 Include variables in default view ( #12818 ) - Jellyfrog Add support for when group doesnt exist ( #12817 ) - Jellyfrog Bump tecnickcom/tcpdf dependency to support php 8 ( #12816 ) - Jellyfrog Prevent error when no alert rules ( #12815 ) - Jellyfrog Small fix in functions.inc.php for PHP8 ( #12793 ) - mpikzink Change printer-supplies rrd name to include the supply_type ( #12792 ) - si458 Revert \"Fix StringBlade errors with a stub file\" ( #12776 ) - Jellyfrog Fix auth and crypto select options ( #12769 ) - Schultz Support X-Forwarded-Proto header ( #12759 ) - Jellyfrog Fix OS sensor array return ( #12694 ) - Jellyfrog Refactor Remove debug globals ( #12811 ) - murrant Make applications work with rrdcached ( #12807 ) - Jellyfrog Make docker app work with rrdcached ( #12746 ) - djamp42 Cleanup Misc cleanup ( #12758 ) - Jellyfrog Documentation Plugins should be called statically ( #12810 ) - mpikzink Fix docs custom graph rrd functions ( #12803 ) - murrant Use GitHub instead of Github ( #12781 ) - Sea-n Smokeping sub site requires fcgiwrap ( #12775 ) - m4rkov Document sub index references ( #12767 ) - murrant Tests Set DBSetupTest timezone to UTC ( #12881 ) - murrant Always test all OS detection. ( #12879 ) - murrant Cache astext in tests to avoid DNS lookup ( #12784 ) - Jellyfrog Enable PHPStan linter ( #12678 ) - Jellyfrog Misc Lnms dev:simulate Snmpsim debug output on failure ( #12880 ) - murrant Enable config:set to set variables inside a nested array of settings ( #12772 ) - murrant Dependencies Bump postcss from 8.2.2 to 8.2.10 ( #12858 ) - dependabot Bump lodash from 4.17.20 to 4.17.21 ( #12848 ) - dependabot Bump url-parse from 1.4.7 to 1.5.1 ( #12844 ) - dependabot Bump phpmailer/phpmailer from 6.4.0 to 6.4.1 ( #12831 ) - dependabot Bump laravel/framework from 8.35.1 to 8.40.0 ( #12814 ) - dependabot Bump composer/composer from 2.0.11 to 2.0.13 ( #12813 ) - dependabot Bump rmccue/requests from 1.7.0 to 1.8.0 ( #12812 ) - dependabot Bump laravel dusk ( #12808 ) - Jellyfrog 21.4.0 (2021-04-17) A big thank you to the following 34 contributors this last month: Jellyfrog (35) murrant (26) PipoCanaja (8) Torch09 (2) si458 (2) TheGracens (2) Cupidazul (2) DaveB91 (1) martinberg (1) craig-nokia (1) codejake (1) tamikkelsen (1) dependabot (1) Schultz (1) opalivan (1) hrtrd (1) zombah (1) casdr (1) Wooboy (1) djamp42 (1) dlangille (1) Erik-Lamers1 (1) WillIrvine (1) mpikzink (1) simmonmt (1) yswery-reconz (1) 0x4c6565 (1) antonio-jose-almeida (1) cjsoftuk (1) shepherdjay (1) imwuwei (1) SourceDoctor (1) filippog (1) bofh80 (1) Thanks to maintainers and others that helped with pull requests this month: murrant (50) Jellyfrog (39) PipoCanaja (11) SourceDoctor (1) frank42hh (1) haydenseitz (1) Feature Cisco AES256 support ( #12717 ) - Schultz Define Port Groups ( #12402 ) - SourceDoctor Service watchdog - add systemd watchdog for resiliency ( #12188 ) - bofh80 Security Escape user editable field ( #12739 ) - murrant Fix SQL injection in rediscover-device ( #12716 ) - Jellyfrog Device Added basic support for BKtel Optical Amplifier ( #12754 ) - Torch09 Added Liebert HPM support ( #12747 ) - martinberg Added basic Delta Orion Controller support ( #12741 ) - craig-nokia Basic support for zyxelac_xmg3927 ( #12740 ) - PipoCanaja Added support Cisco CBS350 ( #12737 ) - PipoCanaja Correct OID for c3GsmSimStatus ( #12724 ) - tamikkelsen Added support for Infinera XTM ( #12710 ) - Torch09 TAIT - Add entity physical support ( #12703 ) - opalivan BDCOM update support ( #12696 ) - hrtrd Update IOS with 4948 variant hardware detection ( #12685 ) - zombah VRP - fix global VRF being NULL and not '' for cbgp, support for NetEngine devices ( #12676 ) - PipoCanaja Added support for Canon printer model TM TX series ( #12667 ) - Wooboy Fortinet per-core cpu ( #12660 ) - murrant Fixed polling and health issues for 9001 and NCS devices, added suppo\u2026 ( #12640 ) - WillIrvine VRP - Fix SSID Client count ( #12629 ) - PipoCanaja Add CPU and Mem for Teldat Devices ( #12619 ) - Cupidazul Better firebrick support ( #12600 ) - cjsoftuk Huawei VRF BGP_Peers update ( #12585 ) - PipoCanaja Add Packet Buffers as memory for PanOS ( #12582 ) - shepherdjay Parse info from H3C branded comware devices ( #12551 ) - imwuwei Webui Fix inventory sensor links when empty ( #12745 ) - murrant Fix mini graphs ( #12738 ) - murrant Fix alert rules display when creating new alert template ( #12731 ) - murrant Fix bug in component table ( #12730 ) - murrant Use native browser lazy load ( #12720 ) - murrant Fix devices latency tab calendar position ( #12684 ) - TheGracens Fix links to non-existent devices ( #12680 ) - murrant Scrollable Dashboard selection menu ( #12656 ) - TheGracens Fix double escaping sysContact on device overview ( #12653 ) - murrant Hide disabled components from overview page CIMC ( #12650 ) - djamp42 Fix progress-bar 0% ( #12648 ) - si458 Add ability to set a custom port on IPMI agents ( #12634 ) - yswery-reconz WebUI - Display interface errors per second instead of accumulated ( #12613 ) - antonio-jose-almeida Add ID to Device Table List and to Device Dependencies Table List + Shorten ifname in Device: Recent Events. ( #12397 ) - Cupidazul Graphs Fix mempools divide by 0 ( #12734 ) - murrant Alerting Add UKFast PSS transport ( #12624 ) - 0x4c6565 Support multiple Alertmanager URLs ( #12346 ) - filippog Discovery Fix service template discovery ( #12662 ) - murrant Polling Allow getting VDSL stats on \"down\" VDSL ports ( #12753 ) - DaveB91 Fix printer state error ( #12681 ) - murrant Translate hex sensor values returned from ipmitool ( #12638 ) - simmonmt Bug Fix globe controller up/down partition bug ( #12757 ) - Jellyfrog Fix scopeIsArchived query ( #12756 ) - Jellyfrog Split port_groups migration to prevent issues ( #12732 ) - murrant Fix ports table when unpolled ports exist ( #12722 ) - murrant JS fixes for IE ( #12721 ) - murrant Correct snmp function usage ( #12714 ) - Jellyfrog Fix adding discrete ipmi sensors by mistake ( #12709 ) - si458 Fix mempool tags ( #12705 ) - murrant Issue with snmpwalk_group string splitting ( #12701 ) - PipoCanaja Use Device object instead of array ( #12699 ) - Jellyfrog Fix alert template variable ping_timestamp ( #12690 ) - Jellyfrog Remove snmp2ipv6 ( #12683 ) - murrant Fix deviceUrl check ( #12682 ) - Jellyfrog Correct globecontroller typo ( #12671 ) - Jellyfrog Fix undefined function in vrp peers ( #12669 ) - murrant Fix Config reference in System validations ( #12668 ) - casdr Fix regression from #12642 ( #12661 ) - Jellyfrog Don't fail on rrd close ( #12659 ) - murrant Change cache table to mediumtext ( #12649 ) - Jellyfrog Fixed VRF name change not updated in DB ( #12644 ) - PipoCanaja Fix a bunch of bugs ( #12643 ) - Jellyfrog Misc cleanup ( #12641 ) - Jellyfrog PHP8 Bug in printChangedStats ( #12639 ) - mpikzink Correct sensor_id variable ( #12633 ) - Jellyfrog Refactor Remove legacy function calls ( #12651 ) - murrant Misc cleanups ( #12642 ) - Jellyfrog Re-implement Printer as a class based module ( #12605 ) - Jellyfrog Cleanup More cleanups ( #12715 ) - Jellyfrog Cleanup ( #12695 ) - Jellyfrog PHPDoc fixes ( #12693 ) - Jellyfrog PHPDoc fixes ( #12687 ) - Jellyfrog Type hint all device model relations ( #12686 ) - Jellyfrog Linting ( #12677 ) - Jellyfrog Fix misc problems ( #12675 ) - Jellyfrog More PHPDoc changes ( #12674 ) - Jellyfrog Type hint model relations ( #12673 ) - Jellyfrog Make moduleobserver type hinting overridable ( #12670 ) - Jellyfrog Fix more PHPDoc ( #12665 ) - Jellyfrog Replace Auth > Illuminate\\Support\\Facades\\Auth ( #12664 ) - Jellyfrog Documentation Fix typos in Dashboards.md ( #12733 ) - codejake Fix doc building ( #12711 ) - Jellyfrog Filter some validation when installed from a package ( #12647 ) - dlangille Add poller_group docs on auto-discovered devices ( #12646 ) - Erik-Lamers1 Tests Add feature to capture a full snmprec ( #12706 ) - Jellyfrog Lint with shellcheck ( #12666 ) - Jellyfrog Enable Black for linter ( #12663 ) - Jellyfrog Add lint GitHub Action ( #12655 ) - murrant Misc Load device relationship from device cache ( #12712 ) - murrant Switch to utf8mb4 ( #12580 ) - Jellyfrog Dependencies Bump phpseclib/phpseclib from 2.0.30 to 3.0.7 ( #12723 ) - dependabot Bump php-amqplib to support PHP8 ( #12698 ) - Jellyfrog Update php dependencies ( #12692 ) - Jellyfrog 21.3.0 (2021-03-20) A big thank you to the following 27 contributors this last month: murrant (14) Jellyfrog (12) PipoCanaja (6) SourceDoctor (4) si458 (2) Cormoran96 (2) miff2000 (2) mpikzink (1) rasssta (1) dependabot (1) Chewie9999 (1) bennet-esyoil (1) rkojedzinszky (1) bofh80 (1) WillIrvine (1) pbaldovi (1) h-barnhart (1) waddles (1) scamp (1) aarchijs (1) yrebrac (1) Serphentas (1) theochita (1) Schouwenburg (1) neg2led (1) bakerds (1) CirnoT (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (28) murrant (17) PipoCanaja (8) SourceDoctor (8) f0o (1) crazy-max (1) yrebrac (1) Feature Developer device simulation ( #12577 ) - murrant Device Add identification for Edgeswitch 8XP ( #12622 ) - si458 Add more printer data ( #12617 ) - Jellyfrog Update hpe-ilo.yaml ( #12612 ) - rasssta Fix AOS 7 sensors ( #12599 ) - murrant Collect BIOS version for IBMC ( #12586 ) - PipoCanaja Added support for siteboss571 + new tests ( #12568 ) - WillIrvine VRP - Huawei Wifi Controllers and routers 3G/4G update ( #12565 ) - PipoCanaja F5 realservers (node_name) display ( #12553 ) - PipoCanaja Add BGP discovery and polling for Dell OS10 devices ( #12549 ) - waddles Update support for ServersCheck ( #12546 ) - Jellyfrog Add support for Edge-Core ECS4100 series devices ( #12530 ) - scamp Adding Cisco ME1200 support ( #12527 ) - aarchijs Cisco enhanced cellular ( #12463 ) - Schouwenburg Support newer SyncServer ( #12423 ) - neg2led Added alarm detection and optical PMs for Waveserver Ai ( #12380 ) - bakerds Webui Fix services availability-map link ( #12632 ) - si458 Add css text center ( #12608 ) - Cormoran96 Sort Type List in Eventlog Pages ( #12572 ) - SourceDoctor Spanning Tree Link in Eventlog ( #12571 ) - SourceDoctor Notifications : display sensor state textual value ( #12554 ) - PipoCanaja GUI - Fix the detailed access point view ( #12543 ) - PipoCanaja Add button to show verbose alert details in the alert, alert-log webui ( #12484 ) - theochita Snmp Traps Fixed typo jnxPowerSupplyOK ( #12556 ) - h-barnhart Applications Add application powermon ( #12500 ) - yrebrac Chrony support ( #12488 ) - Serphentas Docker stats app ( #12358 ) - Cormoran96 Alerting Add Google Chat Transport ( #12558 ) - pbaldovi Discovery DynamicDiscovery - Guess num_oid if not provided in YAML file ( #12570 ) - PipoCanaja Fix location for devices with broken snmp ( #12544 ) - murrant Oxidized Oxidized support airfiber ( #12597 ) - murrant Bug Bugfix for no sockets on Unix Agents ( #12637 ) - mpikzink Fix Service Templates Dynamic ( #12626 ) - murrant Service templates - fix rules ( #12587 ) - bofh80 Fix vminfo invalid power state in migration ( #12567 ) - murrant Add missing Power states ( #12559 ) - Jellyfrog PHP 8 fixes ( #12528 ) - murrant Refactor Remove legacy json format function ( #12583 ) - murrant Documentation Update Agent-Setup.md with systemd instructions on how to restrict on which NIC the agent listens. ( #12601 ) - Chewie9999 Broken link on fast-polling page ( #12595 ) - bennet-esyoil Fix bullet points ( #12574 ) - miff2000 Fix the bullet point rendering ( #12560 ) - miff2000 Tests Location tests more reliable ( #12584 ) - murrant Test both MariaDB and MySQL ( #12547 ) - Jellyfrog Misc Set correct min database version ( #12606 ) - Jellyfrog Simplify process reaping ( #12593 ) - rkojedzinszky Fix broken tests ( #12588 ) - Jellyfrog Add minimum database version check ( #12581 ) - Jellyfrog Global Settings - SNMP Timeout ( #12579 ) - SourceDoctor Improved rrdtool version validation ( #12539 ) - murrant Use DNS Location Record for Location ( #12409 ) - SourceDoctor Dependencies Bump elliptic from 6.5.3 to 6.5.4 ( #12602 ) - dependabot 21.2.0 (2021-02-16) A big thank you to the following 18 contributors this last month: murrant (9) Jellyfrog (8) PipoCanaja (1) hanserasmus (1) nightcore500 (1) simmonmt (1) SourceDoctor (1) dejantep (1) TridTech (1) Showfom (1) jasoncheng7115 (1) nkringle (1) dependabot (1) Negatifff (1) Cupidazul (1) paddy01 (1) Torch09 (1) bofh80 (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (13) murrant (12) SourceDoctor (5) Feature GPS coordinates from device ( #12521 ) - murrant Show Alert Count on Widget ( #12503 ) - SourceDoctor Add Service Templates ( #12107 ) - bofh80 Security Fix url generator XSS ( #12507 ) - Jellyfrog Fix XSS in notifications ( #12504 ) - Jellyfrog Device VRP - Filter invalid temperature data 0x7fffffff ( #12537 ) - PipoCanaja Rittal CMC III low warn limit and CAN bus current ( #12513 ) - nightcore500 Add TrueNAS temperature ( #12506 ) - simmonmt Update deltaups.yaml definition ( #12497 ) - TridTech Fixes incorrect device overlay graph type for poweralert 12 devices ( #12491 ) - nkringle Socomecpdu support ( #12481 ) - Negatifff Add support for SCS KS air-conditioning Devices ( #12360 ) - Torch09 Webui Speedup device list ( #12514 ) - Jellyfrog Authentication Fixes issues with binding and authenticating users in nested groups ( #12398 ) - paddy01 Applications Add poller feature for RRDCached SNMP to query remote agent. ( #12430 ) - Cupidazul Discovery Move sysContact polling to discovery ( #12524 ) - Jellyfrog Bug Better handling of invalid notification dates ( #12523 ) - murrant Fix invalid dates in the database ( #12512 ) - Jellyfrog Fix Fast Ping alerts always running ( #12510 ) - murrant Fix Fast Ping ( #12509 ) - murrant Network map fix Css/img ( #12498 ) - dejantep Correct check for SNMPv3 SHA-192/256 compability ( #12494 ) - Jellyfrog Cleanup Remove perf_times table ( #12517 ) - murrant Documentation Update transports docs ( #12518 ) - hanserasmus Correct rrdcached.sock location on doc ( #12496 ) - Showfom Translation Updated Traditional Chinese Translation ( #12493 ) - jasoncheng7115 Tests \"variant\" is now required for test data ( #12531 ) - Jellyfrog Dependencies Update php packages and fix composer warnings ( #12526 ) - murrant Remove larapoke until they support PHP 8 ( #12522 ) - murrant Bump laravel/framework from 8.22.1 to 8.24.0 ( #12490 ) - dependabot 21.1.0 (2021-02-02) A big thank you to the following 37 contributors this last month: murrant (14) Jellyfrog (8) efelon (4) SourceDoctor (4) paulierco (4) TheMysteriousX (3) dependabot (3) crazy-max (2) djamp42 (2) jezekus (2) martijn-schmidt (2) vitalisator (2) hanserasmus (1) lukoramu (1) deveth0 (1) lazyb0nes (1) mpikzink (1) richardlawley (1) Torch09 (1) rk4an (1) FingerlessGlov3s (1) dlehman83 (1) fablabo (1) zerrac (1) loopodoopo (1) alakiza (1) yrebrac (1) nkringle (1) ottorei (1) Senetus (1) WhippingBoy01 (1) haydenseitz (1) admish (1) kedare (1) ah9828 (1) OahzEgroeg (1) Dmkaz (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (36) murrant (26) SourceDoctor (4) f0o (3) ottorei (1) laf (1) calinrigo (1) Feature Show Device Group on Map ( #12379 ) - SourceDoctor Security Fix js injection issues in device overview ( #12475 ) - murrant CVE-2020-35700 ( #12422 ) - Jellyfrog Device Update enexus for \"SmartPack S\" ( #12465 ) - haydenseitz Added Firepower 4125 ( #12462 ) - WhippingBoy01 Add Alcatel AOS7 bgpdescr & bgpprefix ( #12450 ) - paulierco Panduit PDU ( #12449 ) - Senetus Add sensors for Meinberg Lantime NTP-devices ( #12447 ) - ottorei Adds tripplight snmpwebcard support ( #12445 ) - nkringle Add mempools, cpu and storage to some arbor devices ( #12444 ) - TheMysteriousX Filter Juniper mempools ( #12443 ) - TheMysteriousX Add planet-pdu os device ( #12441 ) - paulierco Add WTI POWER os device ( #12440 ) - jezekus Enumerate sensors under the Outlet for the entity-physical inventory ( #12439 ) - martijn-schmidt Nokia sap graph ( #12432 ) - loopodoopo Apc epdu ( #12428 ) - zerrac Fix for Mikrotik SwOS discovery ( #12426 ) - jezekus New device OS: McafeeWebGateway ( #12418 ) - paulierco Make LibreNMS recognize Schleifenbauer model DPM27/E with existing OS definition ( #12414 ) - martijn-schmidt Update OPNsense version Regex, for _ releases ( #12407 ) - FingerlessGlov3s Change raspberry_pi_sensors state ( #12390 ) - mpikzink Added support for Motorola and Thomson DOCSIS Cable Modems. ( #12386 ) - lukoramu Check Point: Added HA state support ( #12382 ) - lazyb0nes Add Zyxel IES 5206 and 5212 to supported Devices ( #12373 ) - Torch09 Alcatel-Lucent support part2 ( #12369 ) - paulierco Eltek Enexus. Disable some battery sensors if no battery bank is installed at all. ( #12367 ) - vitalisator New device os Raisecom Router OS (ROAP) ( #12361 ) - vitalisator Freenas storage polling fix ( #12275 ) - Dmkaz Webui Fix exception in device overview puppet widget ( #12474 ) - murrant Support new lines in login_message again ( #12469 ) - efelon Fix poller frequency display bug and warn ( #12466 ) - murrant Remove unnecessary horizontal scroll bars in allert widgets ( #12464 ) - efelon Reintroduce word wrapping to the custom login message ( #12460 ) - efelon Add a button to reset port state history ( #12457 ) - TheMysteriousX Improving readability of tables on dark theme dashboards ( #12455 ) - efelon Changed default param max_rows to increase widget count on dashboard ( #12438 ) - alakiza Fix percent bar text location ( #12406 ) - rk4an Don't show gelocation on snmp location string ( #12384 ) - SourceDoctor Copy Dashboard to other User ( #11989 ) - SourceDoctor Output image for graphs with no data ( #11865 ) - murrant Authentication Ldap auth handle no search more gracefully ( #12424 ) - murrant Api Fix oxidized API call when config is missing ( #12476 ) - murrant Allow logs to be filtered by min/max id ( #12471 ) - kedare Bug Fix broken statement on auto discovery ( #12408 ) - djamp42 Remove unused openssl_ver ( #12378 ) - murrant Fix version compare ( #12376 ) - murrant Documentation Update Rancid.md ( #12487 ) - fablabo Creating Documentation page ( #12486 ) - yrebrac Added missing / on internal link ( #12467 ) - admish Lnms link in /usr/bin ( #12446 ) - murrant Update Documentation ( #12411 ) - dlehman83 Document flattened Inventory API function ( #12404 ) - richardlawley Update docs for raspberry.sh ( #12389 ) - deveth0 Update to incorporate new locking mechanisms ( #12388 ) - hanserasmus Update Distributed-Poller.md Discovery using dispatcher service ( #12387 ) - djamp42 Doc - Increase Nginx Timeout ( #12368 ) - SourceDoctor Tests Add test to check if os parameter matches filename ( #12442 ) - Jellyfrog Remove Travis support ( #12416 ) - crazy-max GitHub Actions dev:check ci ( #12392 ) - crazy-max Misc Cast REDIS_TIMEOUT to integer ( #12482 ) - OahzEgroeg Redis - Add scheme to allow TLS ( #12477 ) - ah9828 Dependencies Remove PHP8 blockers in LibreNMS ( #12451 ) - murrant Bump laravel/framework from 8.21.0 to 8.22.1 ( #12448 ) - dependabot Update php dependencies ( #12425 ) - murrant Upgrade to Laravel Mix 6 ( #12421 ) - Jellyfrog Bump axios from 0.19.2 to 0.21.1 ( #12420 ) - dependabot Bump ini from 1.3.5 to 1.3.8 ( #12395 ) - dependabot Old Changelogs","title":"Changelog"},{"location":"General/Changelog/#2420","text":"(2024-02-27) A big thank you to the following 46 contributors this last month: rudybroersma (14) Npeca75 (10) eskyuu (6) electrocret (5) PipoCanaja (5) Jellyfrog (5) vhuk (5) murrant (5) bnerickson (3) fbouynot (3) FlyveHest (2) nickhilliard (2) dependabot (2) richard-ririe (2) laf (2) SourceDoctor (2) VVelox (2) VoipTelCH (1) fabriciotm (1) dirkx (1) swerveshot (1) jmesserli (1) lrizzi (1) Personwho (1) OSIRIS-REx (1) xorrkaz (1) jcostom (1) tevkar (1) descilla (1) arjitc (1) My-Random-Thoughts (1) dlangille (1) blknight88 (1) z0d1ac-RU (1) lferrerfmv (1) gil-obradors (1) gunkaaa (1) TvL2386 (1) santiag0z (1) EinGlasVollKakao (1) kakohegyi (1) i4networks (1) Bierchermuesli (1) mhamzak008 (1) nicklockhart-fullfibre (1) LoveSkylark (1) Thanks to maintainers and others that helped with pull requests this month: PipoCanaja (35) Jellyfrog (30) electrocret (26) laf (21) murrant (11) mpikzink (1) rudybroersma (1) ottorei (1) vhuk (1)","title":"24.2.0"},{"location":"General/Changelog/#feature","text":"Additional custom map features ( #15806 ) - eskyuu Add/Remove devices from static devicegroups ( #15775 ) - richard-ririe Option to ignore device status ( #15697 ) - SourceDoctor Add functionality for custom maps (weathermaps) ( #15633 ) - eskyuu Alert Rule Editor: new notes field & SQL field improove ( #15631 ) - Bierchermuesli NAC - Improve search in WebUI - Keep Historical data ( #15629 ) - PipoCanaja","title":"Feature"},{"location":"General/Changelog/#security","text":"Fix XSS in default example plugin ( #15711 ) - murrant","title":"Security"},{"location":"General/Changelog/#device","text":"Updated SLA poller for Cisco Nexus 9000 ( #15855 ) - FlyveHest Update geist-watchdog.yaml ( #15851 ) - fabriciotm Correctly identify FS Datacenter Switch N8560-48BC ( #15837 ) - rudybroersma Konica printers additional counters ( #15826 ) - Npeca75 Add HSRP state sensors for Cisco IOSXE on L3 switches ( #15823 ) - rudybroersma Add HSRP Sensor support for IOSXR ( #15821 ) - electrocret Add support for Cisco IE1000 ( #15820 ) - rudybroersma Initial support for Eltex mes24xx ( #15816 ) - Npeca75 Add support for Cadant E6000 ( #15813 ) - nickhilliard Add LRT-C / LCM-B / LRS-D / LCM-B modules to Luminato model ( #15812 ) - nickhilliard Add HSRP state sensors for Cisco IOS on L3 switches ( #15809 ) - rudybroersma [rfc1628] Add UPS Test (battery test) status sensor ( #15802 ) - Npeca75 Add build 22631 as Windows 11 23H2 ( #15800 ) - vhuk Zyxel ZynOS PoE Budget sensor support ( #15798 ) - rudybroersma Add Procurve NAC support ( #15794 ) - vhuk Add ArubaOS-CX VSF state sensor support ( #15793 ) - rudybroersma Support for new os/devices, CTS ( #15790 ) - OSIRIS-REx Support for new Lancom devices ( #15779 ) - rudybroersma Add NAC support for Powerconnect ( #15778 ) - vhuk Detect UniFi U7 APs as UniFi AP type ( #15776 ) - jcostom FS.com S5810 Discovery fix ( #15765 ) - rudybroersma Device - webpower smart II snmp UPS card ( #15764 ) - Npeca75 Support for temp sensors - WUT Thermometers - W57605 and W57614 ( #15757 ) - rudybroersma Initial support for Supermicro BMC ( #15750 ) - Npeca75 ArubaOS-CX PSU state sensor support & OS and serial detection ( #15738 ) - rudybroersma Add FortiSwitch PSU state sensor support ( #15735 ) - rudybroersma Added support for Dlink dgs-1250-28x ( #15734 ) - Npeca75 Add FortiGate DHCP Scope usage percentage sensors ( #15727 ) - rudybroersma Added MES 2348B ( #15725 ) - z0d1ac-RU Add FortiGate license status sensors ( #15722 ) - rudybroersma Handle icmpjitter SLA parsing for iosxe ( #15707 ) - FlyveHest Zyxel Wireless Controller OS ( Zyxel NXC series ) ( #15694 ) - kakohegyi Device - fix Counter64 octets value in 32bit column bgpPeerInTotalMessages ( #15621 ) - PipoCanaja Fix tp-link jetstream FDB discovery ( #14321 ) - Npeca75","title":"Device"},{"location":"General/Changelog/#webui","text":"Disable Page Refresh on Oxidized Tools Page ( #15831 ) - electrocret Modify the date selector to use the session timezone ( #15783 ) - eskyuu Switch bill_notes input to textarea ( #15749 ) - arjitc Sort smart app disks by label ( #15686 ) - SourceDoctor","title":"Webui"},{"location":"General/Changelog/#alerting","text":"Add support for Webex max message length. ( #15789 ) - xorrkaz Rename JiraServiceManagement.php to Jiraservicemanagement.php ( #15717 ) - gil-obradors Add JiraServiceManagement Transport ( #15593 ) - mhamzak008 Transport - Jira transport rewrite ( #15561 ) - LoveSkylark","title":"Alerting"},{"location":"General/Changelog/#graphs","text":"Fixed graphs for icmp service showing PL 4 times ( #15856 ) - VoipTelCH Socket Statistic Application cleanup and application page graph fixes. ( #15845 ) - bnerickson","title":"Graphs"},{"location":"General/Changelog/#applications","text":"Deliver output for a specific memcached instance ( #15759 ) - tevkar Update nvidia.inc.php ( #15756 ) - descilla Add BorgBackup monitoring support ( #15591 ) - VVelox Add dhcp-stats tests and update for v3 of the extend ( #15378 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#billing","text":"Updated bill_data table, alter indexes and add new column ( #15751 ) - laf","title":"Billing"},{"location":"General/Changelog/#api","text":"Add API endpoints to update and delete Device Groups ( #15774 ) - richard-ririe Add port description API endpoints and documentation ( #15578 ) - nicklockhart-fullfibre","title":"Api"},{"location":"General/Changelog/#settings","text":"Fix twofactor default value ( #15772 ) - murrant Add isis module to os schema ( #15710 ) - murrant","title":"Settings"},{"location":"General/Changelog/#discovery","text":"Fall back to IPV6-MIB IPv6 address discovery if IP-MIB IPv6 address discovery doesn't return any valid addresses ( #15714 ) - gunkaaa","title":"Discovery"},{"location":"General/Changelog/#oxidized","text":"Add PollerGroup as an option for OxidizedMap ( #15696 ) - electrocret","title":"Oxidized"},{"location":"General/Changelog/#bug","text":"Update Port Real Time Graph error ( #15846 ) - electrocret [bugfix] Fix json-app-tool.php to work with Oid class. ( #15844 ) - bnerickson Fix for linkDown/linkUp ifOperStatus ( #15835 ) - PipoCanaja Fix \"Tempurature\" Typo ( #15811 ) - lrizzi Bug fixes for the custom maps ( #15810 ) - eskyuu Remove dumpRawSql() function in AlertUtil.php ( #15803 ) - Personwho Make all image URLs absolute and fix path for viewer ( #15788 ) - eskyuu Prevent ansi colors in key:generate output ( #15773 ) - Jellyfrog VRP - avoid emptying bgpPeers description at discovery when manually set ( #15713 ) - PipoCanaja OSPF instances and missing mandatory fields fix attempt ( #15712 ) - PipoCanaja Fixed typo in misc/alert_rules.json with regards to \"Space on ...\" alerts ( #15708 ) - TvL2386 Don't escape leaflet tile url in location edit map ( #15695 ) - EinGlasVollKakao Show error if \"Check Type\" field is empty when creating new service template ( #15685 ) - vhuk","title":"Bug"},{"location":"General/Changelog/#refactor","text":"Rewrite ups-nut discovery to SnmpQuery:: ( #15850 ) - Npeca75 Rewrite lmsensors discovery to SnmpQuery:: ( #15833 ) - Npeca75 Rewrite ipv4 address discovery to Eloquent ( #15830 ) - Npeca75","title":"Refactor"},{"location":"General/Changelog/#documentation","text":"Applications.md formatting update for better readability. ( #15849 ) - bnerickson Update Images.md ( #15824 ) - swerveshot More precise OAuth group/role claim information ( #15817 ) - jmesserli Add selinux open directory permission for rrdcached in RRDCached.md ( #15755 ) - fbouynot Missing dir read permission in sepolicy in RRDCached.md ( #15754 ) - fbouynot Update SQL override section after switch to SQL strict mode ( #15736 ) - blknight88 Add CentOS option to SMART dependency install ( #15704 ) - fbouynot","title":"Documentation"},{"location":"General/Changelog/#misc","text":"Add kelvin to celcius conversion ( #15836 ) - dirkx","title":"Misc"},{"location":"General/Changelog/#mibs","text":"Update watchguard MIBs ( #15719 ) - lferrerfmv","title":"Mibs"},{"location":"General/Changelog/#dependencies","text":"Bump composer/composer from 2.6.6 to 2.7.0 ( #15808 ) - dependabot Update PHP dependencies ( #15737 ) - murrant Bump follow-redirects from 1.15.3 to 1.15.4 ( #15724 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2410","text":"(2024-01-07) A big thank you to the following 37 contributors this last month: PipoCanaja (12) murrant (7) laf (5) electrocret (3) peejaychilds (3) Jellyfrog (2) vhuk (2) MittWillson (2) Bierchermuesli (2) netravnen (1) iliessens (1) sarcastic6 (1) SourceDoctor (1) altf4arnold (1) robje (1) rudybroersma (1) mtentilucci (1) tuxgasy (1) craig-nokia (1) brianegge (1) amyjohn000 (1) VirTechSystems (1) atj (1) lhwolfarth (1) bonzo81 (1) Sweeny42 (1) jduke-halls (1) pjordanovic (1) dependabot (1) TheMysteriousX (1) swiftnode-linden (1) cguillaumie (1) luc-ass (1) VVelox (1) Leo-FJ (1) MaxPecc (1) jerji (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (20) murrant (16) PipoCanaja (15) electrocret (12) craig-nokia (1) ottorei (1)","title":"24.1.0"},{"location":"General/Changelog/#device_1","text":"Ignore nameless health sensors for Fortigate ( #15678 ) - iliessens Add support for RoomAlert 32S device ( #15676 ) - sarcastic6 Device - Add Cisco REP Segment state sensor ( #15666 ) - rudybroersma Added better support for some HiveOS Wireless devices ( #15661 ) - laf Fix HPE iLO CPU Status Sensor Description ( #15660 ) - mtentilucci Fix OcNOS detection for recent firmware versions ( #15642 ) - murrant Add support for Fortinet FortiAPs ( #15641 ) - atj Fixing memory scale for datacom-dmos devices ( #15640 ) - lhwolfarth Add support for Forcepoint NGFW 6.10 and older ( #15632 ) - vhuk Add memory readings for Draytek OS ( #15618 ) - Sweeny42 Updated support for HiveOS Wireless newer models ( #15610 ) - laf Add HPE iLO 6 to discovery ( #15607 ) - jduke-halls Incorrect discovery APC Smart-UPS RT 3000 XL 4.1 ( APC Web/SNMP Management Card (AP9619 MB:v4.1.1 PF:v3.9.4) as multi-phase ups ( #15602 ) - pjordanovic Device - McAfee Web Gateway -> SkyHigh Web Gateway ( #15596 ) - PipoCanaja Add and extend support for Hirshmann devices ( #15588 ) - cguillaumie Updated regex for HWG STE2 r2 to better detect hardware and software version ( #15573 ) - luc-ass Update entity-sensor.inc.php for xos' os ( #15552 ) - Leo-FJ Added support of new OS for NTP/PTP systems: Meinberg OS, Safran (Orolia), Oscilloquartz (Adva) ( #15453 ) - MaxPecc Zhone health ( #15276 ) - jerji Fix wrong ASN discovery on non-BGP Devices ( #14948 ) - Bierchermuesli","title":"Device"},{"location":"General/Changelog/#webui_1","text":"Clarify In/Out on Ports table. ( #15680 ) - electrocret WebUI - Filter FDB and ARP tabs in port page if empty ( #15653 ) - PipoCanaja Update Pushover.php ( #15652 ) - brianegge Mark old alert email settings as deprecated ( #15650 ) - murrant Add bad port settings to webui ( #15649 ) - murrant Bug - FDB Table - allow empty searchby as well ( #15626 ) - PipoCanaja Update alertlog query to be more efficient ( #15622 ) - laf Add vendor to searchby rules function ( #15619 ) - bonzo81 Fix grabled characters when oid already UTF-8 ( #15615 ) - MittWillson","title":"Webui"},{"location":"General/Changelog/#graphs_1","text":"Change default graph image to SVG ( #15586 ) - electrocret","title":"Graphs"},{"location":"General/Changelog/#api_1","text":"API add_device: Add ping_ping fallback option ( #15637 ) - murrant More filter options for the BGP peer API endpoint ( #15599 ) - Bierchermuesli","title":"Api"},{"location":"General/Changelog/#discovery_1","text":"Set array before use to stop discovery erroring ( #15604 ) - laf","title":"Discovery"},{"location":"General/Changelog/#authentication","text":"Add support for Okta Group claims to set Roles ( #15592 ) - peejaychilds Output Roles in auth_test script ( #15587 ) - peejaychilds","title":"Authentication"},{"location":"General/Changelog/#bug_1","text":"Fix Rancid error messages ( #15683 ) - vhuk Fix smart application parsing ( #15672 ) - SourceDoctor Fix pagination in alert rules page ( #15659 ) - tuxgasy Bug - \"null\" checks for SAR 7705 release 8.X ( #15657 ) - craig-nokia Bug - missing \"use\" statement in NTP Cisco ( #15656 ) - PipoCanaja Bug - Fix Cisco NTP values ( #15639 ) - PipoCanaja Bug - TPLink - fix null exception for LLDP discovery WIP ( #15628 ) - PipoCanaja Bug - timos MPLS - more poller fixes ( #15624 ) - PipoCanaja Bug - bgp-peers error in Timos -> dbFacile cleanup ( #15620 ) - PipoCanaja Bug - ADSL ifIndex to port error not handled ( #15617 ) - PipoCanaja Bug - XDSL adslAtucCurrOutputPwr exception (Cisco CSCvj53634) ( #15614 ) - PipoCanaja Bug - null checks in Nokia MPLS polling ( #15613 ) - PipoCanaja Bug - Nokia discovery protocols ( #15606 ) - PipoCanaja Make vminfo.vmwVmGuestOS wider ( #15595 ) - TheMysteriousX Fixed state flag causing sql issues in test-template.php ( #15589 ) - laf","title":"Bug"},{"location":"General/Changelog/#documentation_1","text":"Add traceroute to the installed packages doc ( #15645 ) - VirTechSystems Fix documentation formatting ( #15635 ) - Jellyfrog Fix formatting in OAuth-SAML.md ( #15616 ) - peejaychilds Update Debian 12 Installation Instructions. ( #15590 ) - swiftnode-linden Add Debian 12 to install docs ( #15559 ) - VVelox","title":"Documentation"},{"location":"General/Changelog/#misc_1","text":"Updating the logo to higher resolution one ( #15669 ) - altf4arnold Update the type of nummonbssid column in the access_points table ( #15647 ) - amyjohn000 Fix device format missing display field ( #15623 ) - MittWillson Link Model ( #15611 ) - murrant Add space to Oxidized error msg ( #15603 ) - electrocret","title":"Misc"},{"location":"General/Changelog/#internal-features","text":"New utility Number::constrainInteger() ( #15663 ) - murrant","title":"Internal Features"},{"location":"General/Changelog/#mibs_1","text":"Update MIKROTIK-MIB ( #15690 ) - netravnen","title":"Mibs"},{"location":"General/Changelog/#dependencies_1","text":"Update javascript dependencies ( #15651 ) - murrant Bump phpseclib/phpseclib from 3.0.21 to 3.0.34 ( #15600 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2410_1","text":"(2024-01-07) A big thank you to the following 37 contributors this last month: PipoCanaja (12) murrant (7) laf (5) electrocret (3) peejaychilds (3) Jellyfrog (2) vhuk (2) MittWillson (2) Bierchermuesli (2) netravnen (1) iliessens (1) sarcastic6 (1) SourceDoctor (1) altf4arnold (1) robje (1) rudybroersma (1) mtentilucci (1) tuxgasy (1) craig-nokia (1) brianegge (1) amyjohn000 (1) VirTechSystems (1) atj (1) lhwolfarth (1) bonzo81 (1) Sweeny42 (1) jduke-halls (1) pjordanovic (1) dependabot (1) TheMysteriousX (1) swiftnode-linden (1) cguillaumie (1) luc-ass (1) VVelox (1) Leo-FJ (1) MaxPecc (1) jerji (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (20) murrant (16) PipoCanaja (15) electrocret (12) craig-nokia (1) ottorei (1)","title":"24.1.0"},{"location":"General/Changelog/#device_2","text":"Ignore nameless health sensors for Fortigate ( #15678 ) - iliessens Add support for RoomAlert 32S device ( #15676 ) - sarcastic6 Device - Add Cisco REP Segment state sensor ( #15666 ) - rudybroersma Added better support for some HiveOS Wireless devices ( #15661 ) - laf Fix HPE iLO CPU Status Sensor Description ( #15660 ) - mtentilucci Fix OcNOS detection for recent firmware versions ( #15642 ) - murrant Add support for Fortinet FortiAPs ( #15641 ) - atj Fixing memory scale for datacom-dmos devices ( #15640 ) - lhwolfarth Bug - Fix Cisco NTP values ( #15639 ) - PipoCanaja Add support for Forcepoint NGFW 6.10 and older ( #15632 ) - vhuk Bug - timos MPLS - more poller fixes ( #15624 ) - PipoCanaja Add memory readings for Draytek OS ( #15618 ) - Sweeny42 Updated support for HiveOS Wireless newer models ( #15610 ) - laf Add HPE iLO 6 to discovery ( #15607 ) - jduke-halls Incorrect discovery APC Smart-UPS RT 3000 XL 4.1 ( APC Web/SNMP Management Card (AP9619 MB:v4.1.1 PF:v3.9.4) as multi-phase ups ( #15602 ) - pjordanovic Device - McAfee Web Gateway -> SkyHigh Web Gateway ( #15596 ) - PipoCanaja Add and extend support for Hirshmann devices ( #15588 ) - cguillaumie Updated regex for HWG STE2 r2 to better detect hardware and software version ( #15573 ) - luc-ass Update entity-sensor.inc.php for xos' os ( #15552 ) - Leo-FJ Added support of new OS for NTP/PTP systems: Meinberg OS, Safran (Orolia), Oscilloquartz (Adva) ( #15453 ) - MaxPecc Zhone health ( #15276 ) - jerji Fix wrong ASN discovery on non-BGP Devices ( #14948 ) - Bierchermuesli","title":"Device"},{"location":"General/Changelog/#webui_2","text":"Clarify In/Out on Ports table. ( #15680 ) - electrocret WebUI - Filter FDB and ARP tabs in port page if empty ( #15653 ) - PipoCanaja Update Pushover.php ( #15652 ) - brianegge Mark old alert email settings as deprecated ( #15650 ) - murrant Add bad port settings to webui ( #15649 ) - murrant Bug - FDB Table - allow empty searchby as well ( #15626 ) - PipoCanaja Update alertlog query to be more efficient ( #15622 ) - laf Add vendor to searchby rules function ( #15619 ) - bonzo81 Fix grabled characters when oid already UTF-8 ( #15615 ) - MittWillson","title":"Webui"},{"location":"General/Changelog/#graphs_2","text":"Change default graph image to SVG ( #15586 ) - electrocret","title":"Graphs"},{"location":"General/Changelog/#api_2","text":"API add_device: Add ping_ping fallback option ( #15637 ) - murrant More filter options for the BGP peer API endpoint ( #15599 ) - Bierchermuesli","title":"Api"},{"location":"General/Changelog/#discovery_2","text":"Set array before use to stop discovery erroring ( #15604 ) - laf","title":"Discovery"},{"location":"General/Changelog/#authentication_1","text":"Add support for Okta Group claims to set Roles ( #15592 ) - peejaychilds Output Roles in auth_test script ( #15587 ) - peejaychilds","title":"Authentication"},{"location":"General/Changelog/#bug_2","text":"Fix Rancid error messages ( #15683 ) - vhuk Fix smart application parsing ( #15672 ) - SourceDoctor Fix pagination in alert rules page ( #15659 ) - tuxgasy Bug - \"null\" checks for SAR 7705 release 8.X ( #15657 ) - craig-nokia Bug - missing \"use\" statement in NTP Cisco ( #15656 ) - PipoCanaja Bug - TPLink - fix null exception for LLDP discovery WIP ( #15628 ) - PipoCanaja Bug - bgp-peers error in Timos -> dbFacile cleanup ( #15620 ) - PipoCanaja Bug - ADSL ifIndex to port error not handled ( #15617 ) - PipoCanaja Bug - XDSL adslAtucCurrOutputPwr exception (Cisco CSCvj53634) ( #15614 ) - PipoCanaja Bug - null checks in Nokia MPLS polling ( #15613 ) - PipoCanaja Bug - Nokia discovery protocols ( #15606 ) - PipoCanaja Make vminfo.vmwVmGuestOS wider ( #15595 ) - TheMysteriousX Fixed state flag causing sql issues in test-template.php ( #15589 ) - laf","title":"Bug"},{"location":"General/Changelog/#documentation_2","text":"Add traceroute to the installed packages doc ( #15645 ) - VirTechSystems Fix documentation formatting ( #15635 ) - Jellyfrog Fix formatting in OAuth-SAML.md ( #15616 ) - peejaychilds Update Debian 12 Installation Instructions. ( #15590 ) - swiftnode-linden Add Debian 12 to install docs ( #15559 ) - VVelox","title":"Documentation"},{"location":"General/Changelog/#misc_2","text":"Updating the logo to higher resolution one ( #15669 ) - altf4arnold Update the type of nummonbssid column in the access_points table ( #15647 ) - amyjohn000 Fix device format missing display field ( #15623 ) - MittWillson Link Model ( #15611 ) - murrant Add space to Oxidized error msg ( #15603 ) - electrocret","title":"Misc"},{"location":"General/Changelog/#internal-features_1","text":"New utility Number::constrainInteger() ( #15663 ) - murrant","title":"Internal Features"},{"location":"General/Changelog/#mibs_2","text":"Update MIKROTIK-MIB ( #15690 ) - netravnen","title":"Mibs"},{"location":"General/Changelog/#dependencies_2","text":"Update javascript dependencies ( #15651 ) - murrant Bump phpseclib/phpseclib from 3.0.21 to 3.0.34 ( #15600 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#23110","text":"(2023-11-17) A big thank you to the following 37 contributors this last month: murrant (26) PipoCanaja (5) jepke (3) peelman (3) dependabot (2) Galileo77 (2) tim427 (2) ottorei (2) eskyuu (1) arjenz (1) electrocret (1) GramThanos (1) bnerickson (1) peejaychilds (1) laf (1) luttermann (1) helppp (1) slalomsk8er (1) VirTechSystems (1) westerterp (1) cmadamsgit (1) lhwolfarth (1) webtroter (1) fbouynot (1) Wooboy (1) kmodzel (1) jaannnis (1) Fehler12 (1) not-known (1) drykov-ttc (1) tydal-borge (1) iNuc1ear (1) mpikzink (1) WilliamDEdwards (1) RandGH (1) underscoredje (1) Schouwenburg (1) Thanks to maintainers and others that helped with pull requests this month: murrant (40) Jellyfrog (10) electrocret (9) laf (2) ottorei (2) kwangsing3 (1)","title":"23.11.0"},{"location":"General/Changelog/#feature_1","text":"Mail Transport: option to use BCC ( #15554 ) - murrant New command: lnms report:devices ( #15539 ) - murrant","title":"Feature"},{"location":"General/Changelog/#breaking-change","text":"Plugin update (breaking) ( #15498 ) - murrant","title":"Breaking Change"},{"location":"General/Changelog/#security_1","text":"Fix a few XSS vulnerabilities in device group popups ( #15581 ) - murrant Disable GET login by default ( #15558 ) - murrant Use GitHub for vulnerability reporting ( #15555 ) - murrant","title":"Security"},{"location":"General/Changelog/#device_3","text":"[APC sensor] Actual state of alarm contact beside config state ( #15576 ) - jepke Vertiv PDU show power graph in mouesover and device overview ( #15543 ) - Galileo77 Cisco WLC: fetch LWAPP SSIDs for client counts ( #15531 ) - murrant Add sysObjectIDs for other models of PSS shelves ( #15525 ) - peelman Added values from SFP DDM values for awplus switches ( #15522 ) - luttermann Add support for Nokia 1830 PSS Optical gear ( #15516 ) - peelman Add Support for Samlex America PSR-1200-48 Inverters ( #15515 ) - peelman TrueNAS no longer supports zpool space usage ( #15490 ) - murrant Vertiv pdu mg02e4w1 ( #15484 ) - Galileo77 Add FortiGate Environment stats ( #15464 ) - westerterp Add support for FiberStore \"data center\" switches ( #15445 ) - cmadamsgit Adding basic support for Datacom DmOS devices. ( #15436 ) - lhwolfarth Apc ap 7900b ( #15392 ) - webtroter Add definition fujifilmprinter ( #15381 ) - Wooboy Initial support for Moxa EDS-4000 Series switches ( #15293 ) - kmodzel Cisco SB Switch Temp and Fanspeed fix ( #15225 ) - Fehler12 Add support eltex more devices ( #15108 ) - drykov-ttc Add support for Security Radar ( #15053 ) - tydal-borge Add disk sensors for Oceanstor ( #15010 ) - iNuc1ear Fix Fortinet HA-status polling state translations ( #14921 ) - ottorei Add Quantum Scalar I6000 Tape Library ( #14915 ) - mpikzink Add liebert detailsv2 ( #14746 ) - RandGH Zyxel AP wireless client discovery enhancement ( #14704 ) - underscoredje Dantherm hostname ( #14223 ) - Schouwenburg Add Panorama log collection write rate ( #13864 ) - ottorei","title":"Device"},{"location":"General/Changelog/#webui_3","text":"Device links formatting changes ( #15580 ) - eskyuu Only set user roles if they are defined ( #15577 ) - murrant Fix Down/Up time error if device is unpolled ( #15545 ) - murrant Fix health temperature degree display ( #15541 ) - murrant Fixed BGP Remote peer link and graph in Routing Overview, or just static text when not a device in LibreNMS ( #15535 ) - tim427 Added BGP Remote peer link and graph in Routing Overview ( #15532 ) - tim427 Respect web_mouseover setting in popup component ( #15530 ) - murrant Prefetch devices in group to avoid cost of subquery ( #15511 ) - slalomsk8er","title":"Webui"},{"location":"General/Changelog/#alerting_1","text":"Give reason for alert template fallback ( #15583 ) - murrant Add option to disable the send of acknowledgement alerts. ( #15208 ) - not-known","title":"Alerting"},{"location":"General/Changelog/#applications_1","text":"[bugfix] Passing $device into data_update_helper functions instead of declaring it as global. ( #15542 ) - bnerickson","title":"Applications"},{"location":"General/Changelog/#api_3","text":"API Oxidized http source optimization ( #15560 ) - murrant Get poller group ( #15493 ) - VirTechSystems","title":"Api"},{"location":"General/Changelog/#discovery_3","text":"UCD buffers and cache discovered with inverted free/used values ( #15538 ) - murrant","title":"Discovery"},{"location":"General/Changelog/#polling","text":"Prevent non-unicode characters in ifAlias ( #15585 ) - murrant BGP-peers if no data, skip ( #15548 ) - murrant UCD-MIB polling check isset ( #15547 ) - murrant Fix Ciscowlc error when bsnApIfNoOfUsers is not present ( #15529 ) - murrant","title":"Polling"},{"location":"General/Changelog/#authentication_2","text":"Add auth_ldap_cacertfile and auth_ldap_ignorecert options ( #15526 ) - peejaychilds","title":"Authentication"},{"location":"General/Changelog/#bug_3","text":"Bug - Fix API Content-Type Header handling ( #15574 ) - PipoCanaja Huawei Controllers - Exception removed and changed OID for AP Type ( #15564 ) - PipoCanaja Fix graphs device check before auth ( #15551 ) - murrant Prometheus on failure, disable for rest of run ( #15546 ) - murrant Bug - Fix missing device_id in NAC tab view ( #15534 ) - PipoCanaja Bug - string VS array ( #15533 ) - PipoCanaja OSPF tables fix integer types ( #15528 ) - murrant Fixed the wrong field being used for join ( #15524 ) - laf Dark mode fix routing tabs & pages ( #15485 ) - jepke Minor fix and tweak for graylog integration ( #15455 ) - jepke Smokeping menu and title use device displayname ( #15387 ) - fbouynot Increase max package name length to 128 characters ( #14895 ) - WilliamDEdwards","title":"Bug"},{"location":"General/Changelog/#cleanup","text":"Remove api_demo config setting ( #15563 ) - electrocret Wifi module does not exist anymore ( #15549 ) - murrant Misc device column cleanups ( #15518 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_3","text":"Update Docker docs ( #15556 ) - GramThanos Changed log item, source(s_sys) to source(s_src) ( #15521 ) - helppp","title":"Documentation"},{"location":"General/Changelog/#translation","text":"Change spelling disc -> disk ( #15569 ) - arjenz","title":"Translation"},{"location":"General/Changelog/#misc_3","text":"Update renamehost to include more logging if a folder already exists# ( #15280 ) - jaannnis","title":"Misc"},{"location":"General/Changelog/#internal-features_2","text":"Print stack trace in error dumps ( #15514 ) - murrant SnmpQuery runtime cache ( #15512 ) - murrant","title":"Internal Features"},{"location":"General/Changelog/#dependencies_3","text":"Bump axios from 0.25.0 to 1.6.0 ( #15571 ) - dependabot Bump browserify-sign from 4.2.1 to 4.2.2 ( #15510 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#23100","text":"(2023-10-26) A big thank you to the following 30 contributors this last month: murrant (84) SourceDoctor (6) tim427 (4) electrocret (3) dependabot (3) noaheroufus (3) PipoCanaja (3) Galileo77 (2) fbouynot (2) Jellyfrog (2) peejaychilds (1) cwispy (1) qwerin (1) lhwolfarth (1) CTV-2023 (1) barryodonovan (1) MrShunz (1) brointhemix (1) I-FGSD (1) Ac0lyte (1) Jimmy-Cl (1) waddles (1) bnerickson (1) netravnen (1) jepke (1) TheMysteriousX (1) rolfbergheim (1) VVelox (1) davromaniak (1) metrojworthington (1) Thanks to maintainers and others that helped with pull requests this month: murrant (30) Jellyfrog (23) electrocret (21) PipoCanaja (2) RafalNiewinski (1) rcmcronny (1)","title":"23.10.0"},{"location":"General/Changelog/#feature_2","text":"Muteable acknowledged alert notifications ( #15456 ) - SourceDoctor Throttle error reporting ( #15391 ) - murrant Deprecate poller.php ( #15370 ) - murrant","title":"Feature"},{"location":"General/Changelog/#security_2","text":"Fix MAC search sql injection ( #15402 ) - murrant Validate secure cookies ( #15401 ) - murrant Fix xss in device groups overview ( #15399 ) - murrant Update Tnmsne table backend ( #15384 ) - murrant Fix unescaped output in ipv6 search page ( #15327 ) - murrant","title":"Security"},{"location":"General/Changelog/#device_4","text":"Fix websensor temp user_func ( #15492 ) - murrant Discover AEN with sysobjectid instead of sysdescr ( #15482 ) - fbouynot Huawei VRP AP controller fixes ( #15450 ) - murrant Timos MPLS nullables round 2 ( #15448 ) - murrant Fortimail add mail queues message count ( #15444 ) - cwispy Fix timos mpls, add checks ( #15430 ) - murrant Fix VRP polling ( #15428 ) - murrant Updating Datacom logo ( #15427 ) - lhwolfarth Moxa EDS improve discovery ( #15375 ) - murrant Fix Raisecom devices having not increasing OIDs on snmpwalk ( #15365 ) - MrShunz Aviat svg logos ( #15360 ) - murrant Add Fortinet logo ( #15359 ) - murrant Added support for Cambium cnWave60 gear ( #15358 ) - noaheroufus Added support for Cambium cnMatrix switches ( #15351 ) - noaheroufus Update Windows version naming ( #15350 ) - I-FGSD Calix logo update ( #15348 ) - murrant Calix AXOS Sensor Changes ( #15343 ) - noaheroufus Adding Active Power in Watts to APCs ( #15337 ) - Jimmy-Cl Device stulz WIB8000 ( #15271 ) - jepke Added some groups and corrected some references ( #15129 ) - rolfbergheim Add model for Christie Digital projectors ( #15088 ) - davromaniak Vmware vminfo modernize ( #15008 ) - murrant Mcc valere ( #14753 ) - metrojworthington","title":"Device"},{"location":"General/Changelog/#webui_4","text":"Do not update device IP when DNS resolution fails ( #15499 ) - murrant Fix FDB table ip addresses missing ( #15481 ) - murrant Fix bug saving snmpv3 device changes ( #15419 ) - murrant Fix graph errors ( #15407 ) - murrant Calculate downtime from device_outages table ( #15397 ) - murrant Sort services by type and name ( #15367 ) - SourceDoctor Vertically center device icons ( #15361 ) - murrant Fix BGP peer IP missing in Routing page ( #15352 ) - tim427 Fix incorrect pages offset on app ntp page ( #15349 ) - Ac0lyte Show Temperature Graphs on Smart App Overview ( #15342 ) - SourceDoctor Show never polled Information on Widget and in Device itself ( #15341 ) - SourceDoctor Show device group on device overview ( #15338 ) - SourceDoctor FDB Tables improve performance ( #15333 ) - murrant Fix some issues with admin self settings ( #15332 ) - murrant Fix eventlog debug code left in ( #15331 ) - murrant Device NAC page to Laravel Blade ( #15329 ) - PipoCanaja","title":"Webui"},{"location":"General/Changelog/#alerting_2","text":"Send event log when alert rule fails ( #15440 ) - murrant Fix Linemessagingapi class name ( #15356 ) - murrant Fix alerting find owner contacts on old SQL server versions ( #15355 ) - murrant Add alert transport for Grafana Oncall ( #15330 ) - waddles Show which host marked a device as down. ( #15209 ) - TheMysteriousX","title":"Alerting"},{"location":"General/Changelog/#graphs_3","text":"Fix rrd exists check ( #15466 ) - murrant Scale disk spezific SMART Graph from 0 ( #15339 ) - SourceDoctor","title":"Graphs"},{"location":"General/Changelog/#applications_2","text":"Unix Agent and Application fixes ( #15460 ) - murrant Adding Socket Statistics Application Support ( #15307 ) - bnerickson Update docs for osupdate when being used as a script for the agent ( #15099 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#api_4","text":"Fix API get_location by ID ( #15506 ) - murrant Allow add device to set location ( #15469 ) - murrant","title":"Api"},{"location":"General/Changelog/#settings_1","text":"Rearrange AD auth settings ( #15363 ) - murrant","title":"Settings"},{"location":"General/Changelog/#polling_1","text":"IS-IS polling handle missing data ( #15491 ) - murrant Fix polling down retry (and other items) ( #15483 ) - murrant Ports min polled period of 1 ( #15472 ) - murrant Ports module: fix nulls not updating ( #15467 ) - murrant Always create rrd folder on localhost ( #15457 ) - murrant Fix port module wrong null ( #15431 ) - murrant Fix an agent bug if a process ran more than 999 days ( #15411 ) - murrant Type safety check ( #15409 ) - murrant Add rewrites include for legacy modules ( #15405 ) - murrant Fix last polled in wrong column ( #15398 ) - murrant Fix last polled ( #15396 ) - murrant Availability module fixes ( #15369 ) - murrant","title":"Polling"},{"location":"General/Changelog/#bug_4","text":"Add Wrong Type work around to snmp_get function ( #15509 ) - peejaychilds Ospf metrics fix ( #15508 ) - murrant IP::fromHexString handle ascii ( #15504 ) - murrant Fix poller perf graph time ( #15500 ) - murrant Fix auth_ad_url validation ( #15487 ) - murrant Fix regression causing wall of ping latency ( #15486 ) - fbouynot Fix Device ip address mutator ( #15480 ) - murrant Fix Typo in FdbTablesController ( #15477 ) - electrocret Allow inserting null values for sensors ( #15470 ) - Jellyfrog Never set bgp and ports delta fields to unsigned ( #15468 ) - murrant Error when device is not found ( #15459 ) - murrant Restore _delta fields to signed ( #15458 ) - murrant Change port and BGP stats fields to unsigned ( #15449 ) - murrant Fix Top menu search on mobile respo ( #15439 ) - qwerin Packages fixes (+pacman) ( #15415 ) - murrant Fix bug in graphite ( #15393 ) - murrant Fixing Private eBGP visualization, corrected 16bit ASN private range, added 32bit ASN range ( #15357 ) - tim427 Improve \"count\" graphs for F5OS ( #15335 ) - PipoCanaja","title":"Bug"},{"location":"General/Changelog/#refactor_1","text":"Refactor MAC utilities into a single class ( #15379 ) - murrant Refactor discovery-protocols with SnmpQuery ( #15324 ) - PipoCanaja","title":"Refactor"},{"location":"General/Changelog/#cleanup_1","text":"ARP Discovery use MacHelper ( #15479 ) - electrocret Ports ifPhysAddress use MAC helper ( #15478 ) - murrant Module status cleanups ( #15461 ) - murrant Use modern device attrib handling ( #15429 ) - murrant Remove some lightly used or unused dbFacile functions ( #15418 ) - murrant Misc fixes 42 ( #15413 ) - murrant Remove snmp functions that are barely used ( #15377 ) - murrant Remove legacy addhost code ( #15376 ) - murrant Remove unused functions ( #15371 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_4","text":"Redirect old install docs ( #15505 ) - murrant Update supported OS list ( #15426 ) - Jellyfrog Documentation - Smokeping Integration in Centos - Update Smokeping.md ( #15390 ) - CTV-2023 Specify radius attributes for auth roles ( #15374 ) - barryodonovan Add unzip to all install docs dependencies ( #15354 ) - brointhemix Docs security secure session cookie ( #15328 ) - murrant Stable release update clarification ( #15326 ) - murrant Bird2 set timeformat protocols ( #15292 ) - netravnen","title":"Documentation"},{"location":"General/Changelog/#translation_1","text":"German and English typo correction ( #15503 ) - Galileo77 German translation corrected and some visual improvements added. ( #15502 ) - Galileo77 Missing device ip translation ( #15465 ) - murrant","title":"Translation"},{"location":"General/Changelog/#tests","text":"Exclude availability module from default testing ( #15462 ) - murrant","title":"Tests"},{"location":"General/Changelog/#misc_4","text":"Fixes check_dns against localhost when a search-domain is configured ( #15373 ) - tim427 Added extra ASN-range comments, added Priv eBGP on host details, changed color to light-blue instead of red ( #15372 ) - tim427","title":"Misc"},{"location":"General/Changelog/#internal-features_3","text":"Add application metrics model and relationships ( #15417 ) - murrant Error Reporting: Log instead of dump ( #15412 ) - murrant","title":"Internal Features"},{"location":"General/Changelog/#dependencies_4","text":"Bump @babel/traverse from 7.16.10 to 7.23.2 ( #15473 ) - dependabot Bump postcss from 8.4.19 to 8.4.31 ( #15380 ) - dependabot Bump composer/composer from 2.5.8 to 2.6.4 ( #15364 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2390","text":"(2023-09-15) A big thank you to the following 16 contributors this last month: murrant (33) SourceDoctor (3) VVelox (3) eskyuu (2) PipoCanaja (2) MrMoCoDev (1) electrocret (1) Pelt10 (1) LoveSkylark (1) slashdoom (1) jepke (1) hanserasmus (1) adamsweet (1) fbourqui (1) fbouynot (1) Fehler12 (1) Thanks to maintainers and others that helped with pull requests this month: murrant (10) Jellyfrog (9) electrocret (8) PipoCanaja (3) VVelox (1) cltnoc (1) ottorei (1)","title":"23.9.0"},{"location":"General/Changelog/#feature_3","text":"Additional contact options for email transports ( #15266 ) - murrant Implement RBAC (only built in roles) ( #15212 ) - murrant","title":"Feature"},{"location":"General/Changelog/#security_3","text":"Fix injection vulnerability in fdb search page ( #15315 ) - murrant Fix injection vulnerability in ports pages ( #15314 ) - murrant Fix another addcslashes incorrect escape in eventlog ( #15313 ) - murrant Fix another injection in ipv4 search page ( #15312 ) - murrant Fix injection in search pages ipv4, etc ( #15311 ) - murrant Fix improperly escaped output in outages page ( #15310 ) - murrant","title":"Security"},{"location":"General/Changelog/#device_5","text":"Fix smartos-dcp-m.yaml ( #15295 ) - electrocret Use mtxrGaugeTable instead of mtxrHealthGroup ( #15289 ) - murrant Added support for Nutanix VM count, disk state, CPU usage and RAM usage ( #15252 ) - eskyuu Initial support for f5os ( #15241 ) - fbouynot","title":"Device"},{"location":"General/Changelog/#webui_5","text":"Fix login page HTML ( #15321 ) - murrant Fix device display name in top interfaces widget ( #15319 ) - murrant Timezone, fix user set no timezone ( #15296 ) - murrant Availability Map: Show ignored device up when up ( #15283 ) - SourceDoctor Custom ssh,telnet port with oxidized ( #15255 ) - jepke WebUI Services, generate more compact table ( #15243 ) - fbourqui Added empty string check ( #15235 ) - Fehler12 Use full name for vendor_oui ( #15234 ) - PipoCanaja Add global NAC page ( #15228 ) - PipoCanaja","title":"Webui"},{"location":"General/Changelog/#alerting_3","text":"Fix error when mail-contact is missing ( #15305 ) - murrant Hide token, keys and passwords in Transports ( #15274 ) - LoveSkylark","title":"Alerting"},{"location":"General/Changelog/#applications_3","text":"For the applications table set the defaults for app_instance and app_instance to '' ( #15278 ) - VVelox Application Soft Delete ( #15270 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#api_5","text":"Allow port search API to search ifAlias again ( #15320 ) - murrant Fix API availability graph duration ( #15250 ) - murrant","title":"Api"},{"location":"General/Changelog/#settings_2","text":"Add ui description for reporting dump_errors ( #15264 ) - murrant","title":"Settings"},{"location":"General/Changelog/#polling_2","text":"Fix port ifAlias polling ( #15279 ) - murrant Fix ifSpeed override not being applied ( #15237 ) - murrant","title":"Polling"},{"location":"General/Changelog/#authentication_3","text":"ADAuthorizer auth skip count entry ( #15322 ) - murrant Radius enforce roles ( #15294 ) - murrant","title":"Authentication"},{"location":"General/Changelog/#bug_5","text":"FIX TP-Link JetStream 3.0.0 Build 20180511 Rel.36491(s) T1500-28PCT 3.0 ( #15318 ) - MrMoCoDev Fix issue with rrdcached application and bad input ( #15301 ) - murrant Fix .env quoting issue ( #15298 ) - murrant Fix typo in default mibs for SnmpQuery ( #15297 ) - murrant Readd missing key ( #15291 ) - SourceDoctor Fix missing keys for new status ( #15284 ) - SourceDoctor Revert \"Added empty string check\" ( #15249 ) - murrant Fix manual port speed storage ( #15238 ) - murrant Make the service template controller re-evaluate dynamic membership when apply all button is pushed ( #15214 ) - eskyuu","title":"Bug"},{"location":"General/Changelog/#cleanup_2","text":"Return an 5XX error when an exception is raise ( #15285 ) - Pelt10","title":"Cleanup"},{"location":"General/Changelog/#documentation_5","text":"Note the package install command for dhcpd-pools for FreeBSD ( #15247 ) - VVelox Update severity colours in SNMP-Traps.md ( #15244 ) - adamsweet","title":"Documentation"},{"location":"General/Changelog/#misc_5","text":"Another OR statement in GrayLog API ( #15246 ) - hanserasmus Dispatcher option to log output ( #15230 ) - murrant","title":"Misc"},{"location":"General/Changelog/#2380","text":"(2023-08-19) A big thank you to the following 32 contributors this last month: murrant (31) VVelox (5) Jellyfrog (4) electrocret (4) santiag0z (3) laf (3) viptampa (3) arjenz (2) knpo (1) WhiteyDude (1) jacobw (1) jepke (1) sjtarik (1) pjordanovic (1) Schouwenburg (1) eggbeater98 (1) i4networks (1) fbourqui (1) hirose003 (1) richard-ririe (1) robje (1) peejaychilds (1) bonzo81 (1) slashdoom (1) eskyuu (1) j796160836 (1) TheMysteriousX (1) VirTechSystems (1) fufroma (1) zappiehost (1) jgelinas (1) mwobst (1) Thanks to maintainers and others that helped with pull requests this month: murrant (26) Jellyfrog (25) electrocret (23) PipoCanaja (3) laf (2) VVelox (2) ottorei (1) streamthing (1)","title":"23.8.0"},{"location":"General/Changelog/#feature_4","text":"Add FDB table vendor search drop down ( #15072 ) - bonzo81 Port_error_perc macro ( #15016 ) - electrocret","title":"Feature"},{"location":"General/Changelog/#security_4","text":"Fix unsanitized input injection ( #15184 ) - murrant Fix some xss injection for sysLocation and some other fields ( #15183 ) - murrant","title":"Security"},{"location":"General/Changelog/#device_6","text":"Fix version comparison for RouterOS ( #15227 ) - knpo Netscaler, don't use 0 divisor ( #15204 ) - murrant Update Alpine Linux logos to SVG ( #15185 ) - murrant APC new sensors and fix ( #15179 ) - jepke Add SHARP BP series of devices ( #15169 ) - pjordanovic Fix Timos SAR Cellular RSRP and RSSI sensors ( #15163 ) - Schouwenburg Update bgp-peers.inc.php for timos ( #15154 ) - i4networks Fortigate ipv6 ipsec ( #15150 ) - fbourqui Add Calix E7 (EXA) PON port sensors ( #15145 ) - murrant Add os check in discovery for aix/freenas storage and cisco cdp ( #15104 ) - peejaychilds Add VLAN Discovery for arubaos-cx ( #15055 ) - slashdoom Openmanage enterprise modular ( #14408 ) - jgelinas","title":"Device"},{"location":"General/Changelog/#webui_6","text":"Fixed CSS error causing generic image widgets not to do height correctly ( #15220 ) - WhiteyDude Fix error when there is an untranslated sensor type ( #15176 ) - murrant Fix select2 search field focus ( #15171 ) - murrant Update text color in dark.css ( #15155 ) - eggbeater98","title":"Webui"},{"location":"General/Changelog/#alerting_4","text":"Discord Transport user configurable embed fields ( #15068 ) - murrant Implement LINE Messaging API ( #14867 ) - j796160836","title":"Alerting"},{"location":"General/Changelog/#graphs_4","text":"Fix Memmory spelling ( #15231 ) - arjenz Add generic stats graph munging support and make uptime display as days again ( #15097 ) - VVelox","title":"Graphs"},{"location":"General/Changelog/#applications_4","text":"Add the Mojo CAPE Submit app ( #15140 ) - VVelox Logsize monitoring for LibreNMS ( #15137 ) - VVelox Update SMART monitoring to the use JSON ( #15132 ) - VVelox Add a flag for adding app data to tests generated via scripts/json-app-tool.php ( #15080 ) - VVelox Add BIRD2 BGP Peers application support ( #14466 ) - zappiehost","title":"Applications"},{"location":"General/Changelog/#billing_1","text":"Fixed a zero value data insertion for billing ( #15194 ) - laf Updated poll-billing.php to only query for data via snmp when the device and port are both up ( #15164 ) - laf Added basic support for distributing billing ( #15156 ) - laf","title":"Billing"},{"location":"General/Changelog/#api_6","text":"Add API endpoint to get service graphs ( #15138 ) - richard-ririe API get_location ( #14779 ) - VirTechSystems","title":"Api"},{"location":"General/Changelog/#discovery_4","text":"Always mark device last_discovered ( #15218 ) - murrant","title":"Discovery"},{"location":"General/Changelog/#polling_3","text":"Allow dispatcher service master timeout to be set ( #15161 ) - murrant Fix fping 4.0+ prefers IPv6 ( #14825 ) - TheMysteriousX Add module support for wrapper script calls ( #14055 ) - mwobst","title":"Polling"},{"location":"General/Changelog/#authentication_4","text":"Remove user_id cast to int ( #15205 ) - jacobw","title":"Authentication"},{"location":"General/Changelog/#bug_6","text":"Print a useful error if logfile is not writable ( #15233 ) - murrant Make the installer use the schema dump ( #15211 ) - Jellyfrog Change leaflet.default_zoom to Float ( #15207 ) - electrocret Handle empty dbSchema table ( #15198 ) - murrant Fix timezone controller bad return ( #15191 ) - murrant Graylog API properly throw errors ( #15188 ) - murrant Fixing the mac/vendor database download from wireshark, updated file \u2026 ( #15175 ) - sjtarik Fix alert.macros.rule ( #15172 ) - electrocret Miscellaneous fixes ( #15162 ) - murrant Change display query of list_devices to pattern match ( #15147 ) - hirose003 Change rrd_prune find command to exlcude .gitignore ( #15134 ) - robje Apply service templates on a per-device basis ( #15024 ) - eskyuu RFC1628 - Force cast on some values before doing arithmetic ( #14613 ) - fufroma","title":"Bug"},{"location":"General/Changelog/#refactor_2","text":"Fix sensor discovery fetch issue ( #15193 ) - murrant MAC Vendor OUI use scheduler ( #15187 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#cleanup_3","text":"Misc fixes 2 ( #15190 ) - murrant Severity Enum ( #14620 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_6","text":"[DOC] Added social links in footer ( #15195 ) - santiag0z OS discovery clarification ( #15182 ) - murrant [DOC] Remove ~$ from BIND9 code block aka named ( #15181 ) - santiag0z Fix settings titles in dark mode ( #15174 ) - murrant Update Routeros.md ( #15165 ) - viptampa Update Routeros.md ( #15160 ) - viptampa RouterOS Vlan agent script clarification ( #15158 ) - viptampa Fix bad link in Install-LibreNMS.md ( #15152 ) - arjenz","title":"Documentation"},{"location":"General/Changelog/#tests_1","text":"Only dump snmp logs on failure ( #15200 ) - murrant","title":"Tests"},{"location":"General/Changelog/#misc_6","text":"Use Laravel schema migration command directly ( #14039 ) - Jellyfrog","title":"Misc"},{"location":"General/Changelog/#internal-features_4","text":"Set mibs explicitly in SnmpQuery ( #15199 ) - murrant Editor yaml indent fine tuning ( #15189 ) - murrant","title":"Internal Features"},{"location":"General/Changelog/#dependencies_5","text":"Update composer dependencies ( #15167 ) - Jellyfrog Update Ziggy ( #15151 ) - murrant Dependency Updates ( #15149 ) - murrant","title":"Dependencies"},{"location":"General/Changelog/#2370","text":"(2023-07-16) A big thank you to the following 19 contributors this last month: peejaychilds (4) tuxgasy (3) murrant (3) jepke (2) VVelox (2) laf (1) PipoCanaja (1) eggbeater98 (1) illogik (1) elianmanzueta (1) peelman (1) Blinq-SanderBlom (1) vincent5753 (1) electrocret (1) mtentilucci (1) edgesite (1) davromaniak (1) TheMysteriousX (1) sjtarik (1) Thanks to maintainers and others that helped with pull requests this month: murrant (12) electrocret (6) Jellyfrog (6) ottorei (4) laf (3) PipoCanaja (1) FadhliRais (1) VVelox (1) PJGuyTen (1)","title":"23.7.0"},{"location":"General/Changelog/#device_7","text":"Fix MPLS Tab Display for Nokia devices using LDP and not RSVP ( #15128 ) - peelman Change state value for unplugged linecard ( #15126 ) - Blinq-SanderBlom Convert several JunOS sensors to yaml ( #15118 ) - murrant Update Trellix NSP discovery ( #15117 ) - mtentilucci APC new sensors ( #15090 ) - jepke Add regex for Supermicro switches running firmware 2.0 or newer, now called \"SuperSwitch\" ( #15083 ) - davromaniak Add support for PrimeKey Software Appliance ( #15059 ) - TheMysteriousX","title":"Device"},{"location":"General/Changelog/#webui_7","text":"Update Dark theme for readability on availability map ( #15141 ) - eggbeater98 Add Oxidized search clarification ( #15124 ) - electrocret Sort port by interface name while list ports. ( #15093 ) - edgesite","title":"Webui"},{"location":"General/Changelog/#alerting_5","text":"Alert transport slack config fixes ( #15131 ) - illogik Transport Messagebird voice message API ( #15115 ) - jepke","title":"Alerting"},{"location":"General/Changelog/#applications_5","text":"Add Privoxy stats support ( #15114 ) - VVelox Add Suricata Extract submission stats app ( #15105 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#api_7","text":"Adding human readable version of /api/v0/fdb/{mac}/detail ( #15045 ) - sjtarik","title":"Api"},{"location":"General/Changelog/#discovery_5","text":"Fix bogus reply from snmpwalk in ipNetToPhysicalPhysAddress ( #15142 ) - PipoCanaja","title":"Discovery"},{"location":"General/Changelog/#polling_4","text":"Fix for hrStorageIndex agility ( #15028 ) - peejaychilds","title":"Polling"},{"location":"General/Changelog/#bug_7","text":"Skip hostnames which are blank when generating the smokeping config ( #15144 ) - laf Change chunk to chunkById ( #15139 ) - peejaychilds Use lock ports_purge in ports_purge rather than syslog_purge lock ( #15135 ) - peejaychilds Fix validation: memcached required only if it is configured in .env ( #15122 ) - tuxgasy Exit non-zero if composer bin not found ( #15120 ) - tuxgasy","title":"Bug"},{"location":"General/Changelog/#documentation_7","text":"Update openwrt doc following PR #15096 ( #15119 ) - tuxgasy","title":"Documentation"},{"location":"General/Changelog/#translation_2","text":"Fix typo in delhost.inc.php ( #15130 ) - elianmanzueta Added missing zh-tw translation. ( #15125 ) - vincent5753","title":"Translation"},{"location":"General/Changelog/#internal-features_5","text":"Yaml value filling improvements ( #15116 ) - murrant","title":"Internal Features"},{"location":"General/Changelog/#2360","text":"(2023-06-23) A big thank you to the following 14 contributors this last month: VVelox (4) Jellyfrog (4) murrant (2) si458 (1) netravnen (1) tuxgasy (1) jepke (1) ajsiersema (1) wrongecho (1) peejaychilds (1) tim427 (1) kg6uyz (1) d-k-7 (1) electrocret (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (9) murrant (6) electrocret (4) ottorei (2)","title":"23.6.0"},{"location":"General/Changelog/#feature_5","text":"Alert transport cleanup, no_proxy support and other proxy cleanups ( #14763 ) - murrant","title":"Feature"},{"location":"General/Changelog/#device_8","text":"Improve OpenWRT detection ( #15096 ) - tuxgasy TEG-S50ES and TPE-P521ES device detection ( #15052 ) - kg6uyz Add sensor support for cefcModuleOperStatus ( #15026 ) - d-k-7 Extend Avocent Support ( #14914 ) - electrocret","title":"Device"},{"location":"General/Changelog/#alerting_6","text":"Messagebird transport ( #15079 ) - jepke Remove asterisk from recurring input ( #15074 ) - wrongecho Fix syslog transport output format ( #15070 ) - peejaychilds Fixed Markdown/Parse mode for Telegram ( #15066 ) - tim427","title":"Alerting"},{"location":"General/Changelog/#applications_6","text":"Add ZFS L2 support ( #15095 ) - VVelox Add Linux Softnet Stat app ( #15094 ) - VVelox Add Sneck support, making it very trivial to use Nagios style checks in a NRPE like manner ( #13954 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#bug_8","text":"Fixes #14975 Services in Device Groups not displayed correctly in Availability widget ( #15076 ) - ajsiersema Fix Dusk tests after 13626 ( #15057 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#cleanup_4","text":"Add AllowDynamicProperties to DynamicConfigItem ( #15058 ) - Jellyfrog","title":"Cleanup"},{"location":"General/Changelog/#documentation_8","text":"Add archlinux example ( #15113 ) - si458 Fix minor typo in Applications.md ( #15111 ) - VVelox","title":"Documentation"},{"location":"General/Changelog/#mibs_3","text":"Update MIKROTIK-MIB to v7.10 release ( #15110 ) - netravnen","title":"Mibs"},{"location":"General/Changelog/#dependencies_6","text":"Laravel 10.x Shift ( #14995 ) - Jellyfrog","title":"Dependencies"},{"location":"General/Changelog/#2350","text":"(2023-05-19) A big thank you to the following 37 contributors this last month: murrant (29) Jellyfrog (6) mtentilucci (5) peelman (4) electrocret (4) laf (3) cjsoftuk (3) alchemyx (2) Bierchermuesli (2) bakerds (2) mpikzink (2) TheMysteriousX (2) QuadPiece (1) elipsion (1) etiennewan (1) jlo-lirmm (1) dscw (1) fbouynot (1) santiag0z (1) dependabot (1) VoipTelCH (1) otkd (1) ajsiersema (1) JStandiford (1) PipoCanaja (1) arjenz (1) maticomba (1) SourceDoctor (1) pjroehl (1) cjwbath (1) MajesticFalcon (1) bnerickson (1) bestlong (1) Olen (1) mboehn (1) ollb (1) eskyuu (1) Thanks to maintainers and others that helped with pull requests this month: murrant (47) electrocret (18) Jellyfrog (16) ottorei (1) PipoCanaja (1) JohnnyBBravo (1)","title":"23.5.0"},{"location":"General/Changelog/#feature_6","text":"Set focus to Global Search on Ctrl-F ( #14947 ) - Bierchermuesli Add link to hosts mgmt (ipmi) interface ( #14905 ) - mpikzink Implement authentication for Redis/Sentinel ( #14805 ) - TheMysteriousX","title":"Feature"},{"location":"General/Changelog/#security_5","text":"Convert the inventory page to Laravel ( #15004 ) - murrant","title":"Security"},{"location":"General/Changelog/#device_9","text":"Add RoomAlert 12E Switch Sensors, fix Humidity Sensor ( #15049 ) - peelman Fix WISI over graphs ( #15040 ) - peelman Fix inventory display for Calix AXOS devices ( #15039 ) - peelman Map GPS lat and lon to os module ( #15033 ) - QuadPiece Firebrick CPU Monitoring ( #15030 ) - cjsoftuk Fix Firebrick mempool polling ( #15022 ) - cjsoftuk Add support for memory monitoring on Firebrick platform ( #15021 ) - cjsoftuk Fix vsolution discovery yaml ( #14970 ) - murrant Fix tait tnadmin processors ( #14969 ) - murrant Fix Raisecom Processor ( #14968 ) - murrant Fix Raisecom ROS processor collection ( #14966 ) - murrant Add support for Trellix ATD devices ( #14965 ) - mtentilucci Add support for Trellix NSP devices ( #14964 ) - mtentilucci Cisco QFP polling fixes ( #14961 ) - Bierchermuesli Add version, hardware and serial collection ( #14956 ) - JStandiford Add Rubrik Discovery ( #14951 ) - mtentilucci Add Nutanix AOS discovery ( #14950 ) - mtentilucci RouterOS runtime quirk on first discovery ( #14945 ) - murrant Added sensor support for older APC InfraStruXure PDUs ( #14944 ) - bakerds Expand discovery of gigavue os ( #14933 ) - mtentilucci Add discovery of NVT Phybridge FLEX24 ( #14913 ) - pjroehl Add initial OS detection for LoadBalancer.org ( #14902 ) - cjwbath Added graphing of DDoS-protection related OIDs for PAN-OS ( #14847 ) - bakerds Add support for Alpha CXC HP Controller ( #14829 ) - MajesticFalcon Change ESXi port naming to be stable ( #14639 ) - TheMysteriousX Add advantech icr-os for advantech routers ( #14171 ) - mboehn Fix cisco dbm sensors port link on discovery (NCS55A2) ( #13965 ) - ollb","title":"Device"},{"location":"General/Changelog/#webui_8","text":"Ondemand popup graphs ( #15050 ) - murrant Add a global setting for Ctrl-F focus (improve #14947) ( #15023 ) - etiennewan [About] Link to LinkedIn ( #14991 ) - santiag0z Clarify Alert Notify Settings ( #14974 ) - electrocret Fix Legacy vars Processing ( #14967 ) - murrant Correct PowerConsumed SI Units in Overview ( #14425 ) - mpikzink Added support for user timezones and user browser timezone by default (incomplete) ( #13626 ) - eskyuu","title":"Webui"},{"location":"General/Changelog/#alerting_7","text":"Fix undefined array key ( #15025 ) - Jellyfrog","title":"Alerting"},{"location":"General/Changelog/#graphs_5","text":"Php implode arg mismatch ( #15014 ) - jlo-lirmm Fix availability graphs to 100% ( #15013 ) - laf Fix scale_rigid accidentally being set to false ( #14992 ) - murrant Set device ping_perf scale_min to 0 ( #14989 ) - murrant Poller perf: add per device average ( #14940 ) - murrant Stacked graphs on zoom to speed ( #14928 ) - electrocret","title":"Graphs"},{"location":"General/Changelog/#applications_7","text":"Adding linux_config_files application support ( #14776 ) - bnerickson Agent support OS Updates ( #14687 ) - bestlong","title":"Applications"},{"location":"General/Changelog/#api_8","text":"Allow device ignore to be set via API ( #14985 ) - electrocret Enable disabling a device via api ( #14983 ) - VoipTelCH","title":"Api"},{"location":"General/Changelog/#discovery_6","text":"Snmp-scan filter for dns resolved devices ( #14934 ) - SourceDoctor","title":"Discovery"},{"location":"General/Changelog/#polling_5","text":"Fixes #14957 missing IPv6 BGP peers ( #14959 ) - ajsiersema Fix SnmpQuery and max_oid ( #14955 ) - murrant","title":"Polling"},{"location":"General/Changelog/#bug_9","text":"Fix timetaken columns too small ( #15042 ) - murrant Fix some undefined constants ( #14993 ) - murrant Fix routes after Laravel9 ( #14977 ) - Jellyfrog Fix more divide by zero issues ( #14954 ) - murrant Bug - wrong type in ports.inc.php ( #14952 ) - PipoCanaja Solves error in discovering services module ( #14939 ) - maticomba Ensure irc fifo-file is shared between dispatcher and core containers ( #14647 ) - Olen","title":"Bug"},{"location":"General/Changelog/#refactor_3","text":"Add a validation for checking if the scheduler is running ( #14987 ) - Jellyfrog Refactor billing ( #14979 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#cleanup_5","text":"Remove old unused adduser page and script ( #15035 ) - murrant Adopt anonymous migrations ( #15005 ) - Jellyfrog Remove unused port fields ( #14963 ) - murrant Cleanup enable bgp setting ( #14931 ) - electrocret","title":"Cleanup"},{"location":"General/Changelog/#documentation_9","text":"Re-add the Ubuntu Image page and links ( #15041 ) - laf Remove references to VM images ( #15031 ) - murrant Updated WebUI config options in docs to support direct linking to installs ( #15009 ) - laf Fix spelling error in Graylog section ( #15002 ) - dscw Update OAuth-SAML.md to prevent http code 419 error ( #15000 ) - fbouynot Update Smokeping.md with better nginx config instructions ( #14999 ) - alchemyx Update Copyright year to 2023 in README.md ( #14972 ) - otkd Update Install-LibreNMS.md ( #14949 ) - alchemyx","title":"Documentation"},{"location":"General/Changelog/#tests_2","text":"Reduce OS module test noise ( #15046 ) - murrant Test PHP 8.2 and MariaDB 10.11 ( #15007 ) - murrant Slightly better OS module test output ( #15001 ) - murrant Fix a bug when creating test data; if a community contained the strin\u2026 ( #14739 ) - peelman","title":"Tests"},{"location":"General/Changelog/#mibs_4","text":"Bump VMware MIBs ( #15029 ) - elipsion","title":"Mibs"},{"location":"General/Changelog/#dependencies_7","text":"Bump guzzlehttp/psr7 from 2.4.4 to 2.5.0 ( #14986 ) - dependabot Laravel 9.x Shift ( #14504 ) - Jellyfrog","title":"Dependencies"},{"location":"General/Changelog/#2350_1","text":"(2023-05-19) A big thank you to the following 37 contributors this last month: murrant (29) Jellyfrog (6) mtentilucci (5) peelman (4) electrocret (4) laf (3) cjsoftuk (3) alchemyx (2) Bierchermuesli (2) bakerds (2) mpikzink (2) TheMysteriousX (2) QuadPiece (1) elipsion (1) etiennewan (1) jlo-lirmm (1) dscw (1) fbouynot (1) santiag0z (1) dependabot (1) VoipTelCH (1) otkd (1) ajsiersema (1) JStandiford (1) PipoCanaja (1) arjenz (1) maticomba (1) SourceDoctor (1) pjroehl (1) cjwbath (1) MajesticFalcon (1) bnerickson (1) bestlong (1) Olen (1) mboehn (1) ollb (1) eskyuu (1) Thanks to maintainers and others that helped with pull requests this month: murrant (47) electrocret (18) Jellyfrog (16) ottorei (1) PipoCanaja (1) JohnnyBBravo (1)","title":"23.5.0"},{"location":"General/Changelog/#feature_7","text":"Set focus to Global Search on Ctrl-F ( #14947 ) - Bierchermuesli Add link to hosts mgmt (ipmi) interface ( #14905 ) - mpikzink","title":"Feature"},{"location":"General/Changelog/#security_6","text":"Convert the inventory page to Laravel ( #15004 ) - murrant","title":"Security"},{"location":"General/Changelog/#device_10","text":"Add RoomAlert 12E Switch Sensors, fix Humidity Sensor ( #15049 ) - peelman Fix WISI over graphs ( #15040 ) - peelman Fix inventory display for Calix AXOS devices ( #15039 ) - peelman Map GPS lat and lon to os module ( #15033 ) - QuadPiece Fix vsolution discovery yaml ( #14970 ) - murrant Fix tait tnadmin processors ( #14969 ) - murrant Fix Raisecom Processor ( #14968 ) - murrant Fix Raisecom ROS processor collection ( #14966 ) - murrant Add support for Trellix ATD devices ( #14965 ) - mtentilucci Add support for Trellix NSP devices ( #14964 ) - mtentilucci Cisco QFP polling fixes ( #14961 ) - Bierchermuesli Add version, hardware and serial collection ( #14956 ) - JStandiford Add Rubrik Discovery ( #14951 ) - mtentilucci Add Nutanix AOS discovery ( #14950 ) - mtentilucci RouterOS runtime quirk on first discovery ( #14945 ) - murrant Added sensor support for older APC InfraStruXure PDUs ( #14944 ) - bakerds Expand discovery of gigavue os ( #14933 ) - mtentilucci Add discovery of NVT Phybridge FLEX24 ( #14913 ) - pjroehl Add initial OS detection for LoadBalancer.org ( #14902 ) - cjwbath Added graphing of DDoS-protection related OIDs for PAN-OS ( #14847 ) - bakerds Add support for Alpha CXC HP Controller ( #14829 ) - MajesticFalcon Add advantech icr-os for advantech routers ( #14171 ) - mboehn Fix cisco dbm sensors port link on discovery (NCS55A2) ( #13965 ) - ollb","title":"Device"},{"location":"General/Changelog/#webui_9","text":"Ondemand popup graphs ( #15050 ) - murrant Clarify Alert Notify Settings ( #14974 ) - electrocret Fix Legacy vars Processing ( #14967 ) - murrant Correct PowerConsumed SI Units in Overview ( #14425 ) - mpikzink Added support for user timezones and user browser timezone by default (incomplete) ( #13626 ) - eskyuu","title":"Webui"},{"location":"General/Changelog/#alerting_8","text":"Fix undefined array key ( #15025 ) - Jellyfrog","title":"Alerting"},{"location":"General/Changelog/#graphs_6","text":"Php implode arg mismatch ( #15014 ) - jlo-lirmm Fix availability graphs to 100% ( #15013 ) - laf Fix scale_rigid accidentally being set to false ( #14992 ) - murrant Set device ping_perf scale_min to 0 ( #14989 ) - murrant Poller perf: add per device average ( #14940 ) - murrant Stacked graphs on zoom to speed ( #14928 ) - electrocret","title":"Graphs"},{"location":"General/Changelog/#applications_8","text":"Agent support OS Updates ( #14687 ) - bestlong","title":"Applications"},{"location":"General/Changelog/#api_9","text":"Allow device ignore to be set via API ( #14985 ) - electrocret Enable disabling a device via api ( #14983 ) - VoipTelCH","title":"Api"},{"location":"General/Changelog/#discovery_7","text":"Snmp-scan filter for dns resolved devices ( #14934 ) - SourceDoctor","title":"Discovery"},{"location":"General/Changelog/#polling_6","text":"Fixes #14957 missing IPv6 BGP peers ( #14959 ) - ajsiersema Fix SnmpQuery and max_oid ( #14955 ) - murrant","title":"Polling"},{"location":"General/Changelog/#bug_10","text":"Fix timetaken columns too small ( #15042 ) - murrant Fix some undefined constants ( #14993 ) - murrant Fix routes after Laravel9 ( #14977 ) - Jellyfrog Fix more divide by zero issues ( #14954 ) - murrant Bug - wrong type in ports.inc.php ( #14952 ) - PipoCanaja Solves error in discovering services module ( #14939 ) - maticomba","title":"Bug"},{"location":"General/Changelog/#refactor_4","text":"Add a validation for checking if the scheduler is running ( #14987 ) - Jellyfrog Refactor billing ( #14979 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#cleanup_6","text":"Remove old unused adduser page and script ( #15035 ) - murrant Remove unused port fields ( #14963 ) - murrant Cleanup enable bgp setting ( #14931 ) - electrocret","title":"Cleanup"},{"location":"General/Changelog/#documentation_10","text":"Re-add the Ubuntu Image page and links ( #15041 ) - laf Remove references to VM images ( #15031 ) - murrant Updated WebUI config options in docs to support direct linking to installs ( #15009 ) - laf Fix spelling error in Graylog section ( #15002 ) - dscw Update OAuth-SAML.md to prevent http code 419 error ( #15000 ) - fbouynot Update Smokeping.md with better nginx config instructions ( #14999 ) - alchemyx Update Copyright year to 2023 in README.md ( #14972 ) - otkd Update Install-LibreNMS.md ( #14949 ) - alchemyx","title":"Documentation"},{"location":"General/Changelog/#tests_3","text":"Reduce OS module test noise ( #15046 ) - murrant Test PHP 8.2 and MariaDB 10.11 ( #15007 ) - murrant Slightly better OS module test output ( #15001 ) - murrant Fix a bug when creating test data; if a community contained the strin\u2026 ( #14739 ) - peelman","title":"Tests"},{"location":"General/Changelog/#misc_7","text":"Firebrick CPU Monitoring ( #15030 ) - cjsoftuk Add a global setting for Ctrl-F focus (improve #14947) ( #15023 ) - etiennewan Fix Firebrick mempool polling ( #15022 ) - cjsoftuk Add support for memory monitoring on Firebrick platform ( #15021 ) - cjsoftuk Adopt anonymous migrations ( #15005 ) - Jellyfrog [About] Link to LinkedIn ( #14991 ) - santiag0z Implement authentication for Redis/Sentinel ( #14805 ) - TheMysteriousX Adding linux_config_files application support ( #14776 ) - bnerickson Ensure irc fifo-file is shared between dispatcher and core containers ( #14647 ) - Olen Change ESXi port naming to be stable ( #14639 ) - TheMysteriousX Laravel 9.x Shift ( #14504 ) - Jellyfrog","title":"Misc"},{"location":"General/Changelog/#mibs_5","text":"Bump VMware MIBs ( #15029 ) - elipsion","title":"Mibs"},{"location":"General/Changelog/#dependencies_8","text":"Bump guzzlehttp/psr7 from 2.4.4 to 2.5.0 ( #14986 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2340","text":"(2023-04-06) A big thank you to the following 25 contributors this last month: electrocret (8) VVelox (6) Jellyfrog (5) mtentilucci (4) Bierchermuesli (3) murrant (2) GeantRA (2) mwobst (2) dependabot (2) not-known (2) torbeckattsp (1) d-k-7 (1) arjenz (1) kirk444 (1) robje (1) pjroehl (1) peejaychilds (1) lukeofthetauri (1) fbouynot (1) bakerds (1) westerterp (1) peelman (1) jellejans (1) LoveSkylark (1) hvanoch (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (31) murrant (14) ottorei (6) electrocret (3) PipoCanaja (1)","title":"23.4.0"},{"location":"General/Changelog/#feature_8","text":"Indicator on Port Notes tab when Port has notes ( #14923 ) - electrocret Syslog sink over http for logstash (or any json source) ( #14424 ) - Bierchermuesli","title":"Feature"},{"location":"General/Changelog/#device_11","text":"Update hikvision camera detection ( #14943 ) - torbeckattsp APC UPS UIO sensor discovery bug ( #14942 ) - d-k-7 Add additional MOS / 7130 devices ( #14922 ) - kirk444 Add support for WTI console products ( #14920 ) - robje Update junos discovery yaml to reference total memory instead of buff\u2026 ( #14919 ) - GeantRA Add support for Trellix FireEye OS ( #14908 ) - mtentilucci Added cisco FTD 1150 to ftd.yaml ( #14907 ) - pjroehl Add more OIDs for determining hardware and serial attributes correctly ( #14904 ) - mwobst Add Cisco FTD Support for security appliances (x3) ( #14893 ) - mwobst Update test data to account for new vertiv.svg icon ( #14892 ) - mtentilucci Improve Corero CMS support ( #14876 ) - electrocret Add Avocent MergePoint Unity KVM Switch Support ( #14874 ) - mtentilucci Add Fortigate Webfilter stats ( #14873 ) - electrocret Add Cisco Firepower 4112 Support ( #14872 ) - lukeofthetauri Added PoE controller load and status sensors for Junos devices ( #14868 ) - bakerds Add Montclair EDFA Support ( #14852 ) - peelman Device - Add support for Scalance SC646-2C ( #14835 ) - jellejans Add Fortigate packet loss monitoring for Link-Monitor and SD-WAN ( #14828 ) - not-known Refactored Juniper SLA to include support for TWAMP and remove ambigu\u2026 ( #14787 ) - GeantRA Deltanet Lambdatrail LT2-S,HS ( #14661 ) - Bierchermuesli Add support for Battery Recommended Days Remaining ( #14653 ) - Jellyfrog","title":"Device"},{"location":"General/Changelog/#webui_10","text":"Pseudowires refresh ( #14882 ) - Bierchermuesli","title":"Webui"},{"location":"General/Changelog/#alerting_9","text":"Jira transport: use template title ( #14883 ) - not-known Remove Time Elapsed extra space ( #14880 ) - electrocret Fix Alertlog messaging ( #14861 ) - electrocret","title":"Alerting"},{"location":"General/Changelog/#graphs_7","text":"Add graph_stat_percentile_disable config item to disable percentile lines/value printing ( #14887 ) - VVelox Convert NTP freq to use generic_stats ( #14834 ) - VVelox Update fail2ban to have better stat graphs and and fix generic_stats graph.php ( #14818 ) - VVelox Update various device graphs to to have better stats ( #14815 ) - VVelox","title":"Graphs"},{"location":"General/Changelog/#applications_9","text":"Add more docker stats ( #14767 ) - hvanoch","title":"Applications"},{"location":"General/Changelog/#bug_11","text":"SnmpQuery, respect snmp.max_oid ( #14894 ) - murrant Add poller_groups (served) to the poller_cluster table ( #14886 ) - peejaychilds Actually use the stats graph for ntp-server_freq now, which as missed in #14834 ( #14884 ) - VVelox Add type checking to generic_stats.inc.php for $vars['to'] and $vars['from'] ( #14871 ) - VVelox Fix graphs for a search query ( #14864 ) - westerterp Fix interface parse unsets ( #14860 ) - electrocret Fix dbm calculation to return -60 instead of 0 ( #14858 ) - electrocret","title":"Bug"},{"location":"General/Changelog/#cleanup_7","text":"Store empty user_func as null ( #14900 ) - Jellyfrog","title":"Cleanup"},{"location":"General/Changelog/#documentation_11","text":"Fix typo in lnms device:add help ( #14937 ) - arjenz Add Azure example configuration for SAML authentication in documentation ( #14870 ) - fbouynot","title":"Documentation"},{"location":"General/Changelog/#tests_4","text":"Re-throw exceptions if we're in CI ( #14890 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#misc_8","text":"Reorder check_icmp command to follow documented usage ( #14910 ) - mtentilucci Add multi-PR GitHub-apply ( #14875 ) - electrocret Allows GEO lookup with detailed internal Location information wrapped inside parentheses. ( #14799 ) - LoveSkylark","title":"Misc"},{"location":"General/Changelog/#dependencies_9","text":"PHP dependency update ( #14927 ) - murrant Bump phpseclib/phpseclib from 3.0.18 to 3.0.19 ( #14903 ) - dependabot Bump webpack from 5.66.0 to 5.76.1 ( #14901 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2240","text":"(2023-04-06) A big thank you to the following 180 contributors this last month: murrant (230) Jellyfrog (73) electrocret (29) PipoCanaja (25) fbouynot (24) VVelox (21) Npeca75 (17) dependabot (15) bnerickson (11) gs-kamnas (10) bonzo81 (8) santiag0z (8) rhinoau (8) mwobst (7) Martin22 (7) westerterp (6) peelman (6) laf (6) LoveSkylark (5) TheMysteriousX (5) SourceDoctor (5) KayckMatias (5) mtentilucci (4) not-known (4) Bierchermuesli (4) hanserasmus (4) noaheroufus (4) opalivan (4) geg347 (4) ottorei (4) Fehler12 (4) ppasserini (4) tim427 (3) fcqpl (3) kimhaak (3) luc-ass (3) bp0 (3) loopodoopo (3) earendilfr (3) bl3nd3r (3) charlyforot (3) GeantRA (2) systeembeheerder (2) dennypage (2) jasoncheng7115 (2) carbinefreak (2) gdepeyrot (2) bogdanrotariu (2) mabra94 (2) josh-silvas (2) mprins-RAM (2) SirMaple (2) quentinsch (2) Schouwenburg (2) aztec102 (2) wrongecho (2) bennet-esyoil (2) duhow (2) Mar974 (2) QuadPiece (2) kruczek8989 (2) slimey99uk (2) Jimmy-Cl (2) si458 (2) torbeckattsp (1) d-k-7 (1) arjenz (1) kirk444 (1) robje (1) pjroehl (1) peejaychilds (1) lukeofthetauri (1) bakerds (1) guipoletto (1) goebelmeier (1) MarlinMr (1) florisvdk (1) jellejans (1) kylegordon (1) zenbeam (1) gilrim (1) AleksNovak (1) tristanbob (1) da-me (1) fdomain (1) jaannnis (1) knpo (1) trs80 (1) MANT5149 (1) support-capensis (1) zeroservices (1) hvanoch (1) angeletdemon (1) alchemyx (1) rinsekloek (1) gewuerfelt (1) tuxgasy (1) hugalafutro (1) Blinq-SanderBlom (1) nightcore500 (1) mrwold (1) koocotte (1) VoipTelCH (1) cfitzw (1) jaaruizgu (1) pertruccio (1) ianhodgson (1) talkstraightuk (1) fufroma (1) fuzzbawl (1) otkd (1) kiwibrew (1) andrekeller (1) Olen (1) Frazew (1) jgelinas (1) mpikzink (1) squidly (1) daniel-franca (1) sashashura (1) tuomari (1) sembeek (1) huntr-helper (1) ktims (1) VirTechSystems (1) washcroft (1) Laplacence (1) Jarod2801 (1) ciscoqid (1) enferas (1) 00gh (1) PedroChaps (1) ajsiersema (1) prahal (1) paulgear (1) mostdaysarebaddays (1) dagbdagb (1) bile0026 (1) hjcday (1) spyfly (1) Bobdave (1) DaftBrit (1) nox-x (1) SanderBlom (1) thecityofguanyu (1) nsn-amagruder (1) mkuurstra (1) booth-f (1) sajiby3k (1) skandragon (1) glance- (1) twelch24 (1) kevinwallace (1) lfkeitel (1) steffann (1) p4k8 (1) micko (1) cliffalbert (1) HolgerHees (1) frenchie (1) claude191 (1) Cormoran96 (1) WillIrvine (1) lucalo72 (1) ssasso (1) dandare100 (1) ospfbgp (1) MrXermon (1) pandalion98 (1) eskyuu (1) martinberg (1) lpailhas (1) jonathanjdavis (1) IVI053 (1) LTangaF (1) dlangille (1) pfromme25 (1) woidi (1) manonfgoo (1) mzacchi (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (328) murrant (260) PipoCanaja (50) ottorei (36) laf (18) SourceDoctor (7) VVelox (6) electrocret (3) mpikzink (3) santiag0z (2) crazy-max (1) westerterp (1) SeeMyPing (1) fbouynot (1) Cormoran96 (1) bennet-esyoil (1) f0o (1) haxmeadroom (1) bboy8012 (1)","title":"22.4.0"},{"location":"General/Changelog/#feature_9","text":"Indicator on Port Notes tab when Port has notes ( #14923 ) - electrocret Add display query to list_devices function ( #14747 ) - bonzo81 Split out lnms snmp convenience commands ( #14603 ) - murrant Add --forgot-key to key:rotate command ( #14495 ) - murrant Syslog sink over http for logstash (or any json source) ( #14424 ) - Bierchermuesli Improved Modern Modules ( #14315 ) - murrant Add @signedGraphTag() and @signedGraphUrl() blade directives ( #14269 ) - murrant Device settings: attempt to open related tab ( #14250 ) - murrant Error reporting ( #14190 ) - Jellyfrog Prepare for PHP 8.1 ( #14156 ) - Jellyfrog New Poller validations ( #14148 ) - murrant New lnms command to enable and disable plugins ( #14147 ) - murrant Support for SSL/TLS protected connections to MySQL databases ( #14142 ) - gs-kamnas Collect OS distro and LibreNMS version ( #14138 ) - murrant Lnms device:poll better feedback ( #14130 ) - murrant Per-App data storage ( #14087 ) - VVelox SnmpQuery walk multiple oids ( #14015 ) - murrant Add support to REST API for creating Maintenance Schedules for Device Groups ( #13985 ) - thecityofguanyu Automatic fixes for validation failures ( #13930 ) - murrant Allow unordered OIDs (global and per-os) ( #13923 ) - murrant Pre-Install settings ( #13906 ) - murrant Add ISIS discovery and polling for iosxe devices ( #13880 ) - WillIrvine Device_add support display field ( #13846 ) - murrant Add configuration support for IPMIv2 Kg key ( #13845 ) - pandalion98 Display Name in availability map ( #13841 ) - murrant Added --ping-only to snmp-scan.py ( #13810 ) - IVI053 Implement OAuth and SAML2 support ( #13764 ) - Jellyfrog","title":"Feature"},{"location":"General/Changelog/#security_7","text":"Fix Service Template XSS ( #14659 ) - murrant Fix neighbours XSS ( #14658 ) - murrant Fix SNMP trap -> Eventlog XSS ( #14657 ) - murrant Fix XSS in api access ( #14551 ) - murrant XSS sanitize pwrstatd application script inputs ( #14545 ) - bnerickson Block disabled user session auth ( #14473 ) - murrant Fix group delete xss ( #14472 ) - murrant Fix alert rules XSS ( #14471 ) - murrant Fix xss in browser push transport ( #14470 ) - murrant Fix users xss ( #14469 ) - murrant Fix user mass assignment vulnerability ( #14468 ) - murrant Fix billing xss ( #14465 ) - murrant Fix memcached unserialize vulnerability ( #14459 ) - murrant Fix possible RSS XSS ( #14457 ) - murrant GitHub Workflows security hardening ( #14388 ) - sashashura Fix scheduled maintenance xss ( #14360 ) - murrant Add huntr.dev to SECURITY.md ( #14359 ) - huntr-helper Security fixes XSS in oxidized-cfg-check.inc.php and print-customoid.php ( #14126 ) - enferas Bumpver handlebars.js to 4.7.7 to resolve CVE-2021-23369 ( #13990 ) - gs-kamnas Fix services command injection ( #13932 ) - murrant Fix Graylog XSS ( #13931 ) - murrant Bump minimist from 1.2.5 to 1.2.6 ( #13872 ) - dependabot Fix SQL injection in get-host-dependencies ( #13868 ) - Jellyfrog Resolved XSS issue from alert rule list modal ( #13805 ) - laf","title":"Security"},{"location":"General/Changelog/#device_12","text":"Update hikvision camera detection ( #14943 ) - torbeckattsp APC UPS UIO sensor discovery bug ( #14942 ) - d-k-7 Add additional MOS / 7130 devices ( #14922 ) - kirk444 Add support for WTI console products ( #14920 ) - robje Update junos discovery yaml to reference total memory instead of buff\u2026 ( #14919 ) - GeantRA Add support for Trellix FireEye OS ( #14908 ) - mtentilucci Added cisco FTD 1150 to ftd.yaml ( #14907 ) - pjroehl Add more OIDs for determining hardware and serial attributes correctly ( #14904 ) - mwobst Add Cisco FTD Support for security appliances (x3) ( #14893 ) - mwobst Update test data to account for new vertiv.svg icon ( #14892 ) - mtentilucci Improve Corero CMS support ( #14876 ) - electrocret Add Avocent MergePoint Unity KVM Switch Support ( #14874 ) - mtentilucci Add Fortigate Webfilter stats ( #14873 ) - electrocret Add Cisco Firepower 4112 Support ( #14872 ) - lukeofthetauri Added PoE controller load and status sensors for Junos devices ( #14868 ) - bakerds Fortigate IPS Intrusions detected stats ( #14857 ) - electrocret Add support for Vsol v1600d EPON OLT ( #14853 ) - guipoletto Add Montclair EDFA Support ( #14852 ) - peelman Fix discovery for apc ats ( #14837 ) - florisvdk Device - Add support for Scalance SC646-2C ( #14835 ) - jellejans Include Samsung X Series printers ( #14831 ) - kylegordon Add Fortigate packet loss monitoring for Link-Monitor and SD-WAN ( #14828 ) - not-known EdgeOS OLT new sensors and changes ( #14807 ) - noaheroufus Update XDP string to exclude modern Cisco lightweight APs from discovery ( #14803 ) - tristanbob Extend filtering of graphs device_bits on cisco ASA ( #14796 ) - PipoCanaja Changed discovery OID in ets.yaml ( #14795 ) - da-me Added Support for SNS-3615-K9 ( #14792 ) - jaannnis Routeros fix lldp discovery on 7.7+ ( #14791 ) - knpo Refactored Juniper SLA to include support for TWAMP and remove ambigu\u2026 ( #14787 ) - GeantRA Fix cisco-flash ( #14772 ) - electrocret Eaton matrix wattage fix ( #14770 ) - peelman Add Universal Input Output support for APC ( #14766 ) - dennypage Eltek Enexus; Fix SmartpackS divisor and hardware discovery ( #14762 ) - peelman Nokia PMC Microwave Improvements ( #14761 ) - carbinefreak Additional sensors ( #14756 ) - peelman Add AXOS sensor data for PON Transceivers (the only transceivers Cali\u2026 ( #14741 ) - peelman Adding discovery of LSI MegaRAID Device Media Errors, Other Errors, a\u2026 ( #14729 ) - bnerickson Update fs-nmu.inc.php ( #14702 ) - gewuerfelt Stop net-snmp from interpreting the octet-string from rttMonEchoAdmin\u2026 ( #14676 ) - not-known Add state of the Fortigate link monitor health checks ( #14675 ) - not-known Adding support for loop-telecom devices ( #14674 ) - Blinq-SanderBlom Support Huawei SMU02B ( #14673 ) - nightcore500 Use 'counter' RRD type for some TrueNAS sensors ( #14670 ) - TheMysteriousX Device - Add support for \"Smartpack R\" ( #14665 ) - mrwold Deltanet Lambdatrail LT2-S,HS ( #14661 ) - Bierchermuesli Added divisor to SAF Integra-X temp sensors ( #14655 ) - noaheroufus Corrected ICT MPS hardware detection ( #14654 ) - noaheroufus Add support for Battery Recommended Days Remaining ( #14653 ) - Jellyfrog Adjusted PMP to accomodate various other 450 models. ( #14652 ) - noaheroufus Added support for Eltek Micropack 1U ( #14645 ) - fcqpl Added support for Eltek Flatpack S ( #14643 ) - fcqpl Added Moxa switching ifAlias/portName mapping ( #14633 ) - rhinoau Improve VRP power display ( #14624 ) - PipoCanaja Edgeos picked up as generic device ( #14612 ) - ianhodgson Added Moxa EDS-G516E optical sensors ( #14610 ) - rhinoau Fix eNexus total current for Smartpack S ( #14606 ) - murrant Disable SNMP Bulk for Delta UPS devices ( #14599 ) - fufroma Improved AIX os information collection ( #14595 ) - murrant More inclusive Cisco SB os detection ( #14594 ) - murrant IP Infusion OcNOS basic detection ( #14588 ) - murrant Fix APC current divide by zero ( #14578 ) - murrant Extend EfficientIP SolidServer support ( #14549 ) - PipoCanaja TAIT-Infra93 - Fix state + skip_values for Battery ( #14541 ) - opalivan Timos - Improve SAP stats graphing ( #14534 ) - mabra94 McAfee Web Proxy with COUNTER rrd_type on sensors ( #14529 ) - PipoCanaja Fix 'bke.yaml' discovery file ( #14524 ) - PipoCanaja Added support for additional Moxa EDS-P model ( #14523 ) - rhinoau Fix awplus ntp polling bug ( #14521 ) - murrant Add discovery support for Riedo Networks UPDU ( #14496 ) - andrekeller Use correct description oid ( #14489 ) - Jellyfrog Correct upsBypassVoltage oid ( #14488 ) - Jellyfrog Correct variable typo ( #14486 ) - Jellyfrog Hpe ilo: fix filesystem type regex ( #14485 ) - Jellyfrog Added Fortigate SD-WAN Health checks ( #14456 ) - mprins-RAM Dont include empty storage sensor ( #14453 ) - Jellyfrog Remove undefined sensors ( #14449 ) - Jellyfrog Use correct low warn limit variable ( #14447 ) - Jellyfrog Correct aviatModemCurModulationRx oid ( #14446 ) - Jellyfrog Fortinet FortiADC detection and basic statistics ( #14434 ) - westerterp MNI Microwave OS Add ( #14427 ) - carbinefreak Add OS tait-tnadmin for TN9300 ( #14413 ) - opalivan Skip empty drac state sensors ( #14409 ) - jgelinas Added support for additional Moxa EDS-G models ( #14405 ) - rhinoau Device - Add support for Vultan Environmental Monitoring units ( #14401 ) - squidly Issue samsung printer m4080 fx ( #14391 ) - daniel-franca Added status checks for (BWCC) battery status and condition for onboa\u2026 ( #14349 ) - quentinsch Enexus system output current fix ( #14324 ) - loopodoopo UHP VSAT modems ( #14317 ) - loopodoopo Ray2 - Oid repair at ber ( #14302 ) - Martin22 Routeros - Fix displaying distance in charts ( #14300 ) - Martin22 Added support for Ubiquiti UFiber OLT ( #14256 ) - Martin22 Fix ciena-sds inventory bugs ( #14252 ) - murrant F5 partition ram ( #14226 ) - fbouynot Add Cisco Flash storage support ( #14219 ) - fbouynot Fix luminato port poll ( #14217 ) - murrant Teltonika RUT fix ( #14202 ) - loopodoopo Initial support for Moxa AWK Industrial APs ( #14197 ) - rhinoau Mikrotik wifi station mode sensors ( #14193 ) - Npeca75 Update mellanox os image ( #14184 ) - Laplacence Change state_name for Racoms modulation ( #14174 ) - Martin22 Cisco SB/CBS environment sensors ( #14154 ) - Fehler12 Fix Rocky Linux and AlmaLinux icons and logos ( #14150 ) - murrant Add additional sysObjectIDs for variants of the Arista 7130 ( #14144 ) - gs-kamnas Eltex MES 2324p Add ( #14135 ) - aztec102 Solid Optics EDFAMUX support ( #14129 ) - murrant Merge netmanplus and riello and improve device support ( #14125 ) - murrant Device - Basic hatteras dslam integration ( #14115 ) - Bierchermuesli Bats support ( #14108 ) - Schouwenburg Solved aos6 problem where Librenms wasn't identifying all vlans ( #14107 ) - PedroChaps Fix Cisco polling BGP peers in non-default VRF ( #14105 ) - ajsiersema Added support for CheckPoint 1100, 1450 & 1490 models. ( #14074 ) - quentinsch Missing \"s\" in NsBsd.php ( #14067 ) - Mar974 Add full version of Mikrotik logo ( #14063 ) - QuadPiece Ns-bsd updated for SNS LTSB 3.7.19 ( #14060 ) - Mar974 Add apc battery operation time, including display in WebUI ( #14058 ) - mwobst Fix the parsing of the temperature unit value (CMCIII devices) ( #14056 ) - mwobst ZTE ZXA10 Update (Added dBm graphs) ( #14049 ) - aztec102 Update Mikrotik logo ( #14045 ) - QuadPiece Fix use of incorrect variable to retrieve current sensor value ( #14037 ) - dennypage Support Huawei SMU11B ( #14029 ) - murrant Update Teltonika Sensors for FW R_00.07.02 ( #14012 ) - hjcday Procurve hardware description cleanup ( #14007 ) - murrant Racom Ray2 and Ray3 - Modulation states added ( #14001 ) - Martin22 Fix OS Detection for USW-Flex-XG ( #13999 ) - spyfly Add support for Cisco Nexus 3550 series (formerly Exalink Fusion) devices ( #13992 ) - gs-kamnas Improve support for Arista/Metamako MOS devices ( #13988 ) - gs-kamnas Add Cisco Business Wirless to ciscowlc.yaml ( #13984 ) - nsn-amagruder Add Eaton SC200 OS model ( #13978 ) - slimey99uk Fortigate LTE sensor addition ( #13977 ) - slimey99uk Added BKE power supply support. ( #13972 ) - Martin22 Workaround issues with lldp information from GS108Tv1 ( #13971 ) - glance- Add additional OpenBSD PF graphs ( #13963 ) - kevinwallace Don't use bulk-walk for PrimeKey Appliances ( #13958 ) - bl3nd3r Fix avtech12e sensors ( #13943 ) - lfkeitel Support tplink routers ( #13922 ) - si458 Aviat WTM reduce snmp load ( #13918 ) - murrant Fix Hytera error ( #13909 ) - murrant [mikrotik] fixed RouterOS ipv4/ipv6 routes ( #13902 ) - Npeca75 PrimeKey Improvements ( #13901 ) - bl3nd3r Enhancements for Zyxel OS ( #13897 ) - Jimmy-Cl Added support for Dell PowerVault ME4024 ( #13883 ) - laf Add support for Riello NetMan 204 ( #13878 ) - lucalo72 Fix usw flex switch hardware detection ( #13877 ) - Fehler12 Added Polycom Lens SNMP support. ( #13876 ) - Fehler12 Fix for PFSense state table removals field ( #13863 ) - dandare100 Add support for VOSS 8.6 ( #13857 ) - ospfbgp McAfee Proxy Sensor name update ( #13853 ) - PipoCanaja Device - HWG-WLD version 2 support ( #13849 ) - PipoCanaja Fix an issue with the APC current discovery ( #13837 ) - eskyuu Add VS state for Gaia ( #13831 ) - martinberg [new OS] Alpine OptoElectronics TDCM-EDFA support ( #13825 ) - charlyforot Fix db delete on cisco-vrf-lite discovery ( #13823 ) - lpailhas Add rocky linux OS identification ( #13815 ) - hanserasmus Detect truenas scale ( #13812 ) - si458 Add support for PrimeKey Hardware Appliance ( #13806 ) - bl3nd3r [comware] dropped dbfetch from discovery/sensors ( #13796 ) - Npeca75 BGP unnumbered support for Cumulus ( #13785 ) - charlyforot Correct divisor in discovery definition vertiv-pdu.yaml ( #13768 ) - woidi Netscaler new counter metrics ( #13323 ) - mzacchi","title":"Device"},{"location":"General/Changelog/#webui_11","text":"Pseudowires refresh ( #14882 ) - Bierchermuesli Fix port speed setting feedback ( #14743 ) - murrant Fix Cimc on Overview ( #14727 ) - electrocret Search devices also in display ( #14714 ) - gdepeyrot Fix check rrd file exists with remote rrdcached ( #14690 ) - tuxgasy Use displayname instead of hostname for Device Maintenance Modal Title ( #14681 ) - electrocret Remove ungrouped devices panel ( #14664 ) - murrant Custom port view fix ( #14637 ) - SourceDoctor Fix billing graph divide by zero when the period is zero or doesn't exist ( #14623 ) - jaaruizgu Fix port neighbors missing ( #14586 ) - murrant Fix some icons ( #14584 ) - murrant [About] Open Laravel and RRDtool link in new tab ( #14568 ) - santiag0z [About] Open the contributor list link in a new tab ( #14553 ) - santiag0z Fix v2 plugins ( #14506 ) - murrant Check if service_name is empty or equal to service_type ( #14499 ) - luc-ass Show id on device dependencies ( #14497 ) - SourceDoctor Userlist description fix ( #14482 ) - mprins-RAM Sort alert transport by name ( #14464 ) - SourceDoctor Fix missing device_id from device alert logs ( #14460 ) - ottorei Fix about date display ( #14442 ) - murrant Fix pseudowires pages ( #14441 ) - murrant Enhanced Service Overview on Device Overview Page ( #14410 ) - luc-ass Disable plugins that have errors ( #14383 ) - murrant Fix Inventory table for Dark theme ( #14377 ) - electrocret Add initselect2 to locations ports ( #14375 ) - KayckMatias Update devices filter in alert-logs to init_select2 ( #14361 ) - KayckMatias Load device selection dynamically on Ports page ( #14353 ) - KayckMatias Port pages fixes and cleanups ( #14310 ) - murrant Remove Caffeine ( #14277 ) - murrant Updated brother.svg to make it render in Safari ( #14271 ) - luc-ass Fix for Cisco group device health tab ( #14265 ) - fbouynot Fix dashboard widgets becoming unlocked (especially when using a touchscreen) ( #14222 ) - tim427 Migrate xDSL code to module, and add support for VDSL2 MIB ( #14207 ) - PipoCanaja Fix ports display ( #14183 ) - murrant Ports by device group ( #14175 ) - electrocret Empty Outages table ( #14167 ) - Npeca75 View Ports in Portgroups ( #14141 ) - electrocret Fix eventlog filtering ( #14136 ) - murrant Fix device filtering false values ( #14103 ) - murrant [gui] enable permanent vertical scroll ( #14102 ) - Npeca75 Minor visual changes to the apps-overview page ( #14090 ) - bennet-esyoil Improved sorting options for Availability Map ( #14073 ) - mwobst Search device by MAC via URL ( #14072 ) - duhow Add BGP description to eventlog BGP Peers messages ( #14061 ) - mostdaysarebaddays Slightly easier validation page error access ( #14044 ) - murrant Dashboard code cleanup ( #13996 ) - murrant Update dark mode to fix BGP and Peering page ( #13951 ) - Jimmy-Cl Validate base_url and server_name ( #13941 ) - murrant Fix snmp.timeout setting via Web UI ( #13937 ) - murrant Add ISIS-details to alert details ( #13920 ) - ottorei Fix port mini graphs ( #13911 ) - murrant Replaced OpenWRT icon with new logo ( #13891 ) - frenchie Add \"Ping Response\" graph to \"Ping Only\" Device Overview page ( #13886 ) - westerterp Remove fix size for column mac adresse ( #13881 ) - Cormoran96 Fixed the top port errors widget returning bits graphs instead ( #13860 ) - laf Fix class error name prevents to show BER graph ( #13833 ) - charlyforot Fixed displaying hostname in create bill when port is passed ( #13830 ) - laf Fix Oxidized Config tab showing when Device OS or Device Type is disabled ( #13809 ) - westerterp Position the buttons in the center on user preferences page ( #13802 ) - santiag0z Add usage hints for Display Name placeholder usage ( #13801 ) - LTangaF Fix second menu bar in Apps screens ( #13800 ) - westerterp WebUI - Search results for ports ( #13787 ) - PipoCanaja Device Types Widget ( #13670 ) - SourceDoctor","title":"Webui"},{"location":"General/Changelog/#alerting_10","text":"Jira transport: use template title ( #14883 ) - not-known Remove Time Elapsed extra space ( #14880 ) - electrocret Fix Alertlog messaging ( #14861 ) - electrocret Fix MS Teams alert transport, correct HTTP header ( #14843 ) - goebelmeier Add support for topics ( #14804 ) - AleksNovak Adding sample alert for systemd application ( #14711 ) - bnerickson Polling poller debug ( #14691 ) - electrocret Add -I flag to Traceroute cmd ( #14667 ) - electrocret Alert map location fix ( #14380 ) - KayckMatias Populate the alert rule field with the builder json ( #14374 ) - murrant Discord ability to attach graph images ( #14276 ) - murrant Email Transport: embed graphs by default ( #14270 ) - murrant Correct logic for recurring alert rules that span UTC days ( #14145 ) - gs-kamnas Improvements to PagerDuty alert formatting ( #14143 ) - gs-kamnas Example rules for diskspace on / ( #14082 ) - VVelox Add rich (=html) support for messages via Matrix ( #14054 ) - mwobst Add macro.past_20m macro ( #14023 ) - kruczek8989 Allow the use of a custom URL for accessing the PagerDuty API and correct API schema violation ( #14010 ) - gs-kamnas Setting MSteams card summary to alert title ( #13989 ) - DaftBrit More realistic alert test data ( #13969 ) - murrant Use display name when sending alerts to Sensu ( #13967 ) - TheMysteriousX Correct type hint ( #13915 ) - TheMysteriousX Improve alert template saving ( #13910 ) - murrant Added Basic authentication capability to Alertmanager Transport ( #13867 ) - geg347 Newer versions of Jira use HTTP code 201 fore created issues ( #13852 ) - MrXermon Add extra dynamic values alerttransport alertmanager ( #13828 ) - geg347 Add generic PSU status failed alert rule template ( #13821 ) - geg347","title":"Alerting"},{"location":"General/Changelog/#graphs_8","text":"Add graph_stat_percentile_disable config item to disable percentile lines/value printing ( #14887 ) - VVelox Convert NTP freq to use generic_stats ( #14834 ) - VVelox Update fail2ban to have better stat graphs and and fix generic_stats graph.php ( #14818 ) - VVelox Update various device graphs to to have better stats ( #14815 ) - VVelox Update HV::Monitor support to use generic_stats.inc.php ( #14814 ) - VVelox Only show Eth errors when Etherlike is enabled ( #14784 ) - electrocret Fix graph output base64 ( #14701 ) - murrant Fix some graphs not respecting device display name ( #14684 ) - murrant Adding Average into graphs ( #14679 ) - bogdanrotariu Fix device poller modules graph ( #14640 ) - murrant Bug - XDSL module - rrd_def and rrd file definition issue for Actual rate ( #14597 ) - PipoCanaja Fix graph errors wrong content type ( #14574 ) - murrant Improve graph embedded title handling ( #14544 ) - murrant Graphing cleanup ( #14492 ) - murrant Return GraphImage to include more metadata ( #14307 ) - murrant Fix unauth application graphs ( #14216 ) - murrant Allow specifying the background colour in graph images ( #14192 ) - washcroft Ping perf ( #14117 ) - 00gh [RRD] fix IPv6 folder name ( #13945 ) - Npeca75","title":"Graphs"},{"location":"General/Changelog/#snmp-traps","text":"Adds Cisco DHCP Server SNMP MIB and Trap Handlers. ( #14618 ) - josh-silvas Improve LinkUp and LinkDown trap handling incomplete traps ( #14385 ) - tuomari Add Cisco Err-Disable interface event trap handler ( #13855 ) - bonzo81 Add APC SmartAvrReducing trap handlers ( #13839 ) - bonzo81 Add APC upsOnBattery & powerRestored trap handler ( #13836 ) - bonzo81 Add OspfTxRetransmit Trap Handler ( #13824 ) - bonzo81 Cisco Mac address violation trap handler ( #13811 ) - bonzo81","title":"Snmp Traps"},{"location":"General/Changelog/#applications_10","text":"Add a few more graphs for CAPEv2 ( #14813 ) - VVelox CAPEv2 support ( #14801 ) - VVelox Add more docker stats ( #14767 ) - hvanoch Update Nvidia application - values in wrong charts ( #14736 ) - fcqpl Removing max polling restriction for wireguard traffic RRD data ( #14710 ) - bnerickson Alarm Flag on UPS-Nut Application ( #14635 ) - SourceDoctor Adding wireguard app to the apps overview page ( #14629 ) - bnerickson Adding wireguard application support ( #14625 ) - bnerickson Adding systemd service status application ( #14540 ) - bnerickson Memcached application: improve error visibility ( #14536 ) - murrant Fix memcached polling bug ( #14501 ) - murrant Add pwrstatd application ( #14365 ) - bnerickson Add HV Monitor, a generic means for monitoring hypvervisors ( #14218 ) - VVelox Add possibility to monitor redis application through the unix-agent ( #14182 ) - earendilfr Fix error between application module and unix-agent ( #14177 ) - earendilfr Add possibility to monitor the php-fpm service with the unix agent ( #14173 ) - earendilfr Base64 gzip compression support for json_app_get ( #14169 ) - VVelox [apps] Docker only show current containers ( #14152 ) - Npeca75 Fix app docker ( #14080 ) - prahal Add support for Sagan ( #14070 ) - VVelox Add Opensearch\\Elasticsearch monitoring ( #14053 ) - VVelox Add error-state to non-responsive mysql-servers ( #13993 ) - bennet-esyoil Remove alert keys from component for Suricata ( #13959 ) - VVelox Fix a few issues with variable names for Suricata ( #13956 ) - VVelox Scripts/json-app-tool.php JSON generation fix and add -S for SNMP extend name ( #13948 ) - VVelox Add Suricata monitoring ( #13942 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#api_10","text":"Fix for RIPE NCC API Tools ( #14757 ) - LoveSkylark Use Oxidized API client and add support for groups on config get ( #14750 ) - electrocret API list_devices update with sysName, location_id and type ( #14731 ) - bonzo81 Port search API search more than one fields ( #14646 ) - murrant Added disable_notify and location_id ( #14619 ) - pertruccio Add sortorder parameter to list_logs ( #14600 ) - talkstraightuk API restore ability to update purpose and override_sysLocation ( #14596 ) - murrant API graphs, variable whitelist ( #14552 ) - murrant Graph API use new code path ( #14493 ) - murrant Adding device's field in get_alert_rule and list-alert-rules API function (new) ( #14481 ) - geg347 Fix update_device hostname handling #14435 ( #14448 ) - rhinoau Fix port search with slashes ( #14403 ) - murrant Add Columns to search_ports API function ( #14348 ) - electrocret Allow delete location by id ( #14334 ) - bp0 API update_device, make location field work (as does location_id) ( #14325 ) - bp0 Standardize device and device group maintenance API ( #14153 ) - rhinoau Fix maintenance APIs not associating device or group ( #14127 ) - murrant Ensure 'add_device' API returns indexed-array (as per doco) ( #13887 ) - claude191 Adds API call to update port notes on devices. ( #13834 ) - josh-silvas","title":"Api"},{"location":"General/Changelog/#discovery_8","text":"Prevent spurious MAC changes on multi-interface devices ( #14671 ) - TheMysteriousX Fix discovery ignores custom ipmi port ( #14660 ) - VoipTelCH Cisco NAC fix ( #14440 ) - murrant Fix legacy os extends ( #14220 ) - murrant Sensors - Allow changing RRD type in YAML and PHP sensor discovery ( #14208 ) - PipoCanaja Sensors, convert hex to strings ( #14121 ) - murrant Fix printer count sensors when extra garbage is returned ( #14014 ) - murrant Fix polling and discovery of FortiGate cluster sensors ( #13980 ) - mkuurstra","title":"Discovery"},{"location":"General/Changelog/#polling_7","text":"Fix ArubaInstance channel decode issue ( #14732 ) - murrant Don't poll sysDescr, sysObjectID, and sysName so frequently ( #14562 ) - murrant Add connection exception handling to all redis calls ( #14467 ) - Frazew Fix bgp-peers bgpPeerIface bug and update test data ( #14420 ) - murrant Fix ping.php skipped results ( #14368 ) - sembeek Fix for number in sensor string ( #14185 ) - Schouwenburg Increase traceroute timeout ( #14084 ) - murrant Fix STP polling bug ( #13924 ) - murrant Print full error message in poller/discovery output ( #13903 ) - murrant","title":"Polling"},{"location":"General/Changelog/#rancid","text":"Add MRV OptiDriver support in gen_rancid ( #13900 ) - cliffalbert Add support for VyOS on Rancid conf ( #13874 ) - ssasso","title":"Rancid"},{"location":"General/Changelog/#oxidized_1","text":"Show display name in Oxidized config search ( #14800 ) - electrocret Adding Fortigate switches to Oxidized model mapping config ( #14782 ) - LoveSkylark Fix oxidized web requests unclosed connections or responding fast enough ( #14370 ) - fbouynot Oxidized \"allow purpose and notes\" ( #14352 ) - LoveSkylark Syslog-notify-oxidized.php now always notifies Oxidized ( #14011 ) - murrant Fix Oxidized syslog change notifier when the change was made via snmp. ( #14005 ) - kruczek8989 Oxidized API to return groups based on device purpose or notes ( #13976 ) - sajiby3k","title":"Oxidized"},{"location":"General/Changelog/#authentication_5","text":"Update Radius auth to accept permissions attributes ( #14531 ) - kimhaak Rework socialite integration ( #14367 ) - Jellyfrog AD Auth PHP 8.1 fixes ( #14215 ) - murrant Add option STARTTLS for authentication via AD ( #14051 ) - dagbdagb Auth_ldap_skip_group_check when ldap_compare is not supported ( #13926 ) - micko Implement support for usernames coming from reverse proxies ( #13894 ) - HolgerHees Add LDAP bind and userlist filter support to ldap-authorization ( #13788 ) - pfromme25","title":"Authentication"},{"location":"General/Changelog/#bug_12","text":"SnmpQuery, respect snmp.max_oid ( #14894 ) - murrant Add poller_groups (served) to the poller_cluster table ( #14886 ) - peejaychilds Actually use the stats graph for ntp-server_freq now, which as missed in #14834 ( #14884 ) - VVelox Add type checking to generic_stats.inc.php for $vars['to'] and $vars['from'] ( #14871 ) - VVelox Fix graphs for a search query ( #14864 ) - westerterp Fix interface parse unsets ( #14860 ) - electrocret Fix dbm calculation to return -60 instead of 0 ( #14858 ) - electrocret Revert \"Fix entity-state polling/discovery\" ( #14811 ) - murrant Fix entity-state polling/discovery ( #14793 ) - fdomain Update PingCheck.php to remove duplicate \"Device status changed to ... from icmp check.\" event ( #14785 ) - MANT5149 Fix calculated dbm ( #14771 ) - electrocret Handle Division by 0 error for SvcFdbTableSize ( #14672 ) - mabra94 Fix sqlite test ( #14642 ) - murrant Remove extends and hardware detection support ( #14626 ) - murrant Set 0 as integer in loading of graylog. ( #14621 ) - kimhaak Fix GeocodingHelper type-hinting ( #14604 ) - Jellyfrog Bug in Ciscowlc AP graphs definition ( #14585 ) - PipoCanaja SnmpQuery fix mib directory order ( #14580 ) - murrant SnmpQuery Handle empty oids in get more gracefully ( #14577 ) - murrant Fix PTOPO mib in module discovery-protocols ( #14564 ) - PipoCanaja Fix Type error ( #14555 ) - fbouynot Correct variable use in billing ( #14533 ) - Jellyfrog Fix sensor limit linked port rules in collection ( #14520 ) - electrocret EES Rectifier various fixes from MIB + added tests ( #14519 ) - opalivan Fix fetch ifEntry logic ( #14483 ) - Jellyfrog Add a few breaks to avoid connection flooding for the irc-bot ( #14479 ) - Olen Snmpwalk functions: dont include invalid data ( #14438 ) - Jellyfrog Fix VRP duplicate BGP Peers ( #14431 ) - PipoCanaja Version and git helper improvements ( #14412 ) - murrant Cache version data ( #14404 ) - murrant Fix rpi codec state sensor ( #14400 ) - murrant Fix libvirt count() uncountable error ( #14398 ) - murrant Fix Firebrick local ASN ( #14397 ) - murrant Fix ups nut PHP 8 issue ( #14392 ) - murrant Fix cipsec-tunnels ftd bad data causes error ( #14366 ) - murrant Handle null in unix-agent ( #14358 ) - murrant Fix the case of 'Ungrouped' in smokeping integration ( #14351 ) - fbouynot Fix for smokeping integration with ping-only devices ( #14341 ) - fbouynot Match displayname source for graylog ( #14339 ) - fbouynot Check dot1dBasePortIfIndex exists before using it ( #14337 ) - Jellyfrog Prevent errors when hrStorageTable doesn't exist ( #14327 ) - Jellyfrog Revert \"ZTE ZXA10 Update (Added dBm graphs)\" ( #14320 ) - murrant Billing module fix/cleanup ( #14309 ) - electrocret SnmpResponse filterBadLines fix ( #14306 ) - murrant Fix ARP Table on Device overview ( #14304 ) - Npeca75 Disable error reporting when dependencies are outdated ( #14291 ) - murrant Don't send zeros to Graphite for missing metrics ( #14262 ) - ktims Fix removing all port groups ( #14253 ) - murrant Move cronjob time for daily.sh ( #14245 ) - Jellyfrog Firebrick bgp polling was broken ( #14237 ) - murrant Quick fix for cipsec-tunnels Cisco implementation ( #14232 ) - PipoCanaja Fix redeclare of function breaking tests in OS eltex-mes23xx ( #14227 ) - PipoCanaja Autodiscovery fix ( #14213 ) - Npeca75 Fix alert log clearing SQL query ( #14200 ) - Jellyfrog Fix error when ldap_search returns false ( #14199 ) - Jellyfrog Fix unnecessary Updates of DB when values are equal ( #14179 ) - opalivan Fix APP_KEY generation when using fpm ( #14168 ) - Jellyfrog Fix validation error ( #14163 ) - TheMysteriousX IPv6 Debug typo ( #14162 ) - Npeca75 Replace git show --no-patch option with --quiet ( #14160 ) - ciscoqid Fix 500 error in validation when UI containers and poller containers have differing node_ids ( #14146 ) - gs-kamnas Use --no-patch to support old git clients ( #14137 ) - Jellyfrog Prevent duplicate plugin table entries ( #14120 ) - murrant Fix auth_test.php debug ( #14118 ) - murrant Fix config seeder will never run ( #14113 ) - murrant Reset the opcache after install ( #14098 ) - murrant Update config cache on install finalize step ( #14097 ) - murrant Fix more webserver validation issues ( #14096 ) - murrant Revert \"Add apc battery operation time, including display in WebUI\" ( #14068 ) - PipoCanaja Use --no-patch instead ( #14047 ) - Jellyfrog Git version validation improvement ( #14042 ) - murrant Server name validation, handle ports better ( #14041 ) - murrant Fix some broken migrations ( #14040 ) - Jellyfrog Fix rrd version validation check ( #14036 ) - murrant Fix DB timezone validation ( #14035 ) - murrant Regression fix from #13596 ( #14034 ) - Jellyfrog Fix an issue when getting the local version from git ( #14020 ) - murrant Fix migrations failing one time after dashboard cleanup ( #14002 ) - murrant Fix Netscaler VServer database updates during polling ( #13995 ) - Bobdave Fix 500 error in validations when capabilities are not supported or set ( #13991 ) - gs-kamnas Inconsistency in ldap starttls config parameter ( #13987 ) - nox-x Fix version check error ( #13981 ) - murrant Use full sudo path ( #13975 ) - skandragon Fix IPv6 in service check host ( #13939 ) - steffann Validate fixes ( #13935 ) - murrant Lnms device:add handle snmp.community bad format ( #13914 ) - murrant Fix install icons ( #13904 ) - murrant Handle bad uptime input ( #13899 ) - murrant Fix custom error messages ( #13898 ) - murrant Migrate addhost.php to lnms device:add ( #13870 ) - murrant Rewrite agent packages parsing code ( #13840 ) - murrant Fix snmpv3 context when empty SnmpQuery ( #13832 ) - murrant Regression fix from b6a8b602b891d9eb8633f62632c17bdc559cd620 ( #13819 ) - Jellyfrog Fix PHPStan Deprecated test ( #13794 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#refactor_5","text":"Unify time interval formatting ( #14733 ) - murrant Remove Log::event ( #14526 ) - Jellyfrog Cleanup and optimize the availability widget ( #14329 ) - murrant Fix a few Db* to Eloquent requests ( #14278 ) - PipoCanaja Use \"database version\" instead of \"mysql version\" ( #14158 ) - Jellyfrog Improve the efficiency of some queries ( #13974 ) - murrant Move Config loading to a service provider ( #13927 ) - murrant Port Validation Page to Laravel ( #13921 ) - murrant Remove addHost from ModuleTestHelper ( #13847 ) - murrant New device:add code ( #13842 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#cleanup_8","text":"Store empty user_func as null ( #14900 ) - Jellyfrog Consolidate and improve snmptranslate usage ( #14567 ) - murrant Remove graph_min ( #14561 ) - murrant Remove $_GET from graphs ( #14554 ) - murrant Undefined array key fixes ( #14532 ) - Jellyfrog Use Collection instead of collect() ( #14527 ) - Jellyfrog Convert string references to ::class ( #14508 ) - Jellyfrog Miscellaneous cleanup - part 5 ( #14502 ) - Jellyfrog Type API methods and properties ( #14476 ) - fbouynot Miscellaneous cleanup - part 4 ( #14452 ) - Jellyfrog Miscellaneous cleanup - part 3 ( #14450 ) - Jellyfrog Miscellaneous cleanup, mostly undefined variables - part2 ( #14445 ) - Jellyfrog Remove tabs from yaml ( #14437 ) - Jellyfrog Miscellaneous fixes, mostly undefined variables ( #14432 ) - Jellyfrog Trim whitespaces from device data ( #14429 ) - Jellyfrog Fix bgp_peer array_merge error ( #14416 ) - PipoCanaja Defer loading cli option defaults ( #14363 ) - Jellyfrog Remove call to Config from artisan ( #14362 ) - Jellyfrog Mibs - Cleanup names ( #14323 ) - PipoCanaja Enable more checks ( #14318 ) - Jellyfrog Do not include _token in legacy vars ( #14313 ) - murrant Don't include null os when loading defs ( #14312 ) - murrant 2fa not all routes have names ( #14311 ) - murrant Cache astext for 1 day ( #14303 ) - murrant Linux distro images require feature field ( #14301 ) - murrant Silence return type mismatch ( #14298 ) - Jellyfrog Fix more percent calculations ( #14294 ) - murrant Fix rounding null in mempools module ( #14290 ) - murrant Check if polling module exists ( #14289 ) - murrant Fix undefined variable ( #14287 ) - murrant Handle connection timed out errors in unix agent ( #14286 ) - murrant Remove unused function ( #14283 ) - murrant Remove reference to unused variable ( #14280 ) - murrant Cleanup some RunAlerts issues ( #14274 ) - murrant Fix a bunch of \"Since fakerphp/faker 1.14: Accessing property..\" ( #14267 ) - Jellyfrog Fix more error exceptions ( #14266 ) - Jellyfrog Fix hrStorageType being undefined ( #14260 ) - Jellyfrog Misc errors cleanup ( #14257 ) - Jellyfrog Fix ipv6 hexdec error ( #14254 ) - murrant Use empty string instead of null for routes ( #14247 ) - Jellyfrog Sort device types alphabetically ( #14244 ) - VirTechSystems Misc webui code cleanups ( #14242 ) - murrant Fix some ErrorExceptions ( #14241 ) - Jellyfrog Fix os_group unset errors ( #14238 ) - murrant Juniper bgp-peers cleanup ( #14236 ) - murrant Percentage calculation helper ( #14235 ) - murrant Memcached app undefined vars ( #14225 ) - Npeca75 Fix Undefined variable/key warnings ( #14134 ) - murrant Remove mib poller module remnants ( #14077 ) - murrant Remove traceroute6, it is unused ( #14019 ) - murrant Remove DefaultWidgetSeeder ( #14006 ) - murrant Better device:add error output ( #13913 ) - murrant Remove non-working Dell specific alert rules from the collection ( #13706 ) - Fehler12","title":"Cleanup"},{"location":"General/Changelog/#documentation_12","text":"Fix typo in lnms device:add help ( #14937 ) - arjenz Add Azure example configuration for SAML authentication in documentation ( #14870 ) - fbouynot Fix Okta image in docs ( #14848 ) - westerterp Change socialite settings URI ( #14845 ) - fbouynot Fix possible confusion around php-fpm settings ( #14844 ) - hanserasmus Use docker compose v2 ( #14841 ) - MarlinMr Fix typo in Oauth doc ( #14840 ) - fbouynot Add Zenduty Integration info to Transports.md docs ( #14826 ) - zenbeam Update config docs - dump current config ( #14820 ) - hanserasmus Add SELinux instructions for nginx monitoring ( #14812 ) - fbouynot Add SELinux instructions for systemd monitoring ( #14809 ) - fbouynot Add SELinux instructions for systemd monitoring ( #14806 ) - fbouynot Debian 11 Sury DPA provides PHP 8.2 ( #14798 ) - tim427 Update Syslog.md ( #14794 ) - systeembeheerder Update Authentication.md ( #14788 ) - trs80 Fix Doc Link for Canopsis transport ( #14778 ) - support-capensis Update ElasticSearch Index pattern for php 8.1 changes ( #14775 ) - zeroservices Install updates for Rocky8 ( #14722 ) - angeletdemon Updating certificate script documentation ( #14721 ) - bnerickson Update Docker.md with proper path to unzipped files ( #14717 ) - alchemyx Fix typo: purge-port.php file name ( #14712 ) - santiag0z Alert template example uses incorrect variable ( #14683 ) - electrocret Correct squid snmpd.conf proxy host syntax ( #14678 ) - hugalafutro Fix Traceroute debug alert template snippet ( #14668 ) - electrocret Update Dispatcher docs for Debian and for non /opt/librenms installation ( #14663 ) - koocotte Fix Location mapping docs ( #14644 ) - electrocret Update config name for the default device display ( #14641 ) - cfitzw Update Dispatcher-Service.md ( #14632 ) - systeembeheerder Updating postgres application documentation ( #14627 ) - bnerickson Documentation for Observium Migration ( #14601 ) - LoveSkylark Add snmp_flags and tips on string oids to the docs ( #14579 ) - murrant Clarify Dispatcher-Service.md for systemd ( #14575 ) - fuzzbawl Update license section of readme ( #14571 ) - otkd Remove outdated rules videos ( #14505 ) - kiwibrew Docker quick install ( #14475 ) - murrant Updating details of my LibreNMS install ( #14458 ) - SirMaple Fix php7.2 occurence in Performance.md documentation ( #14394 ) - fbouynot Fix documentation for php8.1 and bad package name ( #14393 ) - fbouynot Move list_locations from devices to locations ( #14328 ) - bp0 Cisco-sla module was renamed to slas ( #14288 ) - murrant Update docs around APP_URL ( #14282 ) - murrant Update to mkdocs-material 8.3.9 ( #14189 ) - Jellyfrog SNMP extend / fix mdadm documentation ( #14186 ) - Npeca75 Update index.md ( #14178 ) - Jarod2801 Add instructions for PHP 8.1 and Ubuntu 22.04 ( #14166 ) - Jellyfrog Update php installation instruction for CentOS 8 to reflect the minim\u2026 ( #14159 ) - fbouynot Fix typo in Smokeping SELinux documentation ( #14155 ) - fbouynot Add device_default_display info ( #14151 ) - murrant Change SELinux context for logs ( #14128 ) - fbouynot Small documentation typos ( #14101 ) - wrongecho Documentation typos ( #14099 ) - wrongecho Add SELinux configuration for SNMPd on Centos8 in the documentation ( #14095 ) - fbouynot Add SELinux configuration for LDAP/AD authentication on Centos8 in the documentation ( #14094 ) - fbouynot Add SELinux configuration for Smokeping on Centos8 in the documentation ( #14093 ) - fbouynot Add SELinux configuration for RRDCached on Centos8 in the documentation ( #14092 ) - fbouynot Corrected API devicegroup curl creation examples ( #14081 ) - rhinoau Minor grammar fixes in doc ( #14078 ) - paulgear Add documentation for Chrony application monitoring ( #14066 ) - ottorei Okta saml ( #14038 ) - bile0026 HPE Comware snmp config example ( #13997 ) - murrant Fix typo in dispatcher service doc ( #13979 ) - booth-f Fix a typo in alerting doc ( #13970 ) - twelch24 DOCS, switch to dark or light mode ( #13953 ) - santiag0z Assorted cleanups to alerting docs, primarily to make mdl happier ( #13950 ) - VVelox Update test doc making it more mdl happy and add a section on writing JSON app tests ( #13949 ) - VVelox Docs, fix code block in oxidized group ( #13908 ) - santiag0z [DOC] Fix Code blocks Step 2 Installing Network-WeatherMap ( #13905 ) - santiag0z [DOC] Styling the .env word quote ( #13889 ) - santiag0z Docs, fix Linux SNMP example only listening on ::1 ( #13882 ) - murrant Script that describes how to migrate traffic bills from observium. ( #13757 ) - manonfgoo","title":"Documentation"},{"location":"General/Changelog/#translation_3","text":"Update zh-TW.json ( #14765 ) - jasoncheng7115 Create files with Traditional Chinese translation ( #14764 ) - jasoncheng7115 Fix Typo in Settings ( #14443 ) - electrocret Serbian translation, part3 ( #14205 ) - Npeca75 More Serbian translation ( #14181 ) - Npeca75 Enable translation on Eventlog & Component-status widgets ( #14180 ) - Npeca75 Initial support for Serbian language ( #14165 ) - Npeca75 Enable translation in 3 Alert widget ( #14164 ) - Npeca75 Few more updates to Ita lang ( #14091 ) - ppasserini Italian language update ( #14085 ) - ppasserini Adjustments to german translation ( #14083 ) - mwobst Small Italian lang update ( #13960 ) - ppasserini Ukrainian translation update ( #13933 ) - p4k8 Few more language (ITA) updates ( #13890 ) - ppasserini","title":"Translation"},{"location":"General/Changelog/#tests_5","text":"Re-throw exceptions if we're in CI ( #14890 ) - Jellyfrog Adding certificate application tests ( #14708 ) - bnerickson Mock astext ( #14581 ) - murrant Github tests log improvement ( #14559 ) - murrant Improve trap testing ( #14546 ) - murrant Remove unused phpstan tests ( #14503 ) - Jellyfrog Speed up tests ( #14421 ) - murrant Fix cisco-pw test capture ( #14415 ) - murrant Test supported PHP versions only ( #14389 ) - murrant Run CI on ubuntu 22.04 ( #14379 ) - Jellyfrog Do not allow sysDescr to be fetched in os module yaml ( #14331 ) - murrant Remove PHP version constraint ( #14314 ) - Jellyfrog Lnms dev:simulate check simulated device exists ( #14243 ) - murrant Save-test-data to refresh all variants of an OS ( #14231 ) - PipoCanaja Allow save-test-data.php to run all modules explicitely ( #14212 ) - PipoCanaja Increase OS detection time, sometimes it is not ready by 5s ( #14133 ) - murrant Test PHP 8.1 ( #14109 ) - murrant Fix tests failing when device with IP 127.1.6.1 exists ( #14016 ) - murrant PHP8 phpstan fix ( #13843 ) - murrant Fix tests for MariaDB > 10.5.15 ( #13829 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#misc_9","text":"Reorder check_icmp command to follow documented usage ( #14910 ) - mtentilucci Add multi-PR GitHub-apply ( #14875 ) - electrocret Use Device displayname on VRF page ( #14851 ) - electrocret Fix empty output on validation test ( #14822 ) - hanserasmus Allows GEO lookup with detailed internal Location information wrapped inside parentheses. ( #14799 ) - LoveSkylark Add MAC OUI caching when code updates are disabled ( #14713 ) - gdepeyrot New schema dump ( #14630 ) - Jellyfrog Add check_hetzner_storagebox to includes/services ( #14463 ) - SirMaple Add instance id to error reports ( #14444 ) - murrant Update ports_purge docs and definitions ( #14402 ) - KayckMatias Added Ubuntu and Raspbian to ifAlias script ( #14399 ) - tim427 Defer loading cli option values ( #14354 ) - murrant Allow dumping of errors and warnings ( #14275 ) - murrant Allow reapply yaml config via env ( #14100 ) - murrant Lnms scan respect -q parameter ( #14027 ) - murrant Improve lnms shortcut validation ( #13982 ) - murrant","title":"Misc"},{"location":"General/Changelog/#internal-features_6","text":"Number Casting allow preceding space ( #14699 ) - murrant DeviceCache::get() allow hostname ( #14649 ) - murrant Improve SnmpResponse value() ( #14605 ) - murrant SnmpQuery numeric accept a boolean ( #14565 ) - murrant Support regex in os field replace ( #14563 ) - murrant More Replacement Capabilities for sensor index computation ( #14522 ) - PipoCanaja Ignore CommandNotFoundException from reporting ( #14342 ) - Jellyfrog Allow SnmpQuery to optionally abort walks if one fails ( #14255 ) - murrant","title":"Internal Features"},{"location":"General/Changelog/#mibs_6","text":"Add CISCO-ENTITY-ALARM-MIB file ( #14754 ) - bonzo81 Update Nokia MIBs to release R22.2 ( #14734 ) - peelman More MIB fixing ( #14018 ) - Jellyfrog Update MIBs ( #14017 ) - Jellyfrog Updated existing Siemens MIBs and added trap MIB ( #13986 ) - SanderBlom","title":"Mibs"},{"location":"General/Changelog/#dependencies_10","text":"PHP dependency update ( #14927 ) - murrant Bump phpseclib/phpseclib from 3.0.18 to 3.0.19 ( #14903 ) - dependabot Bump webpack from 5.66.0 to 5.76.1 ( #14901 ) - dependabot Bump symfony/http-kernel from 5.4.16 to 5.4.20 ( #14824 ) - dependabot Bump json5 from 1.0.1 to 1.0.2 ( #14774 ) - dependabot Update PHP dependencies (fix dependencies on PHP 8.2) ( #14759 ) - murrant Bump qs and express ( #14705 ) - dependabot Bump loader-utils from 1.4.0 to 1.4.2 ( #14628 ) - dependabot Increase minimum version to PHP 8.1 ( #14378 ) - murrant Update dependencies ( #14319 ) - murrant Bump php-cs-fixer to 3.4.0 ( #14224 ) - murrant Bump terser from 4.8.0 to 4.8.1 ( #14123 ) - dependabot Bump guzzlehttp/guzzle from 7.4.4 to 7.4.5 ( #14059 ) - dependabot Update Larastan ( #14031 ) - murrant Update PHP dependencies ( #14028 ) - murrant Bump guzzlehttp/guzzle from 7.4.3 to 7.4.4 ( #14025 ) - dependabot Bump guzzlehttp/guzzle from 7.4.1 to 7.4.3 ( #13994 ) - dependabot Bump async from 2.6.3 to 2.6.4 ( #13947 ) - dependabot Bump composer/composer from 2.2.4 to 2.3.5 ( #13944 ) - dependabot Bump guzzlehttp/psr7 from 2.1.0 to 2.2.1 ( #13879 ) - dependabot Bump jpgraph version to 4 ( #13875 ) - ottorei Bump node-forge from 1.2.1 to 1.3.0 ( #13869 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2320","text":"(2023-02-23) A big thank you to the following 20 contributors this last month: electrocret (5) fbouynot (5) hanserasmus (3) VVelox (3) guipoletto (1) westerterp (1) goebelmeier (1) MarlinMr (1) florisvdk (1) kylegordon (1) zenbeam (1) dependabot (1) gilrim (1) murrant (1) noaheroufus (1) AleksNovak (1) tristanbob (1) tim427 (1) PipoCanaja (1) bonzo81 (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (22) murrant (9) ottorei (4) crazy-max (1) VVelox (1) westerterp (1)","title":"23.2.0"},{"location":"General/Changelog/#feature_10","text":"Add display query to list_devices function ( #14747 ) - bonzo81","title":"Feature"},{"location":"General/Changelog/#device_13","text":"Fortigate IPS Intrusions detected stats ( #14857 ) - electrocret Add support for Vsol v1600d EPON OLT ( #14853 ) - guipoletto Fix discovery for apc ats ( #14837 ) - florisvdk Include Samsung X Series printers ( #14831 ) - kylegordon EdgeOS OLT new sensors and changes ( #14807 ) - noaheroufus Update XDP string to exclude modern Cisco lightweight APs from discovery ( #14803 ) - tristanbob Extend filtering of graphs device_bits on cisco ASA ( #14796 ) - PipoCanaja","title":"Device"},{"location":"General/Changelog/#alerting_11","text":"Fix MS Teams alert transport, correct HTTP header ( #14843 ) - goebelmeier Add support for topics ( #14804 ) - AleksNovak","title":"Alerting"},{"location":"General/Changelog/#graphs_9","text":"Update HV::Monitor support to use generic_stats.inc.php ( #14814 ) - VVelox Only show Eth errors when Etherlike is enabled ( #14784 ) - electrocret","title":"Graphs"},{"location":"General/Changelog/#applications_11","text":"Add a few more graphs for CAPEv2 ( #14813 ) - VVelox CAPEv2 support ( #14801 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#api_11","text":"Use Oxidized API client and add support for groups on config get ( #14750 ) - electrocret","title":"Api"},{"location":"General/Changelog/#oxidized_2","text":"Show display name in Oxidized config search ( #14800 ) - electrocret","title":"Oxidized"},{"location":"General/Changelog/#bug_13","text":"Revert \"Fix entity-state polling/discovery\" ( #14811 ) - murrant","title":"Bug"},{"location":"General/Changelog/#documentation_13","text":"Fix Okta image in docs ( #14848 ) - westerterp Change socialite settings URI ( #14845 ) - fbouynot Fix possible confusion around php-fpm settings ( #14844 ) - hanserasmus Use docker compose v2 ( #14841 ) - MarlinMr Fix typo in Oauth doc ( #14840 ) - fbouynot Add Zenduty Integration info to Transports.md docs ( #14826 ) - zenbeam Update config docs - dump current config ( #14820 ) - hanserasmus Add SELinux instructions for nginx monitoring ( #14812 ) - fbouynot Add SELinux instructions for systemd monitoring ( #14809 ) - fbouynot Add SELinux instructions for systemd monitoring ( #14806 ) - fbouynot Debian 11 Sury DPA provides PHP 8.2 ( #14798 ) - tim427","title":"Documentation"},{"location":"General/Changelog/#misc_10","text":"Use Device displayname on VRF page ( #14851 ) - electrocret Fix empty output on validation test ( #14822 ) - hanserasmus","title":"Misc"},{"location":"General/Changelog/#dependencies_11","text":"Bump symfony/http-kernel from 5.4.16 to 5.4.20 ( #14824 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2310","text":"(2023-01-24) A big thank you to the following 19 contributors this last month: electrocret (3) peelman (3) jasoncheng7115 (2) not-known (2) da-me (1) systeembeheerder (1) fdomain (1) jaannnis (1) knpo (1) trs80 (1) MANT5149 (1) LoveSkylark (1) support-capensis (1) zeroservices (1) dependabot (1) dennypage (1) carbinefreak (1) bnerickson (1) Blinq-SanderBlom (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (23) murrant (2) SourceDoctor (1) PipoCanaja (1)","title":"23.1.0"},{"location":"General/Changelog/#device_14","text":"Changed discovery OID in ets.yaml ( #14795 ) - da-me Added Support for SNS-3615-K9 ( #14792 ) - jaannnis Routeros fix lldp discovery on 7.7+ ( #14791 ) - knpo Fix cisco-flash ( #14772 ) - electrocret Eaton matrix wattage fix ( #14770 ) - peelman Add Universal Input Output support for APC ( #14766 ) - dennypage Eltek Enexus; Fix SmartpackS divisor and hardware discovery ( #14762 ) - peelman Nokia PMC Microwave Improvements ( #14761 ) - carbinefreak Add AXOS sensor data for PON Transceivers (the only transceivers Cali\u2026 ( #14741 ) - peelman Adding discovery of LSI MegaRAID Device Media Errors, Other Errors, a\u2026 ( #14729 ) - bnerickson Stop net-snmp from interpreting the octet-string from rttMonEchoAdmin\u2026 ( #14676 ) - not-known Add state of the Fortigate link monitor health checks ( #14675 ) - not-known Adding support for loop-telecom devices ( #14674 ) - Blinq-SanderBlom","title":"Device"},{"location":"General/Changelog/#oxidized_3","text":"Adding Fortigate switches to Oxidized model mapping config ( #14782 ) - LoveSkylark","title":"Oxidized"},{"location":"General/Changelog/#bug_14","text":"Fix entity-state polling/discovery ( #14793 ) - fdomain Update PingCheck.php to remove duplicate \"Device status changed to ... from icmp check.\" event ( #14785 ) - MANT5149 Fix calculated dbm ( #14771 ) - electrocret","title":"Bug"},{"location":"General/Changelog/#documentation_14","text":"Update Syslog.md ( #14794 ) - systeembeheerder Update Authentication.md ( #14788 ) - trs80 Fix Doc Link for Canopsis transport ( #14778 ) - support-capensis Update ElasticSearch Index pattern for php 8.1 changes ( #14775 ) - zeroservices","title":"Documentation"},{"location":"General/Changelog/#translation_4","text":"Update zh-TW.json ( #14765 ) - jasoncheng7115 Create files with Traditional Chinese translation ( #14764 ) - jasoncheng7115","title":"Translation"},{"location":"General/Changelog/#misc_11","text":"Use displayname instead of hostname for Device Maintenance Modal Title ( #14681 ) - electrocret","title":"Misc"},{"location":"General/Changelog/#dependencies_12","text":"Bump json5 from 1.0.1 to 1.0.2 ( #14774 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#22120","text":"(2022-12-28) A big thank you to the following 21 contributors this last month: murrant (10) electrocret (4) bnerickson (4) peelman (2) bonzo81 (2) gdepeyrot (2) bogdanrotariu (2) TheMysteriousX (2) LoveSkylark (1) fcqpl (1) angeletdemon (1) alchemyx (1) rinsekloek (1) SantiagoSilvaZ (1) dependabot (1) gewuerfelt (1) tuxgasy (1) hugalafutro (1) nightcore500 (1) mrwold (1) rhinoau (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (15) murrant (14) PipoCanaja (3) ottorei (3) SeeMyPing (1)","title":"22.12.0"},{"location":"General/Changelog/#feature_11","text":"Pre-Install settings ( #13906 ) - murrant","title":"Feature"},{"location":"General/Changelog/#device_15","text":"Additional sensors ( #14756 ) - peelman Update fs-nmu.inc.php ( #14702 ) - gewuerfelt Support Huawei SMU02B ( #14673 ) - nightcore500 Use 'counter' RRD type for some TrueNAS sensors ( #14670 ) - TheMysteriousX Device - Add support for \"Smartpack R\" ( #14665 ) - mrwold Added Moxa switching ifAlias/portName mapping ( #14633 ) - rhinoau","title":"Device"},{"location":"General/Changelog/#webui_12","text":"Fix port speed setting feedback ( #14743 ) - murrant Fix Cimc on Overview ( #14727 ) - electrocret Search devices also in display ( #14714 ) - gdepeyrot Fix check rrd file exists with remote rrdcached ( #14690 ) - tuxgasy","title":"Webui"},{"location":"General/Changelog/#alerting_12","text":"Adding sample alert for systemd application ( #14711 ) - bnerickson Polling poller debug ( #14691 ) - electrocret Add -I flag to Traceroute cmd ( #14667 ) - electrocret","title":"Alerting"},{"location":"General/Changelog/#graphs_10","text":"Fix graph output base64 ( #14701 ) - murrant Fix some graphs not respecting device display name ( #14684 ) - murrant Adding Average into graphs ( #14679 ) - bogdanrotariu","title":"Graphs"},{"location":"General/Changelog/#applications_12","text":"Update Nvidia application - values in wrong charts ( #14736 ) - fcqpl Removing max polling restriction for wireguard traffic RRD data ( #14710 ) - bnerickson","title":"Applications"},{"location":"General/Changelog/#api_12","text":"Fix for RIPE NCC API Tools ( #14757 ) - LoveSkylark API list_devices update with sysName, location_id and type ( #14731 ) - bonzo81","title":"Api"},{"location":"General/Changelog/#discovery_9","text":"Prevent spurious MAC changes on multi-interface devices ( #14671 ) - TheMysteriousX","title":"Discovery"},{"location":"General/Changelog/#polling_8","text":"Fix ArubaInstance channel decode issue ( #14732 ) - murrant","title":"Polling"},{"location":"General/Changelog/#refactor_6","text":"Unify time interval formatting ( #14733 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#documentation_15","text":"Install updates for Rocky8 ( #14722 ) - angeletdemon Updating certificate script documentation ( #14721 ) - bnerickson Update Docker.md with proper path to unzipped files ( #14717 ) - alchemyx Fix typo: purge-port.php file name ( #14712 ) - SantiagoSilvaZ Alert template example uses incorrect variable ( #14683 ) - electrocret Correct squid snmpd.conf proxy host syntax ( #14678 ) - hugalafutro","title":"Documentation"},{"location":"General/Changelog/#tests_6","text":"Adding certificate application tests ( #14708 ) - bnerickson","title":"Tests"},{"location":"General/Changelog/#misc_12","text":"Add MAC OUI caching when code updates are disabled ( #14713 ) - gdepeyrot","title":"Misc"},{"location":"General/Changelog/#internal-features_7","text":"Number Casting allow preceding space ( #14699 ) - murrant Improve SnmpResponse value() ( #14605 ) - murrant","title":"Internal Features"},{"location":"General/Changelog/#mibs_7","text":"Add CISCO-ENTITY-ALARM-MIB file ( #14754 ) - bonzo81 Update Nokia MIBs to release R22.2 ( #14734 ) - peelman","title":"Mibs"},{"location":"General/Changelog/#dependencies_13","text":"Update PHP dependencies (fix dependencies on PHP 8.2) ( #14759 ) - murrant Bump qs and express ( #14705 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#22110","text":"(2022-11-24) A big thank you to the following 40 contributors this last month: murrant (52) Jellyfrog (23) PipoCanaja (9) bnerickson (5) electrocret (4) SourceDoctor (4) noaheroufus (3) rhinoau (3) mabra94 (2) fcqpl (2) kimhaak (2) SantiagoSilvaZ (2) fbouynot (2) opalivan (2) mprins-RAM (2) VVelox (2) koocotte (1) VoipTelCH (1) cfitzw (1) systeembeheerder (1) dependabot (1) jaaruizgu (1) pertruccio (1) josh-silvas (1) ianhodgson (1) LoveSkylark (1) talkstraightuk (1) fufroma (1) fuzzbawl (1) otkd (1) kiwibrew (1) luc-ass (1) andrekeller (1) geg347 (1) Olen (1) Frazew (1) SirMaple (1) westerterp (1) squidly (1) Bierchermuesli (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (53) murrant (44) PipoCanaja (15) ottorei (1) VVelox (1) SantiagoSilvaZ (1) fbouynot (1)","title":"22.11.0"},{"location":"General/Changelog/#feature_12","text":"Split out lnms snmp convenience commands ( #14603 ) - murrant Add --forgot-key to key:rotate command ( #14495 ) - murrant","title":"Feature"},{"location":"General/Changelog/#security_8","text":"Fix Service Template XSS ( #14659 ) - murrant Fix neighbours XSS ( #14658 ) - murrant Fix SNMP trap -> Eventlog XSS ( #14657 ) - murrant Fix XSS in api access ( #14551 ) - murrant XSS sanitize pwrstatd application script inputs ( #14545 ) - bnerickson","title":"Security"},{"location":"General/Changelog/#device_16","text":"Added divisor to SAF Integra-X temp sensors ( #14655 ) - noaheroufus Corrected ICT MPS hardware detection ( #14654 ) - noaheroufus Adjusted PMP to accomodate various other 450 models. ( #14652 ) - noaheroufus Added support for Eltek Micropack 1U ( #14645 ) - fcqpl Added support for Eltek Flatpack S ( #14643 ) - fcqpl Improve VRP power display ( #14624 ) - PipoCanaja Edgeos picked up as generic device ( #14612 ) - ianhodgson Added Moxa EDS-G516E optical sensors ( #14610 ) - rhinoau Fix eNexus total current for Smartpack S ( #14606 ) - murrant Disable SNMP Bulk for Delta UPS devices ( #14599 ) - fufroma Improved AIX os information collection ( #14595 ) - murrant More inclusive Cisco SB os detection ( #14594 ) - murrant IP Infusion OcNOS basic detection ( #14588 ) - murrant Fix APC current divide by zero ( #14578 ) - murrant Extend EfficientIP SolidServer support ( #14549 ) - PipoCanaja TAIT-Infra93 - Fix state + skip_values for Battery ( #14541 ) - opalivan Timos - Improve SAP stats graphing ( #14534 ) - mabra94 McAfee Web Proxy with COUNTER rrd_type on sensors ( #14529 ) - PipoCanaja Fix 'bke.yaml' discovery file ( #14524 ) - PipoCanaja Added support for additional Moxa EDS-P model ( #14523 ) - rhinoau Fix awplus ntp polling bug ( #14521 ) - murrant Add discovery support for Riedo Networks UPDU ( #14496 ) - andrekeller Use correct description oid ( #14489 ) - Jellyfrog Correct upsBypassVoltage oid ( #14488 ) - Jellyfrog Correct variable typo ( #14486 ) - Jellyfrog Hpe ilo: fix filesystem type regex ( #14485 ) - Jellyfrog Added Fortigate SD-WAN Health checks ( #14456 ) - mprins-RAM Dont include empty storage sensor ( #14453 ) - Jellyfrog Remove undefined sensors ( #14449 ) - Jellyfrog Use correct low warn limit variable ( #14447 ) - Jellyfrog Fortinet FortiADC detection and basic statistics ( #14434 ) - westerterp Device - Add support for Vultan Environmental Monitoring units ( #14401 ) - squidly Device - Basic hatteras dslam integration ( #14115 ) - Bierchermuesli","title":"Device"},{"location":"General/Changelog/#webui_13","text":"Remove ungrouped devices panel ( #14664 ) - murrant Custom port view fix ( #14637 ) - SourceDoctor Fix billing graph divide by zero when the period is zero or doesn't exist ( #14623 ) - jaaruizgu Fix port neighbors missing ( #14586 ) - murrant Fix some icons ( #14584 ) - murrant [About] Open Laravel and RRDtool link in new tab ( #14568 ) - SantiagoSilvaZ [About] Open the contributor list link in a new tab ( #14553 ) - SantiagoSilvaZ Fix v2 plugins ( #14506 ) - murrant Check if service_name is empty or equal to service_type ( #14499 ) - luc-ass Show id on device dependencies ( #14497 ) - SourceDoctor Userlist description fix ( #14482 ) - mprins-RAM Sort alert transport by name ( #14464 ) - SourceDoctor","title":"Webui"},{"location":"General/Changelog/#graphs_11","text":"Fix device poller modules graph ( #14640 ) - murrant Bug - XDSL module - rrd_def and rrd file definition issue for Actual rate ( #14597 ) - PipoCanaja Fix graph errors wrong content type ( #14574 ) - murrant Improve graph embedded title handling ( #14544 ) - murrant Graphing cleanup ( #14492 ) - murrant","title":"Graphs"},{"location":"General/Changelog/#snmp-traps_1","text":"Adds Cisco DHCP Server SNMP MIB and Trap Handlers. ( #14618 ) - josh-silvas","title":"Snmp Traps"},{"location":"General/Changelog/#applications_13","text":"Alarm Flag on UPS-Nut Application ( #14635 ) - SourceDoctor Adding wireguard app to the apps overview page ( #14629 ) - bnerickson Adding wireguard application support ( #14625 ) - bnerickson Adding systemd service status application ( #14540 ) - bnerickson Memcached application: improve error visibility ( #14536 ) - murrant Fix memcached polling bug ( #14501 ) - murrant Add HV Monitor, a generic means for monitoring hypvervisors ( #14218 ) - VVelox Base64 gzip compression support for json_app_get ( #14169 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#api_13","text":"Port search API search more than one fields ( #14646 ) - murrant Added disable_notify and location_id ( #14619 ) - pertruccio Add sortorder parameter to list_logs ( #14600 ) - talkstraightuk API restore ability to update purpose and override_sysLocation ( #14596 ) - murrant API graphs, variable whitelist ( #14552 ) - murrant Graph API use new code path ( #14493 ) - murrant Adding device's field in get_alert_rule and list-alert-rules API function (new) ( #14481 ) - geg347 Fix update_device hostname handling #14435 ( #14448 ) - rhinoau Add Columns to search_ports API function ( #14348 ) - electrocret","title":"Api"},{"location":"General/Changelog/#discovery_10","text":"Fix discovery ignores custom ipmi port ( #14660 ) - VoipTelCH Sensors - Allow changing RRD type in YAML and PHP sensor discovery ( #14208 ) - PipoCanaja","title":"Discovery"},{"location":"General/Changelog/#polling_9","text":"Don't poll sysDescr, sysObjectID, and sysName so frequently ( #14562 ) - murrant Add connection exception handling to all redis calls ( #14467 ) - Frazew","title":"Polling"},{"location":"General/Changelog/#authentication_6","text":"Update Radius auth to accept permissions attributes ( #14531 ) - kimhaak","title":"Authentication"},{"location":"General/Changelog/#bug_15","text":"Handle Division by 0 error for SvcFdbTableSize ( #14672 ) - mabra94 Fix sqlite test ( #14642 ) - murrant Remove extends and hardware detection support ( #14626 ) - murrant Set 0 as integer in loading of graylog. ( #14621 ) - kimhaak Fix GeocodingHelper type-hinting ( #14604 ) - Jellyfrog Bug in Ciscowlc AP graphs definition ( #14585 ) - PipoCanaja SnmpQuery fix mib directory order ( #14580 ) - murrant SnmpQuery Handle empty oids in get more gracefully ( #14577 ) - murrant Fix PTOPO mib in module discovery-protocols ( #14564 ) - PipoCanaja Fix Type error ( #14555 ) - fbouynot Correct variable use in billing ( #14533 ) - Jellyfrog Fix sensor limit linked port rules in collection ( #14520 ) - electrocret EES Rectifier various fixes from MIB + added tests ( #14519 ) - opalivan Fix fetch ifEntry logic ( #14483 ) - Jellyfrog Add a few breaks to avoid connection flooding for the irc-bot ( #14479 ) - Olen","title":"Bug"},{"location":"General/Changelog/#refactor_7","text":"Remove Log::event ( #14526 ) - Jellyfrog","title":"Refactor"},{"location":"General/Changelog/#cleanup_9","text":"Fix snmp_disable type ( #14650 ) - murrant Consolidate and improve snmptranslate usage ( #14567 ) - murrant Remove graph_min ( #14561 ) - murrant Remove $_GET from graphs ( #14554 ) - murrant Undefined array key fixes ( #14532 ) - Jellyfrog Use Collection instead of collect() ( #14527 ) - Jellyfrog Convert string references to ::class ( #14508 ) - Jellyfrog Miscellaneous cleanup - part 5 ( #14502 ) - Jellyfrog Type API methods and properties ( #14476 ) - fbouynot Miscellaneous cleanup - part 4 ( #14452 ) - Jellyfrog Miscellaneous cleanup - part 3 ( #14450 ) - Jellyfrog Miscellaneous cleanup, mostly undefined variables - part2 ( #14445 ) - Jellyfrog","title":"Cleanup"},{"location":"General/Changelog/#documentation_16","text":"Fix Traceroute debug alert template snippet ( #14668 ) - electrocret Update Dispatcher docs for Debian and for non /opt/librenms installation ( #14663 ) - koocotte Fix Location mapping docs ( #14644 ) - electrocret Update config name for the default device display ( #14641 ) - cfitzw Update Dispatcher-Service.md ( #14632 ) - systeembeheerder Updating postgres application documentation ( #14627 ) - bnerickson Documentation for Observium Migration ( #14601 ) - LoveSkylark Add snmp_flags and tips on string oids to the docs ( #14579 ) - murrant Clarify Dispatcher-Service.md for systemd ( #14575 ) - fuzzbawl Update license section of readme ( #14571 ) - otkd Remove outdated rules videos ( #14505 ) - kiwibrew Docker quick install ( #14475 ) - murrant","title":"Documentation"},{"location":"General/Changelog/#tests_7","text":"Mock astext ( #14581 ) - murrant Github tests log improvement ( #14559 ) - murrant Improve trap testing ( #14546 ) - murrant Remove unused phpstan tests ( #14503 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#misc_13","text":"New schema dump ( #14630 ) - Jellyfrog Add check_hetzner_storagebox to includes/services ( #14463 ) - SirMaple Add instance id to error reports ( #14444 ) - murrant","title":"Misc"},{"location":"General/Changelog/#internal-features_8","text":"DeviceCache::get() allow hostname ( #14649 ) - murrant SnmpQuery numeric accept a boolean ( #14565 ) - murrant Support regex in os field replace ( #14563 ) - murrant More Replacement Capabilities for sensor index computation ( #14522 ) - PipoCanaja","title":"Internal Features"},{"location":"General/Changelog/#dependencies_14","text":"Bump loader-utils from 1.4.0 to 1.4.2 ( #14628 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#22100","text":"(2022-10-17) A big thank you to the following 22 contributors this last month: murrant (29) Jellyfrog (8) KayckMatias (4) Martin22 (3) PipoCanaja (3) fbouynot (3) electrocret (2) ottorei (1) SirMaple (1) carbinefreak (1) opalivan (1) luc-ass (1) jgelinas (1) mpikzink (1) rhinoau (1) tim427 (1) daniel-franca (1) sashashura (1) tuomari (1) kimhaak (1) bnerickson (1) loopodoopo (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (20) murrant (16) PipoCanaja (11) ottorei (3) VVelox (2) SantiagoSilvaZ (1)","title":"22.10.0"},{"location":"General/Changelog/#security_9","text":"Block disabled user session auth ( #14473 ) - murrant Fix group delete xss ( #14472 ) - murrant Fix alert rules XSS ( #14471 ) - murrant Fix xss in browser push transport ( #14470 ) - murrant Fix users xss ( #14469 ) - murrant Fix user mass assignment vulnerability ( #14468 ) - murrant Fix billing xss ( #14465 ) - murrant Fix memcached unserialize vulnerability ( #14459 ) - murrant Fix possible RSS XSS ( #14457 ) - murrant GitHub Workflows security hardening ( #14388 ) - sashashura","title":"Security"},{"location":"General/Changelog/#device_17","text":"Correct aviatModemCurModulationRx oid ( #14446 ) - Jellyfrog MNI Microwave OS Add ( #14427 ) - carbinefreak Add OS tait-tnadmin for TN9300 ( #14413 ) - opalivan Skip empty drac state sensors ( #14409 ) - jgelinas Added support for additional Moxa EDS-G models ( #14405 ) - rhinoau Issue samsung printer m4080 fx ( #14391 ) - daniel-franca Enexus system output current fix ( #14324 ) - loopodoopo Routeros - Fix displaying distance in charts ( #14300 ) - Martin22 Added support for Ubiquiti UFiber OLT ( #14256 ) - Martin22","title":"Device"},{"location":"General/Changelog/#webui_14","text":"Fix missing device_id from device alert logs ( #14460 ) - ottorei Fix about date display ( #14442 ) - murrant Fix pseudowires pages ( #14441 ) - murrant Enhanced Service Overview on Device Overview Page ( #14410 ) - luc-ass Disable plugins that have errors ( #14383 ) - murrant Fix Inventory table for Dark theme ( #14377 ) - electrocret Add initselect2 to locations ports ( #14375 ) - KayckMatias Update devices filter in alert-logs to init_select2 ( #14361 ) - KayckMatias","title":"Webui"},{"location":"General/Changelog/#alerting_13","text":"Alert map location fix ( #14380 ) - KayckMatias Populate the alert rule field with the builder json ( #14374 ) - murrant","title":"Alerting"},{"location":"General/Changelog/#snmp-traps_2","text":"Improve LinkUp and LinkDown trap handling incomplete traps ( #14385 ) - tuomari","title":"Snmp Traps"},{"location":"General/Changelog/#applications_14","text":"Add pwrstatd application ( #14365 ) - bnerickson","title":"Applications"},{"location":"General/Changelog/#api_14","text":"Fix port search with slashes ( #14403 ) - murrant","title":"Api"},{"location":"General/Changelog/#discovery_11","text":"Cisco NAC fix ( #14440 ) - murrant","title":"Discovery"},{"location":"General/Changelog/#polling_10","text":"Fix bgp-peers bgpPeerIface bug and update test data ( #14420 ) - murrant","title":"Polling"},{"location":"General/Changelog/#oxidized_4","text":"Fix oxidized web requests unclosed connections or responding fast enough ( #14370 ) - fbouynot","title":"Oxidized"},{"location":"General/Changelog/#authentication_7","text":"Rework socialite integration ( #14367 ) - Jellyfrog","title":"Authentication"},{"location":"General/Changelog/#bug_16","text":"Snmpwalk functions: dont include invalid data ( #14438 ) - Jellyfrog Fix VRP duplicate BGP Peers ( #14431 ) - PipoCanaja Version and git helper improvements ( #14412 ) - murrant Cache version data ( #14404 ) - murrant Fix rpi codec state sensor ( #14400 ) - murrant Fix libvirt count() uncountable error ( #14398 ) - murrant Fix Firebrick local ASN ( #14397 ) - murrant Fix ups nut PHP 8 issue ( #14392 ) - murrant","title":"Bug"},{"location":"General/Changelog/#refactor_8","text":"Fix a few Db* to Eloquent requests ( #14278 ) - PipoCanaja","title":"Refactor"},{"location":"General/Changelog/#cleanup_10","text":"Remove tabs from yaml ( #14437 ) - Jellyfrog Miscellaneous fixes, mostly undefined variables ( #14432 ) - Jellyfrog Trim whitespaces from device data ( #14429 ) - Jellyfrog Fix bgp_peer array_merge error ( #14416 ) - PipoCanaja","title":"Cleanup"},{"location":"General/Changelog/#documentation_17","text":"Updating details of my LibreNMS install ( #14458 ) - SirMaple Fix php7.2 occurence in Performance.md documentation ( #14394 ) - fbouynot Fix documentation for php8.1 and bad package name ( #14393 ) - fbouynot","title":"Documentation"},{"location":"General/Changelog/#translation_5","text":"Fix Typo in Settings ( #14443 ) - electrocret","title":"Translation"},{"location":"General/Changelog/#tests_8","text":"Speed up tests ( #14421 ) - murrant Fix cisco-pw test capture ( #14415 ) - murrant Test supported PHP versions only ( #14389 ) - murrant Run CI on ubuntu 22.04 ( #14379 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#misc_14","text":"Update ports_purge docs and definitions ( #14402 ) - KayckMatias Added Ubuntu and Raspbian to ifAlias script ( #14399 ) - tim427","title":"Misc"},{"location":"General/Changelog/#dependencies_15","text":"Increase minimum version to PHP 8.1 ( #14378 ) - murrant","title":"Dependencies"},{"location":"General/Changelog/#2290","text":"(2022-09-21) A big thank you to the following 19 contributors this last month: murrant (53) Jellyfrog (17) PipoCanaja (7) fbouynot (6) bp0 (3) Npeca75 (2) sembeek (1) huntr-helper (1) KayckMatias (1) LoveSkylark (1) quentinsch (1) loopodoopo (1) electrocret (1) Martin22 (1) luc-ass (1) ktims (1) VirTechSystems (1) tim427 (1) mwobst (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (43) murrant (39) PipoCanaja (9) ottorei (4) SourceDoctor (1)","title":"22.9.0"},{"location":"General/Changelog/#feature_13","text":"Improved Modern Modules ( #14315 ) - murrant Add @signedGraphTag() and @signedGraphUrl() blade directives ( #14269 ) - murrant Device settings: attempt to open related tab ( #14250 ) - murrant Error reporting ( #14190 ) - Jellyfrog","title":"Feature"},{"location":"General/Changelog/#security_10","text":"Fix scheduled maintenance xss ( #14360 ) - murrant Add huntr.dev to SECURITY.md ( #14359 ) - huntr-helper","title":"Security"},{"location":"General/Changelog/#device_18","text":"Added status checks for (BWCC) battery status and condition for onboa\u2026 ( #14349 ) - quentinsch UHP VSAT modems ( #14317 ) - loopodoopo Ray2 - Oid repair at ber ( #14302 ) - Martin22 Fix ciena-sds inventory bugs ( #14252 ) - murrant F5 partition ram ( #14226 ) - fbouynot Add Cisco Flash storage support ( #14219 ) - fbouynot","title":"Device"},{"location":"General/Changelog/#webui_15","text":"Load device selection dynamically on Ports page ( #14353 ) - KayckMatias Port pages fixes and cleanups ( #14310 ) - murrant Remove Caffeine ( #14277 ) - murrant Updated brother.svg to make it render in Safari ( #14271 ) - luc-ass Fix for Cisco group device health tab ( #14265 ) - fbouynot Fix dashboard widgets becoming unlocked (especially when using a touchscreen) ( #14222 ) - tim427 Migrate xDSL code to module, and add support for VDSL2 MIB ( #14207 ) - PipoCanaja Improved sorting options for Availability Map ( #14073 ) - mwobst","title":"Webui"},{"location":"General/Changelog/#alerting_14","text":"Discord ability to attach graph images ( #14276 ) - murrant Email Transport: embed graphs by default ( #14270 ) - murrant","title":"Alerting"},{"location":"General/Changelog/#graphs_12","text":"Return GraphImage to include more metadata ( #14307 ) - murrant","title":"Graphs"},{"location":"General/Changelog/#api_15","text":"Allow delete location by id ( #14334 ) - bp0 API update_device, make location field work (as does location_id) ( #14325 ) - bp0","title":"Api"},{"location":"General/Changelog/#polling_11","text":"Fix ping.php skipped results ( #14368 ) - sembeek","title":"Polling"},{"location":"General/Changelog/#oxidized_5","text":"Oxidized \"allow purpose and notes\" ( #14352 ) - LoveSkylark","title":"Oxidized"},{"location":"General/Changelog/#bug_17","text":"Fix cipsec-tunnels ftd bad data causes error ( #14366 ) - murrant Handle null in unix-agent ( #14358 ) - murrant Fix the case of 'Ungrouped' in smokeping integration ( #14351 ) - fbouynot Fix for smokeping integration with ping-only devices ( #14341 ) - fbouynot Match displayname source for graylog ( #14339 ) - fbouynot Check dot1dBasePortIfIndex exists before using it ( #14337 ) - Jellyfrog Prevent errors when hrStorageTable doesn't exist ( #14327 ) - Jellyfrog Revert \"ZTE ZXA10 Update (Added dBm graphs)\" ( #14320 ) - murrant Billing module fix/cleanup ( #14309 ) - electrocret SnmpResponse filterBadLines fix ( #14306 ) - murrant Fix ARP Table on Device overview ( #14304 ) - Npeca75 Disable error reporting when dependencies are outdated ( #14291 ) - murrant Don't send zeros to Graphite for missing metrics ( #14262 ) - ktims Fix removing all port groups ( #14253 ) - murrant Move cronjob time for daily.sh ( #14245 ) - Jellyfrog Firebrick bgp polling was broken ( #14237 ) - murrant Quick fix for cipsec-tunnels Cisco implementation ( #14232 ) - PipoCanaja Fix redeclare of function breaking tests in OS eltex-mes23xx ( #14227 ) - PipoCanaja","title":"Bug"},{"location":"General/Changelog/#refactor_9","text":"Cleanup and optimize the availability widget ( #14329 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#cleanup_11","text":"Defer loading cli option defaults ( #14363 ) - Jellyfrog Remove call to Config from artisan ( #14362 ) - Jellyfrog Mibs - Cleanup names ( #14323 ) - PipoCanaja Enable more checks ( #14318 ) - Jellyfrog Do not include _token in legacy vars ( #14313 ) - murrant Don't include null os when loading defs ( #14312 ) - murrant 2fa not all routes have names ( #14311 ) - murrant Cache astext for 1 day ( #14303 ) - murrant Linux distro images require feature field ( #14301 ) - murrant Silence return type mismatch ( #14298 ) - Jellyfrog Fix more percent calculations ( #14294 ) - murrant Fix rounding null in mempools module ( #14290 ) - murrant Check if polling module exists ( #14289 ) - murrant Fix undefined variable ( #14287 ) - murrant Handle connection timed out errors in unix agent ( #14286 ) - murrant Remove unused function ( #14283 ) - murrant Remove reference to unused variable ( #14280 ) - murrant Cleanup some RunAlerts issues ( #14274 ) - murrant Fix a bunch of \"Since fakerphp/faker 1.14: Accessing property..\" ( #14267 ) - Jellyfrog Fix more error exceptions ( #14266 ) - Jellyfrog Fix hrStorageType being undefined ( #14260 ) - Jellyfrog Misc errors cleanup ( #14257 ) - Jellyfrog Fix ipv6 hexdec error ( #14254 ) - murrant Use empty string instead of null for routes ( #14247 ) - Jellyfrog Sort device types alphabetically ( #14244 ) - VirTechSystems Misc webui code cleanups ( #14242 ) - murrant Fix some ErrorExceptions ( #14241 ) - Jellyfrog Fix os_group unset errors ( #14238 ) - murrant Juniper bgp-peers cleanup ( #14236 ) - murrant Percentage calculation helper ( #14235 ) - murrant Memcached app undefined vars ( #14225 ) - Npeca75 Fix Undefined variable/key warnings ( #14134 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_18","text":"Move list_locations from devices to locations ( #14328 ) - bp0 Cisco-sla module was renamed to slas ( #14288 ) - murrant Update docs around APP_URL ( #14282 ) - murrant","title":"Documentation"},{"location":"General/Changelog/#tests_9","text":"Do not allow sysDescr to be fetched in os module yaml ( #14331 ) - murrant Remove PHP version constraint ( #14314 ) - Jellyfrog Lnms dev:simulate check simulated device exists ( #14243 ) - murrant Save-test-data to refresh all variants of an OS ( #14231 ) - PipoCanaja","title":"Tests"},{"location":"General/Changelog/#misc_15","text":"Defer loading cli option values ( #14354 ) - murrant Ignore CommandNotFoundException from reporting ( #14342 ) - Jellyfrog Allow dumping of errors and warnings ( #14275 ) - murrant Allow SnmpQuery to optionally abort walks if one fails ( #14255 ) - murrant","title":"Misc"},{"location":"General/Changelog/#dependencies_16","text":"Update dependencies ( #14319 ) - murrant Bump php-cs-fixer to 3.4.0 ( #14224 ) - murrant","title":"Dependencies"},{"location":"General/Changelog/#2280","text":"(2022-08-19) A big thank you to the following 26 contributors this last month: murrant (18) Npeca75 (12) Jellyfrog (9) gs-kamnas (5) earendilfr (3) fbouynot (3) VVelox (3) rhinoau (2) Schouwenburg (2) electrocret (2) aztec102 (2) PipoCanaja (1) loopodoopo (1) washcroft (1) Laplacence (1) opalivan (1) Jarod2801 (1) Martin22 (1) TheMysteriousX (1) ciscoqid (1) Fehler12 (1) PedroChaps (1) ajsiersema (1) quentinsch (1) Mar974 (1) mwobst (1) Thanks to maintainers and others that helped with pull requests this month: murrant (46) Jellyfrog (26) PipoCanaja (2) VVelox (1) Cormoran96 (1) bennet-esyoil (1) ottorei (1)","title":"22.8.0"},{"location":"General/Changelog/#feature_14","text":"Prepare for PHP 8.1 ( #14156 ) - Jellyfrog New Poller validations ( #14148 ) - murrant New lnms command to enable and disable plugins ( #14147 ) - murrant Support for SSL/TLS protected connections to MySQL databases ( #14142 ) - gs-kamnas Collect OS distro and LibreNMS version ( #14138 ) - murrant Lnms device:poll better feedback ( #14130 ) - murrant Per-App data storage ( #14087 ) - VVelox","title":"Feature"},{"location":"General/Changelog/#device_19","text":"Fix luminato port poll ( #14217 ) - murrant Teltonika RUT fix ( #14202 ) - loopodoopo Initial support for Moxa AWK Industrial APs ( #14197 ) - rhinoau Mikrotik wifi station mode sensors ( #14193 ) - Npeca75 Update mellanox os image ( #14184 ) - Laplacence Change state_name for Racoms modulation ( #14174 ) - Martin22 Cisco SB/CBS environment sensors ( #14154 ) - Fehler12 Fix Rocky Linux and AlmaLinux icons and logos ( #14150 ) - murrant Add additional sysObjectIDs for variants of the Arista 7130 ( #14144 ) - gs-kamnas Eltex MES 2324p Add ( #14135 ) - aztec102 Solid Optics EDFAMUX support ( #14129 ) - murrant Merge netmanplus and riello and improve device support ( #14125 ) - murrant Bats support ( #14108 ) - Schouwenburg Solved aos6 problem where Librenms wasn't identifying all vlans ( #14107 ) - PedroChaps Fix Cisco polling BGP peers in non-default VRF ( #14105 ) - ajsiersema Added support for CheckPoint 1100, 1450 & 1490 models. ( #14074 ) - quentinsch Ns-bsd updated for SNS LTSB 3.7.19 ( #14060 ) - Mar974 ZTE ZXA10 Update (Added dBm graphs) ( #14049 ) - aztec102","title":"Device"},{"location":"General/Changelog/#webui_16","text":"Fix ports display ( #14183 ) - murrant Ports by device group ( #14175 ) - electrocret Empty Outages table ( #14167 ) - Npeca75 View Ports in Portgroups ( #14141 ) - electrocret Fix eventlog filtering ( #14136 ) - murrant [gui] enable permanent vertical scroll ( #14102 ) - Npeca75","title":"Webui"},{"location":"General/Changelog/#alerting_15","text":"Correct logic for recurring alert rules that span UTC days ( #14145 ) - gs-kamnas Improvements to PagerDuty alert formatting ( #14143 ) - gs-kamnas Add rich (=html) support for messages via Matrix ( #14054 ) - mwobst","title":"Alerting"},{"location":"General/Changelog/#graphs_13","text":"Fix unauth application graphs ( #14216 ) - murrant Allow specifying the background colour in graph images ( #14192 ) - washcroft","title":"Graphs"},{"location":"General/Changelog/#applications_15","text":"Add possibility to monitor redis application through the unix-agent ( #14182 ) - earendilfr Fix error between application module and unix-agent ( #14177 ) - earendilfr Add possibility to monitor the php-fpm service with the unix agent ( #14173 ) - earendilfr [apps] Docker only show current containers ( #14152 ) - Npeca75 Add support for Sagan ( #14070 ) - VVelox Add Opensearch\\Elasticsearch monitoring ( #14053 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#api_16","text":"Standardize device and device group maintenance API ( #14153 ) - rhinoau Fix maintenance APIs not associating device or group ( #14127 ) - murrant","title":"Api"},{"location":"General/Changelog/#discovery_12","text":"Fix legacy os extends ( #14220 ) - murrant Sensors, convert hex to strings ( #14121 ) - murrant","title":"Discovery"},{"location":"General/Changelog/#polling_12","text":"Fix for number in sensor string ( #14185 ) - Schouwenburg","title":"Polling"},{"location":"General/Changelog/#authentication_8","text":"AD Auth PHP 8.1 fixes ( #14215 ) - murrant","title":"Authentication"},{"location":"General/Changelog/#bug_18","text":"Autodiscovery fix ( #14213 ) - Npeca75 Fix alert log clearing SQL query ( #14200 ) - Jellyfrog Fix error when ldap_search returns false ( #14199 ) - Jellyfrog Fix unnecessary Updates of DB when values are equal ( #14179 ) - opalivan Fix APP_KEY generation when using fpm ( #14168 ) - Jellyfrog Fix validation error ( #14163 ) - TheMysteriousX IPv6 Debug typo ( #14162 ) - Npeca75 Replace git show --no-patch option with --quiet ( #14160 ) - ciscoqid Fix 500 error in validation when UI containers and poller containers have differing node_ids ( #14146 ) - gs-kamnas Use --no-patch to support old git clients ( #14137 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#refactor_10","text":"Use \"database version\" instead of \"mysql version\" ( #14158 ) - Jellyfrog","title":"Refactor"},{"location":"General/Changelog/#documentation_19","text":"Update to mkdocs-material 8.3.9 ( #14189 ) - Jellyfrog SNMP extend / fix mdadm documentation ( #14186 ) - Npeca75 Update index.md ( #14178 ) - Jarod2801 Add instructions for PHP 8.1 and Ubuntu 22.04 ( #14166 ) - Jellyfrog Update php installation instruction for CentOS 8 to reflect the minim\u2026 ( #14159 ) - fbouynot Fix typo in Smokeping SELinux documentation ( #14155 ) - fbouynot Add device_default_display info ( #14151 ) - murrant Change SELinux context for logs ( #14128 ) - fbouynot","title":"Documentation"},{"location":"General/Changelog/#translation_6","text":"Serbian translation, part3 ( #14205 ) - Npeca75 More Serbian translation ( #14181 ) - Npeca75 Enable translation on Eventlog & Component-status widgets ( #14180 ) - Npeca75 Initial support for Serbian language ( #14165 ) - Npeca75 Enable translation in 3 Alert widget ( #14164 ) - Npeca75","title":"Translation"},{"location":"General/Changelog/#tests_10","text":"Allow save-test-data.php to run all modules explicitely ( #14212 ) - PipoCanaja Increase OS detection time, sometimes it is not ready by 5s ( #14133 ) - murrant","title":"Tests"},{"location":"General/Changelog/#2270","text":"(2022-07-20) A big thank you to the following 21 contributors this last month: murrant (12) fbouynot (4) mwobst (3) dependabot (2) wrongecho (2) ppasserini (2) QuadPiece (2) Jellyfrog (2) enferas (1) 00gh (1) bennet-esyoil (1) VVelox (1) rhinoau (1) prahal (1) paulgear (1) duhow (1) PipoCanaja (1) Mar974 (1) ottorei (1) mostdaysarebaddays (1) dagbdagb (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (19) murrant (14) ottorei (2) PipoCanaja (2) mpikzink (1) VVelox (1)","title":"22.7.0"},{"location":"General/Changelog/#security_11","text":"Security fixes XSS in oxidized-cfg-check.inc.php and print-customoid.php ( #14126 ) - enferas","title":"Security"},{"location":"General/Changelog/#device_20","text":"Missing \"s\" in NsBsd.php ( #14067 ) - Mar974 Add full version of Mikrotik logo ( #14063 ) - QuadPiece Add apc battery operation time, including display in WebUI ( #14058 ) - mwobst Fix the parsing of the temperature unit value (CMCIII devices) ( #14056 ) - mwobst Update Mikrotik logo ( #14045 ) - QuadPiece Aviat WTM reduce snmp load ( #13918 ) - murrant","title":"Device"},{"location":"General/Changelog/#webui_17","text":"Fix device filtering false values ( #14103 ) - murrant Minor visual changes to the apps-overview page ( #14090 ) - bennet-esyoil Search device by MAC via URL ( #14072 ) - duhow Add BGP description to eventlog BGP Peers messages ( #14061 ) - mostdaysarebaddays","title":"Webui"},{"location":"General/Changelog/#alerting_16","text":"Example rules for diskspace on / ( #14082 ) - VVelox","title":"Alerting"},{"location":"General/Changelog/#graphs_14","text":"Ping perf ( #14117 ) - 00gh","title":"Graphs"},{"location":"General/Changelog/#applications_16","text":"Fix app docker ( #14080 ) - prahal","title":"Applications"},{"location":"General/Changelog/#polling_13","text":"Increase traceroute timeout ( #14084 ) - murrant","title":"Polling"},{"location":"General/Changelog/#authentication_9","text":"Add option STARTTLS for authentication via AD ( #14051 ) - dagbdagb","title":"Authentication"},{"location":"General/Changelog/#bug_19","text":"Prevent duplicate plugin table entries ( #14120 ) - murrant Fix auth_test.php debug ( #14118 ) - murrant Fix config seeder will never run ( #14113 ) - murrant Reset the opcache after install ( #14098 ) - murrant Update config cache on install finalize step ( #14097 ) - murrant Fix more webserver validation issues ( #14096 ) - murrant Revert \"Add apc battery operation time, including display in WebUI\" ( #14068 ) - PipoCanaja Use --no-patch instead ( #14047 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#cleanup_12","text":"Remove mib poller module remnants ( #14077 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_20","text":"Small documentation typos ( #14101 ) - wrongecho Documentation typos ( #14099 ) - wrongecho Add SELinux configuration for SNMPd on Centos8 in the documentation ( #14095 ) - fbouynot Add SELinux configuration for LDAP/AD authentication on Centos8 in the documentation ( #14094 ) - fbouynot Add SELinux configuration for Smokeping on Centos8 in the documentation ( #14093 ) - fbouynot Add SELinux configuration for RRDCached on Centos8 in the documentation ( #14092 ) - fbouynot Corrected API devicegroup curl creation examples ( #14081 ) - rhinoau Minor grammar fixes in doc ( #14078 ) - paulgear Add documentation for Chrony application monitoring ( #14066 ) - ottorei","title":"Documentation"},{"location":"General/Changelog/#translation_7","text":"Few more updates to Ita lang ( #14091 ) - ppasserini Italian language update ( #14085 ) - ppasserini Adjustments to german translation ( #14083 ) - mwobst","title":"Translation"},{"location":"General/Changelog/#tests_11","text":"Test PHP 8.1 ( #14109 ) - murrant","title":"Tests"},{"location":"General/Changelog/#misc_16","text":"Allow reapply yaml config via env ( #14100 ) - murrant","title":"Misc"},{"location":"General/Changelog/#mibs_8","text":"More MIB fixing ( #14018 ) - Jellyfrog","title":"Mibs"},{"location":"General/Changelog/#dependencies_17","text":"Bump terser from 4.8.0 to 4.8.1 ( #14123 ) - dependabot Bump guzzlehttp/guzzle from 7.4.4 to 7.4.5 ( #14059 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2260","text":"(2022-06-14) A big thank you to the following 22 contributors this last month: murrant (22) gs-kamnas (5) Jellyfrog (4) dependabot (2) kruczek8989 (2) bile0026 (1) dennypage (1) hjcday (1) Martin22 (1) spyfly (1) Bobdave (1) bennet-esyoil (1) DaftBrit (1) SanderBlom (1) thecityofguanyu (1) glance- (1) duhow (1) TheMysteriousX (1) kevinwallace (1) HolgerHees (1) charlyforot (1) SourceDoctor (1) Thanks to maintainers and others that helped with pull requests this month: murrant (21) Jellyfrog (14) ottorei (5) PipoCanaja (2) mpikzink (1) f0o (1)","title":"22.6.0"},{"location":"General/Changelog/#feature_15","text":"SnmpQuery walk multiple oids ( #14015 ) - murrant Add support to REST API for creating Maintenance Schedules for Device Groups ( #13985 ) - thecityofguanyu Automatic fixes for validation failures ( #13930 ) - murrant","title":"Feature"},{"location":"General/Changelog/#security_12","text":"Bumpver handlebars.js to 4.7.7 to resolve CVE-2021-23369 ( #13990 ) - gs-kamnas","title":"Security"},{"location":"General/Changelog/#device_21","text":"Fix use of incorrect variable to retrieve current sensor value ( #14037 ) - dennypage Support Huawei SMU11B ( #14029 ) - murrant Update Teltonika Sensors for FW R_00.07.02 ( #14012 ) - hjcday Procurve hardware description cleanup ( #14007 ) - murrant Racom Ray2 and Ray3 - Modulation states added ( #14001 ) - Martin22 Fix OS Detection for USW-Flex-XG ( #13999 ) - spyfly Add support for Cisco Nexus 3550 series (formerly Exalink Fusion) devices ( #13992 ) - gs-kamnas Improve support for Arista/Metamako MOS devices ( #13988 ) - gs-kamnas Workaround issues with lldp information from GS108Tv1 ( #13971 ) - glance- Add additional OpenBSD PF graphs ( #13963 ) - kevinwallace BGP unnumbered support for Cumulus ( #13785 ) - charlyforot","title":"Device"},{"location":"General/Changelog/#webui_18","text":"Dashboard code cleanup ( #13996 ) - murrant Device Types Widget ( #13670 ) - SourceDoctor","title":"Webui"},{"location":"General/Changelog/#alerting_17","text":"Add macro.past_20m macro ( #14023 ) - kruczek8989 Allow the use of a custom URL for accessing the PagerDuty API and correct API schema violation ( #14010 ) - gs-kamnas Setting MSteams card summary to alert title ( #13989 ) - DaftBrit Use display name when sending alerts to Sensu ( #13967 ) - TheMysteriousX","title":"Alerting"},{"location":"General/Changelog/#applications_17","text":"Add error-state to non-responsive mysql-servers ( #13993 ) - bennet-esyoil","title":"Applications"},{"location":"General/Changelog/#discovery_13","text":"Fix printer count sensors when extra garbage is returned ( #14014 ) - murrant","title":"Discovery"},{"location":"General/Changelog/#oxidized_6","text":"Syslog-notify-oxidized.php now always notifies Oxidized ( #14011 ) - murrant Fix Oxidized syslog change notifier when the change was made via snmp. ( #14005 ) - kruczek8989","title":"Oxidized"},{"location":"General/Changelog/#authentication_10","text":"Implement support for usernames coming from reverse proxies ( #13894 ) - HolgerHees","title":"Authentication"},{"location":"General/Changelog/#bug_20","text":"Git version validation improvement ( #14042 ) - murrant Server name validation, handle ports better ( #14041 ) - murrant Fix some broken migrations ( #14040 ) - Jellyfrog Fix rrd version validation check ( #14036 ) - murrant Fix DB timezone validation ( #14035 ) - murrant Regression fix from #13596 ( #14034 ) - Jellyfrog Fix an issue when getting the local version from git ( #14020 ) - murrant Fix migrations failing one time after dashboard cleanup ( #14002 ) - murrant Fix Netscaler VServer database updates during polling ( #13995 ) - Bobdave Fix 500 error in validations when capabilities are not supported or set ( #13991 ) - gs-kamnas","title":"Bug"},{"location":"General/Changelog/#cleanup_13","text":"Remove traceroute6, it is unused ( #14019 ) - murrant Remove DefaultWidgetSeeder ( #14006 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_21","text":"Okta saml ( #14038 ) - bile0026 HPE Comware snmp config example ( #13997 ) - murrant","title":"Documentation"},{"location":"General/Changelog/#tests_12","text":"Fix tests failing when device with IP 127.1.6.1 exists ( #14016 ) - murrant","title":"Tests"},{"location":"General/Changelog/#misc_17","text":"Slightly easier validation page error access ( #14044 ) - murrant Lnms scan respect -q parameter ( #14027 ) - murrant Custom OID processing of numeric strings with filters ( #13968 ) - duhow Validate base_url and server_name ( #13941 ) - murrant","title":"Misc"},{"location":"General/Changelog/#mibs_9","text":"Update MIBs ( #14017 ) - Jellyfrog Updated existing Siemens MIBs and added trap MIB ( #13986 ) - SanderBlom","title":"Mibs"},{"location":"General/Changelog/#dependencies_18","text":"Update Larastan ( #14031 ) - murrant Update PHP dependencies ( #14028 ) - murrant Bump guzzlehttp/guzzle from 7.4.3 to 7.4.4 ( #14025 ) - dependabot Bump guzzlehttp/guzzle from 7.4.1 to 7.4.3 ( #13994 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2250","text":"(2022-05-21) A big thank you to the following 23 contributors this last month: murrant (7) VVelox (6) slimey99uk (2) dependabot (2) Npeca75 (2) nox-x (1) nsn-amagruder (1) mkuurstra (1) booth-f (1) sajiby3k (1) skandragon (1) Martin22 (1) twelch24 (1) ppasserini (1) bl3nd3r (1) SantiagoSilvaZ (1) Jimmy-Cl (1) lfkeitel (1) steffann (1) micko (1) IVI053 (1) pfromme25 (1) mzacchi (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (19) murrant (16) ottorei (3) mpikzink (1)","title":"22.5.0"},{"location":"General/Changelog/#feature_16","text":"Allow unordered OIDs (global and per-os) ( #13923 ) - murrant Added --ping-only to snmp-scan.py ( #13810 ) - IVI053","title":"Feature"},{"location":"General/Changelog/#device_22","text":"Add Cisco Business Wirless to ciscowlc.yaml ( #13984 ) - nsn-amagruder Add Eaton SC200 OS model ( #13978 ) - slimey99uk Fortigate LTE sensor addition ( #13977 ) - slimey99uk Added BKE power supply support. ( #13972 ) - Martin22 Don't use bulk-walk for PrimeKey Appliances ( #13958 ) - bl3nd3r Fix avtech12e sensors ( #13943 ) - lfkeitel [mikrotik] fixed RouterOS ipv4/ipv6 routes ( #13902 ) - Npeca75 Netscaler new counter metrics ( #13323 ) - mzacchi","title":"Device"},{"location":"General/Changelog/#webui_19","text":"Update dark mode to fix BGP and Peering page ( #13951 ) - Jimmy-Cl Fix snmp.timeout setting via Web UI ( #13937 ) - murrant","title":"Webui"},{"location":"General/Changelog/#alerting_18","text":"More realistic alert test data ( #13969 ) - murrant","title":"Alerting"},{"location":"General/Changelog/#graphs_15","text":"[RRD] fix IPv6 folder name ( #13945 ) - Npeca75","title":"Graphs"},{"location":"General/Changelog/#applications_18","text":"Remove alert keys from component for Suricata ( #13959 ) - VVelox Fix a few issues with variable names for Suricata ( #13956 ) - VVelox Scripts/json-app-tool.php JSON generation fix and add -S for SNMP extend name ( #13948 ) - VVelox Add Suricata monitoring ( #13942 ) - VVelox","title":"Applications"},{"location":"General/Changelog/#discovery_14","text":"Fix polling and discovery of FortiGate cluster sensors ( #13980 ) - mkuurstra","title":"Discovery"},{"location":"General/Changelog/#oxidized_7","text":"Oxidized API to return groups based on device purpose or notes ( #13976 ) - sajiby3k","title":"Oxidized"},{"location":"General/Changelog/#authentication_11","text":"Auth_ldap_skip_group_check when ldap_compare is not supported ( #13926 ) - micko Add LDAP bind and userlist filter support to ldap-authorization ( #13788 ) - pfromme25","title":"Authentication"},{"location":"General/Changelog/#bug_21","text":"Inconsistency in ldap starttls config parameter ( #13987 ) - nox-x Fix version check error ( #13981 ) - murrant Use full sudo path ( #13975 ) - skandragon Fix IPv6 in service check host ( #13939 ) - steffann","title":"Bug"},{"location":"General/Changelog/#refactor_11","text":"Improve the efficiency of some queries ( #13974 ) - murrant Move Config loading to a service provider ( #13927 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#documentation_22","text":"Fix typo in dispatcher service doc ( #13979 ) - booth-f Fix a typo in alerting doc ( #13970 ) - twelch24 DOCS, switch to dark or light mode ( #13953 ) - SantiagoSilvaZ Assorted cleanups to alerting docs, primarily to make mdl happier ( #13950 ) - VVelox Update test doc making it more mdl happy and add a section on writing JSON app tests ( #13949 ) - VVelox","title":"Documentation"},{"location":"General/Changelog/#translation_8","text":"Small Italian lang update ( #13960 ) - ppasserini","title":"Translation"},{"location":"General/Changelog/#misc_18","text":"Improve lnms shortcut validation ( #13982 ) - murrant","title":"Misc"},{"location":"General/Changelog/#dependencies_19","text":"Bump async from 2.6.3 to 2.6.4 ( #13947 ) - dependabot Bump composer/composer from 2.2.4 to 2.3.5 ( #13944 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2240_1","text":"(2022-04-21) A big thank you to the following 27 contributors this last month: murrant (18) SantiagoSilvaZ (3) laf (3) dependabot (3) Fehler12 (3) ottorei (2) bl3nd3r (2) p4k8 (1) si458 (1) TheMysteriousX (1) cliffalbert (1) Jimmy-Cl (1) frenchie (1) ppasserini (1) claude191 (1) westerterp (1) Cormoran96 (1) WillIrvine (1) lucalo72 (1) ssasso (1) Jellyfrog (1) geg347 (1) dandare100 (1) bonzo81 (1) PipoCanaja (1) jonathanjdavis (1) manonfgoo (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (25) murrant (16) laf (10) ottorei (3) PipoCanaja (3) SourceDoctor (2) haxmeadroom (1)","title":"22.4.0"},{"location":"General/Changelog/#feature_17","text":"Add ISIS discovery and polling for iosxe devices ( #13880 ) - WillIrvine","title":"Feature"},{"location":"General/Changelog/#security_13","text":"Fix services command injection ( #13932 ) - murrant Fix Graylog XSS ( #13931 ) - murrant Bump minimist from 1.2.5 to 1.2.6 ( #13872 ) - dependabot Fix SQL injection in get-host-dependencies ( #13868 ) - Jellyfrog","title":"Security"},{"location":"General/Changelog/#device_23","text":"Support tplink routers ( #13922 ) - si458 Fix Hytera error ( #13909 ) - murrant PrimeKey Improvements ( #13901 ) - bl3nd3r Enhancements for Zyxel OS ( #13897 ) - Jimmy-Cl Added support for Dell PowerVault ME4024 ( #13883 ) - laf Add support for Riello NetMan 204 ( #13878 ) - lucalo72 Fix usw flex switch hardware detection ( #13877 ) - Fehler12 Added Polycom Lens SNMP support. ( #13876 ) - Fehler12 Fix for PFSense state table removals field ( #13863 ) - dandare100 McAfee Proxy Sensor name update ( #13853 ) - PipoCanaja Add support for PrimeKey Hardware Appliance ( #13806 ) - bl3nd3r","title":"Device"},{"location":"General/Changelog/#webui_20","text":"Add ISIS-details to alert details ( #13920 ) - ottorei Fix port mini graphs ( #13911 ) - murrant Replaced OpenWRT icon with new logo ( #13891 ) - frenchie Add \"Ping Response\" graph to \"Ping Only\" Device Overview page ( #13886 ) - westerterp Remove fix size for column mac adresse ( #13881 ) - Cormoran96 Fixed the top port errors widget returning bits graphs instead ( #13860 ) - laf","title":"Webui"},{"location":"General/Changelog/#alerting_19","text":"Correct type hint ( #13915 ) - TheMysteriousX Improve alert template saving ( #13910 ) - murrant Added Basic authentication capability to Alertmanager Transport ( #13867 ) - geg347","title":"Alerting"},{"location":"General/Changelog/#snmp-traps_3","text":"Add Cisco Err-Disable interface event trap handler ( #13855 ) - bonzo81","title":"Snmp Traps"},{"location":"General/Changelog/#api_17","text":"Ensure 'add_device' API returns indexed-array (as per doco) ( #13887 ) - claude191","title":"Api"},{"location":"General/Changelog/#polling_14","text":"Fix STP polling bug ( #13924 ) - murrant Print full error message in poller/discovery output ( #13903 ) - murrant","title":"Polling"},{"location":"General/Changelog/#rancid_1","text":"Add MRV OptiDriver support in gen_rancid ( #13900 ) - cliffalbert Add support for VyOS on Rancid conf ( #13874 ) - ssasso","title":"Rancid"},{"location":"General/Changelog/#bug_22","text":"Validate fixes ( #13935 ) - murrant Lnms device:add handle snmp.community bad format ( #13914 ) - murrant Fix install icons ( #13904 ) - murrant Handle bad uptime input ( #13899 ) - murrant Fix custom error messages ( #13898 ) - murrant Migrate addhost.php to lnms device:add ( #13870 ) - murrant","title":"Bug"},{"location":"General/Changelog/#refactor_12","text":"Port Validation Page to Laravel ( #13921 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#cleanup_14","text":"Better device:add error output ( #13913 ) - murrant Remove non-working Dell specific alert rules from the collection ( #13706 ) - Fehler12","title":"Cleanup"},{"location":"General/Changelog/#documentation_23","text":"Docs, fix code block in oxidized group ( #13908 ) - SantiagoSilvaZ [DOC] Fix Code blocks Step 2 Installing Network-WeatherMap ( #13905 ) - SantiagoSilvaZ [DOC] Styling the .env word quote ( #13889 ) - SantiagoSilvaZ Docs, fix Linux SNMP example only listening on ::1 ( #13882 ) - murrant Script that describes how to migrate traffic bills from observium. ( #13757 ) - manonfgoo","title":"Documentation"},{"location":"General/Changelog/#translation_9","text":"Ukrainian translation update ( #13933 ) - p4k8 Few more language (ITA) updates ( #13890 ) - ppasserini","title":"Translation"},{"location":"General/Changelog/#dependencies_20","text":"Bump guzzlehttp/psr7 from 2.1.0 to 2.2.1 ( #13879 ) - dependabot Bump jpgraph version to 4 ( #13875 ) - ottorei Bump node-forge from 1.2.1 to 1.3.0 ( #13869 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2230","text":"(2022-03-17) A big thank you to the following 22 contributors this last month: murrant (7) Jellyfrog (5) bonzo81 (4) laf (3) PipoCanaja (2) charlyforot (2) geg347 (2) westerterp (2) ospfbgp (1) MrXermon (1) pandalion98 (1) eskyuu (1) josh-silvas (1) martinberg (1) lpailhas (1) hanserasmus (1) si458 (1) SantiagoSilvaZ (1) LTangaF (1) dlangille (1) Npeca75 (1) woidi (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (19) murrant (10) laf (8) SourceDoctor (3) ottorei (1) bboy8012 (1) PipoCanaja (1)","title":"22.3.0"},{"location":"General/Changelog/#feature_18","text":"Device_add support display field ( #13846 ) - murrant Display Name in availability map ( #13841 ) - murrant Implement OAuth and SAML2 support ( #13764 ) - Jellyfrog","title":"Feature"},{"location":"General/Changelog/#security_14","text":"Resolved XSS issue from alert rule list modal ( #13805 ) - laf","title":"Security"},{"location":"General/Changelog/#device_24","text":"Add support for VOSS 8.6 ( #13857 ) - ospfbgp Device - HWG-WLD version 2 support ( #13849 ) - PipoCanaja Fix an issue with the APC current discovery ( #13837 ) - eskyuu Add VS state for Gaia ( #13831 ) - martinberg [new OS] Alpine OptoElectronics TDCM-EDFA support ( #13825 ) - charlyforot Fix db delete on cisco-vrf-lite discovery ( #13823 ) - lpailhas Add rocky linux OS identification ( #13815 ) - hanserasmus Detect truenas scale ( #13812 ) - si458 [comware] dropped dbfetch from discovery/sensors ( #13796 ) - Npeca75 Correct divisor in discovery definition vertiv-pdu.yaml ( #13768 ) - woidi","title":"Device"},{"location":"General/Changelog/#webui_21","text":"Fixed displaying hostname in create bill when port is passed ( #13830 ) - laf Fix Oxidized Config tab showing when Device OS or Device Type is disabled ( #13809 ) - westerterp Position the buttons in the center on user preferences page ( #13802 ) - SantiagoSilvaZ Add usage hints for Display Name placeholder usage ( #13801 ) - LTangaF Fix second menu bar in Apps screens ( #13800 ) - westerterp WebUI - Search results for ports ( #13787 ) - PipoCanaja","title":"Webui"},{"location":"General/Changelog/#alerting_20","text":"Newer versions of Jira use HTTP code 201 fore created issues ( #13852 ) - MrXermon Add extra dynamic values alerttransport alertmanager ( #13828 ) - geg347","title":"Alerting"},{"location":"General/Changelog/#snmp-traps_4","text":"Add APC SmartAvrReducing trap handlers ( #13839 ) - bonzo81 Add APC upsOnBattery & powerRestored trap handler ( #13836 ) - bonzo81 Add OspfTxRetransmit Trap Handler ( #13824 ) - bonzo81 Cisco Mac address violation trap handler ( #13811 ) - bonzo81","title":"Snmp Traps"},{"location":"General/Changelog/#api_18","text":"Adds API call to update port notes on devices. ( #13834 ) - josh-silvas","title":"Api"},{"location":"General/Changelog/#bug_23","text":"Rewrite agent packages parsing code ( #13840 ) - murrant Fix snmpv3 context when empty SnmpQuery ( #13832 ) - murrant Regression fix from b6a8b602b891d9eb8633f62632c17bdc559cd620 ( #13819 ) - Jellyfrog Fix PHPStan Deprecated test ( #13794 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#refactor_13","text":"Remove addHost from ModuleTestHelper ( #13847 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#tests_13","text":"PHP8 phpstan fix ( #13843 ) - murrant Fix tests for MariaDB > 10.5.15 ( #13829 ) - Jellyfrog Add MIB to OS helper to tests ( #13795 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#misc_19","text":"Add configuration support for IPMIv2 Kg key ( #13845 ) - pandalion98 New device:add code ( #13842 ) - murrant Fix class error name prevents to show BER graph ( #13833 ) - charlyforot Add generic PSU status failed alert rule template ( #13821 ) - geg347 Bump version to 22.2.1 ( #13798 ) - dlangille","title":"Misc"},{"location":"General/Changelog/#2220","text":"(2022-02-16) A big thank you to the following 22 contributors this last month: Jellyfrog (22) murrant (11) PipoCanaja (7) Npeca75 (7) ilGino (6) SantiagoSilvaZ (4) laf (3) h-barnhart (2) aztec102 (2) Fehler12 (1) JKJameson (1) jepke (1) sGoico (1) dorkmatt (1) SourceDoctor (1) si458 (1) dfitton (1) Martin22 (1) fsmeets (1) dependabot (1) knpo (1) guipoletto (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (35) murrant (16) laf (14) PipoCanaja (10) ottorei (6) SourceDoctor (5) kkrumm1 (1)","title":"22.2.0"},{"location":"General/Changelog/#feature_19","text":"Implement system for user packages in composer ( #13718 ) - Jellyfrog","title":"Feature"},{"location":"General/Changelog/#security_15","text":"Hide community and make it XSS safer ( #13783 ) - PipoCanaja Moved some pages to be within admin route ( #13782 ) - laf XSS fix ( #13780 ),( #13778 ),( #13776 ),( #13775 ) - PipoCanaja Bump follow-redirects package from 1.14.7 to 1.14.8 ( #13774 ) - dependabot","title":"Security"},{"location":"General/Changelog/#device_25","text":"Support for Terra sdi410c / sdi480 devices ( #13759 ) - Npeca75 Added BER to Racom Ray and Ray3 ( #13758 ) - Martin22 Added system temperature support including state for Extreme VSP 4900 devices ( #13743 ) - laf Added ipv6 route discovery for Mikrotik devices ( #13737 ) - Npeca75 Fixed airos temp in 8.7.7 for ubnt devices ( #13731 ) - murrant Added sensors to ZXA OS ( #13724 ) - aztec102 Added support for Volius OS ( #13723 ) - aztec102 Updated DDM MIBs for Jetstream OS ( #13715 ) - Npeca75 Added support for Ubiquiti Airfiber60 devices ( #13680 ) - jepke Fixed Temperature Sensor for AirOS 8.7.4+ ( #13655 ) - JKJameson Added support for Lenovo think station devices ( #13617 ) - Fehler12 Added sensors for huawei vrp devices ( #13352 ) - guipoletto","title":"Device"},{"location":"General/Changelog/#webui_22","text":"Rewrite includes/html/pages/device/health.inc.php ( #13777 ) - Npeca75 Various fixes for STP ( #13773 ) - PipoCanaja Added missing icons for progressive web app ( #13771 ) - murrant Show selected selection option on graphs page in Mono theme ( #13765 ) - SantiagoSilvaZ Show selected option of devices-graphs-select in Mono theme ( #13752 ) - SantiagoSilvaZ Upgrade to font awesome 6 ( #13760 ) - Jellyfrog Upgrade to font awesome 5 ( #13754 ) - Jellyfrog Update dark.css to improve visibility ( #13749 ) - dfitton Removing colon symbol from multiple dialogs ( #13742 ) - ilGino Added the word Actions in the header of the oxidized-nodes table ( #13741 ) - SantiagoSilvaZ Updated icons of links pointing to Health pages ( #13729 ) - ilGino Updated to a more consistent Fontawesome icon for the Export to PDF ( #13713 ) - ilGino Removing the colon symbol to the right of a control labels ( #13704 ),( #13705 ) - ilGino Update to tailwind 3 ( #13695 ) - Jellyfrog","title":"Webui"},{"location":"General/Changelog/#alerting_21","text":"Added better default sensor alert template ( #13703 ) - Jellyfrog","title":"Alerting"},{"location":"General/Changelog/#snmp-traps_5","text":"Added SNMP Traps for Brocade login traps ( #13770 ) - h-barnhart Added SNMP Traps for APC Overload Traps ( #13726 ) - h-barnhart","title":"Snmp Traps"},{"location":"General/Changelog/#discovery_15","text":"Check for empty SLA tags so we skip bad entries ( #13679 ) - laf","title":"Discovery"},{"location":"General/Changelog/#bug_24","text":"Only try contexts in STP for Cisco devices ( #13767 ) - murrant Fix settings array initial value ( #13755 ) - Jellyfrog Use better filesystem functions to delete host rrd dir ( #13735 ) - Jellyfrog Device:poll log poll complete ( #13733 ) - murrant Fixed \\< 0 exception in ports poller ( #13732 ) - murrant Fixed ups-nut check ( #13722 ) - Jellyfrog Changed fping hardcoded binary to user defined fping ( #13720 ) - sGoico","title":"Bug"},{"location":"General/Changelog/#refactor_14","text":"Oxidized reload called on Device update and remove ( #13730 ) - murrant Stp module rewrite ( #13570 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#cleanup_15","text":"Dropped dbfetch from discovery/sensors for pbn devices ( #13789 ) - Npeca75 Dropped dbfetch from discovery/sensors for junos devices ( #13784 ) - Npeca75 Removed contrib directory ( #13727 ) - murrant Removed old vendor fix ( #13717 ) - Jellyfrog Replace Requests library with HTTP Client ( #13689 ) - Jellyfrog Use built in method to render a string with Blade ( #13688 ) - Jellyfrog","title":"Cleanup"},{"location":"General/Changelog/#documentation_24","text":"Simple docs tweaking ( #13792 ) - Jellyfrog Update Switching API doc to fix link ( #13786 ) - knpo Rename DHCP Stats to ISC DHCP Stats ( #13756 ) - SourceDoctor Update Install-LibreNMS.md to include pip3 install ( #13746 ) - si458 validate-config-icon better positioning in the text ( #13744 ) - SantiagoSilvaZ Updated Debian install docs to include pip3 install ( #13721 ) - dorkmatt Full rework of documentation for better nav, cleanup and fixes ( #13709 ) - Jellyfrog","title":"Documentation"},{"location":"General/Changelog/#tests_14","text":"Bump test timeout to 2 hours ( #13769 ) - Jellyfrog Speed up tests by reducing snmp timeout ( #13725 ) - murrant Lnms dev:check add --os-modules-only option ( #13700 ) - murrant","title":"Tests"},{"location":"General/Changelog/#misc_20","text":"Set default DB_TEST_PORT in database config ( #13793 ) - Jellyfrog Fixed links to connected devices in old style maps ( #13762 ) - fsmeets Updated Top Devices widget to include filtering on ifOperStatus ( #13748 ) - Npeca75 Correct prefix for \"kilo\" should be small k, not capital K ( #13714 ) - ilGino Remove old composer preinstall script ( #13712 ) - Jellyfrog Improve Proxy::shouldBeUsed ( #13702 ) - Jellyfrog Use commit date to compare pull requestes ( #13701 ) - Jellyfrog","title":"Misc"},{"location":"General/Changelog/#dependencies_21","text":"Update JS deps ( #13694 ) - Jellyfrog Update dependencies ( #13684 ) - Jellyfrog","title":"Dependencies"},{"location":"General/Changelog/#2210","text":"(2022-01-23) A big thank you to the following 26 contributors this last month: murrant (9) Npeca75 (4) loopodoopo (3) ilGino (2) Jellyfrog (2) SourceDoctor (2) laf (2) aztec102 (2) twelch24 (1) tkjaer (1) ssasso (1) TechieDylan (1) hvanoch (1) h-barnhart (1) gdepeyrot (1) k0079898 (1) efelon (1) westerterp (1) avermeer-tc (1) Fehler12 (1) bonzo81 (1) glance- (1) VirTechSystems (1) iopsthecloud (1) blubecks (1) thford89 (1) Thanks to maintainers and others that helped with pull requests this month: murrant (22) Jellyfrog (13) laf (10) PipoCanaja (6) ottorei (2) SourceDoctor (2)","title":"22.1.0"},{"location":"General/Changelog/#feature_20","text":"Add Sla jitter packet loss percent graph ( #13600 ) - bonzo81 Add API-routes for listing MPLS SAPs and services ( #13561 ) - blubecks","title":"Feature"},{"location":"General/Changelog/#device_26","text":"Merge enviromux-micro in existing NTI ( #13696 ) - Npeca75 Change the variable to detect version for mikrotik ups runtime device divisor ( #13678 ) - TechieDylan VRP BGP fixes ( #13675 ) - murrant Added new sensors to mes23xx ( #13671 ) - Npeca75 Added initial detection MES2324F or MES2324FB ( #13669 ) - aztec102 New OS: Adva XG 304 ( #13668 ) - h-barnhart Basic ZTE ZXA10 detection ( #13658 ) - murrant Added CET Power T2S TSI ( #13645 ) - aztec102 Eltek ospf poller disable ( #13635 ) - loopodoopo Smartoptics dcp m 40 zr ( #13634 ) - avermeer-tc Updated XOS (Extreme) processor data to use correct OID ( #13633 ) - laf Initial Support for Fujitsu RX300 with iRMC4 ( #13631 ) - Fehler12 Teleste Luminato ports & qam/asi output sensors & yaml ( #13616 ) - Npeca75 Workaround linksys always mapping to g1 ( #13595 ) - glance- Equallogic fix typo on os name in the storage module ( #13580 ) - iopsthecloud","title":"Device"},{"location":"General/Changelog/#webui_23","text":"[WebUI] Removing the colon symbol to the right of a control label ( #13698 ) - ilGino Remove unneccessary Section Description ( #13677 ) - SourceDoctor Device tracepath using wrong variables to check for traceroute output ( #13674 ) - laf Allow filter by display name in device list ( #13665 ) - gdepeyrot Sort Vlan Ports by ifName, ifDescr ( #13657 ) - SourceDoctor Fix horizontal scrollbar in device list always visible ( #13653 ) - efelon","title":"Webui"},{"location":"General/Changelog/#alerting_22","text":"Use display name in alerts ( #13650 ) - murrant","title":"Alerting"},{"location":"General/Changelog/#graphs_16","text":"Timos sap dot1q graphing fix ( #13654 ) - loopodoopo","title":"Graphs"},{"location":"General/Changelog/#applications_19","text":"Add supervisord application ( #13673 ) - hvanoch","title":"Applications"},{"location":"General/Changelog/#api_19","text":"API detect if new location should be fixed by default ( #13637 ) - murrant Set fixed_coordinates via api ( #13593 ) - VirTechSystems","title":"Api"},{"location":"General/Changelog/#polling_15","text":"Added oids.no_bulk os setting ( #13666 ) - Npeca75 Add consistent output of name and app_id to Poller for all Applications (fixes #13641) ( #13648 ) - westerterp Fix SnmpQuery bulk boolean backwards ( #13636 ) - murrant","title":"Polling"},{"location":"General/Changelog/#rancid_2","text":"Gen RANCID host also for FS.com devices ( #13682 ) - ssasso","title":"Rancid"},{"location":"General/Changelog/#bug_25","text":"Use PHP_BINARY directly instead of trying to build path to PHP binary ( #13690 ) - Jellyfrog Small text change for misspelled Virtual ( #13686 ) - ilGino Snmp timeout is a float, allow in config ( #13676 ) - murrant Fix NULL device alert caused by services ( #13663 ) - k0079898 Disable VRP VLANs test, seems to be a bug in snmpsim snmpbulkwalk ( #13649 ) - murrant Remove extra rows with duplicate keys in SyncsModels trait ( #13632 ) - murrant","title":"Bug"},{"location":"General/Changelog/#documentation_25","text":"Update rrdcached link ( #13692 ) - twelch24 Add missing python3-pip installation dependency for debian11 ( #13691 ) - tkjaer","title":"Documentation"},{"location":"General/Changelog/#translation_10","text":"Fix settings language file to include Distributed Poller labels. ( #13511 ) - thford89","title":"Translation"},{"location":"General/Changelog/#dependencies_22","text":"Update recommended PHP version to 8.0 ( #13687 ) - Jellyfrog","title":"Dependencies"},{"location":"General/Changelog/#21120","text":"(2021-12-21) A big thank you to the following 30 contributors this last month: murrant (38) Npeca75 (6) Jellyfrog (3) twelch24 (3) johnstruse (2) nightcore500 (2) Martin22 (2) wkamlun (2) martinberg (1) mathieu-artic (1) dependabot (1) carranzamarioagustin (1) SourceDoctor (1) si458 (1) Cormoran96 (1) claude191 (1) ottorei (1) banachtarski-91 (1) RockyVod (1) enferas (1) jepke (1) duhow (1) Nocturr (1) hjcday (1) djamp42 (1) PipoCanaja (1) amanualgoldstein (1) pepperoni-pi (1) paulierco (1) TheGreatDoc (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (42) murrant (20) SourceDoctor (3) ottorei (3) bakerds (2) jaypo82 (1) mpikzink (1) troublestarter (1) PipoCanaja (1)","title":"21.12.0"},{"location":"General/Changelog/#feature_21","text":"Catch all module errors ( #13542 ) - murrant Lnms snmp:fetch query multiple devices ( #13538 ) - murrant Configurable device display name ( #13528 ) - murrant RRD Allow specifying a source file and ds to fill data ( #13480 ) - murrant","title":"Feature"},{"location":"General/Changelog/#security_16","text":"Fix unescaped strings XSS issues ( #13554 ) - enferas","title":"Security"},{"location":"General/Changelog/#device_27","text":"Fix EdgeOS hardware detection ( #13629 ) - johnstruse Add additional ICX 7150 devices ( #13627 ) - johnstruse Fix axiscam serial format ( #13620 ) - murrant Fix Cisco WLC AP cleanup ( #13615 ) - murrant CPU, HW type, HW ver, Fan state discovery ( #13608 ) - Npeca75 Initial Eltex-mes IPv6 address discovery ( #13594 ) - Npeca75 Add better support for Eaton UPS ( #13588 ) - mathieu-artic SmartAX supports IF-MIB, skip custom polling and fix polling GPON ports ( #13579 ) - carranzamarioagustin Add back Areca secondary hardware OID ( #13562 ) - murrant Ray3 - Added memory chart ( #13557 ) - Martin22 Add all Aviat WTM4k family devices ( #13556 ) - RockyVod Fix discovery and pooling Racom Ray2 ( #13553 ) - Martin22 Add version for ironware ( #13551 ) - wkamlun Add ICX 7150 description ( #13550 ) - wkamlun Add discovery for APC EPDU1132M ( #13545 ) - duhow Split Eltex-mes OS to mes21xx / mes23xx. + few improvements ( #13544 ) - Npeca75 Add Initial Support for VMware SD-WAN / Velocloud ( #13536 ) - Nocturr Arista EOS, use sysObjectID for detection (to include vEOS) ( #13534 ) - murrant RUTX fix sensor limits ( #13526 ) - hjcday Added support for Himoinsa gensets status state sensors ( #13456 ) - TheGreatDoc","title":"Device"},{"location":"General/Changelog/#webui_24","text":"VLANs sort in GUI ( #13628 ) - Npeca75 Fix broken links ( #13625 ) - murrant Fix the displayed unit for frequency and distance in the wireless section ( #13614 ) - nightcore500 Add more device fields to oxidized map configuration ( #13604 ) - martinberg Correct graph row component responsive layout for linked graphs ( #13587 ) - murrant Global search: search device display ( #13583 ) - murrant Availibility Map - show Display Name if set ( #13574 ) - SourceDoctor Do not show location in device overview if location is not found ( #13572 ) - murrant Don't use @lang() it doesn't escape the string ( #13566 ) - murrant Allow LegacyPlugin Pages to receive all parameters ( #13519 ) - PipoCanaja","title":"Webui"},{"location":"General/Changelog/#alerting_23","text":"Use http for proxy urls via guzzle ( #13601 ) - Jellyfrog Twilio change text to show alert termplate msg ( #13521 ) - djamp42","title":"Alerting"},{"location":"General/Changelog/#graphs_17","text":"Fix nototal graph option ( #13589 ) - nightcore500 Add additional type tag for Bind metrics ( #13581 ) - murrant","title":"Graphs"},{"location":"General/Changelog/#snmp-traps_6","text":"Veeam SNMP traps fix and extend ( #13549 ) - jepke Add Alcatel Omniswitch Traps Handlers ( #13492 ) - paulierco","title":"Snmp Traps"},{"location":"General/Changelog/#applications_20","text":"PHP8 compatibility for ntp-server polling app ( #13513 ) - amanualgoldstein","title":"Applications"},{"location":"General/Changelog/#billing_2","text":"Billing fix a couple divide by zero errors ( #13517 ) - murrant","title":"Billing"},{"location":"General/Changelog/#api_20","text":"API 'list_parents_of_host' - mostly doco, but one small code enhancement ( #13567 ) - claude191","title":"Api"},{"location":"General/Changelog/#discovery_16","text":"Q-bridge-mib, discover missing VLANs, v2 ( #13569 ) - Npeca75","title":"Discovery"},{"location":"General/Changelog/#polling_16","text":"Ios-fdb-table-fix -- Fixed misnamed dictionary keys for dot1dTpFdbPor\u2026 ( #13559 ) - banachtarski-91 OSPF issue when devices don't support OSPF-MIB::ospfIfTable ( #13530 ) - murrant Poller command rewrite ( #13414 ) - murrant","title":"Polling"},{"location":"General/Changelog/#bug_26","text":"Escape net-snmp unformatted strings, try 2 ( #13584 ) - murrant Workaround don't poll WLC on IOSXE ( #13563 ) - murrant Fix Ciscowlc AP-polling ( #13560 ) - ottorei Mark OID not increasing as invalid ( #13548 ) - murrant Skip invalid OSPF data ( #13547 ) - murrant Remove color markers when logging to files ( #13541 ) - murrant Fix plugin_active check when plugin is not found ( #13531 ) - murrant Remove unused buggy arp_discovery code ( #13529 ) - murrant Pseudowire cpwVcID can exceed database max value ( #13510 ) - pepperoni-pi","title":"Bug"},{"location":"General/Changelog/#refactor_15","text":"Ipv6 discovery switch to new DB syntax ( #13591 ) - Npeca75 OSPF port module ( #13498 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#cleanup_16","text":"Fix bad snmp context option ( #13497 ) - murrant Polling cleanup, fix PHP warnings ( #13460 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_26","text":"Clarify docker app setup on debian/ubuntu ( #13573 ) - si458 Update winbox launcher doc (again) ( #13558 ) - twelch24 Add more detailed instructions to winbox launcher ( #13552 ) - twelch24 Link for can't check Python dependencies validation ( #13520 ) - murrant Elaborate on feeding Oxidized ( #13514 ) - murrant","title":"Documentation"},{"location":"General/Changelog/#tests_15","text":"Tests dont include empty tables ( #13619 ) - murrant Collect-snmp-data.php can now capture snmp context test data ( #13596 ) - murrant Snmp.unescape setting ( #13590 ) - murrant Use phpstan-deprecation-rules instead ( #13582 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#mibs_10","text":"Update netapp mib ( #13571 ) - Cormoran96","title":"Mibs"},{"location":"General/Changelog/#dependencies_23","text":"Bump symfony/http-kernel from 5.3.9 to 5.4.0 ( #13585 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#21110","text":"(2021-11-12) A big thank you to the following 49 contributors this last month: murrant (39) Jellyfrog (6) arrmo (4) Nocturr (4) PipoCanaja (3) TheGreatDoc (3) martinberg (3) robje (2) loopodoopo (2) Npeca75 (2) drshawnkwang (2) jul13579 (2) bakerds (2) SourceDoctor (2) deajan (2) jonathansm (1) lfkeitel (1) Deltawings (1) fcuello-gc (1) drommc (1) techladsjamie (1) duhow (1) hjcday (1) DanielMuller-TN (1) blagh (1) cenjui (1) TheGracens (1) eskyuu (1) nq5 (1) mjbnz (1) roycruse (1) ottorei (1) si458 (1) nmanzi (1) apokryphal (1) thford89 (1) arjitc (1) tuxgasy (1) kterobinson (1) bl3nd3r (1) hanserasmus (1) mpikzink (1) dagbdagb (1) sthen (1) ahmedsajid (1) dorkmatt (1) evheros (1) nightcore500 (1) CirnoT (1) Thanks to maintainers and others that helped with pull requests this month: murrant (53) Jellyfrog (47) PipoCanaja (7) SourceDoctor (5) ottorei (5) mpikzink (2) arjitc (1) salmayno (1) yoeunes (1) Aeet (1) oussama-aitmi (1) nightcore500 (1) drshawnkwang (1)","title":"21.11.0"},{"location":"General/Changelog/#feature_22","text":"Discovery on Reboot ( #13422 ) - SourceDoctor","title":"Feature"},{"location":"General/Changelog/#security_17","text":"Fix widget title injection vulnerability ( #13452 ) - murrant Kick other sessions when changing password ( #13194 ) - murrant","title":"Security"},{"location":"General/Changelog/#device_28","text":"APC Load, wrong low precision oid ( #13506 ) - jonathansm Nokia SAR HMC ( #13503 ) - loopodoopo Ciena 2 ( #13491 ) - loopodoopo Added initial IPv6 Address discovery for TP-LINK Jetstream ( #13484 ) - Npeca75 Update Windows Versions ( #13474 ) - arrmo Support for PDUMNV30HVLX with PADM 20 ( #13473 ) - drommc Opengear improvement, don't needlessly fetch ogEmdTemperatureTable ( #13471 ) - drshawnkwang RouterOS now returns the correct runtime ( #13461 ) - murrant Fix latitude having an extra - in the middle after the decimal point ( #13454 ) - techladsjamie Fix Sophos-XG OID for number of active tunnels ( #13444 ) - Nocturr Fix hwg poseidon state sensors ( #13438 ) - TheGreatDoc UniFi/EdgeSwitch OS support for fw 5.x ( #13434 ) - Nocturr Added support for Extreme SLX-OS switches ( #13431 ) - bakerds Mikrotik vlans discovery, v2 ( #13427 ) - Npeca75 Added sensor discovery for APC NetworkAIR FM and InfraStruXure ATS ( #13426 ) - bakerds Add Sophos-XG OID for monitoring HA, IPSec and license state ( #13423 ) - Nocturr Add more discovery components for Dell PowerConnect 28xx ( #13420 ) - duhow Added Wireless Sensors for Teltonika RUTX Routers ( #13419 ) - hjcday Add APC PowerChute sysObjectID ( #13406 ) - cenjui Fix APC high precision divisor ( #13405 ) - TheGracens Luminato device doesn't support alternative uptimes ( #13399 ) - eskyuu Update ports module to accept VDSL2 ifType in xDSL polling ( #13393 ) - roycruse Fix windows fanspeed ( #13376 ) - si458 Add support for Teltonika RUT360 ( #13375 ) - martinberg Add support for NTI Enviromux ( #13373 ) - martinberg Update Himoinsa Genset discovery ( #13356 ) - TheGreatDoc Improve Poweralert based devices support ( #13340 ) - arjitc Add iDrac physical disk state ( #13264 ) - tuxgasy Add opengear humidity to sensors ( #13226 ) - drshawnkwang IOS/IOSXE PoE stats ( #13213 ) - martinberg Poll SPU memory from Juniper SRX devices ( #13191 ) - bl3nd3r Extend support for Endrun Sonoma Meridian II devices. ( #13069 ) - hanserasmus Bintec be.IP plus support ( #12993 ) - jul13579 Eaton Network MS xups sensors ( #12992 ) - dagbdagb Don't hardcode index for Mikrotik LTE wireless statistics ( #12976 ) - sthen OS support for West Mountain 4005i DC PDU ( #12885 ) - dorkmatt FabOS remove disabled dbm sensors ( #12877 ) - evheros Raspberry Pi: Add SNMP extend to monitor IO pins or sensor modules connected to the GPIO header ( #12749 ) - nightcore500 Use high precision OIDs for APC UPS sensors ( #12594 ) - CirnoT","title":"Device"},{"location":"General/Changelog/#webui_25","text":"Increase default session lifetime to one month ( #13505 ) - murrant Fix maintenance mode button in Firefox ( #13500 ) - lfkeitel Only call htmlentities on port ifAlias,ifName, and ifDescr ( #13489 ) - murrant Merchandise shop link in about ( #13485 ) - murrant Tweak new notification appearance ( #13477 ) - murrant Add missing \\ ( #13459 ) - robje Fix syslog widget priority filtering ( #13411 ) - murrant PHP-Flasher for toast messages ( #13401 ) - murrant Update alertlog-widget to allow filtering by device group ( #13380 ) - ottorei","title":"Webui"},{"location":"General/Changelog/#alerting_24","text":"Fix slack errors when variables are not set ( #13476 ) - murrant Fix api transport mult-line parsing ( #13469 ) - murrant Drop PDConnect Install links ( #13407 ) - blagh Port Speed degraded alert rule ( #13371 ) - murrant Added Unpolled Devices rule to collection ( #12896 ) - ahmedsajid","title":"Alerting"},{"location":"General/Changelog/#graphs_18","text":"Add missing graph definition for pf_matches (pfSense firewall) ( #13507 ) - robje","title":"Graphs"},{"location":"General/Changelog/#snmp-traps_7","text":"SNMP Trap handler: UpsTrapOnBattery ( #13482 ) - TheGreatDoc","title":"Snmp Traps"},{"location":"General/Changelog/#applications_21","text":"Doc - MySQL Application ( #13495 ) - Deltawings","title":"Applications"},{"location":"General/Changelog/#api_21","text":"Add get_ports_by_group API function ( #13361 ) - nmanzi","title":"Api"},{"location":"General/Changelog/#discovery_17","text":"Fix Dispatcher service not discovering poller groups ( #13377 ) - murrant Modified SQL delete statement for vrf is null ( #13199 ) - kterobinson","title":"Discovery"},{"location":"General/Changelog/#polling_17","text":"Added TOS support for fping ( #13496 ) - PipoCanaja Fix SnmpQuery mibdir from os group ( #13475 ) - murrant Fix application and storage query errors ( #13417 ) - murrant Fix uptime polling event ( #13388 ) - murrant Keep stats for snmptranslate ( #13379 ) - murrant Rewrite netstats polling ( #13368 ) - murrant Run Alert Rules on Service status change. ( #13348 ) - thford89","title":"Polling"},{"location":"General/Changelog/#rancid_3","text":"Show single quotes correcting for device configs ( #13360 ) - apokryphal","title":"Rancid"},{"location":"General/Changelog/#oxidized_8","text":"Syslog hook examples and documentation for Procurve devices ( #13397 ) - nq5","title":"Oxidized"},{"location":"General/Changelog/#bug_27","text":"Fix PyMySQL upstream dependency bug ( #13508 ) - murrant Fix net-snmp unformatted strings ( #13486 ) - murrant [bug] Fix & extend MAC OUI table updates ( #13479 ) - PipoCanaja Attempt to fix dispatcher stats thread exception ( #13478 ) - murrant PHP8, correct multiplication in packages application ( #13462 ) - arrmo Don't use proxy for localhost (Oxidized and Prometheus) ( #13450 ) - murrant Better handling of some alerting errors ( #13446 ) - murrant Fix PHP8 error in sensor unit conversion ( #13433 ) - arrmo PHP8 Unit Conversion, ups-nut ( #13432 ) - arrmo Services and ping not polling default groups ( #13403 ) - murrant Increase length of devices_attribs.attrib_type column ( #13395 ) - mjbnz Bug - Fix missing uptime in fillable (Device Model) ( #13387 ) - PipoCanaja Fix regression from #12998 ( #13385 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#refactor_16","text":"Change how options are handled for SnmpQuery ( #13488 ) - murrant Rename concrete SnmpQuery class to avoid confusion ( #13412 ) - murrant Fully convert core to a modern module ( #13347 ) - murrant New plugin system based on Laravel Package Development ( #12998 ) - mpikzink","title":"Refactor"},{"location":"General/Changelog/#cleanup_17","text":"Fixes for misc unset variables ( #13421 ) - murrant Remove unused snom files ( #13369 ) - murrant Fix config fetch disrupted by stderr ( #13362 ) - deajan Use PHPStan level 6 ( #13308 ) - Jellyfrog","title":"Cleanup"},{"location":"General/Changelog/#documentation_27","text":"Fix typo in filepath for unit-tests to work ( #13440 ) - Nocturr Debian 11 Install Docs ( #13430 ) - SourceDoctor Don't suggest running validate.php as root ( #13378 ) - murrant","title":"Documentation"},{"location":"General/Changelog/#tests_16","text":"Fix IPV6 test ( #13468 ) - Jellyfrog Ability to save cipsec-tunnels test data ( #13463 ) - murrant Run phpstan locally with lnms dev:check lint ( #13458 ) - murrant Dusk: improve speed and safety ( #13370 ) - murrant","title":"Tests"},{"location":"General/Changelog/#dependencies_24","text":"Bump psutil=>5.6.0 to satifsy command_runner ( #13501 ) - Jellyfrog Update to Larastan 1.0 ( #13466 ) - Jellyfrog Update PHP dependencies ( #13396 ) - murrant Install new python dependencies during daily maintenance ( #13186 ) - deajan","title":"Dependencies"},{"location":"General/Changelog/#21100","text":"(2021-10-16) A big thank you to the following 21 contributors this last month: murrant (40) SourceDoctor (9) Jellyfrog (5) loopodoopo (3) Cupidazul (3) maxnz (3) mpikzink (3) ottorei (2) gs-kamnas (2) topranks (2) mctaguma (1) DanielMuller-TN (1) hjcday (1) dependabot (1) calvinthefreak (1) si458 (1) Laplacence (1) peelman (1) noaheroufus (1) deajan (1) lutfisan (1) Thanks to maintainers and others that helped with pull requests this month: murrant (36) Jellyfrog (29) SourceDoctor (7) ottorei (1) PipoCanaja (1)","title":"21.10.0"},{"location":"General/Changelog/#feature_23","text":"New SNMP code and lnms snmp:fetch command ( #13303 ) - murrant Add eventlog on_create device version 2 w/deps ( #13302 ) - Cupidazul Push Notifications (Mobile and PC) ( #13277 ) - murrant Modified Prometheus extension to support adding a prefix to metric names ( #13272 ) - topranks Config seeder ( #13259 ) - murrant Infer character encoding for ifAlias and sysLocation ( #13248 ) - murrant Log count of logged in users in database from HOST-RESOURCES-MIB ( #13137 ) - SourceDoctor","title":"Feature"},{"location":"General/Changelog/#security_18","text":"Use the same error message for different kind of authentiction errors ( #13306 ) - Jellyfrog","title":"Security"},{"location":"General/Changelog/#device_29","text":"Added support for Teltonika RUTX series routers ( #13350 ) - hjcday Ericsson TN - Wireless MSE ( #13328 ) - loopodoopo Ciena 6500 Optics sensors ( #13324 ) - loopodoopo Ericsson Traffic Node support ( #13299 ) - loopodoopo Procurve E model prefix fix ( #13261 ) - maxnz Fix axis cam discovery ( #13258 ) - maxnz Wireless and GSM Basic Monitoring ( #13255 ) - Cupidazul Added SAF Integra-X OS Support ( #13236 ) - noaheroufus Arubaos cx hardware ( #13045 ) - maxnz MegaRaid controller in Linux (Broadcom/LSI) ( #12999 ) - mpikzink Add Ericsson IPOS router support ( #12625 ) - lutfisan","title":"Device"},{"location":"General/Changelog/#webui_26","text":"Alert detail display fix ( #13335 ) - SourceDoctor Show Detail by default Option on Alert Widget ( #13309 ) - SourceDoctor Fix various port links ( #13296 ) - murrant Add ORDER BY to the ports query when showing the ports list on device\u2026 ( #13276 ) - peelman Use local timezone for outages pages ( #13274 ) - ottorei Remove device dark mode detection ( #13273 ) - murrant Linkable graph component ( #13263 ) - murrant Improve tailwind dark theme colors ( #13262 ) - murrant Workaround for dashboard widgets showing over popups. ( #13257 ) - murrant","title":"Webui"},{"location":"General/Changelog/#alerting_25","text":"Fix alert transport api with POST method ( #13288 ) - Laplacence","title":"Alerting"},{"location":"General/Changelog/#graphs_19","text":"Fix graphs showing bps instead of pps ( #13266 ) - Cupidazul","title":"Graphs"},{"location":"General/Changelog/#snmp-traps_8","text":"HP Fault Traps ( #13254 ) - mpikzink Veeam backup SNMP Traps ( #13170 ) - mpikzink","title":"Snmp Traps"},{"location":"General/Changelog/#api_22","text":"Added conditional check for rules parameter on add_device_group ( #13353 ) - DanielMuller-TN API add_device: respond with more device array ( #13251 ) - SourceDoctor API Call to assign/remove a Portgroup to Ports ( #13245 ) - SourceDoctor API Call to set instant Maintenance mode ( #13237 ) - SourceDoctor API port search by arbitrary field ( #13231 ) - SourceDoctor","title":"Api"},{"location":"General/Changelog/#settings_3","text":"Automatically set rrdtool_version once ( #13327 ) - murrant","title":"Settings"},{"location":"General/Changelog/#discovery_18","text":"Quick fix for route discovery on PHP8 ( #13284 ) - murrant","title":"Discovery"},{"location":"General/Changelog/#polling_18","text":"Dispatcher bugfix queues not being disabled properly ( #13364 ) - murrant Fix for cimc polling on PHP8 ( #13357 ) - murrant Dispatch Service: Don't stop dispatching if master moves to a node with a queue disabled ( #13355 ) - murrant Fix device query when last_polled_timetaken is null ( #13331 ) - murrant Restore accidentally removed code ( #13330 ) - murrant Allow non-snmp modules to run when snmp disabled ( #13321 ) - murrant Fix python config fetch disrupted by stderr output ( #13295 ) - murrant Fix poller wrapper error ( #13290 ) - murrant","title":"Polling"},{"location":"General/Changelog/#oxidized_9","text":"Added OneOS map for Oxidized ( #13313 ) - calvinthefreak","title":"Oxidized"},{"location":"General/Changelog/#authentication_12","text":"Improvements to SSO Authorization and logout handling ( #13311 ) - gs-kamnas","title":"Authentication"},{"location":"General/Changelog/#bug_28","text":"Fix poller groups reverting when setting via the Web UI. ( #13363 ) - murrant Rename config var auth_redirect_handler -> auth_logout_handler ( #13329 ) - gs-kamnas HrSystem Columns have to be optional ( #13316 ) - SourceDoctor Hrsystem write fix ( #13314 ) - SourceDoctor Check if vlan->port exists ( #13305 ) - Jellyfrog Fix html.device.links validation ( #13269 ) - murrant Fix lnms some commands throwing errors ( #13265 ) - murrant","title":"Bug"},{"location":"General/Changelog/#refactor_17","text":"SnmpQuery updates and more tests ( #13359 ) - murrant Remove load_os and load_discovery functions ( #13345 ) - murrant Rename NetSnmp to SnmpQuery ( #13344 ) - murrant Use Measurements for all statistic collection ( #13333 ) - murrant Use built in trusted proxy functionality ( #13318 ) - murrant Connectivity Helper to check and record device reachability ( #13315 ) - murrant Cleanup config.php.default ( #13297 ) - murrant SNMP Capabilities ( #13289 ) - murrant Cleanup device type override code ( #13256 ) - murrant Full Python code fusion / refactor and hardening 2nd edition ( #13188 ) - deajan Convert all ports backend to Laravel style ajax table ( #13184 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#documentation_28","text":"Change \"move\" to \"migrate\" to make it easier to find ( #13365 ) - murrant Updated link to Dan Brown's migration scripts ( #13354 ) - mctaguma Edit existing install url ( #13342 ) - murrant Oxidized doc update, links and ignore groups ( #13341 ) - murrant Update docs: Update Dispatcher service documentation ( #13339 ) - ottorei Send security researchers to Discord ( #13319 ) - murrant Fix to puppet snmp extend formatting ( #13312 ) - si458 Update formatting of Prometheus extension doc ( #13291 ) - topranks","title":"Documentation"},{"location":"General/Changelog/#tests_17","text":"Disallow usage of deprecated functions ( #13267 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#dependencies_25","text":"Bump composer/composer from 2.1.8 to 2.1.9 ( #13336 ) - dependabot Update dependencies ( #13310 ) - Jellyfrog","title":"Dependencies"},{"location":"General/Changelog/#2190","text":"(2021-09-16) A big thank you to the following 20 contributors this last month: murrant (29) Jellyfrog (5) ottorei (3) SourceDoctor (3) Galileo77 (2) paulierco (2) Fehler12 (2) Negatifff (2) deajan (2) mpikzink (2) vakartel (2) efelon (1) pimvanpelt (1) kimhaak (1) kevinwallace (1) noaheroufus (1) si458 (1) mzacchi (1) niddey (1) PipoCanaja (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (21) murrant (19) ottorei (3) SourceDoctor (2) PipoCanaja (2) mpikzink (1)","title":"21.9.0"},{"location":"General/Changelog/#feature_24","text":"API alert transport can include Options variables in the Body for POST requests ( #13167 ) - mzacchi Show port speed on port graphs, optionally set scale ( #11858 ) - murrant","title":"Feature"},{"location":"General/Changelog/#device_30","text":"Fix Dell server sensors ( #13247 ) - murrant Add mouseover mini graphs that makes sense for Liebert PDU ( #13246 ) - Galileo77 Add ifName to osag os ( #13243 ) - paulierco IfName to mcafeewebgateway ( #13242 ) - paulierco Add VPP logo ( #13230 ) - pimvanpelt Add Support for USW-Flex ( #13229 ) - Fehler12 Added Cisco CBS 250 Support ( #13228 ) - Fehler12 Update geist-watchdog.yaml ( #13223 ) - Galileo77 Add skip_values to Liebert capacity sensor definitions ( #13200 ) - kevinwallace Procurve add SysDescr Regex ( #13196 ) - mpikzink Updated OS Support: Dragonwave Horizon ( #13193 ) - noaheroufus ZTE ZXR10 define discovery for mempool and processor ( #13192 ) - vakartel Dell Network Virtual Link Trunk Status ( #13162 ) - mpikzink","title":"Device"},{"location":"General/Changelog/#webui_27","text":"Update to fix table row color and hover color for dark.css ( #13244 ) - efelon Fix port minigraph layout ( #13240 ) - murrant Sort dashboard entries alphabetically ( #13238 ) - ottorei Fix graph row columns ( #13232 ) - murrant Changed map functionality in device overview ( #13225 ) - kimhaak New Blade Components: x-device-link, x-port-link, x-graph-row, x-popup ( #13197 ) - murrant Add serial search in ajax search process ( #13185 ) - Negatifff Allow device actions to appear in device list and improve docs ( #13177 ) - murrant Show count of Ports in PortGroup display ( #13164 ) - SourceDoctor Change automatic widget updates to use bootgrid when possible ( #13159 ) - niddey","title":"Webui"},{"location":"General/Changelog/#alerting_26","text":"Fix PagerDuty transport's group field ( #13235 ) - ottorei Format port speed changes in the event log ( #13174 ) - murrant","title":"Alerting"},{"location":"General/Changelog/#graphs_20","text":"Change default graph view to zoom in on traffic. ( #13173 ) - murrant","title":"Graphs"},{"location":"General/Changelog/#settings_4","text":"Dynamic Select setting ( #13179 ) - murrant Increase config value length limit ( #13178 ) - murrant Default port group in Settings ( #13175 ) - SourceDoctor Default port_group for new ports ( #13166 ) - SourceDoctor Add support for description texts in Settings page ( #13104 ) - Jellyfrog","title":"Settings"},{"location":"General/Changelog/#discovery_19","text":"Mark snmp disabled devices as skipped ( #13202 ) - murrant Allow more compatibility in STP port discovery/polling ( #13109 ) - PipoCanaja","title":"Discovery"},{"location":"General/Changelog/#polling_19","text":"Fix snmp_bulk setting not being applied ( #13209 ) - murrant Do not poll passive ISIS-circuits ( #13168 ) - ottorei Common contexts for polling ( #13158 ) - murrant Rewrite ISIS Adjacency discovery/polling ( #13155 ) - murrant","title":"Polling"},{"location":"General/Changelog/#oxidized_10","text":"Add sysobjectid and hardware fields into oxidized maps ( #13221 ) - Negatifff","title":"Oxidized"},{"location":"General/Changelog/#bug_29","text":"Fix mempool unit display ( #13241 ) - murrant Select dynamic fixes ( #13187 ) - murrant Validate schema in utc ( #13182 ) - murrant Fix DB Inconsistent friendly error message ( #13163 ) - murrant","title":"Bug"},{"location":"General/Changelog/#refactor_18","text":"Update configuration docs to use lnms config:set ( #13157 ) - murrant Rename nobulk -> snmp_bulk ( #13098 ) - Jellyfrog","title":"Refactor"},{"location":"General/Changelog/#documentation_29","text":"Add security context service ( #13218 ) - deajan Fix numbering in application docs ( #13183 ) - si458 Docs link to webui settings in user's install ( #13176 ) - murrant","title":"Documentation"},{"location":"General/Changelog/#misc_21","text":"Increase RestartSec time to a reasonable value ( #13217 ) - deajan Validate APP_KEY ( #13171 ) - murrant","title":"Misc"},{"location":"General/Changelog/#2180","text":"(2021-08-22) A big thank you to the following 40 contributors this last month: PipoCanaja (12) murrant (10) Jellyfrog (8) paulierco (5) mpikzink (5) ottorei (3) fbourqui (2) facuxt (2) geg347 (2) dennypage (2) opalivan (2) keryazmi (2) wkamlun (2) si458 (2) martinberg (2) vakartel (1) SanderBlom (1) SourceDoctor (1) VirTechSystems (1) Talkabout (1) hannut (1) kevinwallace (1) jasoncheng7115 (1) arjitc (1) igorek24 (1) mtoupsUNO (1) Laplacence (1) tcwarn (1) deajan (1) Npeca75 (1) Negatifff (1) adamus1red (1) rhinoau (1) arrmo (1) e-caille (1) Sea-n (1) saschareichert (1) bennetgallein (1) loopodoopo (1) tikitaru (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (37) murrant (28) PipoCanaja (20) SourceDoctor (2)","title":"21.8.0"},{"location":"General/Changelog/#feature_25","text":"Lnms config:set ability to set os settings ( #13151 ) - murrant Detect sending non-html emails as html ( #13114 ) - murrant Add peak in and out ( #13006 ) - bennetgallein","title":"Feature"},{"location":"General/Changelog/#device_31","text":"Add OSAG new OS ( #13156 ) - paulierco More specific grandstream-ht detection ( #13152 ) - murrant Added voltage, cell states and wireless data for cell interface (GEMDS OS). ( #13142 ) - SanderBlom Opnsense detection ( #13097 ) - mpikzink Added OID for Extreme switch X350-48t ( #13096 ) - tcwarn Add Janitza power consumed ( #13095 ) - mpikzink Added/fixed LLDP discovery ( #13082 ) - Npeca75 Allow stack index other than '1.' for CiscoSB ( #13078 ) - dennypage Add logo for Scientific Linux ( #13075 ) - mpikzink Fix Cisco SLAs garbage entries ( #13068 ) - murrant Cisco ISE version, HW, SW and test-data ( #13062 ) - PipoCanaja Fixed Packetlight EDFA sensors and add test-data ( #13060 ) - opalivan Alcatel-Lucent AOS7 bgp fix2 ( #13059 ) - paulierco Add logo for Linux Mint ( #13055 ) - arrmo Alcatel-Lucent Aos6 ignore second power supply ( #13054 ) - paulierco Alcatel-Lucent Aos7 increase fan threshold ( #13053 ) - paulierco Use non numeric snmpwalk for nxos fan trays ( #13048 ) - e-caille Alcatel-Lucent Aos7 bgp fix ( #13047 ) - paulierco Add number of connected wireless client and number of connected FortiAP ( #13037 ) - wkamlun Update Sensors for ADVA FSP150CC + discovery fix ( #13020 ) - keryazmi Improve dell-compellent detection for newer firmwares ( #13019 ) - saschareichert Poll current connections for F5 ltm ( #12968 ) - martinberg Ericsson 6600 series ( #12931 ) - loopodoopo Fix WUT ThermoHygro with new hardware revisions ( #12913 ) - mpikzink Fix polling current on ICT2000DB-12IRC ( #12529 ) - tikitaru","title":"Device"},{"location":"General/Changelog/#webui_28","text":"Cleanup Port hover minigraph description when using \"Interface Description Parsing\" ( #13143 ) - fbourqui Dark mode improvements ( #13141 ) - facuxt Improvements to dark theme. ( #13139 ) - facuxt Adjust App String Pi-hole to project name ( #13136 ) - SourceDoctor Sort port selector dropdown ( #13135 ) - VirTechSystems Priority filtering for syslog widget ( #13134 ) - Talkabout Center new service window ( #13115 ) - arjitc Add urlencode for location link in device view ( #13076 ) - Negatifff Add device_group to availability widget hyperlink ( #13061 ) - rhinoau More sensor data on inventory page ( #13057 ) - PipoCanaja","title":"Webui"},{"location":"General/Changelog/#api_23","text":"Adding API route to set bgpPeerDescr field ( #13056 ) - geg347 API mac search ( #12964 ) - mpikzink","title":"Api"},{"location":"General/Changelog/#alerting_27","text":"Add EU Service Region to PagerDuty transport ( #13154 ) - ottorei Fix HTML encoded characters in Slack ( #13120 ) - geg347 Add SignalWire (Twilio alternative) alert transport support ( #13107 ) - igorek24","title":"Alerting"},{"location":"General/Changelog/#discovery_20","text":"Full Python code fusion / refactor and hardening ( #13094 ) - deajan Extend REGEX filtering option by sensor_class ( #13066 ) - opalivan","title":"Discovery"},{"location":"General/Changelog/#oxidized_11","text":"Follow redirects when reloading Oxidized nodes list ( #13051 ) - martinberg","title":"Oxidized"},{"location":"General/Changelog/#bug_30","text":"Fix issue syslog_xlate containing dots ( #13148 ) - vakartel Enclose IPv6 literal in [brackets] for snmpget and unix-agent ( #13130 ) - kevinwallace Fix lnms scan, nets not detected ( #13129 ) - murrant","title":"Bug"},{"location":"General/Changelog/#documentation_30","text":"Update docs for controlling modules ( #13147 ) - murrant Update docs: Example for optional data on templates ( #13128 ) - ottorei Update FAQs for large groups ( #13110 ) - ottorei Document new optional ups-nut arg1 ( #13072 ) - adamus1red Formatted applications docs for copy/paste ( #13049 ) - si458 Update cleanup config document ( #13026 ) - Sea-n","title":"Documentation"},{"location":"General/Changelog/#translation_11","text":"Updated Traditional Chinese Translation ( #13116 ) - jasoncheng7115","title":"Translation"},{"location":"General/Changelog/#tests_18","text":"Run PHPStan with higher level for new files ( #13108 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#misc_22","text":"Added two indexes to 'syslog' table for performance ( #13105 ) - mtoupsUNO Remove timeouts for passthrough lnms commands ( #13080 ) - murrant Add Laravel task scheduling ( #13074 ) - Jellyfrog","title":"Misc"},{"location":"General/Changelog/#mibs_11","text":"MIB cleaning (misc again) ( #13103 ) - PipoCanaja Added H3C / Comware MIB files ( #13102 ) - Laplacence Update Cisco Small Business (mostly) MIBs ( #13099 ) - dennypage Update NET-SNMP mibs ( #13093 ) - Jellyfrog MIB cleaning for Dell + Gandi ( #13089 ) - PipoCanaja MIB cleaning for Panasonic (1 file) and Avtech (11 files) ( #13088 ) - PipoCanaja MIB cleaning for OS \"Junose\" ( #13087 ) - PipoCanaja MIB cleaning (Misc) ( #13086 ) - PipoCanaja MIB cleaning for Junos ( #13085 ) - PipoCanaja MIB cleaning for HP ( #13084 ) - PipoCanaja MIB cleaning for equallogic ( #13083 ) - PipoCanaja","title":"Mibs"},{"location":"General/Changelog/#dependencies_26","text":"Bump super-linter ( #13073 ) - Jellyfrog Bump larastan ( #13071 ) - Jellyfrog","title":"Dependencies"},{"location":"General/Changelog/#2170","text":"(2021-07-16) A big thank you to the following 27 contributors this last month: murrant (9) rhinoau (8) PipoCanaja (5) mpikzink (4) mathieu-artic (4) martinberg (3) Npeca75 (2) epiecs (2) Sea-n (2) paulierco (2) djamp42 (2) Jellyfrog (1) geg347 (1) ziodona85 (1) keryazmi (1) hanserasmus (1) edgetho007 (1) dagbdagb (1) jbronn (1) adamboutcher (1) VirTechSystems (1) skoobasteeve (1) dependabot (1) si458 (1) kdanev14 (1) cjsoftuk (1) jezekus (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (32) murrant (14) PipoCanaja (13)","title":"21.7.0"},{"location":"General/Changelog/#feature_26","text":"Support multiple db servers ( #12963 ) - djamp42","title":"Feature"},{"location":"General/Changelog/#device_32","text":"Inital support for Eltex-MES switches ( #13036 ) - Npeca75 Add support for Ucopia Appliances ( #13031 ) - mathieu-artic Fixing irrelevant values rpm packetloss ( #13010 ) - geg347 Added Vlan discovery on LAG ports, Jetstream OS ( #13007 ) - Npeca75 Add showtime start for OneAccess SDSL routers ( #13005 ) - mathieu-artic Arista_mos-support ( #13003 ) - hanserasmus Add LTE/UMTS support for Oneaccess routers ( #13002 ) - mathieu-artic Add Sonicwall OS 7 ( #12997 ) - edgetho007 Added support for the Rittal LCP DX Chiller ( #12995 ) - epiecs Eaton M2 EMP g2 ( #12994 ) - dagbdagb TP-Link Jetstream DDM and PoE Support ( #12990 ) - jbronn Alcatel-Lucent AOS6 to yaml ( #12982 ) - paulierco Added logo svg for Rocky Linux ( #12977 ) - skoobasteeve Added VRP ICMP SLA (NQA in huawei naming) support ( #12973 ) - PipoCanaja EUROstor RAID ( #12969 ) - mpikzink Add support for Liebert humidity setpoint and UPS powerfactor ( #12965 ) - martinberg Added support to new device Controlbox TH-332B ( #12940 ) - kdanev14 Add OS Support for Siemens Scalance X Switching ( #12938 ) - rhinoau Alcatel-Lucent aos7 LLDP Neighbors ( #12886 ) - paulierco Add HPE-maPDU support ( #12550 ) - jezekus","title":"Device"},{"location":"General/Changelog/#webui_29","text":"Fix availability widget service backend error ( #13044 ) - rhinoau Fix availability widget device totals ( #13043 ) - rhinoau Don't add %3F=yes to the url ( #13041 ) - murrant Webui - Display app metric if available ( #13023 ) - PipoCanaja Webui - Fix application fault detail display ( #13016 ) - PipoCanaja Two-factor UI config and status display ( #13012 ) - rhinoau Leave it to generate_device_link for sysName/hostName/IP ( #13000 ) - PipoCanaja Filter out NULL lat/lng values from Geographical Map display queries ( #12985 ) - rhinoau Fix ldap/ad group webui settings ( #12967 ) - murrant Create Laravel Sessions Table ( #12962 ) - djamp42 Fix \"Sub-directory Support\" in small steps ( #12951 ) - mpikzink","title":"Webui"},{"location":"General/Changelog/#api_24","text":"Return api error when device doesn't exist ( #12978 ) - VirTechSystems","title":"Api"},{"location":"General/Changelog/#discovery_21","text":"Fix an issue which led to duplication of BGP peers. ( #12932 ) - cjsoftuk","title":"Discovery"},{"location":"General/Changelog/#oxidized_12","text":"Option to filter Oxidized groups ( #12966 ) - martinberg","title":"Oxidized"},{"location":"General/Changelog/#bug_31","text":"Fix scripts to allow pathname with space ( #13027 ) - Sea-n Wrong statement used for Oxidized ignore_groups ( #13001 ) - martinberg Fix typo in filename ( #12996 ) - Sea-n Make migrating after upgrading MySQL easier. ( #12971 ) - murrant Fix proxmox menu url ( #12970 ) - si458","title":"Bug"},{"location":"General/Changelog/#refactor_19","text":"Refractor health ( #13022 ) - mpikzink","title":"Refactor"},{"location":"General/Changelog/#cleanup_18","text":"PHPStan fixes ( #13038 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_31","text":"Documentation cleanup of sections 4-6 ( #13018 ) - rhinoau Documentation cleanup of General, Install, Getting Started sections ( #13013 ) - rhinoau Update Applications.md for SQUID ( #12987 ) - adamboutcher","title":"Documentation"},{"location":"General/Changelog/#misc_23","text":"Aruba 8.8.0 MIBS ( #13042 ) - mpikzink Create HP-SN-AGENT-MIB ( #13009 ) - ziodona85 Update ADVA's MIB file ( #13004 ) - keryazmi Help users that did not upgrade MySQL try two ( #12989 ) - murrant Add renamehost function result handling and exit codes to renamehost.php ( #12980 ) - rhinoau","title":"Misc"},{"location":"General/Changelog/#dependencies_27","text":"Php-cs-fixer 3 prep ( #13039 ) - murrant PHP dependencies update ( #13034 ) - murrant Bump phpmailer/phpmailer from 6.4.1 to 6.5.0 ( #12975 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2160","text":"(2021-06-17) A big thank you to the following 23 contributors this last month: mpikzink (9) murrant (6) PipoCanaja (5) dust241999 (3) mathieu-artic (2) paulierco (2) paddy01 (2) andrzejmaczka (2) zombah (1) BennyE (1) Sea-n (1) jbronn (1) d-k-7 (1) systemcrash (1) loopodoopo (1) maesbrisa (1) thomseddon (1) cliffalbert (1) Jellyfrog (1) wolfraider (1) rpardim (1) geg347 (1) ottorei (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (31) PipoCanaja (15) murrant (10) tayyabali785 (1)","title":"21.6.0"},{"location":"General/Changelog/#feature_27","text":"New module add juniper rpm support + reimplementation of cisco-sla module ( #12799 ) - geg347 ISIS-adjacency polling support ( #12461 ) - ottorei","title":"Feature"},{"location":"General/Changelog/#device_33","text":"Add Serialnumber for some Dell ForceTen devices ( #12960 ) - mpikzink 2 more Rittal variants ( #12953 ) - mpikzink Added New-OS: Alcatel-Lucent Enterprise Stellar Wireless ( #12952 ) - BennyE Add SDSL Support for OneAccess routers ( #12948 ) - mathieu-artic Improve TP-Link JetStream Discovery ( #12946 ) - jbronn Alcatel-Lucent aos6 and aos7 fdb fix ( #12945 ) - paulierco Janitza UMG96 ( #12944 ) - mpikzink Imporoved raritan pdu support ( #12937 ) - d-k-7 Alcatel-Lucent Aos7 sensors nobulk ( #12935 ) - paulierco Add Epson Projector as new OS ( #12928 ) - mpikzink Add Barco Clickshare ( #12927 ) - mpikzink Fix nokia(TiMOS) memory ( #12925 ) - paddy01 Device - Vertiv-PDU - Issue 11608 ( #12923 ) - dust241999 Adding basic support for Vertiv PDUs and power graphs ( #12908 ) - dust241999 Ciena 6500 ( #12903 ) - loopodoopo Added support for PowerWalker VFI ( #12891 ) - andrzejmaczka Initial HAProxy ALOHA support ( #12889 ) - Jellyfrog HWG WaterLeak sensor support ( #12865 ) - PipoCanaja Added definition for Riello 204 ( #12861 ) - wolfraider Add support for oneaccess router ( #12850 ) - mathieu-artic Gaia VPN IPSEC discovery ( #12823 ) - rpardim","title":"Device"},{"location":"General/Changelog/#webui_30","text":"Human readable database inconsistent error ( #12950 ) - murrant Add TopErrors widget based on ifError_rate ( #12926 ) - PipoCanaja Fix \"Sub-directory Support\" in small steps ( #12911 ) - mpikzink Fix \"Sub-directory Support\" in small steps ( #12910 ) - mpikzink Fix \"Sub-directory Support\" in small steps ( #12905 ) - mpikzink FIX Alert rules: Import from Alert Rule ( #12897 ) - andrzejmaczka Fix port down alert toggle ( #12884 ) - murrant","title":"Webui"},{"location":"General/Changelog/#authentication_13","text":"Add number sign to special character handling in ActiveDirectoryAuthorizer ( #12943 ) - paddy01","title":"Authentication"},{"location":"General/Changelog/#applications_22","text":"Fix type error ( #12899 ) - murrant","title":"Applications"},{"location":"General/Changelog/#api_25","text":"Add api call to list OSPF ports ( #12955 ) - zombah","title":"Api"},{"location":"General/Changelog/#alerting_28","text":"Add Signal CLI transport support ( #12954 ) - mpikzink Update device_component_down_junos macro ( #12898 ) - thomseddon","title":"Alerting"},{"location":"General/Changelog/#discovery_22","text":"LLDP - ifAlias should be last checked in function find_port_id ( #12904 ) - PipoCanaja LLDP - Extend discovery lldp code to support different subtypes ( #12901 ) - PipoCanaja","title":"Discovery"},{"location":"General/Changelog/#polling_20","text":"Nobulk setting in sensors yaml ( #12833 ) - murrant","title":"Polling"},{"location":"General/Changelog/#rancid_4","text":"Support for fortiswitch in gen_rancid ( #12894 ) - cliffalbert","title":"Rancid"},{"location":"General/Changelog/#refactor_20","text":"Filter unwanted data in Routes Ajax reply ( #12847 ) - PipoCanaja","title":"Refactor"},{"location":"General/Changelog/#documentation_32","text":"Improve Markdown syntax in Document ( #12949 ) - Sea-n Add info about lnms config:set at top of Configuration page ( #12939 ) - murrant Update docs ( #12919 ) - systemcrash","title":"Documentation"},{"location":"General/Changelog/#2150","text":"(2021-05-17) A big thank you to the following 28 contributors this last month: murrant (34) Jellyfrog (14) PipoCanaja (14) dependabot (7) rpardim (3) wolfraider (2) TheGracens (2) si458 (2) mpikzink (2) Sea-n (2) Negatifff (1) backeby (1) SanderBlom (1) paddy01 (1) nightcore500 (1) arrmo (1) bennetgallein (1) Torch09 (1) m4rkov (1) Schultz (1) thegreatecheese (1) paulierco (1) rasssta (1) craig-nokia (1) dethmetaljeff (1) djamp42 (1) martinberg (1) SourceDoctor (1) Thanks to maintainers and others that helped with pull requests this month: murrant (43) Jellyfrog (42) PipoCanaja (8) SourceDoctor (1) martinberg (1)","title":"21.5.0"},{"location":"General/Changelog/#feature_28","text":"Validate database during the install ( #12867 ) - murrant Collect OUI Database and do OUI lookups ( #12842 ) - PipoCanaja Show OS definition in lnms config:get ( #12819 ) - murrant","title":"Feature"},{"location":"General/Changelog/#security_19","text":"Jquery upgrade ( #12802 ) - murrant Oxidized improvements ( #12773 ) - murrant","title":"Security"},{"location":"General/Changelog/#device_34","text":"Huawei MA5603T ( #12869 ) - Negatifff Unifi 5.60.1 sysObjectID changed ( #12862 ) - wolfraider Add better Unifi processors, supported on some models ( #12854 ) - murrant Added support for GE MDS devices ( #12834 ) - SanderBlom Tripplite snmp trap handling ( #12832 ) - murrant CyberPower UPS Updates ( #12827 ) - arrmo Fix for Gaia Storage duplicated ( #12824 ) - rpardim Checkpoint Gaia Sensor Count ( #12822 ) - rpardim Gaia SecureXL current status and Management Connected Gateways ( #12821 ) - rpardim Zywall - HW, Version, Serial and Tests ( #12788 ) - PipoCanaja Firebrick sensor rework ( #12783 ) - murrant Updated Nexus (nxos) os information and test data ( #12779 ) - Torch09 FabOS sensor fixes and add SFP dBm ( #12777 ) - murrant Vrp - Collect sticky mac addresses in fdb-table ( #12774 ) - PipoCanaja Pop returned value from snmpwalk_group for lldp on mikrotik routeros ( #12768 ) - thegreatecheese Adjust Alcatel-Lucent aos7 ( #12766 ) - paulierco Corrected Chassis Over Temp oid for state indexes ( #12764 ) - craig-nokia Fix outlet sensor indexes overwriting each other when there's more than one infeed ( #12763 ) - dethmetaljeff Calix (occamos) b6_316 and Calix (calix) 700 ( #12744 ) - PipoCanaja Additional data collection for GAIA ( #12713 ) - martinberg","title":"Device"},{"location":"General/Changelog/#webui_31","text":"Fix arp-search remote_interface display ( #12871 ) - PipoCanaja Fix empty label in generate_port_link ( #12870 ) - PipoCanaja Fix server stats widget ( #12864 ) - murrant Disable autocomplete for password in login-form ( #12851 ) - backeby Fix top devices widget storage graphs ( #12849 ) - murrant Fixes to Export CSV ( #12830 ) - paddy01 Alert rule delay/interval empty = 0 ( #12804 ) - murrant Webui - Services bootstrap enable + status ( #12736 ) - PipoCanaja Filter Ports out by Interface Type ( #12590 ) - SourceDoctor","title":"Webui"},{"location":"General/Changelog/#graphs_21","text":"Fix graph argument issues ( #12868 ) - murrant RRD Graph optimization ( #12735 ) - murrant","title":"Graphs"},{"location":"General/Changelog/#applications_23","text":"Add mysql skip slave ( #12826 ) - si458 Added metric for MySQL Slave Lag (secs) ( #12765 ) - rasssta","title":"Applications"},{"location":"General/Changelog/#api_26","text":"Fixing consistency across api endpoints ( #12795 ) - bennetgallein","title":"Api"},{"location":"General/Changelog/#alerting_29","text":"Missing columns in select for $alert->serial & $alert->features ( #12771 ) - PipoCanaja Notify if a sensor has been deleted ( #12755 ) - TheGracens","title":"Alerting"},{"location":"General/Changelog/#discovery_23","text":"Ignore Wrong Type errors in snpm_get and snmp_get_multi_oid ( #12800 ) - murrant Discovery - Compute num_oid to make os development easier ( #12576 ) - PipoCanaja","title":"Discovery"},{"location":"General/Changelog/#polling_21","text":"Fix issue with sensor class case ( #12782 ) - murrant","title":"Polling"},{"location":"General/Changelog/#bug_32","text":"Fix database validations ( #12882 ) - murrant PHP 8 Unit Conversion Fix ( #12857 ) - wolfraider Debug and collect-snmp-data.php fixes ( #12837 ) - murrant Fix allow_unauth_graphs ( #12829 ) - nightcore500 Include variables in default view ( #12818 ) - Jellyfrog Add support for when group doesnt exist ( #12817 ) - Jellyfrog Bump tecnickcom/tcpdf dependency to support php 8 ( #12816 ) - Jellyfrog Prevent error when no alert rules ( #12815 ) - Jellyfrog Small fix in functions.inc.php for PHP8 ( #12793 ) - mpikzink Change printer-supplies rrd name to include the supply_type ( #12792 ) - si458 Revert \"Fix StringBlade errors with a stub file\" ( #12776 ) - Jellyfrog Fix auth and crypto select options ( #12769 ) - Schultz Support X-Forwarded-Proto header ( #12759 ) - Jellyfrog Fix OS sensor array return ( #12694 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#refactor_21","text":"Remove debug globals ( #12811 ) - murrant Make applications work with rrdcached ( #12807 ) - Jellyfrog Make docker app work with rrdcached ( #12746 ) - djamp42","title":"Refactor"},{"location":"General/Changelog/#cleanup_19","text":"Misc cleanup ( #12758 ) - Jellyfrog","title":"Cleanup"},{"location":"General/Changelog/#documentation_33","text":"Plugins should be called statically ( #12810 ) - mpikzink Fix docs custom graph rrd functions ( #12803 ) - murrant Use GitHub instead of Github ( #12781 ) - Sea-n Smokeping sub site requires fcgiwrap ( #12775 ) - m4rkov Document sub index references ( #12767 ) - murrant","title":"Documentation"},{"location":"General/Changelog/#tests_19","text":"Set DBSetupTest timezone to UTC ( #12881 ) - murrant Always test all OS detection. ( #12879 ) - murrant Cache astext in tests to avoid DNS lookup ( #12784 ) - Jellyfrog Enable PHPStan linter ( #12678 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#misc_24","text":"Lnms dev:simulate Snmpsim debug output on failure ( #12880 ) - murrant Enable config:set to set variables inside a nested array of settings ( #12772 ) - murrant","title":"Misc"},{"location":"General/Changelog/#dependencies_28","text":"Bump postcss from 8.2.2 to 8.2.10 ( #12858 ) - dependabot Bump lodash from 4.17.20 to 4.17.21 ( #12848 ) - dependabot Bump url-parse from 1.4.7 to 1.5.1 ( #12844 ) - dependabot Bump phpmailer/phpmailer from 6.4.0 to 6.4.1 ( #12831 ) - dependabot Bump laravel/framework from 8.35.1 to 8.40.0 ( #12814 ) - dependabot Bump composer/composer from 2.0.11 to 2.0.13 ( #12813 ) - dependabot Bump rmccue/requests from 1.7.0 to 1.8.0 ( #12812 ) - dependabot Bump laravel dusk ( #12808 ) - Jellyfrog","title":"Dependencies"},{"location":"General/Changelog/#2140","text":"(2021-04-17) A big thank you to the following 34 contributors this last month: Jellyfrog (35) murrant (26) PipoCanaja (8) Torch09 (2) si458 (2) TheGracens (2) Cupidazul (2) DaveB91 (1) martinberg (1) craig-nokia (1) codejake (1) tamikkelsen (1) dependabot (1) Schultz (1) opalivan (1) hrtrd (1) zombah (1) casdr (1) Wooboy (1) djamp42 (1) dlangille (1) Erik-Lamers1 (1) WillIrvine (1) mpikzink (1) simmonmt (1) yswery-reconz (1) 0x4c6565 (1) antonio-jose-almeida (1) cjsoftuk (1) shepherdjay (1) imwuwei (1) SourceDoctor (1) filippog (1) bofh80 (1) Thanks to maintainers and others that helped with pull requests this month: murrant (50) Jellyfrog (39) PipoCanaja (11) SourceDoctor (1) frank42hh (1) haydenseitz (1)","title":"21.4.0"},{"location":"General/Changelog/#feature_29","text":"Cisco AES256 support ( #12717 ) - Schultz Define Port Groups ( #12402 ) - SourceDoctor Service watchdog - add systemd watchdog for resiliency ( #12188 ) - bofh80","title":"Feature"},{"location":"General/Changelog/#security_20","text":"Escape user editable field ( #12739 ) - murrant Fix SQL injection in rediscover-device ( #12716 ) - Jellyfrog","title":"Security"},{"location":"General/Changelog/#device_35","text":"Added basic support for BKtel Optical Amplifier ( #12754 ) - Torch09 Added Liebert HPM support ( #12747 ) - martinberg Added basic Delta Orion Controller support ( #12741 ) - craig-nokia Basic support for zyxelac_xmg3927 ( #12740 ) - PipoCanaja Added support Cisco CBS350 ( #12737 ) - PipoCanaja Correct OID for c3GsmSimStatus ( #12724 ) - tamikkelsen Added support for Infinera XTM ( #12710 ) - Torch09 TAIT - Add entity physical support ( #12703 ) - opalivan BDCOM update support ( #12696 ) - hrtrd Update IOS with 4948 variant hardware detection ( #12685 ) - zombah VRP - fix global VRF being NULL and not '' for cbgp, support for NetEngine devices ( #12676 ) - PipoCanaja Added support for Canon printer model TM TX series ( #12667 ) - Wooboy Fortinet per-core cpu ( #12660 ) - murrant Fixed polling and health issues for 9001 and NCS devices, added suppo\u2026 ( #12640 ) - WillIrvine VRP - Fix SSID Client count ( #12629 ) - PipoCanaja Add CPU and Mem for Teldat Devices ( #12619 ) - Cupidazul Better firebrick support ( #12600 ) - cjsoftuk Huawei VRF BGP_Peers update ( #12585 ) - PipoCanaja Add Packet Buffers as memory for PanOS ( #12582 ) - shepherdjay Parse info from H3C branded comware devices ( #12551 ) - imwuwei","title":"Device"},{"location":"General/Changelog/#webui_32","text":"Fix inventory sensor links when empty ( #12745 ) - murrant Fix mini graphs ( #12738 ) - murrant Fix alert rules display when creating new alert template ( #12731 ) - murrant Fix bug in component table ( #12730 ) - murrant Use native browser lazy load ( #12720 ) - murrant Fix devices latency tab calendar position ( #12684 ) - TheGracens Fix links to non-existent devices ( #12680 ) - murrant Scrollable Dashboard selection menu ( #12656 ) - TheGracens Fix double escaping sysContact on device overview ( #12653 ) - murrant Hide disabled components from overview page CIMC ( #12650 ) - djamp42 Fix progress-bar 0% ( #12648 ) - si458 Add ability to set a custom port on IPMI agents ( #12634 ) - yswery-reconz WebUI - Display interface errors per second instead of accumulated ( #12613 ) - antonio-jose-almeida Add ID to Device Table List and to Device Dependencies Table List + Shorten ifname in Device: Recent Events. ( #12397 ) - Cupidazul","title":"Webui"},{"location":"General/Changelog/#graphs_22","text":"Fix mempools divide by 0 ( #12734 ) - murrant","title":"Graphs"},{"location":"General/Changelog/#alerting_30","text":"Add UKFast PSS transport ( #12624 ) - 0x4c6565 Support multiple Alertmanager URLs ( #12346 ) - filippog","title":"Alerting"},{"location":"General/Changelog/#discovery_24","text":"Fix service template discovery ( #12662 ) - murrant","title":"Discovery"},{"location":"General/Changelog/#polling_22","text":"Allow getting VDSL stats on \"down\" VDSL ports ( #12753 ) - DaveB91 Fix printer state error ( #12681 ) - murrant Translate hex sensor values returned from ipmitool ( #12638 ) - simmonmt","title":"Polling"},{"location":"General/Changelog/#bug_33","text":"Fix globe controller up/down partition bug ( #12757 ) - Jellyfrog Fix scopeIsArchived query ( #12756 ) - Jellyfrog Split port_groups migration to prevent issues ( #12732 ) - murrant Fix ports table when unpolled ports exist ( #12722 ) - murrant JS fixes for IE ( #12721 ) - murrant Correct snmp function usage ( #12714 ) - Jellyfrog Fix adding discrete ipmi sensors by mistake ( #12709 ) - si458 Fix mempool tags ( #12705 ) - murrant Issue with snmpwalk_group string splitting ( #12701 ) - PipoCanaja Use Device object instead of array ( #12699 ) - Jellyfrog Fix alert template variable ping_timestamp ( #12690 ) - Jellyfrog Remove snmp2ipv6 ( #12683 ) - murrant Fix deviceUrl check ( #12682 ) - Jellyfrog Correct globecontroller typo ( #12671 ) - Jellyfrog Fix undefined function in vrp peers ( #12669 ) - murrant Fix Config reference in System validations ( #12668 ) - casdr Fix regression from #12642 ( #12661 ) - Jellyfrog Don't fail on rrd close ( #12659 ) - murrant Change cache table to mediumtext ( #12649 ) - Jellyfrog Fixed VRF name change not updated in DB ( #12644 ) - PipoCanaja Fix a bunch of bugs ( #12643 ) - Jellyfrog Misc cleanup ( #12641 ) - Jellyfrog PHP8 Bug in printChangedStats ( #12639 ) - mpikzink Correct sensor_id variable ( #12633 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#refactor_22","text":"Remove legacy function calls ( #12651 ) - murrant Misc cleanups ( #12642 ) - Jellyfrog Re-implement Printer as a class based module ( #12605 ) - Jellyfrog","title":"Refactor"},{"location":"General/Changelog/#cleanup_20","text":"More cleanups ( #12715 ) - Jellyfrog Cleanup ( #12695 ) - Jellyfrog PHPDoc fixes ( #12693 ) - Jellyfrog PHPDoc fixes ( #12687 ) - Jellyfrog Type hint all device model relations ( #12686 ) - Jellyfrog Linting ( #12677 ) - Jellyfrog Fix misc problems ( #12675 ) - Jellyfrog More PHPDoc changes ( #12674 ) - Jellyfrog Type hint model relations ( #12673 ) - Jellyfrog Make moduleobserver type hinting overridable ( #12670 ) - Jellyfrog Fix more PHPDoc ( #12665 ) - Jellyfrog Replace Auth > Illuminate\\Support\\Facades\\Auth ( #12664 ) - Jellyfrog","title":"Cleanup"},{"location":"General/Changelog/#documentation_34","text":"Fix typos in Dashboards.md ( #12733 ) - codejake Fix doc building ( #12711 ) - Jellyfrog Filter some validation when installed from a package ( #12647 ) - dlangille Add poller_group docs on auto-discovered devices ( #12646 ) - Erik-Lamers1","title":"Documentation"},{"location":"General/Changelog/#tests_20","text":"Add feature to capture a full snmprec ( #12706 ) - Jellyfrog Lint with shellcheck ( #12666 ) - Jellyfrog Enable Black for linter ( #12663 ) - Jellyfrog Add lint GitHub Action ( #12655 ) - murrant","title":"Tests"},{"location":"General/Changelog/#misc_25","text":"Load device relationship from device cache ( #12712 ) - murrant Switch to utf8mb4 ( #12580 ) - Jellyfrog","title":"Misc"},{"location":"General/Changelog/#dependencies_29","text":"Bump phpseclib/phpseclib from 2.0.30 to 3.0.7 ( #12723 ) - dependabot Bump php-amqplib to support PHP8 ( #12698 ) - Jellyfrog Update php dependencies ( #12692 ) - Jellyfrog","title":"Dependencies"},{"location":"General/Changelog/#2130","text":"(2021-03-20) A big thank you to the following 27 contributors this last month: murrant (14) Jellyfrog (12) PipoCanaja (6) SourceDoctor (4) si458 (2) Cormoran96 (2) miff2000 (2) mpikzink (1) rasssta (1) dependabot (1) Chewie9999 (1) bennet-esyoil (1) rkojedzinszky (1) bofh80 (1) WillIrvine (1) pbaldovi (1) h-barnhart (1) waddles (1) scamp (1) aarchijs (1) yrebrac (1) Serphentas (1) theochita (1) Schouwenburg (1) neg2led (1) bakerds (1) CirnoT (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (28) murrant (17) PipoCanaja (8) SourceDoctor (8) f0o (1) crazy-max (1) yrebrac (1)","title":"21.3.0"},{"location":"General/Changelog/#feature_30","text":"Developer device simulation ( #12577 ) - murrant","title":"Feature"},{"location":"General/Changelog/#device_36","text":"Add identification for Edgeswitch 8XP ( #12622 ) - si458 Add more printer data ( #12617 ) - Jellyfrog Update hpe-ilo.yaml ( #12612 ) - rasssta Fix AOS 7 sensors ( #12599 ) - murrant Collect BIOS version for IBMC ( #12586 ) - PipoCanaja Added support for siteboss571 + new tests ( #12568 ) - WillIrvine VRP - Huawei Wifi Controllers and routers 3G/4G update ( #12565 ) - PipoCanaja F5 realservers (node_name) display ( #12553 ) - PipoCanaja Add BGP discovery and polling for Dell OS10 devices ( #12549 ) - waddles Update support for ServersCheck ( #12546 ) - Jellyfrog Add support for Edge-Core ECS4100 series devices ( #12530 ) - scamp Adding Cisco ME1200 support ( #12527 ) - aarchijs Cisco enhanced cellular ( #12463 ) - Schouwenburg Support newer SyncServer ( #12423 ) - neg2led Added alarm detection and optical PMs for Waveserver Ai ( #12380 ) - bakerds","title":"Device"},{"location":"General/Changelog/#webui_33","text":"Fix services availability-map link ( #12632 ) - si458 Add css text center ( #12608 ) - Cormoran96 Sort Type List in Eventlog Pages ( #12572 ) - SourceDoctor Spanning Tree Link in Eventlog ( #12571 ) - SourceDoctor Notifications : display sensor state textual value ( #12554 ) - PipoCanaja GUI - Fix the detailed access point view ( #12543 ) - PipoCanaja Add button to show verbose alert details in the alert, alert-log webui ( #12484 ) - theochita","title":"Webui"},{"location":"General/Changelog/#snmp-traps_9","text":"Fixed typo jnxPowerSupplyOK ( #12556 ) - h-barnhart","title":"Snmp Traps"},{"location":"General/Changelog/#applications_24","text":"Add application powermon ( #12500 ) - yrebrac Chrony support ( #12488 ) - Serphentas Docker stats app ( #12358 ) - Cormoran96","title":"Applications"},{"location":"General/Changelog/#alerting_31","text":"Add Google Chat Transport ( #12558 ) - pbaldovi","title":"Alerting"},{"location":"General/Changelog/#discovery_25","text":"DynamicDiscovery - Guess num_oid if not provided in YAML file ( #12570 ) - PipoCanaja Fix location for devices with broken snmp ( #12544 ) - murrant","title":"Discovery"},{"location":"General/Changelog/#oxidized_13","text":"Oxidized support airfiber ( #12597 ) - murrant","title":"Oxidized"},{"location":"General/Changelog/#bug_34","text":"Bugfix for no sockets on Unix Agents ( #12637 ) - mpikzink Fix Service Templates Dynamic ( #12626 ) - murrant Service templates - fix rules ( #12587 ) - bofh80 Fix vminfo invalid power state in migration ( #12567 ) - murrant Add missing Power states ( #12559 ) - Jellyfrog PHP 8 fixes ( #12528 ) - murrant","title":"Bug"},{"location":"General/Changelog/#refactor_23","text":"Remove legacy json format function ( #12583 ) - murrant","title":"Refactor"},{"location":"General/Changelog/#documentation_35","text":"Update Agent-Setup.md with systemd instructions on how to restrict on which NIC the agent listens. ( #12601 ) - Chewie9999 Broken link on fast-polling page ( #12595 ) - bennet-esyoil Fix bullet points ( #12574 ) - miff2000 Fix the bullet point rendering ( #12560 ) - miff2000","title":"Documentation"},{"location":"General/Changelog/#tests_21","text":"Location tests more reliable ( #12584 ) - murrant Test both MariaDB and MySQL ( #12547 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#misc_26","text":"Set correct min database version ( #12606 ) - Jellyfrog Simplify process reaping ( #12593 ) - rkojedzinszky Fix broken tests ( #12588 ) - Jellyfrog Add minimum database version check ( #12581 ) - Jellyfrog Global Settings - SNMP Timeout ( #12579 ) - SourceDoctor Improved rrdtool version validation ( #12539 ) - murrant Use DNS Location Record for Location ( #12409 ) - SourceDoctor","title":"Misc"},{"location":"General/Changelog/#dependencies_30","text":"Bump elliptic from 6.5.3 to 6.5.4 ( #12602 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2120","text":"(2021-02-16) A big thank you to the following 18 contributors this last month: murrant (9) Jellyfrog (8) PipoCanaja (1) hanserasmus (1) nightcore500 (1) simmonmt (1) SourceDoctor (1) dejantep (1) TridTech (1) Showfom (1) jasoncheng7115 (1) nkringle (1) dependabot (1) Negatifff (1) Cupidazul (1) paddy01 (1) Torch09 (1) bofh80 (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (13) murrant (12) SourceDoctor (5)","title":"21.2.0"},{"location":"General/Changelog/#feature_31","text":"GPS coordinates from device ( #12521 ) - murrant Show Alert Count on Widget ( #12503 ) - SourceDoctor Add Service Templates ( #12107 ) - bofh80","title":"Feature"},{"location":"General/Changelog/#security_21","text":"Fix url generator XSS ( #12507 ) - Jellyfrog Fix XSS in notifications ( #12504 ) - Jellyfrog","title":"Security"},{"location":"General/Changelog/#device_37","text":"VRP - Filter invalid temperature data 0x7fffffff ( #12537 ) - PipoCanaja Rittal CMC III low warn limit and CAN bus current ( #12513 ) - nightcore500 Add TrueNAS temperature ( #12506 ) - simmonmt Update deltaups.yaml definition ( #12497 ) - TridTech Fixes incorrect device overlay graph type for poweralert 12 devices ( #12491 ) - nkringle Socomecpdu support ( #12481 ) - Negatifff Add support for SCS KS air-conditioning Devices ( #12360 ) - Torch09","title":"Device"},{"location":"General/Changelog/#webui_34","text":"Speedup device list ( #12514 ) - Jellyfrog","title":"Webui"},{"location":"General/Changelog/#authentication_14","text":"Fixes issues with binding and authenticating users in nested groups ( #12398 ) - paddy01","title":"Authentication"},{"location":"General/Changelog/#applications_25","text":"Add poller feature for RRDCached SNMP to query remote agent. ( #12430 ) - Cupidazul","title":"Applications"},{"location":"General/Changelog/#discovery_26","text":"Move sysContact polling to discovery ( #12524 ) - Jellyfrog","title":"Discovery"},{"location":"General/Changelog/#bug_35","text":"Better handling of invalid notification dates ( #12523 ) - murrant Fix invalid dates in the database ( #12512 ) - Jellyfrog Fix Fast Ping alerts always running ( #12510 ) - murrant Fix Fast Ping ( #12509 ) - murrant Network map fix Css/img ( #12498 ) - dejantep Correct check for SNMPv3 SHA-192/256 compability ( #12494 ) - Jellyfrog","title":"Bug"},{"location":"General/Changelog/#cleanup_21","text":"Remove perf_times table ( #12517 ) - murrant","title":"Cleanup"},{"location":"General/Changelog/#documentation_36","text":"Update transports docs ( #12518 ) - hanserasmus Correct rrdcached.sock location on doc ( #12496 ) - Showfom","title":"Documentation"},{"location":"General/Changelog/#translation_12","text":"Updated Traditional Chinese Translation ( #12493 ) - jasoncheng7115","title":"Translation"},{"location":"General/Changelog/#tests_22","text":"\"variant\" is now required for test data ( #12531 ) - Jellyfrog","title":"Tests"},{"location":"General/Changelog/#dependencies_31","text":"Update php packages and fix composer warnings ( #12526 ) - murrant Remove larapoke until they support PHP 8 ( #12522 ) - murrant Bump laravel/framework from 8.22.1 to 8.24.0 ( #12490 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#2110","text":"(2021-02-02) A big thank you to the following 37 contributors this last month: murrant (14) Jellyfrog (8) efelon (4) SourceDoctor (4) paulierco (4) TheMysteriousX (3) dependabot (3) crazy-max (2) djamp42 (2) jezekus (2) martijn-schmidt (2) vitalisator (2) hanserasmus (1) lukoramu (1) deveth0 (1) lazyb0nes (1) mpikzink (1) richardlawley (1) Torch09 (1) rk4an (1) FingerlessGlov3s (1) dlehman83 (1) fablabo (1) zerrac (1) loopodoopo (1) alakiza (1) yrebrac (1) nkringle (1) ottorei (1) Senetus (1) WhippingBoy01 (1) haydenseitz (1) admish (1) kedare (1) ah9828 (1) OahzEgroeg (1) Dmkaz (1) Thanks to maintainers and others that helped with pull requests this month: Jellyfrog (36) murrant (26) SourceDoctor (4) f0o (3) ottorei (1) laf (1) calinrigo (1)","title":"21.1.0"},{"location":"General/Changelog/#feature_32","text":"Show Device Group on Map ( #12379 ) - SourceDoctor","title":"Feature"},{"location":"General/Changelog/#security_22","text":"Fix js injection issues in device overview ( #12475 ) - murrant CVE-2020-35700 ( #12422 ) - Jellyfrog","title":"Security"},{"location":"General/Changelog/#device_38","text":"Update enexus for \"SmartPack S\" ( #12465 ) - haydenseitz Added Firepower 4125 ( #12462 ) - WhippingBoy01 Add Alcatel AOS7 bgpdescr & bgpprefix ( #12450 ) - paulierco Panduit PDU ( #12449 ) - Senetus Add sensors for Meinberg Lantime NTP-devices ( #12447 ) - ottorei Adds tripplight snmpwebcard support ( #12445 ) - nkringle Add mempools, cpu and storage to some arbor devices ( #12444 ) - TheMysteriousX Filter Juniper mempools ( #12443 ) - TheMysteriousX Add planet-pdu os device ( #12441 ) - paulierco Add WTI POWER os device ( #12440 ) - jezekus Enumerate sensors under the Outlet for the entity-physical inventory ( #12439 ) - martijn-schmidt Nokia sap graph ( #12432 ) - loopodoopo Apc epdu ( #12428 ) - zerrac Fix for Mikrotik SwOS discovery ( #12426 ) - jezekus New device OS: McafeeWebGateway ( #12418 ) - paulierco Make LibreNMS recognize Schleifenbauer model DPM27/E with existing OS definition ( #12414 ) - martijn-schmidt Update OPNsense version Regex, for _ releases ( #12407 ) - FingerlessGlov3s Change raspberry_pi_sensors state ( #12390 ) - mpikzink Added support for Motorola and Thomson DOCSIS Cable Modems. ( #12386 ) - lukoramu Check Point: Added HA state support ( #12382 ) - lazyb0nes Add Zyxel IES 5206 and 5212 to supported Devices ( #12373 ) - Torch09 Alcatel-Lucent support part2 ( #12369 ) - paulierco Eltek Enexus. Disable some battery sensors if no battery bank is installed at all. ( #12367 ) - vitalisator New device os Raisecom Router OS (ROAP) ( #12361 ) - vitalisator Freenas storage polling fix ( #12275 ) - Dmkaz","title":"Device"},{"location":"General/Changelog/#webui_35","text":"Fix exception in device overview puppet widget ( #12474 ) - murrant Support new lines in login_message again ( #12469 ) - efelon Fix poller frequency display bug and warn ( #12466 ) - murrant Remove unnecessary horizontal scroll bars in allert widgets ( #12464 ) - efelon Reintroduce word wrapping to the custom login message ( #12460 ) - efelon Add a button to reset port state history ( #12457 ) - TheMysteriousX Improving readability of tables on dark theme dashboards ( #12455 ) - efelon Changed default param max_rows to increase widget count on dashboard ( #12438 ) - alakiza Fix percent bar text location ( #12406 ) - rk4an Don't show gelocation on snmp location string ( #12384 ) - SourceDoctor Copy Dashboard to other User ( #11989 ) - SourceDoctor Output image for graphs with no data ( #11865 ) - murrant","title":"Webui"},{"location":"General/Changelog/#authentication_15","text":"Ldap auth handle no search more gracefully ( #12424 ) - murrant","title":"Authentication"},{"location":"General/Changelog/#api_27","text":"Fix oxidized API call when config is missing ( #12476 ) - murrant Allow logs to be filtered by min/max id ( #12471 ) - kedare","title":"Api"},{"location":"General/Changelog/#bug_36","text":"Fix broken statement on auto discovery ( #12408 ) - djamp42 Remove unused openssl_ver ( #12378 ) - murrant Fix version compare ( #12376 ) - murrant","title":"Bug"},{"location":"General/Changelog/#documentation_37","text":"Update Rancid.md ( #12487 ) - fablabo Creating Documentation page ( #12486 ) - yrebrac Added missing / on internal link ( #12467 ) - admish Lnms link in /usr/bin ( #12446 ) - murrant Update Documentation ( #12411 ) - dlehman83 Document flattened Inventory API function ( #12404 ) - richardlawley Update docs for raspberry.sh ( #12389 ) - deveth0 Update to incorporate new locking mechanisms ( #12388 ) - hanserasmus Update Distributed-Poller.md Discovery using dispatcher service ( #12387 ) - djamp42 Doc - Increase Nginx Timeout ( #12368 ) - SourceDoctor","title":"Documentation"},{"location":"General/Changelog/#tests_23","text":"Add test to check if os parameter matches filename ( #12442 ) - Jellyfrog Remove Travis support ( #12416 ) - crazy-max GitHub Actions dev:check ci ( #12392 ) - crazy-max","title":"Tests"},{"location":"General/Changelog/#misc_27","text":"Cast REDIS_TIMEOUT to integer ( #12482 ) - OahzEgroeg Redis - Add scheme to allow TLS ( #12477 ) - ah9828","title":"Misc"},{"location":"General/Changelog/#dependencies_32","text":"Remove PHP8 blockers in LibreNMS ( #12451 ) - murrant Bump laravel/framework from 8.21.0 to 8.22.1 ( #12448 ) - dependabot Update php dependencies ( #12425 ) - murrant Upgrade to Laravel Mix 6 ( #12421 ) - Jellyfrog Bump axios from 0.19.2 to 0.21.1 ( #12420 ) - dependabot Bump ini from 1.3.5 to 1.3.8 ( #12395 ) - dependabot","title":"Dependencies"},{"location":"General/Changelog/#old-changelogs","text":"","title":"Old Changelogs"},{"location":"General/Releases/","text":"Choosing a release We try to ensure that breaking changes aren't introduced by utilising various automated code testing, syntax testing and unit testing along with manual code review. However bugs can and do get introduced as well as major refactoring to improve the quality of the code base. We have two branches available for you to use. The default is the master branch. Development branch Our master branch is our dev branch, this is actively commited to and it's not uncommon for multiple commits to be merged in daily. As such sometimes changes will be introduced which will cause unintended issues. If this happens we are usually quick to fix or revert those changes. We appreciate everyone that runs this branch as you are in essence secondary testers to the automation and manually testing that is done during the merge stages. You can configure your install (this is the default) to use this branch by setting lnms config:set update_channel master and ensuring you switch to the master branch with: cd /opt/librenms && git checkout master Stable branch With this in mind, we provide a monthly stable release which is released on or around the last Sunday of the month. Code pull requests (aside from Bug fixes) are stopped days leading up to the release to ensure that we have a clean working branch at that point. The changelog is also updated and will reference the release number and date so you can see what changes have been made since the last release. To switch to using stable branches you can set lnms config:set update_channel release This will pause updates until the next stable release, at that time LibreNMS will update to the stable release and continue to only update to stable releases. Downgrading is not supported on LibreNMS and will likely cause bugs.","title":"Choosing a release"},{"location":"General/Releases/#choosing-a-release","text":"We try to ensure that breaking changes aren't introduced by utilising various automated code testing, syntax testing and unit testing along with manual code review. However bugs can and do get introduced as well as major refactoring to improve the quality of the code base. We have two branches available for you to use. The default is the master branch.","title":"Choosing a release"},{"location":"General/Releases/#development-branch","text":"Our master branch is our dev branch, this is actively commited to and it's not uncommon for multiple commits to be merged in daily. As such sometimes changes will be introduced which will cause unintended issues. If this happens we are usually quick to fix or revert those changes. We appreciate everyone that runs this branch as you are in essence secondary testers to the automation and manually testing that is done during the merge stages. You can configure your install (this is the default) to use this branch by setting lnms config:set update_channel master and ensuring you switch to the master branch with: cd /opt/librenms && git checkout master","title":"Development branch"},{"location":"General/Releases/#stable-branch","text":"With this in mind, we provide a monthly stable release which is released on or around the last Sunday of the month. Code pull requests (aside from Bug fixes) are stopped days leading up to the release to ensure that we have a clean working branch at that point. The changelog is also updated and will reference the release number and date so you can see what changes have been made since the last release. To switch to using stable branches you can set lnms config:set update_channel release This will pause updates until the next stable release, at that time LibreNMS will update to the stable release and continue to only update to stable releases. Downgrading is not supported on LibreNMS and will likely cause bugs.","title":"Stable branch"},{"location":"General/Security/","text":"General Like any good software we take security seriously. However, bugs do make it into the software along with the history of the code base we inherited. It's how we deal with identified vulnerabilities that should show that we take things seriously. Securing your install As with any system of this nature, we highly recommend that you restrict access to the install via a firewall or VPN. Please ensure you keep your install up to date . Enable HTTPS It is also highly recommended that the Web interface is protected with an SSL certificate such as ones provided by LetsEncrypt . Secure Session Cookies Once you have enabled HTTPS for your install, you should set SESSION_SECURE_COOKIE=true in your .env file. This will require cookies to be transferred by secure protocol and prevent any MiM attacks against it. Trusted Proxies When using a reverse proxy, you may restrict the hosts allowed to forward headers to LibreNMS. By default this allows all proxies, due to legacy reasons. Set APP_TRUSTED_PROXIES in your .env to an empty string or the urls to the proxies allowed to forward. Reporting vulnerabilities Like anyone, we appreciate the work people put in to find flaws in software and welcome anyone to do so with LibreNMS, this will lead to better quality and more secure software for everyone. If you think you've found a vulnerability and want to discuss it with some of the core team then you can contact us on Discord and we will endeavour to get back to as quick as we can, this is usually within 24 hours. We are happy to attribute credit to the findings, but we ask that we're given a chance to patch any vulnerability before public disclosure so that our users can update as soon as a fix is available.","title":"Security information"},{"location":"General/Security/#general","text":"Like any good software we take security seriously. However, bugs do make it into the software along with the history of the code base we inherited. It's how we deal with identified vulnerabilities that should show that we take things seriously.","title":"General"},{"location":"General/Security/#securing-your-install","text":"As with any system of this nature, we highly recommend that you restrict access to the install via a firewall or VPN. Please ensure you keep your install up to date .","title":"Securing your install"},{"location":"General/Security/#enable-https","text":"It is also highly recommended that the Web interface is protected with an SSL certificate such as ones provided by LetsEncrypt .","title":"Enable HTTPS"},{"location":"General/Security/#secure-session-cookies","text":"Once you have enabled HTTPS for your install, you should set SESSION_SECURE_COOKIE=true in your .env file. This will require cookies to be transferred by secure protocol and prevent any MiM attacks against it.","title":"Secure Session Cookies"},{"location":"General/Security/#trusted-proxies","text":"When using a reverse proxy, you may restrict the hosts allowed to forward headers to LibreNMS. By default this allows all proxies, due to legacy reasons. Set APP_TRUSTED_PROXIES in your .env to an empty string or the urls to the proxies allowed to forward.","title":"Trusted Proxies"},{"location":"General/Security/#reporting-vulnerabilities","text":"Like anyone, we appreciate the work people put in to find flaws in software and welcome anyone to do so with LibreNMS, this will lead to better quality and more secure software for everyone. If you think you've found a vulnerability and want to discuss it with some of the core team then you can contact us on Discord and we will endeavour to get back to as quick as we can, this is usually within 24 hours. We are happy to attribute credit to the findings, but we ask that we're given a chance to patch any vulnerability before public disclosure so that our users can update as soon as a fix is available.","title":"Reporting vulnerabilities"},{"location":"General/Updating/","text":"Updating an Install By default, LibreNMS is set to automatically update. If you have disabled this feature then you can perform a manual update. Manual update If you would like to perform a manual update then you can do this by running the following command as the librenms user: ./daily.sh This will update both the core LibreNMS files but also update the database structure if updates are available. Advanced users If you absolutely must update manually without using ./daily.sh then you can do so by running the following commands: cd /opt/librenms git pull ./scripts/composer_wrapper.php install --no-dev ./lnms migrate ./validate.php Disabling automatic updates LibreNMS by default performs updates on a daily basis. This can be disabled in the WebUI Global Settings under System -> Updates, or using lnms Warning You should never remove daily.sh from the cronjob! This does database cleanup and other processes in addition to updating. settings/system/updates lnms config:set update false","title":"Updating"},{"location":"General/Updating/#updating-an-install","text":"By default, LibreNMS is set to automatically update. If you have disabled this feature then you can perform a manual update.","title":"Updating an Install"},{"location":"General/Updating/#manual-update","text":"If you would like to perform a manual update then you can do this by running the following command as the librenms user: ./daily.sh This will update both the core LibreNMS files but also update the database structure if updates are available.","title":"Manual update"},{"location":"General/Updating/#advanced-users","text":"If you absolutely must update manually without using ./daily.sh then you can do so by running the following commands: cd /opt/librenms git pull ./scripts/composer_wrapper.php install --no-dev ./lnms migrate ./validate.php","title":"Advanced users"},{"location":"General/Updating/#disabling-automatic-updates","text":"LibreNMS by default performs updates on a daily basis. This can be disabled in the WebUI Global Settings under System -> Updates, or using lnms Warning You should never remove daily.sh from the cronjob! This does database cleanup and other processes in addition to updating. settings/system/updates lnms config:set update false","title":"Disabling automatic updates"},{"location":"General/Welcome-to-Observium-users/","text":"LibreNMS is a fork of Observium. The reason for the fork has nothing to do with Observium's move to community vs. paid versions . It is simply that we have different priorities and values to the Observium development team. We decided to fork (reluctantly) because we like using Observium, but we want to collaborate on a community-based project with like-minded IT professionals. See README.md and the references there for more information about the kind of community we're trying to promote. LibreNMS was forked from the last GPL-licensed version of Observium . Thanks to one of our users, Dan Brown, who has written a migration script , you can easily move your Observium install over to LibreNMS. This also takes care of moving from one CPU architecture to another. Give it a try :) How LibreNMS will be different from Observium: We will have an inclusive community, where it's OK to ask stupid questions, and OK to ask for things that aren't on the roadmap. If you'd like to see something added, add or comment on the relevant issue in our Community forum . Development decisions will be community-driven. We want to make software that fulfills its users' needs. There are no plans for a paid version, and we don't anticipate this ever changing. There are no current plans for paid support, but this may be added later if there is sufficient demand. We use git for version control and GitHub for hosting to make it as easy and painless as possible to create forked or private versions. Reasons why you might want to use Observium instead of LibreNMS: You have a financial investment in Observium and aren't concerned about community contributions. You don't like the GNU General Public License, version 3 or the philosophy of Free Software/copyleft in general. Reasons why you might want to use LibreNMS instead of Observium: You want to work with others on the project, knowing that your investment of time and effort will not be wasted . You want to add and experiment with features that are not a priority for the Observium developers. See CONTRIBUTING for more details. You want to make use of the additional features LibreNMS can offer.","title":"Welcome to Observium users"},{"location":"Installation/Docker/","text":"Docker An official LibreNMS docker image based on Alpine Linux and Nginx is available on DockerHub . Documentation Full install and configuration documentation can be found on the GitHub repository . Quick install Install docker: https://docs.docker.com/engine/install/ Download and unzip composer files: mkdir librenms cd librenms wget https://github.com/librenms/docker/archive/refs/heads/master.zip unzip master.zip cd docker-master/examples/compose Set a new mysql password in .env and inspect compose.yml Bring up the docker containers sudo docker compose -f compose.yml up -d Open webui to finish configuration. http://localhost:8000 (use the correct ip or name instead of localhost)","title":"Docker"},{"location":"Installation/Docker/#docker","text":"An official LibreNMS docker image based on Alpine Linux and Nginx is available on DockerHub .","title":"Docker"},{"location":"Installation/Docker/#documentation","text":"Full install and configuration documentation can be found on the GitHub repository .","title":"Documentation"},{"location":"Installation/Docker/#quick-install","text":"Install docker: https://docs.docker.com/engine/install/ Download and unzip composer files: mkdir librenms cd librenms wget https://github.com/librenms/docker/archive/refs/heads/master.zip unzip master.zip cd docker-master/examples/compose Set a new mysql password in .env and inspect compose.yml Bring up the docker containers sudo docker compose -f compose.yml up -d Open webui to finish configuration. http://localhost:8000 (use the correct ip or name instead of localhost)","title":"Quick install"},{"location":"Installation/Images/","text":"LibreNMS VMs NOTE: We highly advise that you change all passwords on this image when you deploy it!! NOTE: These images ship with a vagrant user, please remove this user account when you deploy it!! NOTE: Read the above note again! We have available for download a pre-built image based on Ubuntu 22.04. These images are built using packer.io . Details of the image and it's setup are: At present we provide the following builds: OVA Built with VirtualBox. OVA Built for VMWare ESXi. Vagrant Box file. Any issues and or help with these images should be reported via Community Forum or our Discord server Setup US Keyboard Etc/UTC Timezone 4 Poller Wrapper threads Software PHP 8.1 MariaDB Syslog-ng Features Oxidized installed but not configured Weathermap plugin enabled Billing enabled RRDCached enabled Service checks enabled Syslog enabled Download All images can be downloaded from GitHub . The tags follow the main LibreNMS repo. When a new LibreNMS release is available we will push new images out running that version. Please do note that if you download an older release with a view to running that specific version, you will need to disable updates lnms config:set update false . Access/Credentials If you are using the VirtualBox image then to access your newly imported VM, these ports are forwarded from your machine to the VM: 8080 for WebUI and 2023 for SSH. Remember to edit/remove them if you change (and you should) the VM network configuration. WebUI (http://localhost) username: librenms password: D32fwefwef SSH (change the password ssh://localhost:2023) username: librenms password: CDne3fwdfds SSH (remove this account) username: vagrant password; vagrant MySQL/MariaDB username: librenms password: D42nf23rewD Contributing If you would like to help with these images whether it's add additional features or default software / settings then you can do so on GitHub .","title":"Virtual machines"},{"location":"Installation/Images/#librenms-vms","text":"NOTE: We highly advise that you change all passwords on this image when you deploy it!! NOTE: These images ship with a vagrant user, please remove this user account when you deploy it!! NOTE: Read the above note again! We have available for download a pre-built image based on Ubuntu 22.04. These images are built using packer.io . Details of the image and it's setup are: At present we provide the following builds: OVA Built with VirtualBox. OVA Built for VMWare ESXi. Vagrant Box file. Any issues and or help with these images should be reported via Community Forum or our Discord server","title":"LibreNMS VMs"},{"location":"Installation/Images/#setup","text":"US Keyboard Etc/UTC Timezone 4 Poller Wrapper threads","title":"Setup"},{"location":"Installation/Images/#software","text":"PHP 8.1 MariaDB Syslog-ng","title":"Software"},{"location":"Installation/Images/#features","text":"Oxidized installed but not configured Weathermap plugin enabled Billing enabled RRDCached enabled Service checks enabled Syslog enabled","title":"Features"},{"location":"Installation/Images/#download","text":"All images can be downloaded from GitHub . The tags follow the main LibreNMS repo. When a new LibreNMS release is available we will push new images out running that version. Please do note that if you download an older release with a view to running that specific version, you will need to disable updates lnms config:set update false .","title":"Download"},{"location":"Installation/Images/#accesscredentials","text":"If you are using the VirtualBox image then to access your newly imported VM, these ports are forwarded from your machine to the VM: 8080 for WebUI and 2023 for SSH. Remember to edit/remove them if you change (and you should) the VM network configuration. WebUI (http://localhost) username: librenms password: D32fwefwef SSH (change the password ssh://localhost:2023) username: librenms password: CDne3fwdfds SSH (remove this account) username: vagrant password; vagrant MySQL/MariaDB username: librenms password: D42nf23rewD","title":"Access/Credentials"},{"location":"Installation/Images/#contributing","text":"If you would like to help with these images whether it's add additional features or default software / settings then you can do so on GitHub .","title":"Contributing"},{"location":"Installation/Install-LibreNMS/","text":"Install LibreNMS Prepare Linux Server You should have an installed Linux server running one of the supported OS. Make sure you select your server's OS in the tabbed options below. Choice of web server is your preference, NGINX is recommended. Connect to the server command line and follow the instructions below. Note These instructions assume you are the root user. If you are not, prepend sudo to the shell commands (the ones that aren't at mysql> prompts) or temporarily become a user with root privileges with sudo -s or sudo -i . Please note the minimum supported PHP version is 8.1 Install Required Packages Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 NGINX apt install acl curl fping git graphviz imagemagick mariadb-client mariadb-server mtr-tiny nginx-full nmap php-cli php-curl php-fpm php-gd php-gmp php-json php-mbstring php-mysql php-snmp php-xml php-zip rrdtool snmp snmpd unzip python3-pymysql python3-dotenv python3-redis python3-setuptools python3-systemd python3-pip whois traceroute NGINX Apache apt install software-properties-common add-apt-repository universe add-apt-repository ppa:ondrej/php apt update apt install acl curl fping git graphviz imagemagick mariadb-client mariadb-server mtr-tiny nginx-full nmap php-cli php-curl php-fpm php-gd php-gmp php-json php-mbstring php-mysql php-snmp php-xml php-zip rrdtool snmp snmpd unzip python3-pymysql python3-dotenv python3-redis python3-setuptools python3-systemd python3-pip whois traceroute apt install software-properties-common add-apt-repository universe add-apt-repository ppa:ondrej/php apt update apt install acl curl apache2 fping git graphviz imagemagick libapache2-mod-fcgid mariadb-client mariadb-server mtr-tiny nmap php-cli php-curl php-fpm php-gd php-gmp php-json php-mbstring php-mysql php-snmp php-xml php-zip rrdtool snmp snmpd whois python3-pymysql python3-dotenv python3-redis python3-setuptools python3-systemd python3-pip unzip traceroute NGINX Apache dnf -y install epel-release dnf -y install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-8.rpm dnf module reset php dnf module enable php:8.1 dnf install bash-completion cronie fping git ImageMagick mariadb-server mtr net-snmp net-snmp-utils nginx nmap php-fpm php-cli php-common php-curl php-gd php-gmp php-json php-mbstring php-process php-snmp php-xml php-zip php-mysqlnd python3 python3-PyMySQL python3-redis python3-memcached python3-pip python3-systemd rrdtool unzip dnf -y install epel-release dnf -y install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-8.rpm dnf module reset php dnf module enable php:remi-8.1 dnf install bash-completion cronie fping gcc git httpd ImageMagick mariadb-server mtr net-snmp net-snmp-utils nmap php-fpm php-cli php-common php-curl php-gd php-gmp php-json php-mbstring php-process php-snmp php-xml php-zip php-mysqlnd python3 python3-devel python3-PyMySQL python3-redis python3-memcached python3-pip python3-systemd rrdtool unzip NGINX apt install apt-transport-https lsb-release ca-certificates wget acl curl fping git graphviz imagemagick mariadb-client mariadb-server mtr-tiny nginx-full nmap php8.2-cli php8.2-curl php8.2-fpm php8.2-gd php8.2-gmp php8.2-mbstring php8.2-mysql php8.2-snmp php8.2-xml php8.2-zip python3-dotenv python3-pymysql python3-redis python3-setuptools python3-systemd python3-pip rrdtool snmp snmpd unzip whois Add librenms user useradd librenms -d /opt/librenms -M -r -s \"$(which bash)\" Download LibreNMS cd /opt git clone https://github.com/librenms/librenms.git Set permissions chown -R librenms:librenms /opt/librenms chmod 771 /opt/librenms setfacl -d -m g::rwx /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache/ /opt/librenms/storage/ setfacl -R -m g::rwx /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache/ /opt/librenms/storage/ Install PHP dependencies su - librenms ./scripts/composer_wrapper.php install --no-dev exit Sometimes when there is a proxy used to gain internet access, the above script may fail. The workaround is to install the composer package manually. For a global installation: wget https://getcomposer.org/composer-stable.phar mv composer-stable.phar /usr/bin/composer chmod +x /usr/bin/composer Set timezone See https://php.net/manual/en/timezones.php for a list of supported timezones. Valid examples are: \"America/New_York\", \"Australia/Brisbane\", \"Etc/UTC\". Ensure date.timezone is set in php.ini to your preferred time zone. Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 vi /etc/php/8.1/fpm/php.ini vi /etc/php/8.1/cli/php.ini vi /etc/php/8.1/fpm/php.ini vi /etc/php/8.1/cli/php.ini vi /etc/php.ini vi /etc/php/8.2/fpm/php.ini vi /etc/php/8.2/cli/php.ini Remember to set the system timezone as well. timedatectl set-timezone Etc/UTC Configure MariaDB Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 vi /etc/mysql/mariadb.conf.d/50-server.cnf vi /etc/mysql/mariadb.conf.d/50-server.cnf vi /etc/my.cnf.d/mariadb-server.cnf vi /etc/mysql/mariadb.conf.d/50-server.cnf Within the [mysqld] section add: innodb_file_per_table=1 lower_case_table_names=0 Then restart MariaDB systemctl enable mariadb systemctl restart mariadb Start MariaDB client mysql -u root NOTE: Change the 'password' below to something secure. CREATE DATABASE librenms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ; CREATE USER 'librenms' @ 'localhost' IDENTIFIED BY 'password' ; GRANT ALL PRIVILEGES ON librenms . * TO 'librenms' @ 'localhost' ; exit Configure PHP-FPM Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/librenms.conf vi /etc/php/8.1/fpm/pool.d/librenms.conf cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/librenms.conf vi /etc/php/8.1/fpm/pool.d/librenms.conf cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/librenms.conf vi /etc/php-fpm.d/librenms.conf cp /etc/php/8.2/fpm/pool.d/www.conf /etc/php/8.2/fpm/pool.d/librenms.conf vi /etc/php/8.2/fpm/pool.d/librenms.conf Change [www] to [librenms] : [librenms] Change user and group to \"librenms\": user = librenms group = librenms Change listen to a unique path that must match your webserver's config ( fastcgi_pass for NGINX and SetHandler for Apache) : listen = /run/php-fpm-librenms.sock If there are no other PHP web applications on this server, you may remove www.conf to save some resources. Feel free to tune the performance settings in librenms.conf to meet your needs. Configure Web Server Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 NGINX vi /etc/nginx/conf.d/librenms.conf Add the following config, edit server_name as required: server { listen 80 ; server_name librenms.example.com ; root /opt/librenms/html ; index index.php ; charset utf-8 ; gzip on ; gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon ; location / { try_files $uri $uri/ /index.php? $query_string ; } location ~ [^/]\\.php(/|$) { fastcgi_pass unix:/run/php-fpm-librenms.sock ; fastcgi_split_path_info ^(.+\\.php)(/.+) $ ; include fastcgi.conf ; } location ~ /\\.(?!well-known).* { deny all ; } } rm /etc/nginx/sites-enabled/default systemctl restart nginx systemctl restart php8.1-fpm NGINX Apache vi /etc/nginx/conf.d/librenms.conf Add the following config, edit server_name as required: server { listen 80 ; server_name librenms.example.com ; root /opt/librenms/html ; index index.php ; charset utf-8 ; gzip on ; gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon ; location / { try_files $uri $uri/ /index.php? $query_string ; } location ~ [^/]\\.php(/|$) { fastcgi_pass unix:/run/php-fpm-librenms.sock ; fastcgi_split_path_info ^(.+\\.php)(/.+) $ ; include fastcgi.conf ; } location ~ /\\.(?!well-known).* { deny all ; } } rm /etc/nginx/sites-enabled/default systemctl restart nginx systemctl restart php8.1-fpm vi /etc/apache2/sites-available/librenms.conf Add the following config, edit ServerName as required: DocumentRoot /opt/librenms/html/ ServerName librenms.example.com AllowEncodedSlashes NoDecode Require all granted AllowOverride All Options FollowSymLinks MultiViews # Enable http authorization headers SetEnvIfNoCase ^Authorization$ \"(.+)\" HTTP_AUTHORIZATION=$1 SetHandler \"proxy:unix:/run/php-fpm-librenms.sock|fcgi://localhost\" a2dissite 000 -default a2enmod proxy_fcgi setenvif rewrite a2ensite librenms.conf systemctl restart apache2 systemctl restart php8.1-fpm NGINX Apache vi /etc/nginx/conf.d/librenms.conf Add the following config, edit server_name as required: server { listen 80 ; server_name librenms.example.com ; root /opt/librenms/html ; index index.php ; charset utf-8 ; gzip on ; gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon ; location / { try_files $uri $uri/ /index.php? $query_string ; } location ~ [^/]\\.php(/|$) { fastcgi_pass unix:/run/php-fpm-librenms.sock ; fastcgi_split_path_info ^(.+\\.php)(/.+) $ ; include fastcgi.conf ; } location ~ /\\.(?!well-known).* { deny all ; } } NOTE: If this is the only site you are hosting on this server (it should be :)) then you will need to disable the default site. Delete the server section from /etc/nginx/nginx.conf systemctl enable --now nginx systemctl enable --now php-fpm Create the librenms.conf: vi /etc/httpd/conf.d/librenms.conf Add the following config, edit ServerName as required: DocumentRoot /opt/librenms/html/ ServerName librenms.example.com AllowEncodedSlashes NoDecode Require all granted AllowOverride All Options FollowSymLinks MultiViews # Enable http authorization headers SetEnvIfNoCase ^Authorization$ \"(.+)\" HTTP_AUTHORIZATION=$1 SetHandler \"proxy:unix:/run/php-fpm-librenms.sock|fcgi://localhost\" NOTE: If this is the only site you are hosting on this server (it should be :)) then you will need to disable the default site. rm -f /etc/httpd/conf.d/welcome.conf systemctl enable --now httpd systemctl enable --now php-fpm NGINX vi /etc/nginx/sites-enabled/librenms.vhost Add the following config, edit server_name as required: server { listen 80 ; server_name librenms.example.com ; root /opt/librenms/html ; index index.php ; charset utf-8 ; gzip on ; gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon ; location / { try_files $uri $uri/ /index.php? $query_string ; } location ~ [^/]\\.php(/|$) { fastcgi_pass unix:/run/php-fpm-librenms.sock ; fastcgi_split_path_info ^(.+\\.php)(/.+) $ ; include fastcgi.conf ; } location ~ /\\.(?!well-known).* { deny all ; } } rm /etc/nginx/sites-enabled/default systemctl reload nginx systemctl restart php8.2-fpm SELinux Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 SELinux not enabled by default SELinux not enabled by default Install the policy tool for SELinux: dnf install policycoreutils-python-utils Configure the contexts needed by LibreNMS semanage fcontext -a -t httpd_sys_content_t '/opt/librenms/html(/.*)?' semanage fcontext -a -t httpd_sys_rw_content_t '/opt/librenms/(rrd|storage)(/.*)?' semanage fcontext -a -t httpd_log_t \"/opt/librenms/logs(/.*)?\" semanage fcontext -a -t bin_t '/opt/librenms/librenms-service.py' restorecon -RFvv /opt/librenms setsebool -P httpd_can_sendmail=1 setsebool -P httpd_execmem 1 chcon -t httpd_sys_rw_content_t /opt/librenms/.env Allow fping Create the file http_fping.tt with the following contents. You can create this file anywhere, as it is a throw-away file. The last step in this install procedure will install the module in the proper location. module http_fping 1.0; require { type httpd_t; class capability net_raw; class rawip_socket { getopt create setopt write read }; } #============= httpd_t ============== allow httpd_t self:capability net_raw; allow httpd_t self:rawip_socket { getopt create setopt write read }; Then run these commands checkmodule -M -m -o http_fping.mod http_fping.tt semodule_package -o http_fping.pp -m http_fping.mod semodule -i http_fping.pp Additional SELinux problems may be found by executing the following command audit2why < /var/log/audit/audit.log SELinux not enabled by default Allow access through firewall Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 Firewall not enabled by default Firewall not enabled by default firewall-cmd --zone public --add-service http --add-service https firewall-cmd --permanent --zone public --add-service http --add-service https Firewall not enabled by default Enable lnms command completion This feature grants you the opportunity to use tab for completion on lnms commands as you would for normal linux commands. ln -s /opt/librenms/lnms /usr/bin/lnms cp /opt/librenms/misc/lnms-completion.bash /etc/bash_completion.d/ Configure snmpd cp /opt/librenms/snmpd.conf.example /etc/snmp/snmpd.conf vi /etc/snmp/snmpd.conf Edit the text which says RANDOMSTRINGGOESHERE and set your own community string. curl -o /usr/bin/distro https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/distro chmod +x /usr/bin/distro systemctl enable snmpd systemctl restart snmpd Cron job cp /opt/librenms/dist/librenms.cron /etc/cron.d/librenms NOTE: Keep in mind that cron, by default, only uses a very limited set of environment variables. You may need to configure proxy variables for the cron invocation. Alternatively adding the proxy settings in config.php is possible too. The config.php file will be created in the upcoming steps. Review the following URL after you finished librenms install steps: https://docs.librenms.org//Support/Configuration/#proxy-support Enable the scheduler cp /opt/librenms/dist/librenms-scheduler.service /opt/librenms/dist/librenms-scheduler.timer /etc/systemd/system/ systemctl enable librenms-scheduler.timer systemctl start librenms-scheduler.timer Copy logrotate config LibreNMS keeps logs in /opt/librenms/logs . Over time these can become large and be rotated out. To rotate out the old logs you can use the provided logrotate config file: cp /opt/librenms/misc/librenms.logrotate /etc/logrotate.d/librenms Web installer Now head to the web installer and follow the on-screen instructions. http://librenms.example.com/install The web installer might prompt you to create a config.php file in your librenms install location manually, copying the content displayed on-screen to the file. If you have to do this, please remember to set the permissions on config.php after you copied the on-screen contents to the file. Run: chown librenms:librenms /opt/librenms/config.php Final steps That's it! You now should be able to log in to http://librenms.example.com/ . Please note that we have not covered HTTPS setup in this example, so your LibreNMS install is not secure by default. Please do not expose it to the public Internet unless you have configured HTTPS and taken appropriate web server hardening steps. Add the first device We now suggest that you add localhost as your first device from within the WebUI. Troubleshooting If you ever have issues with your install, run validate.php: sudo su - librenms ./validate.php There are various options for getting help listed on the LibreNMS web site: https://www.librenms.org/#support What next? Now that you've installed LibreNMS, we'd suggest that you have a read of a few other docs to get you going: Performance tuning Alerting Device Groups Auto discovery Closing We hope you enjoy using LibreNMS. If you do, it would be great if you would consider opting into the stats system we have, please see this page on what it is and how to enable it. If you would like to help make LibreNMS better there are many ways to help . You can also back LibreNMS on Open Collective .","title":"Installing LibreNMS"},{"location":"Installation/Install-LibreNMS/#install-librenms","text":"","title":"Install LibreNMS"},{"location":"Installation/Install-LibreNMS/#prepare-linux-server","text":"You should have an installed Linux server running one of the supported OS. Make sure you select your server's OS in the tabbed options below. Choice of web server is your preference, NGINX is recommended. Connect to the server command line and follow the instructions below. Note These instructions assume you are the root user. If you are not, prepend sudo to the shell commands (the ones that aren't at mysql> prompts) or temporarily become a user with root privileges with sudo -s or sudo -i . Please note the minimum supported PHP version is 8.1","title":"Prepare Linux Server"},{"location":"Installation/Install-LibreNMS/#install-required-packages","text":"Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 NGINX apt install acl curl fping git graphviz imagemagick mariadb-client mariadb-server mtr-tiny nginx-full nmap php-cli php-curl php-fpm php-gd php-gmp php-json php-mbstring php-mysql php-snmp php-xml php-zip rrdtool snmp snmpd unzip python3-pymysql python3-dotenv python3-redis python3-setuptools python3-systemd python3-pip whois traceroute NGINX Apache apt install software-properties-common add-apt-repository universe add-apt-repository ppa:ondrej/php apt update apt install acl curl fping git graphviz imagemagick mariadb-client mariadb-server mtr-tiny nginx-full nmap php-cli php-curl php-fpm php-gd php-gmp php-json php-mbstring php-mysql php-snmp php-xml php-zip rrdtool snmp snmpd unzip python3-pymysql python3-dotenv python3-redis python3-setuptools python3-systemd python3-pip whois traceroute apt install software-properties-common add-apt-repository universe add-apt-repository ppa:ondrej/php apt update apt install acl curl apache2 fping git graphviz imagemagick libapache2-mod-fcgid mariadb-client mariadb-server mtr-tiny nmap php-cli php-curl php-fpm php-gd php-gmp php-json php-mbstring php-mysql php-snmp php-xml php-zip rrdtool snmp snmpd whois python3-pymysql python3-dotenv python3-redis python3-setuptools python3-systemd python3-pip unzip traceroute NGINX Apache dnf -y install epel-release dnf -y install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-8.rpm dnf module reset php dnf module enable php:8.1 dnf install bash-completion cronie fping git ImageMagick mariadb-server mtr net-snmp net-snmp-utils nginx nmap php-fpm php-cli php-common php-curl php-gd php-gmp php-json php-mbstring php-process php-snmp php-xml php-zip php-mysqlnd python3 python3-PyMySQL python3-redis python3-memcached python3-pip python3-systemd rrdtool unzip dnf -y install epel-release dnf -y install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-8.rpm dnf module reset php dnf module enable php:remi-8.1 dnf install bash-completion cronie fping gcc git httpd ImageMagick mariadb-server mtr net-snmp net-snmp-utils nmap php-fpm php-cli php-common php-curl php-gd php-gmp php-json php-mbstring php-process php-snmp php-xml php-zip php-mysqlnd python3 python3-devel python3-PyMySQL python3-redis python3-memcached python3-pip python3-systemd rrdtool unzip NGINX apt install apt-transport-https lsb-release ca-certificates wget acl curl fping git graphviz imagemagick mariadb-client mariadb-server mtr-tiny nginx-full nmap php8.2-cli php8.2-curl php8.2-fpm php8.2-gd php8.2-gmp php8.2-mbstring php8.2-mysql php8.2-snmp php8.2-xml php8.2-zip python3-dotenv python3-pymysql python3-redis python3-setuptools python3-systemd python3-pip rrdtool snmp snmpd unzip whois","title":"Install Required Packages"},{"location":"Installation/Install-LibreNMS/#add-librenms-user","text":"useradd librenms -d /opt/librenms -M -r -s \"$(which bash)\"","title":"Add librenms user"},{"location":"Installation/Install-LibreNMS/#download-librenms","text":"cd /opt git clone https://github.com/librenms/librenms.git","title":"Download LibreNMS"},{"location":"Installation/Install-LibreNMS/#set-permissions","text":"chown -R librenms:librenms /opt/librenms chmod 771 /opt/librenms setfacl -d -m g::rwx /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache/ /opt/librenms/storage/ setfacl -R -m g::rwx /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache/ /opt/librenms/storage/","title":"Set permissions"},{"location":"Installation/Install-LibreNMS/#install-php-dependencies","text":"su - librenms ./scripts/composer_wrapper.php install --no-dev exit Sometimes when there is a proxy used to gain internet access, the above script may fail. The workaround is to install the composer package manually. For a global installation: wget https://getcomposer.org/composer-stable.phar mv composer-stable.phar /usr/bin/composer chmod +x /usr/bin/composer","title":"Install PHP dependencies"},{"location":"Installation/Install-LibreNMS/#set-timezone","text":"See https://php.net/manual/en/timezones.php for a list of supported timezones. Valid examples are: \"America/New_York\", \"Australia/Brisbane\", \"Etc/UTC\". Ensure date.timezone is set in php.ini to your preferred time zone. Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 vi /etc/php/8.1/fpm/php.ini vi /etc/php/8.1/cli/php.ini vi /etc/php/8.1/fpm/php.ini vi /etc/php/8.1/cli/php.ini vi /etc/php.ini vi /etc/php/8.2/fpm/php.ini vi /etc/php/8.2/cli/php.ini Remember to set the system timezone as well. timedatectl set-timezone Etc/UTC","title":"Set timezone"},{"location":"Installation/Install-LibreNMS/#configure-mariadb","text":"Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 vi /etc/mysql/mariadb.conf.d/50-server.cnf vi /etc/mysql/mariadb.conf.d/50-server.cnf vi /etc/my.cnf.d/mariadb-server.cnf vi /etc/mysql/mariadb.conf.d/50-server.cnf Within the [mysqld] section add: innodb_file_per_table=1 lower_case_table_names=0 Then restart MariaDB systemctl enable mariadb systemctl restart mariadb Start MariaDB client mysql -u root NOTE: Change the 'password' below to something secure. CREATE DATABASE librenms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ; CREATE USER 'librenms' @ 'localhost' IDENTIFIED BY 'password' ; GRANT ALL PRIVILEGES ON librenms . * TO 'librenms' @ 'localhost' ; exit","title":"Configure MariaDB"},{"location":"Installation/Install-LibreNMS/#configure-php-fpm","text":"Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/librenms.conf vi /etc/php/8.1/fpm/pool.d/librenms.conf cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/librenms.conf vi /etc/php/8.1/fpm/pool.d/librenms.conf cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/librenms.conf vi /etc/php-fpm.d/librenms.conf cp /etc/php/8.2/fpm/pool.d/www.conf /etc/php/8.2/fpm/pool.d/librenms.conf vi /etc/php/8.2/fpm/pool.d/librenms.conf Change [www] to [librenms] : [librenms] Change user and group to \"librenms\": user = librenms group = librenms Change listen to a unique path that must match your webserver's config ( fastcgi_pass for NGINX and SetHandler for Apache) : listen = /run/php-fpm-librenms.sock If there are no other PHP web applications on this server, you may remove www.conf to save some resources. Feel free to tune the performance settings in librenms.conf to meet your needs.","title":"Configure PHP-FPM"},{"location":"Installation/Install-LibreNMS/#configure-web-server","text":"Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 NGINX vi /etc/nginx/conf.d/librenms.conf Add the following config, edit server_name as required: server { listen 80 ; server_name librenms.example.com ; root /opt/librenms/html ; index index.php ; charset utf-8 ; gzip on ; gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon ; location / { try_files $uri $uri/ /index.php? $query_string ; } location ~ [^/]\\.php(/|$) { fastcgi_pass unix:/run/php-fpm-librenms.sock ; fastcgi_split_path_info ^(.+\\.php)(/.+) $ ; include fastcgi.conf ; } location ~ /\\.(?!well-known).* { deny all ; } } rm /etc/nginx/sites-enabled/default systemctl restart nginx systemctl restart php8.1-fpm NGINX Apache vi /etc/nginx/conf.d/librenms.conf Add the following config, edit server_name as required: server { listen 80 ; server_name librenms.example.com ; root /opt/librenms/html ; index index.php ; charset utf-8 ; gzip on ; gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon ; location / { try_files $uri $uri/ /index.php? $query_string ; } location ~ [^/]\\.php(/|$) { fastcgi_pass unix:/run/php-fpm-librenms.sock ; fastcgi_split_path_info ^(.+\\.php)(/.+) $ ; include fastcgi.conf ; } location ~ /\\.(?!well-known).* { deny all ; } } rm /etc/nginx/sites-enabled/default systemctl restart nginx systemctl restart php8.1-fpm vi /etc/apache2/sites-available/librenms.conf Add the following config, edit ServerName as required: DocumentRoot /opt/librenms/html/ ServerName librenms.example.com AllowEncodedSlashes NoDecode Require all granted AllowOverride All Options FollowSymLinks MultiViews # Enable http authorization headers SetEnvIfNoCase ^Authorization$ \"(.+)\" HTTP_AUTHORIZATION=$1 SetHandler \"proxy:unix:/run/php-fpm-librenms.sock|fcgi://localhost\" a2dissite 000 -default a2enmod proxy_fcgi setenvif rewrite a2ensite librenms.conf systemctl restart apache2 systemctl restart php8.1-fpm NGINX Apache vi /etc/nginx/conf.d/librenms.conf Add the following config, edit server_name as required: server { listen 80 ; server_name librenms.example.com ; root /opt/librenms/html ; index index.php ; charset utf-8 ; gzip on ; gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon ; location / { try_files $uri $uri/ /index.php? $query_string ; } location ~ [^/]\\.php(/|$) { fastcgi_pass unix:/run/php-fpm-librenms.sock ; fastcgi_split_path_info ^(.+\\.php)(/.+) $ ; include fastcgi.conf ; } location ~ /\\.(?!well-known).* { deny all ; } } NOTE: If this is the only site you are hosting on this server (it should be :)) then you will need to disable the default site. Delete the server section from /etc/nginx/nginx.conf systemctl enable --now nginx systemctl enable --now php-fpm Create the librenms.conf: vi /etc/httpd/conf.d/librenms.conf Add the following config, edit ServerName as required: DocumentRoot /opt/librenms/html/ ServerName librenms.example.com AllowEncodedSlashes NoDecode Require all granted AllowOverride All Options FollowSymLinks MultiViews # Enable http authorization headers SetEnvIfNoCase ^Authorization$ \"(.+)\" HTTP_AUTHORIZATION=$1 SetHandler \"proxy:unix:/run/php-fpm-librenms.sock|fcgi://localhost\" NOTE: If this is the only site you are hosting on this server (it should be :)) then you will need to disable the default site. rm -f /etc/httpd/conf.d/welcome.conf systemctl enable --now httpd systemctl enable --now php-fpm NGINX vi /etc/nginx/sites-enabled/librenms.vhost Add the following config, edit server_name as required: server { listen 80 ; server_name librenms.example.com ; root /opt/librenms/html ; index index.php ; charset utf-8 ; gzip on ; gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon ; location / { try_files $uri $uri/ /index.php? $query_string ; } location ~ [^/]\\.php(/|$) { fastcgi_pass unix:/run/php-fpm-librenms.sock ; fastcgi_split_path_info ^(.+\\.php)(/.+) $ ; include fastcgi.conf ; } location ~ /\\.(?!well-known).* { deny all ; } } rm /etc/nginx/sites-enabled/default systemctl reload nginx systemctl restart php8.2-fpm","title":"Configure Web Server"},{"location":"Installation/Install-LibreNMS/#selinux","text":"Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 SELinux not enabled by default SELinux not enabled by default Install the policy tool for SELinux: dnf install policycoreutils-python-utils","title":"SELinux"},{"location":"Installation/Install-LibreNMS/#allow-access-through-firewall","text":"Ubuntu 22.04 Ubuntu 20.04 CentOS 8 Debian 12 Firewall not enabled by default Firewall not enabled by default firewall-cmd --zone public --add-service http --add-service https firewall-cmd --permanent --zone public --add-service http --add-service https Firewall not enabled by default","title":"Allow access through firewall"},{"location":"Installation/Install-LibreNMS/#enable-lnms-command-completion","text":"This feature grants you the opportunity to use tab for completion on lnms commands as you would for normal linux commands. ln -s /opt/librenms/lnms /usr/bin/lnms cp /opt/librenms/misc/lnms-completion.bash /etc/bash_completion.d/","title":"Enable lnms command completion"},{"location":"Installation/Install-LibreNMS/#configure-snmpd","text":"cp /opt/librenms/snmpd.conf.example /etc/snmp/snmpd.conf vi /etc/snmp/snmpd.conf Edit the text which says RANDOMSTRINGGOESHERE and set your own community string. curl -o /usr/bin/distro https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/distro chmod +x /usr/bin/distro systemctl enable snmpd systemctl restart snmpd","title":"Configure snmpd"},{"location":"Installation/Install-LibreNMS/#cron-job","text":"cp /opt/librenms/dist/librenms.cron /etc/cron.d/librenms NOTE: Keep in mind that cron, by default, only uses a very limited set of environment variables. You may need to configure proxy variables for the cron invocation. Alternatively adding the proxy settings in config.php is possible too. The config.php file will be created in the upcoming steps. Review the following URL after you finished librenms install steps: https://docs.librenms.org//Support/Configuration/#proxy-support","title":"Cron job"},{"location":"Installation/Install-LibreNMS/#enable-the-scheduler","text":"cp /opt/librenms/dist/librenms-scheduler.service /opt/librenms/dist/librenms-scheduler.timer /etc/systemd/system/ systemctl enable librenms-scheduler.timer systemctl start librenms-scheduler.timer","title":"Enable the scheduler"},{"location":"Installation/Install-LibreNMS/#copy-logrotate-config","text":"LibreNMS keeps logs in /opt/librenms/logs . Over time these can become large and be rotated out. To rotate out the old logs you can use the provided logrotate config file: cp /opt/librenms/misc/librenms.logrotate /etc/logrotate.d/librenms","title":"Copy logrotate config"},{"location":"Installation/Install-LibreNMS/#web-installer","text":"Now head to the web installer and follow the on-screen instructions. http://librenms.example.com/install The web installer might prompt you to create a config.php file in your librenms install location manually, copying the content displayed on-screen to the file. If you have to do this, please remember to set the permissions on config.php after you copied the on-screen contents to the file. Run: chown librenms:librenms /opt/librenms/config.php","title":"Web installer"},{"location":"Installation/Install-LibreNMS/#final-steps","text":"That's it! You now should be able to log in to http://librenms.example.com/ . Please note that we have not covered HTTPS setup in this example, so your LibreNMS install is not secure by default. Please do not expose it to the public Internet unless you have configured HTTPS and taken appropriate web server hardening steps.","title":"Final steps"},{"location":"Installation/Install-LibreNMS/#add-the-first-device","text":"We now suggest that you add localhost as your first device from within the WebUI.","title":"Add the first device"},{"location":"Installation/Install-LibreNMS/#troubleshooting","text":"If you ever have issues with your install, run validate.php: sudo su - librenms ./validate.php There are various options for getting help listed on the LibreNMS web site: https://www.librenms.org/#support","title":"Troubleshooting"},{"location":"Installation/Install-LibreNMS/#what-next","text":"Now that you've installed LibreNMS, we'd suggest that you have a read of a few other docs to get you going: Performance tuning Alerting Device Groups Auto discovery","title":"What next?"},{"location":"Installation/Install-LibreNMS/#closing","text":"We hope you enjoy using LibreNMS. If you do, it would be great if you would consider opting into the stats system we have, please see this page on what it is and how to enable it. If you would like to help make LibreNMS better there are many ways to help . You can also back LibreNMS on Open Collective .","title":"Closing"},{"location":"Installation/Migrating-from-Observium/","text":"A LibreNMS user, Dan , has kindly provided full details and scripts to be able to migrate from Observium to LibreNMS. We have mirrored the scripts he's provided with consent, these are available in the scripts\\Migration folder of your installation.. Setup: First I had to lay out my script requirements: Build the RRD directories on LibreNMS Convert the RRD files on Observium to XML (x86 to x64 move) Copy the RRD/XML files to LibreNMS Convert the XML files back to RRD files Add the device to LibreNMS Script: There are two versions of the scripts available for you to download: - One converts the RRDs to XML and then back to RRD files when they hit the destination. This is a requirement if you are moving from x86 to x64. - Assuming you\u2019re moving servers that are on the same architecture, we can skip that step and just SCP the original RRD files. For everything to work as originally intended, you\u2019ll need four files. Put all four files on both servers, the scripts default to /tmp/ : nodelist.txt \u2013 this file contains the list of hosts you would like to move. This must match exactly to the hostname Observium uses mkdir.sh \u2013 this script creates the necessary directories on your LibreNMS server destwork.sh \u2013 depending on the version you choose, this script will add the device to LibreNMS and possibly convert from XML to RRD convert.sh \u2013 convert is the main script we\u2019ll be calling. All of the magic happens here. Feel free to crack open the scripts and modify them to suit you. Each file has a handful of variables you\u2019ll need to set for your conversion. They should be self-explanatory, but please leave a comment if you have trouble. Conversion: This section assumes the following: Root access is available on both servers You have SSH access to both servers All four files have been placed in the tmp directory of both servers I would strongly suggest you start with just one or two hosts and see how things work. For me, 10 standard sized devices took about 20 minutes with the RRD to XML conversion. Every environment will be different, so start slow and work your way up to full automation. SSH Keys First thing we will want to do is exchange SSH keys so that we can automate the login process used by the scripts. Perform these steps on your Observium server: ssh-keygen -t rsa Accept the defaults and enter a passphrase if you wish. Then: ssh-copy-id librenms Where librenms is the hostname or IP of your destination server. Nodelist.txt The nodelist.txt file contains a list of hosts we want to migrate from Observium. These names must match the name of the RRD folder on Observium. You can get those names by running the following \u2013 ls /opt/observium/rrd/ Also important, the nodelist.txt file must be on both your Observium and LibreNMS server . Once you have your list, edit nodelist.txt with nano: nano /tmp/nodelist.txt And replace the dummy data with the hosts you are converting. CTRL+X and then Y to save your modifications. Make the same changes on the LibreNMS server. Script Variables Now that we have nodelist.txt setup correctly, it is time to set the variables in all three shell scripts. We are going to start with convert.sh. Edit it with nano: nano /tmp/convert.sh and change the variables to suit your environment. Here is a quick list of them: DEST \u2013 This should be the IP or hostname of your LibreNMS server L_RRDPATH \u2013 This signifies the location of the LibreNMS RRD directory. The default value is the default install location O_RRDPATH \u2013 Location of the Observium RRD directory. The default value is the default install location MKDIR \u2013 Location of the mkdir.sh script DESTSCRIPT \u2013 Location of the destwork.sh script NODELIST \u2013 Location of the nodelist.txt file Next, edit the destwork.sh script: nano /tmp/destwork.sh","title":"Migrating from Observium"},{"location":"Installation/Migrating-from-Observium/#setup","text":"First I had to lay out my script requirements: Build the RRD directories on LibreNMS Convert the RRD files on Observium to XML (x86 to x64 move) Copy the RRD/XML files to LibreNMS Convert the XML files back to RRD files Add the device to LibreNMS","title":"Setup:"},{"location":"Installation/Migrating-from-Observium/#script","text":"There are two versions of the scripts available for you to download: - One converts the RRDs to XML and then back to RRD files when they hit the destination. This is a requirement if you are moving from x86 to x64. - Assuming you\u2019re moving servers that are on the same architecture, we can skip that step and just SCP the original RRD files. For everything to work as originally intended, you\u2019ll need four files. Put all four files on both servers, the scripts default to /tmp/ : nodelist.txt \u2013 this file contains the list of hosts you would like to move. This must match exactly to the hostname Observium uses mkdir.sh \u2013 this script creates the necessary directories on your LibreNMS server destwork.sh \u2013 depending on the version you choose, this script will add the device to LibreNMS and possibly convert from XML to RRD convert.sh \u2013 convert is the main script we\u2019ll be calling. All of the magic happens here. Feel free to crack open the scripts and modify them to suit you. Each file has a handful of variables you\u2019ll need to set for your conversion. They should be self-explanatory, but please leave a comment if you have trouble.","title":"Script:"},{"location":"Installation/Migrating-from-Observium/#conversion","text":"This section assumes the following: Root access is available on both servers You have SSH access to both servers All four files have been placed in the tmp directory of both servers I would strongly suggest you start with just one or two hosts and see how things work. For me, 10 standard sized devices took about 20 minutes with the RRD to XML conversion. Every environment will be different, so start slow and work your way up to full automation.","title":"Conversion:"},{"location":"Installation/Migrating-from-Observium/#ssh-keys","text":"First thing we will want to do is exchange SSH keys so that we can automate the login process used by the scripts. Perform these steps on your Observium server: ssh-keygen -t rsa Accept the defaults and enter a passphrase if you wish. Then: ssh-copy-id librenms Where librenms is the hostname or IP of your destination server.","title":"SSH Keys"},{"location":"Installation/Migrating-from-Observium/#nodelisttxt","text":"The nodelist.txt file contains a list of hosts we want to migrate from Observium. These names must match the name of the RRD folder on Observium. You can get those names by running the following \u2013 ls /opt/observium/rrd/ Also important, the nodelist.txt file must be on both your Observium and LibreNMS server . Once you have your list, edit nodelist.txt with nano: nano /tmp/nodelist.txt And replace the dummy data with the hosts you are converting. CTRL+X and then Y to save your modifications. Make the same changes on the LibreNMS server.","title":"Nodelist.txt"},{"location":"Installation/Migrating-from-Observium/#script-variables","text":"Now that we have nodelist.txt setup correctly, it is time to set the variables in all three shell scripts. We are going to start with convert.sh. Edit it with nano: nano /tmp/convert.sh and change the variables to suit your environment. Here is a quick list of them: DEST \u2013 This should be the IP or hostname of your LibreNMS server L_RRDPATH \u2013 This signifies the location of the LibreNMS RRD directory. The default value is the default install location O_RRDPATH \u2013 Location of the Observium RRD directory. The default value is the default install location MKDIR \u2013 Location of the mkdir.sh script DESTSCRIPT \u2013 Location of the destwork.sh script NODELIST \u2013 Location of the nodelist.txt file Next, edit the destwork.sh script: nano /tmp/destwork.sh","title":"Script Variables"},{"location":"Support/","text":"How to get Help Browse through the navigation on the left Search in the upper right Check the frequently asked questions Additional Support We have a few methods for you to get in touch to ask for help. Community Forum Ask for Help Feature Requests Discord Active chat and discussion Bug Reports","title":"How to get help"},{"location":"Support/#how-to-get-help","text":"Browse through the navigation on the left Search in the upper right Check the frequently asked questions","title":"How to get Help"},{"location":"Support/#additional-support","text":"We have a few methods for you to get in touch to ask for help. Community Forum Ask for Help Feature Requests Discord Active chat and discussion Bug Reports","title":"Additional Support"},{"location":"Support/1-Minute-Polling/","text":"1-Minute Polling We now have support for polling data at intervals to fit your needs. Please be aware of the following: If you just want faster up/down alerts, Fast Ping is a much easier path to that goal. You must also change your cron entry for poller-wrapper.py for this to work (if you change from the default 300 seconds). Your polling MUST complete in the time you configure for the heartbeat step value. See /poller in your WebUI for your current value. This will only affect RRD files created from the moment you change your settings. This change will affect all data storage mechanisms such as MySQL, RRD and InfluxDB. If you decrease the values then please be aware of the increase in space use for MySQL and InfluxDB. It's highly recommended to configure some performance optimizations . Keep in mind that all your devices will write all graphs every minute to the disk and that every device has many graphs. The most important thing is probably the RRDCached configuration that can save a lot of write IOPS. To make the changes, please navigate to /settings/poller/rrdtool/ within your WebUI. Select RRDTool Setup and then update the two values for step and heartbeat intervals: Step is how often you want to insert data, so if you change to 1 minute polling then this should be 60. Heartbeat is how long to wait for data before registering a null value, i.e 120 seconds. Converting existing RRD files We provide a basic script to convert the default rrd files we generate to utilise your configured step and heartbeat values. Please do ensure that you backup your RRD files before running this just in case. The script runs on a per device basis or all devices at once. The rrd files must be accessible from the server you run this script from. ./scripts/rrdstep.php This will provide the help information. To run it for localhost just run: ./scripts/rrdstep.php -h localhost","title":"1 Minute Polling"},{"location":"Support/1-Minute-Polling/#1-minute-polling","text":"We now have support for polling data at intervals to fit your needs. Please be aware of the following: If you just want faster up/down alerts, Fast Ping is a much easier path to that goal. You must also change your cron entry for poller-wrapper.py for this to work (if you change from the default 300 seconds). Your polling MUST complete in the time you configure for the heartbeat step value. See /poller in your WebUI for your current value. This will only affect RRD files created from the moment you change your settings. This change will affect all data storage mechanisms such as MySQL, RRD and InfluxDB. If you decrease the values then please be aware of the increase in space use for MySQL and InfluxDB. It's highly recommended to configure some performance optimizations . Keep in mind that all your devices will write all graphs every minute to the disk and that every device has many graphs. The most important thing is probably the RRDCached configuration that can save a lot of write IOPS. To make the changes, please navigate to /settings/poller/rrdtool/ within your WebUI. Select RRDTool Setup and then update the two values for step and heartbeat intervals: Step is how often you want to insert data, so if you change to 1 minute polling then this should be 60. Heartbeat is how long to wait for data before registering a null value, i.e 120 seconds.","title":"1-Minute Polling"},{"location":"Support/1-Minute-Polling/#converting-existing-rrd-files","text":"We provide a basic script to convert the default rrd files we generate to utilise your configured step and heartbeat values. Please do ensure that you backup your RRD files before running this just in case. The script runs on a per device basis or all devices at once. The rrd files must be accessible from the server you run this script from. ./scripts/rrdstep.php This will provide the help information. To run it for localhost just run: ./scripts/rrdstep.php -h localhost","title":"Converting existing RRD files"},{"location":"Support/Adding-a-Device/","text":"Adding Device You have two options for adding a new device into LibreNMS. You can add a device via the cli or by using the WebUI . Via WebUI Using the web interface, go to Devices and click Add Device. Enter the details required for the device that you want to add and then click 'Add Host'. As an example, if your device is configured to use the community my_company using snmp v2c then you would enter: SNMP Port defaults to 161. By default Hostname will be used for polling data. If you want to get polling Device data via a specific IP-Address (e.g. Management IP) fill out the optional field Overwrite IP with it's IP-Address. Via CLI Using the command line via ssh you can add a new device by changing to the directory of your LibreNMS install and typing (be sure to put the correct details). ./lnms device:add yourhostname [ --v1 | --v2c ] [ -c yourSNMPcommunity ] You can use ./lnms device:add --help for a list of available options and defaults. As an example, if your device with the name mydevice.example.com is configured to use the community my_company using snmp v2c then you would enter: ./lnms device:add --v2c -c my_company mydevice.example.com Please note that if the community contains special characters such as $ then you will need to wrap it in ' . I.e: 'Pa$$w0rd' . Ping Only Device You can add ping only devices into LibreNMS through the WebUI or CLI. When adding the device switch the SNMP button to \"off\". Device will be added into LibreNMS as Ping Only Device and will show ICMP Response Graph. Hostname: IP address or DNS name. Hardware: Optional you can type in whatever you like. OS: Optional this will add the Device's OS Icon. Via CLI this is done with ./lnms device:add [-P|--ping-only] yourhostname A How-to video can be found here: How to add ping only devices Automatic Discovery and API If you would like to add devices automatically then you will probably want to read the Auto-discovery Setup guide. You may also want to add devices programmatically, if so, take a look at our API documentation","title":"Adding a device"},{"location":"Support/Adding-a-Device/#adding-device","text":"You have two options for adding a new device into LibreNMS. You can add a device via the cli or by using the WebUI .","title":"Adding Device"},{"location":"Support/Adding-a-Device/#via-webui","text":"Using the web interface, go to Devices and click Add Device. Enter the details required for the device that you want to add and then click 'Add Host'. As an example, if your device is configured to use the community my_company using snmp v2c then you would enter: SNMP Port defaults to 161. By default Hostname will be used for polling data. If you want to get polling Device data via a specific IP-Address (e.g. Management IP) fill out the optional field Overwrite IP with it's IP-Address.","title":"Via WebUI"},{"location":"Support/Adding-a-Device/#via-cli","text":"Using the command line via ssh you can add a new device by changing to the directory of your LibreNMS install and typing (be sure to put the correct details). ./lnms device:add yourhostname [ --v1 | --v2c ] [ -c yourSNMPcommunity ] You can use ./lnms device:add --help for a list of available options and defaults. As an example, if your device with the name mydevice.example.com is configured to use the community my_company using snmp v2c then you would enter: ./lnms device:add --v2c -c my_company mydevice.example.com Please note that if the community contains special characters such as $ then you will need to wrap it in ' . I.e: 'Pa$$w0rd' .","title":"Via CLI"},{"location":"Support/Adding-a-Device/#ping-only-device","text":"You can add ping only devices into LibreNMS through the WebUI or CLI. When adding the device switch the SNMP button to \"off\". Device will be added into LibreNMS as Ping Only Device and will show ICMP Response Graph. Hostname: IP address or DNS name. Hardware: Optional you can type in whatever you like. OS: Optional this will add the Device's OS Icon. Via CLI this is done with ./lnms device:add [-P|--ping-only] yourhostname A How-to video can be found here: How to add ping only devices","title":"Ping Only Device"},{"location":"Support/Adding-a-Device/#automatic-discovery-and-api","text":"If you would like to add devices automatically then you will probably want to read the Auto-discovery Setup guide. You may also want to add devices programmatically, if so, take a look at our API documentation","title":"Automatic Discovery and API"},{"location":"Support/Bare-Dashboard/","text":"Bare Dashboard Settings to assist with wall/monitor displays. Hide Menubar To hide Menubar e.g. for Monitoring TV Screens attach ?bare=yes on URL No Search Fields in Dashboard Widgets To hide Search Field in Dashboard Widgets take a look into Widget Settings.","title":"Bare Dashboard"},{"location":"Support/Bare-Dashboard/#bare-dashboard","text":"Settings to assist with wall/monitor displays.","title":"Bare Dashboard"},{"location":"Support/Bare-Dashboard/#hide-menubar","text":"To hide Menubar e.g. for Monitoring TV Screens attach ?bare=yes on URL","title":"Hide Menubar"},{"location":"Support/Bare-Dashboard/#no-search-fields-in-dashboard-widgets","text":"To hide Search Field in Dashboard Widgets take a look into Widget Settings.","title":"No Search Fields in Dashboard Widgets"},{"location":"Support/CLI-Tools/","text":"Command line tools Here's a brief list of command line tools, some might be missing. If you think something is missing, feel free to ask us or send a pull request :-) purge-ports.php This script provides CLI access to the \"delete port\" function of the WebUI. This might come in handy when trying to clean up old ports after large changes within the network or when hacking on the poller/discovery functions. LibreNMS Port purge tool -p port_id Purge single port by it's port-id -f file Purge a list of ports, read port-ids from _file_, one on each line A filename of - means reading from STDIN. Querying port IDs from the database One simple way to obtain port IDs is by querying the SQL database. If you wanted to query all deleted ports from the database, you could to this with the following query: echo 'SELECT port_id, hostname, ifDescr FROM ports, devices WHERE devices.device_id = ports.device_id AND deleted = 1' | mysql -h your_DB_server -u your_DB_user -p --skip-column-names your_DB_name When you are sure that the list of ports is correct and you want to delete all of them, you can write the list into a file and call purge-ports.php with that file as input: echo 'SELECT port_id FROM ports, devices WHERE devices.device_id = ports.device_id AND deleted = 1' | mysql -h your_DB_server -u your_DB_user -p --skip-column-names your_DB_name > ports_to_delete ./purge-port.php -f ports_to_delete","title":"CLI Scripts"},{"location":"Support/CLI-Tools/#command-line-tools","text":"Here's a brief list of command line tools, some might be missing. If you think something is missing, feel free to ask us or send a pull request :-)","title":"Command line tools"},{"location":"Support/CLI-Tools/#purge-portsphp","text":"This script provides CLI access to the \"delete port\" function of the WebUI. This might come in handy when trying to clean up old ports after large changes within the network or when hacking on the poller/discovery functions. LibreNMS Port purge tool -p port_id Purge single port by it's port-id -f file Purge a list of ports, read port-ids from _file_, one on each line A filename of - means reading from STDIN.","title":"purge-ports.php"},{"location":"Support/CLI-Tools/#querying-port-ids-from-the-database","text":"One simple way to obtain port IDs is by querying the SQL database. If you wanted to query all deleted ports from the database, you could to this with the following query: echo 'SELECT port_id, hostname, ifDescr FROM ports, devices WHERE devices.device_id = ports.device_id AND deleted = 1' | mysql -h your_DB_server -u your_DB_user -p --skip-column-names your_DB_name When you are sure that the list of ports is correct and you want to delete all of them, you can write the list into a file and call purge-ports.php with that file as input: echo 'SELECT port_id FROM ports, devices WHERE devices.device_id = ports.device_id AND deleted = 1' | mysql -h your_DB_server -u your_DB_user -p --skip-column-names your_DB_name > ports_to_delete ./purge-port.php -f ports_to_delete","title":"Querying port IDs from the database"},{"location":"Support/Cleanup-options/","text":"Cleanup Options As the number of devices starts to grow in your LibreNMS install, so will things such as the RRD files, MySQL database containing eventlogs, Syslogs and performance data etc. Your LibreNMS install could become quite large so it becomes necessary to clean up those entries. With Cleanup Options, you can stay in control. These options rely on daily.sh running from cron as per the installation instructions. system/cleanup lnms config:set eventlog_purge 30 lnms config:set syslog_purge 30 lnms config:set route_purge 10 lnms config:set alert_log_purge 365 lnms config:set authlog_purge 30 lnms config:set ports_fdb_purge 10 lnms config:set ports_nac_purge 10 lnms config:set device_perf_purge 7 lnms config:set rrd_purge 0 lnms config:set ports_purge true These options will ensure data within LibreNMS over X days old is automatically purged. You can alter these individually, values are in days. NOTE : Please be aware that rrd_purge is NOT set by default. This option will remove any RRD files that have not been updated for the set amount of days automatically - only enable this if you are comfortable with that happening. (All active RRD files are updated every polling period.) Ports Purge Over time as you add devices some interfaces will need to be purged as they are set to be ignored or bad interfaces or marked as deleted. You can purge all deleted ports from the WebUI (see below) or by setting lnms config:set ports_purge true . In the Web UI Under the Ports Tab in the Nav Bar, Click on \"Deleted\" then click on \"Purge all deleted\". This will purge all the ports.","title":"Cleanup Options"},{"location":"Support/Cleanup-options/#cleanup-options","text":"As the number of devices starts to grow in your LibreNMS install, so will things such as the RRD files, MySQL database containing eventlogs, Syslogs and performance data etc. Your LibreNMS install could become quite large so it becomes necessary to clean up those entries. With Cleanup Options, you can stay in control. These options rely on daily.sh running from cron as per the installation instructions. system/cleanup lnms config:set eventlog_purge 30 lnms config:set syslog_purge 30 lnms config:set route_purge 10 lnms config:set alert_log_purge 365 lnms config:set authlog_purge 30 lnms config:set ports_fdb_purge 10 lnms config:set ports_nac_purge 10 lnms config:set device_perf_purge 7 lnms config:set rrd_purge 0 lnms config:set ports_purge true These options will ensure data within LibreNMS over X days old is automatically purged. You can alter these individually, values are in days. NOTE : Please be aware that rrd_purge is NOT set by default. This option will remove any RRD files that have not been updated for the set amount of days automatically - only enable this if you are comfortable with that happening. (All active RRD files are updated every polling period.)","title":"Cleanup Options"},{"location":"Support/Cleanup-options/#ports-purge","text":"Over time as you add devices some interfaces will need to be purged as they are set to be ignored or bad interfaces or marked as deleted. You can purge all deleted ports from the WebUI (see below) or by setting lnms config:set ports_purge true . In the Web UI Under the Ports Tab in the Nav Bar, Click on \"Deleted\" then click on \"Purge all deleted\". This will purge all the ports.","title":"Ports Purge"},{"location":"Support/Configuration/","text":"Configuration Docs LibreNMS configuration is a set of key values. The config is stored in two places: Database: This applies to all pollers and can be set with either lnms config:set or in the Web UI. Database config takes precedence over config.php. config.php: This applies to the local poller only. Configs set here will be disabled in the Web UI to prevent unexpected behaviour. The LibreNMS uses dot notation for config items: Database config.php snmp.community $config['snmp']['community'] snmp.community.+ $config['snmp']['community'][] snmp.v3.0.authalgo $config['snmp']['v3'][0]['authalgo'] The documentation has not been updated to reflect using lnms config:set to set config items, but it will work for all settings. Not all settings have been defined in LibreNMS, but they can still be set with the --ignore-checks option. Without that option input is checked for correctness, that does not mean it is not possible to set bad values. Please report missing settings. CLI lnms config:get will fetch the current config settings (composite of database, config.php, and defaults). lnms config:set will set the config setting in the database. Calling lnms config:set on a setting with no value will reset it to the default value. If you set up bash completion, you can use tab completion to find config settings. Getting a list of all current values To get a complete list of all the current values, you can use the command lnms config:get --dump . The output may not be desirable, so you can use the jq package to pretty print it. Then it would be lnms config:get --dump | jq . Example output: librenms@librenms:~$ lnms config:get --dump | jq { \"install_dir\": \"/opt/librenms\", \"active_directory\": { \"users_purge\": 0 }, \"addhost_alwayscheckip\": false, \"alert\": { \"ack_until_clear\": false, \"admins\": true, \"default_copy\": true, \"default_if_none\": false, \"default_mail\": false, \"default_only\": true, \"disable\": false, \"fixed-contacts\": true, \"globals\": true, \"syscontact\": true, \"transports\": { \"mail\": 5 }, \"tolerance_window\": 5, \"users\": false, ... Examples lnms config:get snmp.community [ \"public\" ] lnms config:set snmp.community.+ testing lnms config:get snmp.community [ \"public\" , \"testing\" ] lnms config:set snmp.community.0 private lnms config:get snmp.community [ \"private\" , \"testing\" ] lnms config:set snmp.community test Invalid format lnms config:set snmp.community '[\"test\", \"othercommunity\"]' lnms config:get snmp.community [ \"test\" , \"othercommunity\" ] lnms config:set snmp.community Reset snmp.community to the default? ( yes/no ) [ no ] : > yes lnms config:get snmp.community [ \"public\" ] Pre-load configuration This feature is primarily for docker images and other automation. When installing LibreNMS for the first time with a new database you can place yaml key value files in database/seeders/config to pre-populate the config database. Example snmp.yaml snmp.community : - public - private snmp.max_repeaters : 30 Directories lnms config:set temp_dir /tmp The temporary directory is where images and other temporary files are created on your filesystem. lnms config:set log_dir /opt/librenms/logs Log files created by LibreNMS will be stored within this directory. Database config Set these variables either in .env (/opt/librenms/.env by default) or in the environment. DB_HOST=127.0.0.1 DB_DATABASE=librenms DB_USERNAME=DBUSER DB_PASSWORD=\"DBPASS\" Use non-standard port: DB_PORT=3306 Use a unix socket: DB_SOCKET=/run/mysqld/mysqld.sock Core PHP Settings You can change the memory limits for php within config.php . The value is in Megabytes and should just be an int value: lnms config:set php_memory_limit 128 Programs A lot of these are self explanatory so no further information may be provided. Any extensions that have dedicated documentation page will be linked to rather than having the config provided. RRDTool You can configure these options within the WebUI now, please avoid setting these options within config.php Settings -> External Settings -> RRDTool Setup external/binaries lnms config:set rrdtool /usr/bin/rrdtool Please see 1 Minute polling for information on configuring your install to record data more frequently. fping external/binaries lnms config:set fping /usr/bin/fping lnms config:set fping6 fping6 poller/ping lnms config:set fping_options.timeout 500 lnms config:set fping_options.count 3 lnms config:set fping_options.interval 500 lnms config:set fping_options.tos 184 fping configuration options: timeout ( fping parameter -t ): Amount of time that fping waits for a response to its first request (in milliseconds). See note below count ( fping parameter -c ): Number of request packets to send to each target. interval ( fping parameter -p ): Time in milliseconds that fping waits between successive packets to an individual target. tos ( fping parameter -O ): Set the type of service flag (TOS). Value can be either decimal or hexadecimal (0xh) format. Can be used to ensure that ping packets are queued in following QOS mecanisms in the network. Table is accessible in the TOS Wikipedia page . NOTE: Setting a higher timeout value than the interval value can lead to slowing down poller. Example: timeout: 3000 count: 3 interval: 500 In this example, interval will be overwritten by the timeout value of 3000 which is 3 seconds. As we send three icmp packets (count: 3), each one is delayed by 3 seconds which will result in fping taking > 6 seconds to return results. You can disable the fping / icmp check that is done for a device to be determined to be up on a global or per device basis. We don't advise disabling the fping / icmp check unless you know the impact, at worst if you have a large number of devices down then it's possible that the poller would no longer complete in 5 minutes due to waiting for snmp to timeout. Globally disable fping / icmp check: lnms config:set icmp_check false If you would like to do this on a per device basis then you can do so under Device -> Edit -> Misc -> Disable ICMP Test? On traceroute LibreNMS uses traceroute to record debug information when a device is down due to icmp AND you have lnms config:set debug.run_trace true set. external/binaries lnms config:set traceroute /usr/bin/traceroute SNMP SNMP program locations. external/binaries lnms config:set snmpwalk /usr/bin/snmpwalk lnms config:set snmpget /usr/bin/snmpget lnms config:set snmpbulkwalk /usr/bin/snmpbulkwalk lnms config:set snmpgetnext /usr/bin/snmpgetnext lnms config:set snmptranslate /usr/bin/snmptranslate Misc binaries external/binaries lnms config:set whois /usr/bin/whois lnms config:set ping /bin/ping lnms config:set mtr /usr/bin/mtr lnms config:set nmap /usr/bin/nmap lnms config:set nagios_plugins /usr/lib/nagios/plugins lnms config:set ipmitool /usr/bin/ipmitool lnms config:set virsh /usr/bin/virsh lnms config:set dot /usr/bin/dot lnms config:set sfdp /usr/bin/sfdp Authentication Generic Authentication settings. Password minimum length for auth that allows user creation lnms config:set password.min_length 8 Proxy support For alerting and the callback functionality, we support the use of a http proxy setting. These can be any one of the following: system/proxy lnms config:set callback_proxy proxy.domain.com lnms config:set http_proxy proxy.domain.com We can also make use of one of these environment variables which can be set in /etc/environment : http_proxy = proxy.domain.com https_proxy = proxy.domain.com RRDCached Please refer to RRDCached WebUI Settings lnms config:set base_url http://demo.librenms.org LibreNMS will attempt to detect the URL you are using but you can override that here. webui/style lnms config:set site_style light Currently we have a number of styles which can be set which will alter the navigation bar look. dark, light and mono with light being the default. lnms config:set webui.custom_css.+ css/custom/styles.css You can override a large number of visual elements by creating your own css stylesheet and referencing it here, place any custom css files into html/css/custom so they will be ignored by auto updates. You can specify as many css files as you like, the order they are within your config will be the order they are loaded in the browser. webui/style lnms config:set title_image images/custom/yourlogo.png You can override the default logo with yours, place any custom images files into html/images/custom so they will be ignored by auto updates. lnms config:set page_refresh 300 Set how often pages are refreshed in seconds. The default is every 5 minutes. Some pages don't refresh at all by design. lnms config:set front_page default You can create your own front page by adding a blade file in resources/views/overview/custom/ and setting front_page to it's name. For example, if you create resources/views/overview/custom/foobar.blade.php , set front_page to foobar . webui/dashboard lnms config:set webui.default_dashboard_id 0 Allows the specification of a global default dashboard page for any user who has not set one in their user preferences. Should be set to dashboard_id of an existing dashboard that is shared or shared(read). Otherwise, the system will automatically create each user an empty dashboard called Default on their first login. lnms config:set login_message \"Unauthorised access or use shall render the user liable to criminal and/or civil prosecution.\" This is the default message on the login page displayed to users. lnms config:set public_status true If this is set to true then an overview will be shown on the login page of devices and the status. lnms config:set show_locations true # Enable Locations on menu lnms config:set show_locations_dropdown true # Enable Locations dropdown on menu lnms config:set show_services false # Disable Services on menu lnms config:set int_customers true # Enable Customer Port Parsing lnms config:set summary_errors false # Show Errored ports in summary boxes on the dashboard lnms config:set customers_descr '[\"cust\"]' # The description to look for in ifDescr. Can have multiple '[\"cust\",\"cid\"]' lnms config:set transit_descr '[\"transit\"]' # Add custom transit descriptions (array) lnms config:set peering_descr '[\"peering\"]' # Add custom peering descriptions (array) lnms config:set core_descr '[\"core\"]' # Add custom core descriptions (array) lnms config:set custom_descr '[\"This is Custom\"]' # Add custom interface descriptions (array) lnms config:set int_transit true # Enable Transit Types lnms config:set int_peering true # Enable Peering Types lnms config:set int_core true # Enable Core Port Types lnms config:set int_l2tp false # Disable L2TP Port Types Enable / disable certain menus from being shown in the WebUI. You are able to adjust the number and time frames of the quick select time options for graphs and the mini graphs shown per row. Quick select: lnms config:set graphs.mini.normal '{ \"day\": \"24 Hours\", \"week\": \"One Week\", \"month\": \"One Month\", \"year\": \"One Year\" }' lnms config:set graphs.mini.widescreen '{ \"sixhour\": \"6 Hours\", \"day\": \"24 Hours\", \"twoday\": \"48 Hours\", \"week\": \"One Week\", \"twoweek\": \"Two Weeks\", \"month\": \"One Month\", \"twomonth\": \"Two Months\", \"year\": \"One Year\", \"twoyear\": \"Two Years\" }' Mini graphs: lnms config:set graphs.row.normal '{ \"sixhour\": \"6 Hours\", \"day\": \"24 Hours\", \"twoday\": \"48 Hours\", \"week\": \"One Week\", \"twoweek\": \"Two Weeks\", \"month\": \"One Month\", \"twomonth\": \"Two Months\", \"year\": \"One Year\", \"twoyear\": \"Two Years\" }' lnms config:set web_mouseover true You can disable the mouseover popover for mini graphs by setting this to false. lnms config:set enable_lazy_load true You can disable image lazy loading by setting this to false. lnms config:set overview_show_sysDescr true Enable or disable the sysDescr output for a device. webui/device lnms config:set device_display_default '{{ $hostname }}' This is a simple template to control the display of device names by default. You can override this setting per-device. You may enter any free-form text including one or more of the following template replacements: Template Replacement {{ $hostname }} The hostname or IP of the device that was set when added *default {{ $sysName_fallback }} The hostname or sysName if hostname is an IP {{ $sysName }} The SNMP sysName of the device, falls back to hostname/IP if missing {{ $ip }} The actual polled IP of the device, will not display a hostname For example, {{ $sysName_fallback }} ({{ $ip }}) will display something like server (192.168.1.1) lnms config:set device_traffic_iftype.+ '/loopback/' Interface types that aren't graphed in the WebUI. The default array contains more items, please see misc/config_definitions.json for the full list. lnms config:set enable_clear_discovery true Administrators are able to clear the last discovered time of a device which will force a full discovery run within the configured 5 minute cron window. lnms config:set enable_footer true Disable the footer of the WebUI by setting enable_footer to 0. You can enable the old style network map (only available for individual devices with links discovered via xDP) by setting: lnms config:set gui.network-map.style old lnms config:set percentile_value 90 Show the X th percentile in the graph instead of the default 95th percentile. webui/graph lnms config:set shorthost_target_length 15 The target maximum hostname length when applying the shorthost() function. You can increase this if you want to try and fit more of the hostname in graph titles. The default value is 12 However, this can possibly break graph generation if this is very long. You can enable dynamic graphs within the WebUI under Global Settings -> Webui Settings -> Graph Settings. Graphs will be movable/scalable without reloading the page: Stacked Graphs You can enable stacked graphs instead of the default inverted graphs. Enabling them is possible via webui Global Settings -> Webui Settings -> Graph settings -> Use stacked graphs Add host settings The following setting controls how hosts are added. If a host is added as an ip address it is checked to ensure the ip is not already present. If the ip is present the host is not added. If host is added by hostname this check is not performed. If the setting is true hostnames are resolved and the check is also performed. This helps prevents accidental duplicate hosts. lnms config:set addhost_alwayscheckip false # true - check for duplicate ips even when adding host by name. # false- only check when adding host by ip. By default we allow hosts to be added with duplicate sysName's, you can disable this with the following config: discovery/general lnms config:set allow_duplicate_sysName false Global poller and discovery modules Enable or disable discovery or poller modules. This setting has an order of precedence Device > OS > Global. So if the module is set at a more specific level, it will override the less specific settings. Global: lnms config:set discovery_modules.arp-table false lnms config:set discovery_modules.entity-state true lnms config:set poller_modules.entity-state true Per OS: lnms config:set os.ios.discovery_modules.arp-table false lnms config:set os.ios.discovery_modules.entity-state true lnms config:set os.ios.poller_modules.entity-state true SNMP Settings Default SNMP options including retry and timeout settings and also default version and port. poller/snmp lnms config:set snmp.timeout 1 # timeout in seconds lnms config:set snmp.retries 5 # how many times to retry the query lnms config:set snmp.transports '[\"udp\", \"udp6\", \"tcp\", \"tcp6\"]' # Transports to use lnms config:set snmp.version '[\"v2c\", \"v3\", \"v1\"]' # Default versions to use lnms config:set snmp.port 161 # Default port lnms config:set snmp.exec_timeout 1200 # execution time limit in seconds NOTE: timeout is the time to wait for an answer and exec_timeout is the max time to run a query. The default v1/v2c snmp community to use, you can expand this array with [1] , [2] , [3] , etc. poller/snmp lnms config:set snmp.community.0 public NOTE: This list of SNMP communities is used for auto discovery, and as a default set for any manually added device. The default v3 snmp details to use, you can expand this array with [1] , [2] , [3] , etc. poller/snmp lnms config:set snmp.v3.0 '{ authlevel: \"noAuthNoPriv\", authname: \"root\", authpass: \"\", authalgo: \"MD5\", cryptopass: \"\", cryptoalgo: \"AES\" }' authlevel noAuthNoPriv | authNoPriv | authPriv authname User Name (required even for noAuthNoPriv) authpass Auth Passphrase authalgo MD5 | SHA | SHA-224 | SHA-256 | SHA-384 | SHA-512 cryptopass Privacy (Encryption) Passphrase cryptoalgo AES | AES-192 | AES-256 | AES-256-C | DES Auto discovery settings Please refer to Auto-Discovery Email configuration You can configure these options within the WebUI now, please avoid setting these options within config.php alerting/email lnms config:set email_backend mail lnms config:set email_from librenms@yourdomain.local lnms config:set email_user ` lnms config:get project_id ` lnms config:set email_sendmail_path /usr/sbin/sendmail lnms config:set email_smtp_host localhost lnms config:set email_smtp_port 25 lnms config:set email_smtp_timeout 10 lnms config:set email_smtp_secure tls lnms config:set email_smtp_auth false lnms config:set email_smtp_username NULL lnms config:set email_smtp_password NULL What type of mail transport to use for delivering emails. Valid options for email_backend are mail, sendmail or smtp. The varying options after that are to support the different transports. Alerting Please refer to Alerting Billing Please refer to Billing Global module support lnms config:set enable_syslog false # Enable Syslog lnms config:set enable_inventory true # Enable Inventory lnms config:set enable_pseudowires true # Enable Pseudowires lnms config:set enable_vrfs true # Enable VRFs Port extensions Please refer to Port-Description-Parser lnms config:set enable_ports_etherlike false lnms config:set enable_ports_junoseatmvp false lnms config:set enable_ports_poe false Enable / disable additional port statistics. Port Group Assign a new discovered Port automatically to Port Group with this Port Group ID (0 means no Port Group assignment) discovery/networks lnms config:set default_port_group 0 External integration Rancid lnms config:set rancid_configs.+ /var/lib/rancid/network/configs/ lnms config:set rancid_repo_type svn lnms config:set rancid_ignorecomments false Rancid configuration, rancid_configs is an array containing all of the locations of your rancid files. Setting rancid_ignorecomments will disable showing lines that start with # Oxidized Please refer to Oxidized CollectD lnms config:set collectd_dir /var/lib/collectd/rrd Specify the location of the collectd rrd files. Note that the location in config.php should be consistent with the location set in /etc/collectd.conf and etc/collectd.d/rrdtool.conf DataDir \"/var/lib/collectd/rrd\" CreateFilesAsync false CacheTimeout 120 CacheFlush 900 WritesPerSecond 50 /etc/collectd.conf LoadPlugin rrdtool DataDir \"/var/lib/collectd/rrd\" CacheTimeout 120 CacheFlush 900 /etc/collectd.d/rrdtool.conf lnms config:set collectd_sock unix:///var/run/collectd.sock Specify the location of the collectd unix socket. Using a socket allows the collectd graphs to be flushed to disk before being drawn. Be sure that your web server has permissions to write to this socket. Smokeping Please refer to Smokeping NFSen Please refer to NFSen Location parsing LibreNMS can interpret sysLocation information and map the device loction based on GeoCoordinates or GeoCoding information. Info-keywords [] contains optional Latitude and Longitude information if manual GeoCoordinate positioning is desired. () contains optional information that is ignored during GeoCoding lookups. GeoCoordinates If device sysLocation information contains [lat, lng] (note the comma and square brackets), that is used to determin the GeoCoordinates. Example: name_that_can_not_be_looked_up [ 40 .424521, -86.912755 ] GeoCoding Next it will attempt to look up the sysLocation with a map engine provided you have configured one under $config['geoloc']['engine']. The information has to be accurate or no result is returned, when it does it will ignore any information inside parentheses, allowing you to add details that would otherwise interfeeer with the lookup. Example: 1100 Congress Ave, Austin, TX 78701 ( 3rd floor ) Geocoding lookup is: 1100 Congress Ave, Austin, TX 78701 Overrides You can overwrite each device sysLocation information in the webGUI under \"Device settings\". You can overwrite the location coordinates n in the webGUI under Device>GEO Locations Location mapping If you just want to set GPS coordinates on a location, you should visit Devices > Geo Locations > All Locations and edit the coordinates there. Exact Matching: lnms config:set location_map '{\"Under the Sink\": \"Under The Sink, The Office, London, UK\"}' Regex Matching: lnms config:set location_map_regex '{\"/Sink/\": \"Under The Sink, The Office, London, UK\"}' Regex Match Substitution: lnms config:set location_map_regex_sub '{\"/Sink/\": \"Under The Sink, The Office, London, UK [lat, long]\"}' If you have an SNMP SysLocation of \"Rack10,Rm-314,Sink\", Regex Match Substition yields \"Rack10,Rm-314,Under The Sink, The Office, London, UK [lat, long]\". This allows you to keep the SysLocation string short and keeps Rack/Room/Building information intact after the substitution. The above are examples, these will rewrite device snmp locations so you don't need to configure full location within snmp. Interfaces to be ignored Interfaces can be automatically ignored during discovery by modifying bad_if* entries in a default array, unsetting a default array and customizing it, or creating an OS specific array. The preferred method for ignoring interfaces is to use an OS specific array. The default arrays can be found in misc/config_definitions.json. OS specific definitions (includes/definitions/_specific_os_.yaml) can contain bad_if* arrays, but should only be modified via pull-request as manipulation of the definition files will block updating: Examples: Add entries to default arrays lnms config:set bad_if.+ voip-null lnms config:set bad_iftype.+ voiceEncap lnms config:set bad_if_regexp.+ '/^lo[0-9].*/' # loopback Override default bad_if values lnms config:set bad_if '[\"voip-null\", \"voiceEncap\", \"voiceFXO\"]' Create an OS specific array lnms config:set os.iosxe.bad_iftype.+ macSecControlledIF lnms config:set os.iosxe.bad_iftype.+ macSecUncontrolledIF Various bad_if* selection options available bad_if is matched against the ifDescr value. bad_iftype is matched against the ifType value. bad_if_regexp is matched against the ifDescr value as a regular expression. bad_ifname_regexp is matched against the ifName value as a regular expression. bad_ifalias_regexp is matched against the ifAlias value as a regular expression. Interfaces that shouldn't be ignored Examples: lnms config:set good_if.+ FastEthernet lnms config:set os.ios.good_if.+ FastEthernet good_if is matched against ifDescr value. This can be a bad_if value as well which would stop that port from being ignored. i.e. if bad_if and good_if both contained FastEthernet then ports with this value in the ifDescr will be valid. Interfaces to be rewritten lnms config:set rewrite_if '{\"cpu\": \"Management Interface\"}' lnms config:set rewrite_if_regexp '{\"/cpu /\": \"Management \"}' Entries defined in rewrite_if are being replaced completely. Entries defined in rewrite_if_regexp only replace the match. Matches are compared case-insensitive. Entity sensors to be ignored Some devices register bogus sensors as they are returned via SNMP but either don't exist or just don't return data. This allows you to ignore those based on the descr field in the database. You can either ignore globally or on a per os basis. lnms config:set bad_entity_sensor_regex.+ '/Physical id [0-9]+/' lnms config:set os.ios.bad_entity_sensor_regex '[\"/Physical id [0-9]+/\"]' Entity sensors limit values Vendors may give some limit values (or thresholds) for the discovered sensors. By default, when no such value is given, both high and low limit values are guessed, based on the value measured during the initial discovery. When it is preferred to have no high and/or low limit values at all if these are not provided by the vendor, the guess method can be disabled: lnms config:set sensors.guess_limits false Ignoring Health Sensors It is possible to filter some sensors from the configuration: Ignore all temperature sensors lnms config:set disabled_sensors.current true Filter all sensors matching regexp '/PEM Iout/' . lnms config:set disabled_sensors_regex.+ '/PEM Iout/' Filter all 'current' sensors for Operating System 'vrp'. lnms config:set os.vrp.disabled_sensors.current true Filter all sensors matching regexp '/PEM Iout/' for Operating System iosxe. lnms config:set os.iosxe.disabled_sensors_regex '/PEM Iout/' Storage configuration Mounted storage / mount points to ignore in discovery and polling. discovery/storage ```bash lnms config:set ignore_mount_removable true lnms config:set ignore_mount_network true lnms config:set ignore_mount_optical true lnms config:set ignore_mount.+ /kern lnms config:set ignore_mount.+ /mnt/cdrom lnms config:set ignore_mount.+ /proc lnms config:set ignore_mount.+ /dev lnms config:set ignore_mount_string.+ packages lnms config:set ignore_mount_string.+ devfs lnms config:set ignore_mount_string.+ procfs lnms config:set ignore_mount_string.+ UMA lnms config:set ignore_mount_string.+ MALLOC lnms config:set ignore_mount_regexp.+ '/on: \\/packages/' lnms config:set ignore_mount_regexp.+ '/on: \\/dev/' lnms config:set ignore_mount_regexp.+ '/on: \\/proc/' lnms config:set ignore_mount_regexp.+ '/on: \\/junos^/' lnms config:set ignore_mount_regexp.+ '/on: \\/junos\\/dev/' lnms config:set ignore_mount_regexp.+ '/on: \\/jail\\/dev/' lnms config:set ignore_mount_regexp.+ '/^(dev|proc)fs/' lnms config:set ignore_mount_regexp.+ '/^\\/dev\\/md0/' lnms config:set ignore_mount_regexp.+ '/^\\/var\\/dhcpd\\/dev,/' lnms config:set ignore_mount_regexp.+ '/UMA/' ``` Custom storage warning percentage lnms config:set storage_perc_warn 60 IRC Bot Please refer to IRC Bot Authentication Please refer to Authentication Cleanup options Please refer to Cleanup Options Syslog options Please refer to Syslog Virtualization lnms config:set enable_libvirt true lnms config:set libvirt_protocols '[\"qemu+ssh\",\"xen+ssh\"]' lnms config:set libvirt_username root Enable this to switch on support for libvirt along with libvirt_protocols to indicate how you connect to libvirt. You also need to: Generate a non-password-protected ssh key for use by LibreNMS, as the user which runs polling & discovery (usually librenms ). On each VM host you wish to monitor: Configure public key authentication from your LibreNMS server/poller by adding the librenms public key to ~root/.ssh/authorized_keys . (xen+ssh only) Enable libvirtd to gather data from xend by setting (xend-unix-server yes) in /etc/xen/xend-config.sxp and restarting xend and libvirtd. To test your setup, run virsh -c qemu+ssh://vmhost/system list or virsh -c xen+ssh://vmhost list as your librenms polling user. BGP Support lnms config:set astext.65332 \"Cymru FullBogon Feed\" You can use this array to rewrite the description of ASes that you have discovered. Auto updates Please refer to Updating IPMI Setup the types of IPMI protocols to test a host for and in what order. Don't forget to install ipmitool on the monitoring host. lnms config:set ipmi.type '[\"lanplus\", \"lan\", \"imb\", \"open\"]' Distributed poller settings Please refer to Distributed Poller API Settings CORS Support https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS CORS support for the API is disabled by default. Below you will find the standard options, all of which you can configure. lnms config:set api.cors.enabled false lnms config:set api.cors.origin '[\"*\"]' lnms config:set api.cors.maxage '86400' lnms config:set api.cors.allowmethods '[\"POST\", \"GET\", \"PUT\", \"DELETE\", \"PATCH\"]' lnms config:set api.cors.allowheaders '[\"Origin\", \"X-Requested-With\", \"Content-Type\", \"Accept\", \"X-Auth-Token\"]' lnms config:set api.cors.exposeheaders '[\"Cache-Control\", \"Content-Language\", \"Content-Type\", \"Expires\", \"Last-Modified\", \"Pragma\"]' lnms config:set api.cors.allowmethods '[\"POST\", \"GET\", \"PUT\", \"DELETE\", \"PATCH\"]' lnms config:set api.cors.allowheaders '[\"Origin\", \"X-Requested-With\", \"Content-Type\", \"Accept\", \"X-Auth-Token\"]' lnms config:set api.cors.exposeheaders '[\"Cache-Control\", \"Content-Language\", \"Content-Type\", \"Expires\", \"Last-Modified\", \"Pragma\"]' lnms config:set api.cors.allowcredentials false","title":"Configuration Docs"},{"location":"Support/Configuration/#configuration-docs","text":"LibreNMS configuration is a set of key values. The config is stored in two places: Database: This applies to all pollers and can be set with either lnms config:set or in the Web UI. Database config takes precedence over config.php. config.php: This applies to the local poller only. Configs set here will be disabled in the Web UI to prevent unexpected behaviour. The LibreNMS uses dot notation for config items: Database config.php snmp.community $config['snmp']['community'] snmp.community.+ $config['snmp']['community'][] snmp.v3.0.authalgo $config['snmp']['v3'][0]['authalgo'] The documentation has not been updated to reflect using lnms config:set to set config items, but it will work for all settings. Not all settings have been defined in LibreNMS, but they can still be set with the --ignore-checks option. Without that option input is checked for correctness, that does not mean it is not possible to set bad values. Please report missing settings.","title":"Configuration Docs"},{"location":"Support/Configuration/#cli","text":"lnms config:get will fetch the current config settings (composite of database, config.php, and defaults). lnms config:set will set the config setting in the database. Calling lnms config:set on a setting with no value will reset it to the default value. If you set up bash completion, you can use tab completion to find config settings.","title":"CLI"},{"location":"Support/Configuration/#getting-a-list-of-all-current-values","text":"To get a complete list of all the current values, you can use the command lnms config:get --dump . The output may not be desirable, so you can use the jq package to pretty print it. Then it would be lnms config:get --dump | jq . Example output: librenms@librenms:~$ lnms config:get --dump | jq { \"install_dir\": \"/opt/librenms\", \"active_directory\": { \"users_purge\": 0 }, \"addhost_alwayscheckip\": false, \"alert\": { \"ack_until_clear\": false, \"admins\": true, \"default_copy\": true, \"default_if_none\": false, \"default_mail\": false, \"default_only\": true, \"disable\": false, \"fixed-contacts\": true, \"globals\": true, \"syscontact\": true, \"transports\": { \"mail\": 5 }, \"tolerance_window\": 5, \"users\": false, ...","title":"Getting a list of all current values"},{"location":"Support/Configuration/#examples","text":"lnms config:get snmp.community [ \"public\" ] lnms config:set snmp.community.+ testing lnms config:get snmp.community [ \"public\" , \"testing\" ] lnms config:set snmp.community.0 private lnms config:get snmp.community [ \"private\" , \"testing\" ] lnms config:set snmp.community test Invalid format lnms config:set snmp.community '[\"test\", \"othercommunity\"]' lnms config:get snmp.community [ \"test\" , \"othercommunity\" ] lnms config:set snmp.community Reset snmp.community to the default? ( yes/no ) [ no ] : > yes lnms config:get snmp.community [ \"public\" ]","title":"Examples"},{"location":"Support/Configuration/#pre-load-configuration","text":"This feature is primarily for docker images and other automation. When installing LibreNMS for the first time with a new database you can place yaml key value files in database/seeders/config to pre-populate the config database. Example snmp.yaml snmp.community : - public - private snmp.max_repeaters : 30","title":"Pre-load configuration"},{"location":"Support/Configuration/#directories","text":"lnms config:set temp_dir /tmp The temporary directory is where images and other temporary files are created on your filesystem. lnms config:set log_dir /opt/librenms/logs Log files created by LibreNMS will be stored within this directory.","title":"Directories"},{"location":"Support/Configuration/#database-config","text":"Set these variables either in .env (/opt/librenms/.env by default) or in the environment. DB_HOST=127.0.0.1 DB_DATABASE=librenms DB_USERNAME=DBUSER DB_PASSWORD=\"DBPASS\" Use non-standard port: DB_PORT=3306 Use a unix socket: DB_SOCKET=/run/mysqld/mysqld.sock","title":"Database config"},{"location":"Support/Configuration/#core","text":"","title":"Core"},{"location":"Support/Configuration/#php-settings","text":"You can change the memory limits for php within config.php . The value is in Megabytes and should just be an int value: lnms config:set php_memory_limit 128","title":"PHP Settings"},{"location":"Support/Configuration/#programs","text":"A lot of these are self explanatory so no further information may be provided. Any extensions that have dedicated documentation page will be linked to rather than having the config provided.","title":"Programs"},{"location":"Support/Configuration/#rrdtool","text":"You can configure these options within the WebUI now, please avoid setting these options within config.php Settings -> External Settings -> RRDTool Setup external/binaries lnms config:set rrdtool /usr/bin/rrdtool Please see 1 Minute polling for information on configuring your install to record data more frequently.","title":"RRDTool"},{"location":"Support/Configuration/#fping","text":"external/binaries lnms config:set fping /usr/bin/fping lnms config:set fping6 fping6 poller/ping lnms config:set fping_options.timeout 500 lnms config:set fping_options.count 3 lnms config:set fping_options.interval 500 lnms config:set fping_options.tos 184 fping configuration options: timeout ( fping parameter -t ): Amount of time that fping waits for a response to its first request (in milliseconds). See note below count ( fping parameter -c ): Number of request packets to send to each target. interval ( fping parameter -p ): Time in milliseconds that fping waits between successive packets to an individual target. tos ( fping parameter -O ): Set the type of service flag (TOS). Value can be either decimal or hexadecimal (0xh) format. Can be used to ensure that ping packets are queued in following QOS mecanisms in the network. Table is accessible in the TOS Wikipedia page . NOTE: Setting a higher timeout value than the interval value can lead to slowing down poller. Example: timeout: 3000 count: 3 interval: 500 In this example, interval will be overwritten by the timeout value of 3000 which is 3 seconds. As we send three icmp packets (count: 3), each one is delayed by 3 seconds which will result in fping taking > 6 seconds to return results. You can disable the fping / icmp check that is done for a device to be determined to be up on a global or per device basis. We don't advise disabling the fping / icmp check unless you know the impact, at worst if you have a large number of devices down then it's possible that the poller would no longer complete in 5 minutes due to waiting for snmp to timeout. Globally disable fping / icmp check: lnms config:set icmp_check false If you would like to do this on a per device basis then you can do so under Device -> Edit -> Misc -> Disable ICMP Test? On","title":"fping"},{"location":"Support/Configuration/#traceroute","text":"LibreNMS uses traceroute to record debug information when a device is down due to icmp AND you have lnms config:set debug.run_trace true set. external/binaries lnms config:set traceroute /usr/bin/traceroute","title":"traceroute"},{"location":"Support/Configuration/#snmp","text":"SNMP program locations. external/binaries lnms config:set snmpwalk /usr/bin/snmpwalk lnms config:set snmpget /usr/bin/snmpget lnms config:set snmpbulkwalk /usr/bin/snmpbulkwalk lnms config:set snmpgetnext /usr/bin/snmpgetnext lnms config:set snmptranslate /usr/bin/snmptranslate","title":"SNMP"},{"location":"Support/Configuration/#misc-binaries","text":"external/binaries lnms config:set whois /usr/bin/whois lnms config:set ping /bin/ping lnms config:set mtr /usr/bin/mtr lnms config:set nmap /usr/bin/nmap lnms config:set nagios_plugins /usr/lib/nagios/plugins lnms config:set ipmitool /usr/bin/ipmitool lnms config:set virsh /usr/bin/virsh lnms config:set dot /usr/bin/dot lnms config:set sfdp /usr/bin/sfdp","title":"Misc binaries"},{"location":"Support/Configuration/#authentication","text":"Generic Authentication settings. Password minimum length for auth that allows user creation lnms config:set password.min_length 8","title":"Authentication"},{"location":"Support/Configuration/#proxy-support","text":"For alerting and the callback functionality, we support the use of a http proxy setting. These can be any one of the following: system/proxy lnms config:set callback_proxy proxy.domain.com lnms config:set http_proxy proxy.domain.com We can also make use of one of these environment variables which can be set in /etc/environment : http_proxy = proxy.domain.com https_proxy = proxy.domain.com","title":"Proxy support"},{"location":"Support/Configuration/#rrdcached","text":"Please refer to RRDCached","title":"RRDCached"},{"location":"Support/Configuration/#webui-settings","text":"lnms config:set base_url http://demo.librenms.org LibreNMS will attempt to detect the URL you are using but you can override that here. webui/style lnms config:set site_style light Currently we have a number of styles which can be set which will alter the navigation bar look. dark, light and mono with light being the default. lnms config:set webui.custom_css.+ css/custom/styles.css You can override a large number of visual elements by creating your own css stylesheet and referencing it here, place any custom css files into html/css/custom so they will be ignored by auto updates. You can specify as many css files as you like, the order they are within your config will be the order they are loaded in the browser. webui/style lnms config:set title_image images/custom/yourlogo.png You can override the default logo with yours, place any custom images files into html/images/custom so they will be ignored by auto updates. lnms config:set page_refresh 300 Set how often pages are refreshed in seconds. The default is every 5 minutes. Some pages don't refresh at all by design. lnms config:set front_page default You can create your own front page by adding a blade file in resources/views/overview/custom/ and setting front_page to it's name. For example, if you create resources/views/overview/custom/foobar.blade.php , set front_page to foobar . webui/dashboard lnms config:set webui.default_dashboard_id 0 Allows the specification of a global default dashboard page for any user who has not set one in their user preferences. Should be set to dashboard_id of an existing dashboard that is shared or shared(read). Otherwise, the system will automatically create each user an empty dashboard called Default on their first login. lnms config:set login_message \"Unauthorised access or use shall render the user liable to criminal and/or civil prosecution.\" This is the default message on the login page displayed to users. lnms config:set public_status true If this is set to true then an overview will be shown on the login page of devices and the status. lnms config:set show_locations true # Enable Locations on menu lnms config:set show_locations_dropdown true # Enable Locations dropdown on menu lnms config:set show_services false # Disable Services on menu lnms config:set int_customers true # Enable Customer Port Parsing lnms config:set summary_errors false # Show Errored ports in summary boxes on the dashboard lnms config:set customers_descr '[\"cust\"]' # The description to look for in ifDescr. Can have multiple '[\"cust\",\"cid\"]' lnms config:set transit_descr '[\"transit\"]' # Add custom transit descriptions (array) lnms config:set peering_descr '[\"peering\"]' # Add custom peering descriptions (array) lnms config:set core_descr '[\"core\"]' # Add custom core descriptions (array) lnms config:set custom_descr '[\"This is Custom\"]' # Add custom interface descriptions (array) lnms config:set int_transit true # Enable Transit Types lnms config:set int_peering true # Enable Peering Types lnms config:set int_core true # Enable Core Port Types lnms config:set int_l2tp false # Disable L2TP Port Types Enable / disable certain menus from being shown in the WebUI. You are able to adjust the number and time frames of the quick select time options for graphs and the mini graphs shown per row. Quick select: lnms config:set graphs.mini.normal '{ \"day\": \"24 Hours\", \"week\": \"One Week\", \"month\": \"One Month\", \"year\": \"One Year\" }' lnms config:set graphs.mini.widescreen '{ \"sixhour\": \"6 Hours\", \"day\": \"24 Hours\", \"twoday\": \"48 Hours\", \"week\": \"One Week\", \"twoweek\": \"Two Weeks\", \"month\": \"One Month\", \"twomonth\": \"Two Months\", \"year\": \"One Year\", \"twoyear\": \"Two Years\" }' Mini graphs: lnms config:set graphs.row.normal '{ \"sixhour\": \"6 Hours\", \"day\": \"24 Hours\", \"twoday\": \"48 Hours\", \"week\": \"One Week\", \"twoweek\": \"Two Weeks\", \"month\": \"One Month\", \"twomonth\": \"Two Months\", \"year\": \"One Year\", \"twoyear\": \"Two Years\" }' lnms config:set web_mouseover true You can disable the mouseover popover for mini graphs by setting this to false. lnms config:set enable_lazy_load true You can disable image lazy loading by setting this to false. lnms config:set overview_show_sysDescr true Enable or disable the sysDescr output for a device. webui/device lnms config:set device_display_default '{{ $hostname }}' This is a simple template to control the display of device names by default. You can override this setting per-device. You may enter any free-form text including one or more of the following template replacements: Template Replacement {{ $hostname }} The hostname or IP of the device that was set when added *default {{ $sysName_fallback }} The hostname or sysName if hostname is an IP {{ $sysName }} The SNMP sysName of the device, falls back to hostname/IP if missing {{ $ip }} The actual polled IP of the device, will not display a hostname For example, {{ $sysName_fallback }} ({{ $ip }}) will display something like server (192.168.1.1) lnms config:set device_traffic_iftype.+ '/loopback/' Interface types that aren't graphed in the WebUI. The default array contains more items, please see misc/config_definitions.json for the full list. lnms config:set enable_clear_discovery true Administrators are able to clear the last discovered time of a device which will force a full discovery run within the configured 5 minute cron window. lnms config:set enable_footer true Disable the footer of the WebUI by setting enable_footer to 0. You can enable the old style network map (only available for individual devices with links discovered via xDP) by setting: lnms config:set gui.network-map.style old lnms config:set percentile_value 90 Show the X th percentile in the graph instead of the default 95th percentile. webui/graph lnms config:set shorthost_target_length 15 The target maximum hostname length when applying the shorthost() function. You can increase this if you want to try and fit more of the hostname in graph titles. The default value is 12 However, this can possibly break graph generation if this is very long. You can enable dynamic graphs within the WebUI under Global Settings -> Webui Settings -> Graph Settings. Graphs will be movable/scalable without reloading the page:","title":"WebUI Settings"},{"location":"Support/Configuration/#stacked-graphs","text":"You can enable stacked graphs instead of the default inverted graphs. Enabling them is possible via webui Global Settings -> Webui Settings -> Graph settings -> Use stacked graphs","title":"Stacked Graphs"},{"location":"Support/Configuration/#add-host-settings","text":"The following setting controls how hosts are added. If a host is added as an ip address it is checked to ensure the ip is not already present. If the ip is present the host is not added. If host is added by hostname this check is not performed. If the setting is true hostnames are resolved and the check is also performed. This helps prevents accidental duplicate hosts. lnms config:set addhost_alwayscheckip false # true - check for duplicate ips even when adding host by name. # false- only check when adding host by ip. By default we allow hosts to be added with duplicate sysName's, you can disable this with the following config: discovery/general lnms config:set allow_duplicate_sysName false","title":"Add host settings"},{"location":"Support/Configuration/#global-poller-and-discovery-modules","text":"Enable or disable discovery or poller modules. This setting has an order of precedence Device > OS > Global. So if the module is set at a more specific level, it will override the less specific settings. Global: lnms config:set discovery_modules.arp-table false lnms config:set discovery_modules.entity-state true lnms config:set poller_modules.entity-state true Per OS: lnms config:set os.ios.discovery_modules.arp-table false lnms config:set os.ios.discovery_modules.entity-state true lnms config:set os.ios.poller_modules.entity-state true","title":"Global poller and discovery modules"},{"location":"Support/Configuration/#snmp-settings","text":"Default SNMP options including retry and timeout settings and also default version and port. poller/snmp lnms config:set snmp.timeout 1 # timeout in seconds lnms config:set snmp.retries 5 # how many times to retry the query lnms config:set snmp.transports '[\"udp\", \"udp6\", \"tcp\", \"tcp6\"]' # Transports to use lnms config:set snmp.version '[\"v2c\", \"v3\", \"v1\"]' # Default versions to use lnms config:set snmp.port 161 # Default port lnms config:set snmp.exec_timeout 1200 # execution time limit in seconds NOTE: timeout is the time to wait for an answer and exec_timeout is the max time to run a query. The default v1/v2c snmp community to use, you can expand this array with [1] , [2] , [3] , etc. poller/snmp lnms config:set snmp.community.0 public NOTE: This list of SNMP communities is used for auto discovery, and as a default set for any manually added device. The default v3 snmp details to use, you can expand this array with [1] , [2] , [3] , etc. poller/snmp lnms config:set snmp.v3.0 '{ authlevel: \"noAuthNoPriv\", authname: \"root\", authpass: \"\", authalgo: \"MD5\", cryptopass: \"\", cryptoalgo: \"AES\" }' authlevel noAuthNoPriv | authNoPriv | authPriv authname User Name (required even for noAuthNoPriv) authpass Auth Passphrase authalgo MD5 | SHA | SHA-224 | SHA-256 | SHA-384 | SHA-512 cryptopass Privacy (Encryption) Passphrase cryptoalgo AES | AES-192 | AES-256 | AES-256-C | DES","title":"SNMP Settings"},{"location":"Support/Configuration/#auto-discovery-settings","text":"Please refer to Auto-Discovery","title":"Auto discovery settings"},{"location":"Support/Configuration/#email-configuration","text":"You can configure these options within the WebUI now, please avoid setting these options within config.php alerting/email lnms config:set email_backend mail lnms config:set email_from librenms@yourdomain.local lnms config:set email_user ` lnms config:get project_id ` lnms config:set email_sendmail_path /usr/sbin/sendmail lnms config:set email_smtp_host localhost lnms config:set email_smtp_port 25 lnms config:set email_smtp_timeout 10 lnms config:set email_smtp_secure tls lnms config:set email_smtp_auth false lnms config:set email_smtp_username NULL lnms config:set email_smtp_password NULL What type of mail transport to use for delivering emails. Valid options for email_backend are mail, sendmail or smtp. The varying options after that are to support the different transports.","title":"Email configuration"},{"location":"Support/Configuration/#alerting","text":"Please refer to Alerting","title":"Alerting"},{"location":"Support/Configuration/#billing","text":"Please refer to Billing","title":"Billing"},{"location":"Support/Configuration/#global-module-support","text":"lnms config:set enable_syslog false # Enable Syslog lnms config:set enable_inventory true # Enable Inventory lnms config:set enable_pseudowires true # Enable Pseudowires lnms config:set enable_vrfs true # Enable VRFs","title":"Global module support"},{"location":"Support/Configuration/#port-extensions","text":"Please refer to Port-Description-Parser lnms config:set enable_ports_etherlike false lnms config:set enable_ports_junoseatmvp false lnms config:set enable_ports_poe false Enable / disable additional port statistics.","title":"Port extensions"},{"location":"Support/Configuration/#port-group","text":"Assign a new discovered Port automatically to Port Group with this Port Group ID (0 means no Port Group assignment) discovery/networks lnms config:set default_port_group 0","title":"Port Group"},{"location":"Support/Configuration/#external-integration","text":"","title":"External integration"},{"location":"Support/Configuration/#rancid","text":"lnms config:set rancid_configs.+ /var/lib/rancid/network/configs/ lnms config:set rancid_repo_type svn lnms config:set rancid_ignorecomments false Rancid configuration, rancid_configs is an array containing all of the locations of your rancid files. Setting rancid_ignorecomments will disable showing lines that start with #","title":"Rancid"},{"location":"Support/Configuration/#oxidized","text":"Please refer to Oxidized","title":"Oxidized"},{"location":"Support/Configuration/#collectd","text":"lnms config:set collectd_dir /var/lib/collectd/rrd Specify the location of the collectd rrd files. Note that the location in config.php should be consistent with the location set in /etc/collectd.conf and etc/collectd.d/rrdtool.conf DataDir \"/var/lib/collectd/rrd\" CreateFilesAsync false CacheTimeout 120 CacheFlush 900 WritesPerSecond 50 /etc/collectd.conf LoadPlugin rrdtool DataDir \"/var/lib/collectd/rrd\" CacheTimeout 120 CacheFlush 900 /etc/collectd.d/rrdtool.conf lnms config:set collectd_sock unix:///var/run/collectd.sock Specify the location of the collectd unix socket. Using a socket allows the collectd graphs to be flushed to disk before being drawn. Be sure that your web server has permissions to write to this socket.","title":"CollectD"},{"location":"Support/Configuration/#smokeping","text":"Please refer to Smokeping","title":"Smokeping"},{"location":"Support/Configuration/#nfsen","text":"Please refer to NFSen","title":"NFSen"},{"location":"Support/Configuration/#location-parsing","text":"LibreNMS can interpret sysLocation information and map the device loction based on GeoCoordinates or GeoCoding information. Info-keywords [] contains optional Latitude and Longitude information if manual GeoCoordinate positioning is desired. () contains optional information that is ignored during GeoCoding lookups.","title":"Location parsing"},{"location":"Support/Configuration/#geocoordinates","text":"If device sysLocation information contains [lat, lng] (note the comma and square brackets), that is used to determin the GeoCoordinates. Example: name_that_can_not_be_looked_up [ 40 .424521, -86.912755 ]","title":"GeoCoordinates"},{"location":"Support/Configuration/#geocoding","text":"Next it will attempt to look up the sysLocation with a map engine provided you have configured one under $config['geoloc']['engine']. The information has to be accurate or no result is returned, when it does it will ignore any information inside parentheses, allowing you to add details that would otherwise interfeeer with the lookup. Example: 1100 Congress Ave, Austin, TX 78701 ( 3rd floor ) Geocoding lookup is: 1100 Congress Ave, Austin, TX 78701","title":"GeoCoding"},{"location":"Support/Configuration/#overrides","text":"You can overwrite each device sysLocation information in the webGUI under \"Device settings\". You can overwrite the location coordinates n in the webGUI under Device>GEO Locations","title":"Overrides"},{"location":"Support/Configuration/#location-mapping","text":"If you just want to set GPS coordinates on a location, you should visit Devices > Geo Locations > All Locations and edit the coordinates there. Exact Matching: lnms config:set location_map '{\"Under the Sink\": \"Under The Sink, The Office, London, UK\"}' Regex Matching: lnms config:set location_map_regex '{\"/Sink/\": \"Under The Sink, The Office, London, UK\"}' Regex Match Substitution: lnms config:set location_map_regex_sub '{\"/Sink/\": \"Under The Sink, The Office, London, UK [lat, long]\"}' If you have an SNMP SysLocation of \"Rack10,Rm-314,Sink\", Regex Match Substition yields \"Rack10,Rm-314,Under The Sink, The Office, London, UK [lat, long]\". This allows you to keep the SysLocation string short and keeps Rack/Room/Building information intact after the substitution. The above are examples, these will rewrite device snmp locations so you don't need to configure full location within snmp.","title":"Location mapping"},{"location":"Support/Configuration/#interfaces-to-be-ignored","text":"Interfaces can be automatically ignored during discovery by modifying bad_if* entries in a default array, unsetting a default array and customizing it, or creating an OS specific array. The preferred method for ignoring interfaces is to use an OS specific array. The default arrays can be found in misc/config_definitions.json. OS specific definitions (includes/definitions/_specific_os_.yaml) can contain bad_if* arrays, but should only be modified via pull-request as manipulation of the definition files will block updating: Examples: Add entries to default arrays lnms config:set bad_if.+ voip-null lnms config:set bad_iftype.+ voiceEncap lnms config:set bad_if_regexp.+ '/^lo[0-9].*/' # loopback Override default bad_if values lnms config:set bad_if '[\"voip-null\", \"voiceEncap\", \"voiceFXO\"]' Create an OS specific array lnms config:set os.iosxe.bad_iftype.+ macSecControlledIF lnms config:set os.iosxe.bad_iftype.+ macSecUncontrolledIF Various bad_if* selection options available bad_if is matched against the ifDescr value. bad_iftype is matched against the ifType value. bad_if_regexp is matched against the ifDescr value as a regular expression. bad_ifname_regexp is matched against the ifName value as a regular expression. bad_ifalias_regexp is matched against the ifAlias value as a regular expression.","title":"Interfaces to be ignored"},{"location":"Support/Configuration/#interfaces-that-shouldnt-be-ignored","text":"Examples: lnms config:set good_if.+ FastEthernet lnms config:set os.ios.good_if.+ FastEthernet good_if is matched against ifDescr value. This can be a bad_if value as well which would stop that port from being ignored. i.e. if bad_if and good_if both contained FastEthernet then ports with this value in the ifDescr will be valid.","title":"Interfaces that shouldn't be ignored"},{"location":"Support/Configuration/#interfaces-to-be-rewritten","text":"lnms config:set rewrite_if '{\"cpu\": \"Management Interface\"}' lnms config:set rewrite_if_regexp '{\"/cpu /\": \"Management \"}' Entries defined in rewrite_if are being replaced completely. Entries defined in rewrite_if_regexp only replace the match. Matches are compared case-insensitive.","title":"Interfaces to be rewritten"},{"location":"Support/Configuration/#entity-sensors-to-be-ignored","text":"Some devices register bogus sensors as they are returned via SNMP but either don't exist or just don't return data. This allows you to ignore those based on the descr field in the database. You can either ignore globally or on a per os basis. lnms config:set bad_entity_sensor_regex.+ '/Physical id [0-9]+/' lnms config:set os.ios.bad_entity_sensor_regex '[\"/Physical id [0-9]+/\"]'","title":"Entity sensors to be ignored"},{"location":"Support/Configuration/#entity-sensors-limit-values","text":"Vendors may give some limit values (or thresholds) for the discovered sensors. By default, when no such value is given, both high and low limit values are guessed, based on the value measured during the initial discovery. When it is preferred to have no high and/or low limit values at all if these are not provided by the vendor, the guess method can be disabled: lnms config:set sensors.guess_limits false","title":"Entity sensors limit values"},{"location":"Support/Configuration/#ignoring-health-sensors","text":"It is possible to filter some sensors from the configuration: Ignore all temperature sensors lnms config:set disabled_sensors.current true Filter all sensors matching regexp '/PEM Iout/' . lnms config:set disabled_sensors_regex.+ '/PEM Iout/' Filter all 'current' sensors for Operating System 'vrp'. lnms config:set os.vrp.disabled_sensors.current true Filter all sensors matching regexp '/PEM Iout/' for Operating System iosxe. lnms config:set os.iosxe.disabled_sensors_regex '/PEM Iout/'","title":"Ignoring Health Sensors"},{"location":"Support/Configuration/#storage-configuration","text":"Mounted storage / mount points to ignore in discovery and polling. discovery/storage ```bash lnms config:set ignore_mount_removable true lnms config:set ignore_mount_network true lnms config:set ignore_mount_optical true lnms config:set ignore_mount.+ /kern lnms config:set ignore_mount.+ /mnt/cdrom lnms config:set ignore_mount.+ /proc lnms config:set ignore_mount.+ /dev lnms config:set ignore_mount_string.+ packages lnms config:set ignore_mount_string.+ devfs lnms config:set ignore_mount_string.+ procfs lnms config:set ignore_mount_string.+ UMA lnms config:set ignore_mount_string.+ MALLOC lnms config:set ignore_mount_regexp.+ '/on: \\/packages/' lnms config:set ignore_mount_regexp.+ '/on: \\/dev/' lnms config:set ignore_mount_regexp.+ '/on: \\/proc/' lnms config:set ignore_mount_regexp.+ '/on: \\/junos^/' lnms config:set ignore_mount_regexp.+ '/on: \\/junos\\/dev/' lnms config:set ignore_mount_regexp.+ '/on: \\/jail\\/dev/' lnms config:set ignore_mount_regexp.+ '/^(dev|proc)fs/' lnms config:set ignore_mount_regexp.+ '/^\\/dev\\/md0/' lnms config:set ignore_mount_regexp.+ '/^\\/var\\/dhcpd\\/dev,/' lnms config:set ignore_mount_regexp.+ '/UMA/' ``` Custom storage warning percentage lnms config:set storage_perc_warn 60","title":"Storage configuration"},{"location":"Support/Configuration/#irc-bot","text":"Please refer to IRC Bot","title":"IRC Bot"},{"location":"Support/Configuration/#authentication_1","text":"Please refer to Authentication","title":"Authentication"},{"location":"Support/Configuration/#cleanup-options","text":"Please refer to Cleanup Options","title":"Cleanup options"},{"location":"Support/Configuration/#syslog-options","text":"Please refer to Syslog","title":"Syslog options"},{"location":"Support/Configuration/#virtualization","text":"lnms config:set enable_libvirt true lnms config:set libvirt_protocols '[\"qemu+ssh\",\"xen+ssh\"]' lnms config:set libvirt_username root Enable this to switch on support for libvirt along with libvirt_protocols to indicate how you connect to libvirt. You also need to: Generate a non-password-protected ssh key for use by LibreNMS, as the user which runs polling & discovery (usually librenms ). On each VM host you wish to monitor: Configure public key authentication from your LibreNMS server/poller by adding the librenms public key to ~root/.ssh/authorized_keys . (xen+ssh only) Enable libvirtd to gather data from xend by setting (xend-unix-server yes) in /etc/xen/xend-config.sxp and restarting xend and libvirtd. To test your setup, run virsh -c qemu+ssh://vmhost/system list or virsh -c xen+ssh://vmhost list as your librenms polling user.","title":"Virtualization"},{"location":"Support/Configuration/#bgp-support","text":"lnms config:set astext.65332 \"Cymru FullBogon Feed\" You can use this array to rewrite the description of ASes that you have discovered.","title":"BGP Support"},{"location":"Support/Configuration/#auto-updates","text":"Please refer to Updating","title":"Auto updates"},{"location":"Support/Configuration/#ipmi","text":"Setup the types of IPMI protocols to test a host for and in what order. Don't forget to install ipmitool on the monitoring host. lnms config:set ipmi.type '[\"lanplus\", \"lan\", \"imb\", \"open\"]'","title":"IPMI"},{"location":"Support/Configuration/#distributed-poller-settings","text":"Please refer to Distributed Poller","title":"Distributed poller settings"},{"location":"Support/Configuration/#api-settings","text":"","title":"API Settings"},{"location":"Support/Configuration/#cors-support","text":"https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS CORS support for the API is disabled by default. Below you will find the standard options, all of which you can configure. lnms config:set api.cors.enabled false lnms config:set api.cors.origin '[\"*\"]' lnms config:set api.cors.maxage '86400' lnms config:set api.cors.allowmethods '[\"POST\", \"GET\", \"PUT\", \"DELETE\", \"PATCH\"]' lnms config:set api.cors.allowheaders '[\"Origin\", \"X-Requested-With\", \"Content-Type\", \"Accept\", \"X-Auth-Token\"]' lnms config:set api.cors.exposeheaders '[\"Cache-Control\", \"Content-Language\", \"Content-Type\", \"Expires\", \"Last-Modified\", \"Pragma\"]' lnms config:set api.cors.allowmethods '[\"POST\", \"GET\", \"PUT\", \"DELETE\", \"PATCH\"]' lnms config:set api.cors.allowheaders '[\"Origin\", \"X-Requested-With\", \"Content-Type\", \"Accept\", \"X-Auth-Token\"]' lnms config:set api.cors.exposeheaders '[\"Cache-Control\", \"Content-Language\", \"Content-Type\", \"Expires\", \"Last-Modified\", \"Pragma\"]' lnms config:set api.cors.allowcredentials false","title":"CORS Support"},{"location":"Support/Device-Sensors/","text":"Device Sensors LibreNMS has a standard for device sensors they are split into categories. This doc is to help users understand device sensors in general, if you need help with developing sensors for a device please see the Contributing + Developing section. Health Sensors The High and Low values of these sensors can be edited in Web UI by going to the device settings -> Health. There you can set your own custom High and Low values. List of these sensors can be found here Link Note Some values are defined by the manufactures and others are auto calculated when you add the device into librenms. Keep in mind every environment is different and may require user input. Wireless Sensors Some Wireless have High and Low values of these sensors can be edited in Web UI by going to the device settings -> Wireless Sensors There you can set your own custom High and Low values. List of these sensors can be found here Link Note Some values are defined by the manufactures and others are auto calculated when you add the device into librenms. Keep in mind every environment is different and may require user input. State Sensors Return states of device entries sensors states. For example. Drive Status, Memory Status, Power Supply Status. 0 = OK 1 = Warning 2 = Critical 3 = Unknown Alerting Sensors These alert rules can be found inside the Alert Rules Collection. The alert rules below are the default alert rules, there are more device-specific alert rules in the alerts collection. Sensor Over Limit Alert Rule: Will alert on any sensor value that is over the limit. Sensor Under Limit Alert Rule: Will alert on any sensor value that is under the limit. Remember you can set these limits inside device settings in the Web UI. State Sensor Critical: Will alert on any state that returns critical = 2 State Sensor Warning: Will alert on any state that returns warning = 1 Wireless Sensor Over Limit Alert Rule: Will Alert on sensors that listed in device settings under Wireless. Wireless Sensor Under Limit Alert Rule: Will Alert on sensors that listed in device settings under Wireless.","title":"Device Sensors"},{"location":"Support/Device-Sensors/#device-sensors","text":"LibreNMS has a standard for device sensors they are split into categories. This doc is to help users understand device sensors in general, if you need help with developing sensors for a device please see the Contributing + Developing section.","title":"Device Sensors"},{"location":"Support/Device-Sensors/#health-sensors","text":"The High and Low values of these sensors can be edited in Web UI by going to the device settings -> Health. There you can set your own custom High and Low values. List of these sensors can be found here Link Note Some values are defined by the manufactures and others are auto calculated when you add the device into librenms. Keep in mind every environment is different and may require user input.","title":"Health Sensors"},{"location":"Support/Device-Sensors/#wireless-sensors","text":"Some Wireless have High and Low values of these sensors can be edited in Web UI by going to the device settings -> Wireless Sensors There you can set your own custom High and Low values. List of these sensors can be found here Link Note Some values are defined by the manufactures and others are auto calculated when you add the device into librenms. Keep in mind every environment is different and may require user input.","title":"Wireless Sensors"},{"location":"Support/Device-Sensors/#state-sensors","text":"Return states of device entries sensors states. For example. Drive Status, Memory Status, Power Supply Status. 0 = OK 1 = Warning 2 = Critical 3 = Unknown","title":"State Sensors"},{"location":"Support/Device-Sensors/#alerting-sensors","text":"These alert rules can be found inside the Alert Rules Collection. The alert rules below are the default alert rules, there are more device-specific alert rules in the alerts collection. Sensor Over Limit Alert Rule: Will alert on any sensor value that is over the limit. Sensor Under Limit Alert Rule: Will alert on any sensor value that is under the limit. Remember you can set these limits inside device settings in the Web UI. State Sensor Critical: Will alert on any state that returns critical = 2 State Sensor Warning: Will alert on any state that returns warning = 1 Wireless Sensor Over Limit Alert Rule: Will Alert on sensors that listed in device settings under Wireless. Wireless Sensor Under Limit Alert Rule: Will Alert on sensors that listed in device settings under Wireless.","title":"Alerting Sensors"},{"location":"Support/Device-Troubleshooting/","text":"Capture Debug Information You can use this feature to run Debug on Discovery, Poller, SNMP, Alerts. This output information could be helpful for you in troubleshooting a device or when requesting help. This feature can be found by going to the device that you are troubleshooting in the webui, clicking on the settings icon menu on far right and selecting Capture. Discovery Discovery will run and output debug information. Poller Poller will run and output debug information. SNMP SNMP will run SNMP Bulk Walk on the device and output the information. Alerts Alerts Capture is handy when you are creating alerts and need to see if your alert rule matches.","title":"Device Troubleshooting"},{"location":"Support/Device-Troubleshooting/#capture-debug-information","text":"You can use this feature to run Debug on Discovery, Poller, SNMP, Alerts. This output information could be helpful for you in troubleshooting a device or when requesting help. This feature can be found by going to the device that you are troubleshooting in the webui, clicking on the settings icon menu on far right and selecting Capture.","title":"Capture Debug Information"},{"location":"Support/Device-Troubleshooting/#discovery","text":"Discovery will run and output debug information.","title":"Discovery"},{"location":"Support/Device-Troubleshooting/#poller","text":"Poller will run and output debug information.","title":"Poller"},{"location":"Support/Device-Troubleshooting/#snmp","text":"SNMP will run SNMP Bulk Walk on the device and output the information.","title":"SNMP"},{"location":"Support/Device-Troubleshooting/#alerts","text":"Alerts Capture is handy when you are creating alerts and need to see if your alert rule matches.","title":"Alerts"},{"location":"Support/Discovery%20Support/","text":"discovery.php This document will explain how to use discovery.php to debug issues or manually running to process data. Command options -h | Poll single device -h odd Poll odd numbered devices ( same as -i 2 -n 0 ) -h even Poll even numbered devices ( same as -i 2 -n 1 ) -h all Poll all devices -h new Poll all devices that have not had a discovery run before --os Poll devices only with specified operating system --type Poll devices only with specified type -i -n Poll as instance of Instances start at 0 . 0 -3 for -n 4 Debugging and testing options: -d Enable debugging output -v Enable verbose debugging output -m Specify module ( s ) to be run. Comma separate modules, submodules may be added with / -h Use this to specify a device via either id or hostname (including wildcard using *). You can also specify odd and even. all will run discovery against all devices whilst new will poll only those devices that have recently been added or have been selected for rediscovery. -i This can be used to stagger the discovery process. -d Enables debugging output (verbose output but with most sensitive data masked) so that you can see what is happening during a discovery run. This includes things like rrd updates, SQL queries and response from snmp. -v Enables verbose debugging output with all data in tact. -m This enables you to specify the module you want to run for discovery. Discovery wrapper We have a discovery-wrapper.py script which is based on poller-wrapper.py by Job Snijders . This script is currently the default. If you need to debug the output of discovery-wrapper.py then you can add -d to the end of the command - it is NOT recommended to do this in cron. You also may use -m to pass a list of comma-separated modules. Please refer to Command options of discovery.php. Example: /opt/librenms/discovery-wrapper.py 1 -m bgp-peers If you want to switch back to discovery.php then you can replace: 33 */6 * * * librenms /opt/librenms/discovery-wrapper.py 1 >> /dev/null 2>&1 With: 33 */6 * * * librenms /opt/librenms/discovery.php -h all >> /dev/null 2>&1 Discovery config These are the default discovery config items. You can globally disable a module by setting it to 0. If you just want to disable it for one device then you can do this within the WebUI -> Device -> Settings -> Modules. discovery/discovery_modules lnms config:set discovery_modules.os true lnms config:set discovery_modules.ports true lnms config:set discovery_modules.ports-stack true lnms config:set discovery_modules.entity-physical true lnms config:set discovery_modules.entity-state false lnms config:set discovery_modules.processors true lnms config:set discovery_modules.mempools true lnms config:set discovery_modules.cisco-vrf-lite true lnms config:set discovery_modules.cisco-mac-accounting false lnms config:set discovery_modules.cisco-pw false lnms config:set discovery_modules.vrf false lnms config:set discovery_modules.cisco-cef false lnms config:set discovery_modules.slas false lnms config:set discovery_modules.cisco-cbqos false lnms config:set discovery_modules.cisco-otv false lnms config:set discovery_modules.ipv4-addresses true lnms config:set discovery_modules.ipv6-addresses true lnms config:set discovery_modules.route false lnms config:set discovery_modules.sensors true lnms config:set discovery_modules.storage true lnms config:set discovery_modules.hr-device true lnms config:set discovery_modules.discovery-protocols true lnms config:set discovery_modules.arp-table true lnms config:set discovery_modules.discovery-arp false lnms config:set discovery_modules.junose-atm-vp false lnms config:set discovery_modules.bgp-peers true lnms config:set discovery_modules.vlans true lnms config:set discovery_modules.vminfo false lnms config:set discovery_modules.printer-supplies false lnms config:set discovery_modules.ucd-diskio true lnms config:set discovery_modules.applications false lnms config:set discovery_modules.services true lnms config:set discovery_modules.stp true lnms config:set discovery_modules.ntp true lnms config:set discovery_modules.loadbalancers false lnms config:set discovery_modules.mef false lnms config:set discovery_modules.wireless true lnms config:set discovery_modules.fdb-table true lnms config:set discovery_modules.xdsl false OS based Discovery config You can enable or disable modules for a specific OS by using lnms config:set OS based settings have preference over global. Device based settings have preference over all others Discover performance improvement can be achieved by deactivating all modules that are not supported by specific OS. E.g. to deactivate spanning tree but activate discovery-arp module for linux OS discovery/discovery_modules lnms config:set os.linux.discovery_modules.stp false lnms config:set os.linux.discovery_modules.discovery-arp true Discovery modules os : Os detection. This module will pick up the OS of the device. ports : This module will detect all ports on a device excluding ones configured to be ignored by config options. ports-stack : Same as ports except for stacks. xdsl : Module to collect more metrics for xDSL interfaces. entity-physical : Module to pick up the devices hardware support. processors : Processor support for devices. mempools : Memory detection support for devices. cisco-vrf-lite : VRF-Lite detection and support. ipv4-addresses : IPv4 Address detection ipv6-addresses : IPv6 Address detection route : This module will load the routing table of the device. The default route limit is 1000 (configurable with lnms config:set routes.max_number 1000 ), with history data. sensors : Sensor detection such as Temperature, Humidity, Voltages + More storage : Storage detection for hard disks hr-device : Processor and Memory support via HOST-RESOURCES-MIB. discovery-protocols : Auto discovery module for xDP, OSPF and BGP. arp-table : Detection of the ARP table for the device. fdb-table : Detection of the Forwarding DataBase table for the device, with history data. discovery-arp : Auto discovery via ARP. junose-atm-vp : Juniper ATM support. bgp-peers : BGP detection and support. vlans : VLAN detection and support. cisco-mac-accounting : MAC Address account support. cisco-pw : Pseudowires wires detection and support. vrf : VRF detection and support. cisco-cef : CEF detection and support. slas : SLA detection and support. vminfo : Detection of vm guests for VMware ESXi and libvert printer-supplies : Toner levels support. ucd-diskio : Disk I/O support. services : *Nix services support. charge : APC Charge detection and support. Running Here are some examples of running discovery from within your install directory. ./discovery.php -h localhost ./discovery.php -h localhost -m ports Debugging To provide debugging output you will need to run the discovery process with the -d flag. You can do this either against all modules, single or multiple modules: All Modules ./discovery.php -h localhost -d Single Module ./discovery.php -h localhost -m ports -d Multiple Modules ./discovery.php -h localhost -m ports,entity-physical -d Using -d shouldn't output much sensitive information, -v will so it is then advisable to sanitise the output before pasting it somewhere as the debug output will contain snmp details amongst other items including port descriptions. The output will contain: DB Updates SNMP Response","title":"Discovery Support"},{"location":"Support/Discovery%20Support/#discoveryphp","text":"This document will explain how to use discovery.php to debug issues or manually running to process data.","title":"discovery.php"},{"location":"Support/Discovery%20Support/#command-options","text":"-h | Poll single device -h odd Poll odd numbered devices ( same as -i 2 -n 0 ) -h even Poll even numbered devices ( same as -i 2 -n 1 ) -h all Poll all devices -h new Poll all devices that have not had a discovery run before --os Poll devices only with specified operating system --type Poll devices only with specified type -i -n Poll as instance of Instances start at 0 . 0 -3 for -n 4 Debugging and testing options: -d Enable debugging output -v Enable verbose debugging output -m Specify module ( s ) to be run. Comma separate modules, submodules may be added with / -h Use this to specify a device via either id or hostname (including wildcard using *). You can also specify odd and even. all will run discovery against all devices whilst new will poll only those devices that have recently been added or have been selected for rediscovery. -i This can be used to stagger the discovery process. -d Enables debugging output (verbose output but with most sensitive data masked) so that you can see what is happening during a discovery run. This includes things like rrd updates, SQL queries and response from snmp. -v Enables verbose debugging output with all data in tact. -m This enables you to specify the module you want to run for discovery.","title":"Command options"},{"location":"Support/Discovery%20Support/#discovery-wrapper","text":"We have a discovery-wrapper.py script which is based on poller-wrapper.py by Job Snijders . This script is currently the default. If you need to debug the output of discovery-wrapper.py then you can add -d to the end of the command - it is NOT recommended to do this in cron. You also may use -m to pass a list of comma-separated modules. Please refer to Command options of discovery.php. Example: /opt/librenms/discovery-wrapper.py 1 -m bgp-peers If you want to switch back to discovery.php then you can replace: 33 */6 * * * librenms /opt/librenms/discovery-wrapper.py 1 >> /dev/null 2>&1 With: 33 */6 * * * librenms /opt/librenms/discovery.php -h all >> /dev/null 2>&1","title":"Discovery wrapper"},{"location":"Support/Discovery%20Support/#discovery-config","text":"These are the default discovery config items. You can globally disable a module by setting it to 0. If you just want to disable it for one device then you can do this within the WebUI -> Device -> Settings -> Modules. discovery/discovery_modules lnms config:set discovery_modules.os true lnms config:set discovery_modules.ports true lnms config:set discovery_modules.ports-stack true lnms config:set discovery_modules.entity-physical true lnms config:set discovery_modules.entity-state false lnms config:set discovery_modules.processors true lnms config:set discovery_modules.mempools true lnms config:set discovery_modules.cisco-vrf-lite true lnms config:set discovery_modules.cisco-mac-accounting false lnms config:set discovery_modules.cisco-pw false lnms config:set discovery_modules.vrf false lnms config:set discovery_modules.cisco-cef false lnms config:set discovery_modules.slas false lnms config:set discovery_modules.cisco-cbqos false lnms config:set discovery_modules.cisco-otv false lnms config:set discovery_modules.ipv4-addresses true lnms config:set discovery_modules.ipv6-addresses true lnms config:set discovery_modules.route false lnms config:set discovery_modules.sensors true lnms config:set discovery_modules.storage true lnms config:set discovery_modules.hr-device true lnms config:set discovery_modules.discovery-protocols true lnms config:set discovery_modules.arp-table true lnms config:set discovery_modules.discovery-arp false lnms config:set discovery_modules.junose-atm-vp false lnms config:set discovery_modules.bgp-peers true lnms config:set discovery_modules.vlans true lnms config:set discovery_modules.vminfo false lnms config:set discovery_modules.printer-supplies false lnms config:set discovery_modules.ucd-diskio true lnms config:set discovery_modules.applications false lnms config:set discovery_modules.services true lnms config:set discovery_modules.stp true lnms config:set discovery_modules.ntp true lnms config:set discovery_modules.loadbalancers false lnms config:set discovery_modules.mef false lnms config:set discovery_modules.wireless true lnms config:set discovery_modules.fdb-table true lnms config:set discovery_modules.xdsl false","title":"Discovery config"},{"location":"Support/Discovery%20Support/#os-based-discovery-config","text":"You can enable or disable modules for a specific OS by using lnms config:set OS based settings have preference over global. Device based settings have preference over all others Discover performance improvement can be achieved by deactivating all modules that are not supported by specific OS. E.g. to deactivate spanning tree but activate discovery-arp module for linux OS discovery/discovery_modules lnms config:set os.linux.discovery_modules.stp false lnms config:set os.linux.discovery_modules.discovery-arp true","title":"OS based Discovery config"},{"location":"Support/Discovery%20Support/#discovery-modules","text":"os : Os detection. This module will pick up the OS of the device. ports : This module will detect all ports on a device excluding ones configured to be ignored by config options. ports-stack : Same as ports except for stacks. xdsl : Module to collect more metrics for xDSL interfaces. entity-physical : Module to pick up the devices hardware support. processors : Processor support for devices. mempools : Memory detection support for devices. cisco-vrf-lite : VRF-Lite detection and support. ipv4-addresses : IPv4 Address detection ipv6-addresses : IPv6 Address detection route : This module will load the routing table of the device. The default route limit is 1000 (configurable with lnms config:set routes.max_number 1000 ), with history data. sensors : Sensor detection such as Temperature, Humidity, Voltages + More storage : Storage detection for hard disks hr-device : Processor and Memory support via HOST-RESOURCES-MIB. discovery-protocols : Auto discovery module for xDP, OSPF and BGP. arp-table : Detection of the ARP table for the device. fdb-table : Detection of the Forwarding DataBase table for the device, with history data. discovery-arp : Auto discovery via ARP. junose-atm-vp : Juniper ATM support. bgp-peers : BGP detection and support. vlans : VLAN detection and support. cisco-mac-accounting : MAC Address account support. cisco-pw : Pseudowires wires detection and support. vrf : VRF detection and support. cisco-cef : CEF detection and support. slas : SLA detection and support. vminfo : Detection of vm guests for VMware ESXi and libvert printer-supplies : Toner levels support. ucd-diskio : Disk I/O support. services : *Nix services support. charge : APC Charge detection and support.","title":"Discovery modules"},{"location":"Support/Discovery%20Support/#running","text":"Here are some examples of running discovery from within your install directory. ./discovery.php -h localhost ./discovery.php -h localhost -m ports","title":"Running"},{"location":"Support/Discovery%20Support/#debugging","text":"To provide debugging output you will need to run the discovery process with the -d flag. You can do this either against all modules, single or multiple modules: All Modules ./discovery.php -h localhost -d Single Module ./discovery.php -h localhost -m ports -d Multiple Modules ./discovery.php -h localhost -m ports,entity-physical -d Using -d shouldn't output much sensitive information, -v will so it is then advisable to sanitise the output before pasting it somewhere as the debug output will contain snmp details amongst other items including port descriptions. The output will contain: DB Updates SNMP Response","title":"Debugging"},{"location":"Support/Environment-Variables/","text":"Environment Variables LibreNMS allows certain settings to be set via the environment or through the .env file. Database Set the variables to connect to the database. The default values are shown below. DB_HOST=localhost DB_PORT=3306 DB_DATABASE=librenms DB_USERNAME=librenms DB_PASSWORD= DB_SOCKET= Trusted Reverse Proxies A comma separated list of trusted reverse proxy IPs or CIDR. For legacy reasons the default is '*' , which means any proxy is allowed. '**' means trust any proxy up the chain. APP_TRUSTED_PROXIES=192.168.1.0/24,192.167.8.20 Base url Set the base url for generated urls. This will be needed when using signed graph urls for alerting. It may be needed when using reverse proxies combined with a subdirectory. Generally, LibreNMS will make correct URLs (especially if you have set up your proxy variables correctly) APP_URL=http://librenms/ User / Group The user and group that LibreNMS should operate as. Group will default to the same as the user if unset. LIBRENMS_USER=librenms LIBRENMS_GROUP=librenms Debug Increases the amount of information shown when an error occurs. WARNING: This may leak information, do not leave enabled. APP_DEBUG=true","title":"Environment Variables"},{"location":"Support/Environment-Variables/#environment-variables","text":"LibreNMS allows certain settings to be set via the environment or through the .env file.","title":"Environment Variables"},{"location":"Support/Environment-Variables/#database","text":"Set the variables to connect to the database. The default values are shown below. DB_HOST=localhost DB_PORT=3306 DB_DATABASE=librenms DB_USERNAME=librenms DB_PASSWORD= DB_SOCKET=","title":"Database"},{"location":"Support/Environment-Variables/#trusted-reverse-proxies","text":"A comma separated list of trusted reverse proxy IPs or CIDR. For legacy reasons the default is '*' , which means any proxy is allowed. '**' means trust any proxy up the chain. APP_TRUSTED_PROXIES=192.168.1.0/24,192.167.8.20","title":"Trusted Reverse Proxies"},{"location":"Support/Environment-Variables/#base-url","text":"Set the base url for generated urls. This will be needed when using signed graph urls for alerting. It may be needed when using reverse proxies combined with a subdirectory. Generally, LibreNMS will make correct URLs (especially if you have set up your proxy variables correctly) APP_URL=http://librenms/","title":"Base url"},{"location":"Support/Environment-Variables/#user-group","text":"The user and group that LibreNMS should operate as. Group will default to the same as the user if unset. LIBRENMS_USER=librenms LIBRENMS_GROUP=librenms","title":"User / Group"},{"location":"Support/Environment-Variables/#debug","text":"Increases the amount of information shown when an error occurs. WARNING: This may leak information, do not leave enabled. APP_DEBUG=true","title":"Debug"},{"location":"Support/Example-Hardware-Setup/","text":"Example hardware setups The information in this document is direct from users, it's a place for people to share their setups so you have an idea of what may be required for your install. To obtain the device, port and sensor counts you can run: select count ( * ) from devices ; select count ( * ) from ports where `deleted` = 0 ; select count ( * ) from sensors where `sensor_deleted` = 0 ; laf Home Running in Proxmox. LibreNMS MySQL Type Virtual Virtual OS CentOS 7 CentOS 7 CPU 2 Sockets, 4 Cores 1 Socket, 2 Cores Memory 2GB 2GB Disk Type Raid 1, SSD Raid 1, SSD Disk Space 18GB 30GB Devices 20 - Ports 133 - Health sensors 47 - Load < 0.1 < 0.1 Vente-Priv\u00e9e NOC LibreNMS MariaDB Type Dell R430 Dell R430 OS Debian 7 (dotdeb) Debian 7 (dotdeb) CPU 2 Sockets, 14 Cores 1 Socket, 2 Cores Memory 256GB 256GB Disk Type Raid 10, SSD Raid 10, SSD Disk Space 1TB 1TB Devices 1028 - Ports 26745 - Health sensors 6238 - Load < 0.5 < 0.5 KKrumm Home LibreNMS MySQL Type VM Same Server OS CentOS 7 CPU 2 Sockets, 4 Cores Memory 4GB Disk Type Raid 10, SAS Drives Disk Space 40 GB Devices 12 Ports 130 Health sensors 44 Load < 2.5 KKrumm Work LibreNMS MySQL Type HP Proliantdl380gen8 Same Server OS CentOS 7 CPU 2 Sockets, 24 Cores Memory 32GB Disk Type Raid 10, SAS Drives Disk Space 250 GB Devices 390 Ports 16167 Health sensors 3223 Load < 14.5 CppMonkey(KodApa85) Home LibreNMS MariaDB Type i5-4690K Same Workstation OS Ubuntu 18.04.2 CPU 4 Cores Memory 16GB Disk Type Hybrid SATA Disk Space 2 TB Devices 14 Ports 0 Health sensors 70 Load < 0.5 CppMonkey(KodApa85) Dev Running in Ganeti LibreNMS MariaDB Type VM Same VM OS CentOS 7.5 CPU 2 Cores Memory 4GB Disk Type M.2 Disk Space 40 GB Devices 38 Ports 1583 Health sensors 884 Load < 1.0 CppMonkey(KodApa85) Work NOC Running in Ganeti Cluster with 2x Dell PER730xd - 64GB, Dual E5-2660 v3 LibreNMS MariaDB Type VM VM OS Debian Stretch Debian Stretch CPU 4 Cores 2 Cores Memory 8GB 4GB Disk Type Raid 6, SAS Drives Disk Space 100 GB 40GB Devices 179 Ports 14495 Health sensors 2329 Load < 2.5 < 1.5 LaZyDK Home LibreNMS MariaDB Type VM - QNAP TS-453 Pro Same Server OS Ubuntu 16.04 CPU 1 vCore Memory 2GB Disk Type Raid 1, SATA Drives Disk Space 10 GB Devices 26 Ports 228 Health sensors 117 Load < 0.92 SirMaple Home LibreNMS MariaDB Type VM Same Server OS Debian 11 CPU 4 vCore Memory 4GB Disk Type Raid 1, SSD Disk Space 50 GB Devices 41 Ports 317 Health sensors 243 Load < 3.15 VVelox Home / Dev LibreNMS MariaDB Type Supermicro X7SPA-HF Same Server OS FreeBSD 12-STABLE CPU Intel Atom D525 Memory 4GB Disk Type Raid 1, SATA Disk Space 1TB Devices 17 Ports 174 Health sensors 76 Load < 3 SourceDoctor Home / Dev Running in VMWare Workstation Pro LibreNMS MariaDB Type VM Same Server OS Debian Buster CPU 2 vCore Memory 2GB Disk Type Raid 5, SSD Disk Space 20GB Devices 35 Ports 245 Health sensors 101 Load < 1 lazyb0nes Lab LibreNMS MariaDB Type VM Same Server OS RHEL 7.7 CPU 32 cores Memory 64GB Disk Type Flash San Array Disk Space 400GB Devices 670 Ports 25678 Health sensors 2457 Load 10.92 dagb Work Running in VMware. LibreNMS MariaDB Type Virtual Same Server OS CentOS 7 CPU 12 Cores Xeon 6130 Memory 8GB Disk Type SAN (SSD) Disk Space 26GB/72GB/7GB (logs/RRDs/db) Devices 650 Ports 34300 Health sensors 10500 Load 5.5 (45%)","title":"Example Hardware Setups"},{"location":"Support/Example-Hardware-Setup/#example-hardware-setups","text":"The information in this document is direct from users, it's a place for people to share their setups so you have an idea of what may be required for your install. To obtain the device, port and sensor counts you can run: select count ( * ) from devices ; select count ( * ) from ports where `deleted` = 0 ; select count ( * ) from sensors where `sensor_deleted` = 0 ;","title":"Example hardware setups"},{"location":"Support/Example-Hardware-Setup/#laf","text":"Home Running in Proxmox. LibreNMS MySQL Type Virtual Virtual OS CentOS 7 CentOS 7 CPU 2 Sockets, 4 Cores 1 Socket, 2 Cores Memory 2GB 2GB Disk Type Raid 1, SSD Raid 1, SSD Disk Space 18GB 30GB Devices 20 - Ports 133 - Health sensors 47 - Load < 0.1 < 0.1","title":"laf"},{"location":"Support/Example-Hardware-Setup/#vente-privee","text":"NOC LibreNMS MariaDB Type Dell R430 Dell R430 OS Debian 7 (dotdeb) Debian 7 (dotdeb) CPU 2 Sockets, 14 Cores 1 Socket, 2 Cores Memory 256GB 256GB Disk Type Raid 10, SSD Raid 10, SSD Disk Space 1TB 1TB Devices 1028 - Ports 26745 - Health sensors 6238 - Load < 0.5 < 0.5","title":"Vente-Priv\u00e9e"},{"location":"Support/Example-Hardware-Setup/#kkrumm","text":"Home LibreNMS MySQL Type VM Same Server OS CentOS 7 CPU 2 Sockets, 4 Cores Memory 4GB Disk Type Raid 10, SAS Drives Disk Space 40 GB Devices 12 Ports 130 Health sensors 44 Load < 2.5","title":"KKrumm"},{"location":"Support/Example-Hardware-Setup/#kkrumm_1","text":"Work LibreNMS MySQL Type HP Proliantdl380gen8 Same Server OS CentOS 7 CPU 2 Sockets, 24 Cores Memory 32GB Disk Type Raid 10, SAS Drives Disk Space 250 GB Devices 390 Ports 16167 Health sensors 3223 Load < 14.5","title":"KKrumm"},{"location":"Support/Example-Hardware-Setup/#cppmonkeykodapa85","text":"Home LibreNMS MariaDB Type i5-4690K Same Workstation OS Ubuntu 18.04.2 CPU 4 Cores Memory 16GB Disk Type Hybrid SATA Disk Space 2 TB Devices 14 Ports 0 Health sensors 70 Load < 0.5","title":"CppMonkey(KodApa85)"},{"location":"Support/Example-Hardware-Setup/#cppmonkeykodapa85_1","text":"Dev Running in Ganeti LibreNMS MariaDB Type VM Same VM OS CentOS 7.5 CPU 2 Cores Memory 4GB Disk Type M.2 Disk Space 40 GB Devices 38 Ports 1583 Health sensors 884 Load < 1.0","title":"CppMonkey(KodApa85)"},{"location":"Support/Example-Hardware-Setup/#cppmonkeykodapa85_2","text":"Work NOC Running in Ganeti Cluster with 2x Dell PER730xd - 64GB, Dual E5-2660 v3 LibreNMS MariaDB Type VM VM OS Debian Stretch Debian Stretch CPU 4 Cores 2 Cores Memory 8GB 4GB Disk Type Raid 6, SAS Drives Disk Space 100 GB 40GB Devices 179 Ports 14495 Health sensors 2329 Load < 2.5 < 1.5","title":"CppMonkey(KodApa85)"},{"location":"Support/Example-Hardware-Setup/#lazydk","text":"Home LibreNMS MariaDB Type VM - QNAP TS-453 Pro Same Server OS Ubuntu 16.04 CPU 1 vCore Memory 2GB Disk Type Raid 1, SATA Drives Disk Space 10 GB Devices 26 Ports 228 Health sensors 117 Load < 0.92","title":"LaZyDK"},{"location":"Support/Example-Hardware-Setup/#sirmaple","text":"Home LibreNMS MariaDB Type VM Same Server OS Debian 11 CPU 4 vCore Memory 4GB Disk Type Raid 1, SSD Disk Space 50 GB Devices 41 Ports 317 Health sensors 243 Load < 3.15","title":"SirMaple"},{"location":"Support/Example-Hardware-Setup/#vvelox","text":"Home / Dev LibreNMS MariaDB Type Supermicro X7SPA-HF Same Server OS FreeBSD 12-STABLE CPU Intel Atom D525 Memory 4GB Disk Type Raid 1, SATA Disk Space 1TB Devices 17 Ports 174 Health sensors 76 Load < 3","title":"VVelox"},{"location":"Support/Example-Hardware-Setup/#sourcedoctor","text":"Home / Dev Running in VMWare Workstation Pro LibreNMS MariaDB Type VM Same Server OS Debian Buster CPU 2 vCore Memory 2GB Disk Type Raid 5, SSD Disk Space 20GB Devices 35 Ports 245 Health sensors 101 Load < 1","title":"SourceDoctor"},{"location":"Support/Example-Hardware-Setup/#lazyb0nes","text":"Lab LibreNMS MariaDB Type VM Same Server OS RHEL 7.7 CPU 32 cores Memory 64GB Disk Type Flash San Array Disk Space 400GB Devices 670 Ports 25678 Health sensors 2457 Load 10.92","title":"lazyb0nes"},{"location":"Support/Example-Hardware-Setup/#dagb","text":"Work Running in VMware. LibreNMS MariaDB Type Virtual Same Server OS CentOS 7 CPU 12 Cores Xeon 6130 Memory 8GB Disk Type SAN (SSD) Disk Space 26GB/72GB/7GB (logs/RRDs/db) Devices 650 Ports 34300 Health sensors 10500 Load 5.5 (45%)","title":"dagb"},{"location":"Support/FAQ/","text":"Getting started How do I install LibreNMS? This is currently well documented within the doc folder of the installation files. Please see the following doc How do I add a device? You have two options for adding a new device into LibreNMS. 1: Using the command line via ssh you can add a new device by changing to the directory of your LibreNMS install and typing: lnms device:add [ hostname or ip ] To see all options run: lnms device:add -h Please note that if the community contains special characters such as $ then you will need to wrap it in ' . I.e: 'Pa$$w0rd' . 2: Using the web interface, go to Devices and then Add Device. Enter the details required for the device that you want to add and then click 'Add Host'. How do I get help? Getting Help What are the supported OSes for installing LibreNMS on? Supported is quite a strong word :) The 'officially' supported distros are: Ubuntu / Debian Red Hat / CentOS Gentoo However we will always aim to help wherever possible so if you are running a distro that isn't one of the above then give it a try anyway and if you need help then jump on the discord server . Do you have a demo available? We do indeed, you can find access to the demo here Support How does LibreNMS use MIBs? LibreNMS does not parse MIBs to discover sensors for devices. LibreNMS uses static discovery definitions written in YAML or PHP. Therefore, updating a MIB alone will not improve OS support, the definitions must be updated. LibreNMS only uses MIBs to make OIDs easier to read. Why do I get blank pages sometimes in the WebUI? You can enable debug information by setting APP_DEBUG=true in your .env. (Do not leave this enabled, it could leak private data) If the page you are trying to load has a substantial amount of data in it then it could be that the php memory limit needs to be increased in config.php . Why do I not see any graphs? The easiest way to check if all is well is to run ./validate.php as librenms from within your install directory. This should give you info on why things aren't working. One other reason could be a restricted snmpd.conf file or snmp view which limits the data sent back. If you use net-snmp then we suggest using the included snmpd.conf file. How do I debug pages not loading correctly? A debug system is in place which enables you to see the output from php errors, warnings and notices along with the MySQL queries that have been run for that page. You can enable debug information by setting APP_DEBUG=true in your .env. (Do not leave this enabled, it could leak private data) To see additional information, run ./scripts/composer_wrapper.php install , to install additional debug tools. This will add a debug bar at the bottom of every page that will show you detailed debug information. How do I debug the discovery process? Please see the Discovery Support document for further details. How do I debug the poller process? Please see the Poller Support document for further details. Why do I get a lot apache or rrdtool zombies in my process list? If this is related to your web service for LibreNMS then this has been tracked down to an issue within php which the developers aren't fixing. We have implemented a work around which means you shouldn't be seeing this. If you are, please report this in issue 443 . Why do I see traffic spikes in my graphs? This occurs either when a counter resets or the device sends back bogus data making it look like a counter reset. We have enabled support for setting a maximum value for rrd files for ports. Before this all rrd files were set to 100G max values, now you can enable support to limit this to the actual port speed. rrdtool tune will change the max value when the interface speed is detected as being changed (min value will be set for anything 10M or over) or when you run the included script (./scripts/tune_port.php) - see RRDTune doc SNMP ifInOctets and ifOutOctets are counters, which means they start at 0 (at device boot) and count up from there. LibreNMS records the value every 5 minutes and uses the difference between the previous value and the current value to calculate rate. (Also, this value resets to 0 when it hits the max value) Now, when the value is not recorded for awhile RRD (our time series storage) does not record a 0, it records the last value, otherwise, there would be even worse problems. Then finally we get the current ifIn/OutOctets value and record that. Now, it appears as though all of the traffic since it stopped getting values have occurred in the last 5 minute interval. So whenever you see spikes like this, it means we have not received data from the device for several polling intervals. The cause can vary quite a bit: bad snmp implementations, intermittent network connectivity, broken poller, and more. Why do I see gaps in my graphs? This is most commonly due to the poller not being able to complete it's run within 300 seconds. Check which devices are causing this by going to /poll-log/ within the Web interface. When you find the device(s) which are taking the longest you can then look at the Polling module graph under Graphs -> Poller -> Poller Modules Performance. Take a look at what modules are taking the longest and disabled un used modules. If you poll a large number of devices / ports then it's recommended to run a local recursive dns server such as pdns-recursor. Running RRDCached is also highly advised in larger installs but has benefits no matter the size. How do I change the IP / hostname of a device? There is a host rename tool called renamehost.php in your librenms root directory. When renaming you are also changing the device's IP / hostname address for monitoring. Usage: ./renamehost.php You can also rename a device in the Web UI by going to the device, then clicking settings Icon -> Edit. My device doesn't finish polling within 300 seconds We have a few things you can try: Disable unnecessary polling modules under edit device. Set a max repeater value within the snmp settings for a device. What to set this to is tricky, you really should run an snmpbulkwalk with -Cr10 through -Cr50 to see what works best. 50 is usually a good choice if the device can cope. Things aren't working correctly? Run ./validate.php as librenms from within your install. Re-run ./validate.php once you've resolved any issues raised. You have an odd issue - we'd suggest you join our discord server to discuss. What do the values mean in my graphs? The values you see are reported as metric values. Thanks to a post on Reddit here are those values: 10^-18 a - atto 10^-15 f - femto 10^-12 p - pico 10^-9 n - nano 10^-6 u - micro 10^-3 m - milli 0 (no unit) 10^3 k - kilo 10^6 M - mega 10^9 G - giga 10^12 T - tera 10^15 P - peta Why does a device show as a warning? This is indicating that the device has rebooted within the last 24 hours (by default). If you want to adjust this threshold then you can do so by setting $config['uptime_warning'] = '86400'; in config.php . The value must be in seconds. Why do I not see all interfaces in the Overall traffic graph for a device? By default numerous interface types and interface descriptions are excluded from this graph. The excluded defaults are: $config [ 'device_traffic_iftype' ][] = '/loopback/' ; $config [ 'device_traffic_iftype' ][] = '/tunnel/' ; $config [ 'device_traffic_iftype' ][] = '/virtual/' ; $config [ 'device_traffic_iftype' ][] = '/mpls/' ; $config [ 'device_traffic_iftype' ][] = '/ieee8023adLag/' ; $config [ 'device_traffic_iftype' ][] = '/l2vlan/' ; $config [ 'device_traffic_iftype' ][] = '/ppp/' ; $config [ 'device_traffic_descr' ][] = '/loopback/' ; $config [ 'device_traffic_descr' ][] = '/vlan/' ; $config [ 'device_traffic_descr' ][] = '/tunnel/' ; $config [ 'device_traffic_descr' ][] = '/bond/' ; $config [ 'device_traffic_descr' ][] = '/null/' ; $config [ 'device_traffic_descr' ][] = '/dummy/' ; If you would like to re-include l2vlan interfaces for instance, you first need to unset the config array and set your options: unset ( $config [ 'device_traffic_iftype' ]); $config [ 'device_traffic_iftype' ][] = '/loopback/' ; $config [ 'device_traffic_iftype' ][] = '/tunnel/' ; $config [ 'device_traffic_iftype' ][] = '/virtual/' ; $config [ 'device_traffic_iftype' ][] = '/mpls/' ; $config [ 'device_traffic_iftype' ][] = '/ieee8023adLag/' ; $config [ 'device_traffic_iftype' ][] = '/ppp/' ; How do I migrate my LibreNMS install to another server? If you are moving from one CPU architecture to another then you will need to dump the rrd files and re-create them. If you are in this scenario then you can use Dan Brown's migration scripts . If you are just moving to another server with the same CPU architecture then the following steps should be all that's needed: Install LibreNMS as per our normal documentation; you don't need to run through the web installer or building the sql schema. Stop cron by commenting out all lines in /etc/cron.d/librenms Dump the MySQL database librenms from your old server ( mysqldump librenms -u root -p > librenms.sql )... and import it into your new server ( mysql -u root -p librenms < librenms.sql ). Copy the rrd/ folder to the new server. Copy the .env and config.php files to the new server. Check for modified files (eg specific os, ...) with git status and migrate them. Ensure ownership of the copied files and folders (substitute your user if necessary) - chown -R librenms:librenms /opt/librenms Delete old pollers on the GUI (gear icon --> Pollers --> Pollers) Validate your installation (/opt/librenms/validate.php) Re-enable cron by uncommenting all lines in /etc/cron.d/librenms Why is my EdgeRouter device not detected? If you have service snmp description set in your config then this will be why, please remove this. For some reason Ubnt have decided setting this value should override the sysDescr value returned which breaks our detection. If you don't have that set then this may be then due to an update of EdgeOS or a new device type, please create an issue . Why are some of my disks not showing? If you are monitoring a linux server then net-snmp doesn't always expose all disks via hrStorage (HOST-RESOURCES-MIB). We have additional support which will retrieve disks via dskTable (UCD-SNMP-MIB). To expose these disks you need to add additional config to your snmpd.conf file. For example, to expose /dev/sda1 which may be mounted as /storage you can specify: disk /dev/sda1 Or disk /storage Restart snmpd and LibreNMS should populate the additional disk after a fresh discovery. Why are my disks reporting an incorrect size? There is a known issue for net-snmp, which causes it to report incorrect disk size and disk usage when the size of the disk (or raid) are larger then 16TB, a workaround has been implemented but is not active on Centos 6.8 by default due to the fact that this workaround breaks official SNMP specs, and as such could cause unexpected behaviour in other SNMP tools. You can activate the workaround by adding to /etc/snmp/snmpd.conf : realStorageUnits 0 What does mean \\\"ignore alert tag\\\" on device, component, service and port? Tag device, component, service and port to ignore alerts. Alert checks will still run. However, ignore tag can be read in alert rules. For example on device, if devices.ignore = 0 or macros.device = 1 condition is is set and ignore alert tag is on, the alert rule won't match. The alert rule is ignored. How do I clean up alerts from my switches and routers about ports being down or changing speed Some properties used for alerting (ending in _prev ) are only updated when a change is detected, and not every time the poller runs. This means that if you make a permanant change to your network such as removing a device, performing a major firmware upgrade, or downgrading a WAN connection, you may be stuck with some unresolvable alerts. If a port will be permantly down, it's best practice to configure it to be administratively down on the device to prevent malicious access. You can then only run alerts on ports with ifAdminStatus = up . Otherwise, you'll need to reset the device port state history. On the device generating alerts, use the cog button to go to the edit device page. At the top of the device settings pane is a button labelled Reset Port State - this will clear the historic state for all ports on that device, allowing any active alerts to clear. Why can't Normal and Global View users see Oxidized? Configs can often contain sensitive data. Because of that only global admins can see configs. What is the Demo User for? Demo users allow full access except adding/editing users and deleting devices and can't change passwords. Why does modifying 'Default Alert Template' fail? This template's entry could be missing in the database. Please run this from the LibreNMS directory: php artisan db:seed --class = DefaultAlertTemplateSeeder Why would alert un-mute itself? If alert un-mutes itself then it most likely means that the alert cleared and is then triggered again. Please review eventlog as it will tell you in there. How do I change the Device Type? You can change the Device Type by going to the device you would like to change, then click on the Gear Icon -> Edit. If you would like to define custom types, we suggest using Device Groups . They will be listed in the menu similarly to device types. Editing large device groups gives error messages If the device group contains large amount of devices, editing it from the UI might cause errors on the form even when all the data seems correct. This is caused by PHP's max_input_vars -variable. You should be able to confirm that this is the case by inspecting the PHP's error logs. With the basic installation on Ubuntu 22.04 LTS with Nginx and PHP 8.1 FPM this value can be tuned by editing the file /etc/php/8.1/fpm/php.ini and adjusting the value of max_input_vars to be at least the size of the large group. In larger installations a value such as 10000 should suffice. Where do I update my database credentials? If you've changed your database credentials then you will need to update LibreNMS with those new details. Please edit .env .env : DB_HOST= DB_DATABASE= DB_USERNAME= DB_PASSWORD= DB_PORT= My reverse proxy is not working Make sure your proxy is passing the proper variables. At a minimum: X-Forwarded-For and X-Forwarded-Proto (X-Forwarded-Port if needed) You also need to Set the proxy or proxies as trusted If you are using a subdirectory on the reverse proxy and not on the actual web server, you may need to set APP_URL and $config['base_url'] . My alerts aren't being delivered on time If you're running MySQL/MariaDB on a separate machine or container make sure the timezone is set properly on both the LibreNMS and MySQL/MariaDB instance. Alerts will be delivered according to MySQL/MariaDB's time, so a mismatch between the two can cause alerts to be delivered late if LibreNMS is on a timezone later than MySQL/MariaDB. My alert templates stopped working You should probably have a look in the documentation concerning the new template syntax . Since version 1.42, syntax changed, and you basically need to convert your templates to this new syntax (including the titles). How do I use trend prediction in graphs As of Ver. 1.55 a new feature has been added where you can view a simple linear prediction in port graphs. It doesn't work on non-port graphs or consolidated graphs at the time this FAQ entry was written. To view a prediction: Click on any port graph of any network device Select a From date to your liking (not earlier than the device was actually added to LNMS), and then select a future date in the To field. Click update You should now see a linear prediction line on the graph. How do I move only the DB to another server? There is already a reference how to move your whole LNMS installation to another server. But the following steps will help you to split up an \"All-in-one\" installation to one LibreNMS installation with a separate database install. *Note: This section assumes you have a MySQL/MariaDB instance Stop the apache and mysql service in you LibreNMS installation. Edit out all the cron entries in /etc/cron.d/librenms . Dump your librenms database on your current install by issuing mysqldump librenms -u root -p > librenms.sql . Stop and disable the MySQL server on your current install. On your new server make sure you create a new database with the standard install command, no need to add a user for localhost though. Copy this over to your new database server and import it with mysql -u root -p librenms < librenms.sql . Enter to mysql and add permissions with the following two commands: GRANT ALL PRIVILEGES ON librenms . * TO 'librenms' @ 'IP_OF_YOUR_LNMS_SERVER' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION ; GRANT ALL PRIVILEGES ON librenms . * TO 'librenms' @ 'FQDN_OF_YOUR_LNMS_SERVER' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION ; FLUSH PRIVILEGES ; exit ; Enable and restart MySQL server. Edit your config.php file to point the install to the new database server location. Very important : On your LibreNMS server, inside your install directory is a .env file, in it you need to edit the DBHOST paramater to point to your new server location. After all this is done, enable all the cron entries again and start apache. What are the \"optional requirements message\" when I add SNMPv3 devices? When you add a device via the WebUI you may see a little message stating \"Optional requirements are not met so some options are disabled\". Do not panic. This simply means your system does not contain openssl >= 1.1 and net-snmp >= 5.8 , which are the minimum specifications needed to be able to use SHA-224|256|384|512 as auth algorithms. For crypto algorithms AES-192, AES-256 you need net-snmp compiled with --enable-blumenthal-aes . Developing How do I add support for a new OS? Please see Supporting a new OS if you are adding all the support yourself, i.e. writing all of the supporting code. If you are only able to supply supporting info, and would like the help of others to write up the code, please follow the below steps. What information do you need to add a new OS? Please open a feature request in the community forum and provide the output of Discovery, Poller, and Snmpwalk as separate non-expiring https://p.libren.ms/ links : Please use preferably the command line to obtain the information. Especially, if snmpwalk results in a large amount of data. Replace the relevant information in these commands such as HOSTNAME and COMMUNITY. Use snmpwalk instead of snmpbulkwalk for v1 devices. These commands will automatically upload the data to LibreNMS servers. ./discovery.php -h HOSTNAME -d | ./pbin.sh lnms device:poll HOSTNAME -vv | ./pbin.sh snmpbulkwalk -OUneb -v2c -c COMMUNITY HOSTNAME . | ./pbin.sh You can use the links provided by these commands within the community post. If possible please also provide what the OS name should be if it doesn't exist already, as well as any useful link (MIBs from vendor, logo, etc etc) What can I do to help? Thanks for asking, sometimes it's not quite so obvious and everyone can contribute something different. So here are some ways you can help LibreNMS improve. Code. This is a big thing. We want this community to grow by the software developing and evolving to cater for users needs. The biggest area that people can help make this happen is by providing code support. This doesn't necessarily mean contributing code for discovering a new device: Web UI, a new look and feel has been adopted but we are not finished by any stretch of the imagination. Make suggestions, find and fix bugs, update the design / layout. Poller / Discovery code. Improving it (we think a lot can be done to speed things up), adding new device support and updating old ones. The LibreNMS main website, this is hosted on GitHub like the main repo and we accept use contributions here as well :) Hardware. We don't physically need it but if we are to add device support, it's made a whole lot easier with access to the kit via SNMP. If you've got MIBs, they are handy as well :) If you know the vendor and can get permission to use logos that's also great. Bugs. Found one? We want to know about it. Most bugs are fixed after being spotted and reported by someone, I'd love to say we are amazing developers and will fix all bugs before you spot them but that's just not true. Feature requests. Can't code / won't code. No worries, chuck a feature request into our community forum with enough detail and someone will take a look. A lot of the time this might be what interests someone, they need the same feature or they just have time. Please be patient, everyone who contributes does so in their own time. Documentation. Documentation can always be improved and every little bit helps. Not all features are currently documented or documented well, there's spelling mistakes etc. It's very easy to submit updates through the GitHub website , no git experience needed. Be nice, this is the foundation of this project. We expect everyone to be nice. People will fall out, people will disagree but please do it so in a respectable way. Ask questions. Sometimes just by asking questions you prompt deeper conversations that can lead us to somewhere amazing so please never be afraid to ask a question. How can I test another users branch? LibreNMS can and is developed by anyone, this means someone may be working on a new feature or support for a device that you want. It can be helpful for others to test these new features, using Git, this is made easy. cd /opt/librenms Firstly ensure that your current branch is in good state: git status If you see nothing to commit, working directory clean then let's go for it :) Let's say that you want to test a users (f0o) new development branch (issue-1337) then you can do the following: git remote add f0o https://github.com/f0o/librenms.git git remote update f0o git checkout issue-1337 Once you are done testing, you can easily switch back to the master branch: git checkout master If you want to pull any new updates provided by f0o's branch then whilst you are still in it, do the following: git pull f0o issue-1337","title":"FAQ"},{"location":"Support/FAQ/#getting-started","text":"","title":"Getting started"},{"location":"Support/FAQ/#how-do-i-install-librenms","text":"This is currently well documented within the doc folder of the installation files. Please see the following doc","title":" How do I install LibreNMS?"},{"location":"Support/FAQ/#how-do-i-add-a-device","text":"You have two options for adding a new device into LibreNMS. 1: Using the command line via ssh you can add a new device by changing to the directory of your LibreNMS install and typing: lnms device:add [ hostname or ip ] To see all options run: lnms device:add -h Please note that if the community contains special characters such as $ then you will need to wrap it in ' . I.e: 'Pa$$w0rd' . 2: Using the web interface, go to Devices and then Add Device. Enter the details required for the device that you want to add and then click 'Add Host'.","title":" How do I add a device?"},{"location":"Support/FAQ/#how-do-i-get-help","text":"Getting Help","title":" How do I get help?"},{"location":"Support/FAQ/#what-are-the-supported-oses-for-installing-librenms-on","text":"Supported is quite a strong word :) The 'officially' supported distros are: Ubuntu / Debian Red Hat / CentOS Gentoo However we will always aim to help wherever possible so if you are running a distro that isn't one of the above then give it a try anyway and if you need help then jump on the discord server .","title":" What are the supported OSes for installing LibreNMS on?"},{"location":"Support/FAQ/#do-you-have-a-demo-available","text":"We do indeed, you can find access to the demo here","title":" Do you have a demo available?"},{"location":"Support/FAQ/#support","text":"","title":"Support"},{"location":"Support/FAQ/#how-does-librenms-use-mibs","text":"LibreNMS does not parse MIBs to discover sensors for devices. LibreNMS uses static discovery definitions written in YAML or PHP. Therefore, updating a MIB alone will not improve OS support, the definitions must be updated. LibreNMS only uses MIBs to make OIDs easier to read.","title":"How does LibreNMS use MIBs?"},{"location":"Support/FAQ/#why-do-i-get-blank-pages-sometimes-in-the-webui","text":"You can enable debug information by setting APP_DEBUG=true in your .env. (Do not leave this enabled, it could leak private data) If the page you are trying to load has a substantial amount of data in it then it could be that the php memory limit needs to be increased in config.php .","title":" Why do I get blank pages sometimes in the WebUI?"},{"location":"Support/FAQ/#why-do-i-not-see-any-graphs","text":"The easiest way to check if all is well is to run ./validate.php as librenms from within your install directory. This should give you info on why things aren't working. One other reason could be a restricted snmpd.conf file or snmp view which limits the data sent back. If you use net-snmp then we suggest using the included snmpd.conf file.","title":" Why do I not see any graphs?"},{"location":"Support/FAQ/#how-do-i-debug-pages-not-loading-correctly","text":"A debug system is in place which enables you to see the output from php errors, warnings and notices along with the MySQL queries that have been run for that page. You can enable debug information by setting APP_DEBUG=true in your .env. (Do not leave this enabled, it could leak private data) To see additional information, run ./scripts/composer_wrapper.php install , to install additional debug tools. This will add a debug bar at the bottom of every page that will show you detailed debug information.","title":" How do I debug pages not loading correctly?"},{"location":"Support/FAQ/#how-do-i-debug-the-discovery-process","text":"Please see the Discovery Support document for further details.","title":" How do I debug the discovery process?"},{"location":"Support/FAQ/#how-do-i-debug-the-poller-process","text":"Please see the Poller Support document for further details.","title":" How do I debug the poller process?"},{"location":"Support/FAQ/#why-do-i-get-a-lot-apache-or-rrdtool-zombies-in-my-process-list","text":"If this is related to your web service for LibreNMS then this has been tracked down to an issue within php which the developers aren't fixing. We have implemented a work around which means you shouldn't be seeing this. If you are, please report this in issue 443 .","title":" Why do I get a lot apache or rrdtool zombies in my process list?"},{"location":"Support/FAQ/#why-do-i-see-traffic-spikes-in-my-graphs","text":"This occurs either when a counter resets or the device sends back bogus data making it look like a counter reset. We have enabled support for setting a maximum value for rrd files for ports. Before this all rrd files were set to 100G max values, now you can enable support to limit this to the actual port speed. rrdtool tune will change the max value when the interface speed is detected as being changed (min value will be set for anything 10M or over) or when you run the included script (./scripts/tune_port.php) - see RRDTune doc SNMP ifInOctets and ifOutOctets are counters, which means they start at 0 (at device boot) and count up from there. LibreNMS records the value every 5 minutes and uses the difference between the previous value and the current value to calculate rate. (Also, this value resets to 0 when it hits the max value) Now, when the value is not recorded for awhile RRD (our time series storage) does not record a 0, it records the last value, otherwise, there would be even worse problems. Then finally we get the current ifIn/OutOctets value and record that. Now, it appears as though all of the traffic since it stopped getting values have occurred in the last 5 minute interval. So whenever you see spikes like this, it means we have not received data from the device for several polling intervals. The cause can vary quite a bit: bad snmp implementations, intermittent network connectivity, broken poller, and more.","title":" Why do I see traffic spikes in my graphs?"},{"location":"Support/FAQ/#why-do-i-see-gaps-in-my-graphs","text":"This is most commonly due to the poller not being able to complete it's run within 300 seconds. Check which devices are causing this by going to /poll-log/ within the Web interface. When you find the device(s) which are taking the longest you can then look at the Polling module graph under Graphs -> Poller -> Poller Modules Performance. Take a look at what modules are taking the longest and disabled un used modules. If you poll a large number of devices / ports then it's recommended to run a local recursive dns server such as pdns-recursor. Running RRDCached is also highly advised in larger installs but has benefits no matter the size.","title":" Why do I see gaps in my graphs?"},{"location":"Support/FAQ/#how-do-i-change-the-ip-hostname-of-a-device","text":"There is a host rename tool called renamehost.php in your librenms root directory. When renaming you are also changing the device's IP / hostname address for monitoring. Usage: ./renamehost.php You can also rename a device in the Web UI by going to the device, then clicking settings Icon -> Edit.","title":" How do I change the IP / hostname of a device?"},{"location":"Support/FAQ/#my-device-doesnt-finish-polling-within-300-seconds","text":"We have a few things you can try: Disable unnecessary polling modules under edit device. Set a max repeater value within the snmp settings for a device. What to set this to is tricky, you really should run an snmpbulkwalk with -Cr10 through -Cr50 to see what works best. 50 is usually a good choice if the device can cope.","title":" My device doesn't finish polling within 300 seconds"},{"location":"Support/FAQ/#things-arent-working-correctly","text":"Run ./validate.php as librenms from within your install. Re-run ./validate.php once you've resolved any issues raised. You have an odd issue - we'd suggest you join our discord server to discuss.","title":" Things aren't working correctly?"},{"location":"Support/FAQ/#what-do-the-values-mean-in-my-graphs","text":"The values you see are reported as metric values. Thanks to a post on Reddit here are those values: 10^-18 a - atto 10^-15 f - femto 10^-12 p - pico 10^-9 n - nano 10^-6 u - micro 10^-3 m - milli 0 (no unit) 10^3 k - kilo 10^6 M - mega 10^9 G - giga 10^12 T - tera 10^15 P - peta","title":" What do the values mean in my graphs?"},{"location":"Support/FAQ/#why-does-a-device-show-as-a-warning","text":"This is indicating that the device has rebooted within the last 24 hours (by default). If you want to adjust this threshold then you can do so by setting $config['uptime_warning'] = '86400'; in config.php . The value must be in seconds.","title":" Why does a device show as a warning?"},{"location":"Support/FAQ/#why-do-i-not-see-all-interfaces-in-the-overall-traffic-graph-for-a-device","text":"By default numerous interface types and interface descriptions are excluded from this graph. The excluded defaults are: $config [ 'device_traffic_iftype' ][] = '/loopback/' ; $config [ 'device_traffic_iftype' ][] = '/tunnel/' ; $config [ 'device_traffic_iftype' ][] = '/virtual/' ; $config [ 'device_traffic_iftype' ][] = '/mpls/' ; $config [ 'device_traffic_iftype' ][] = '/ieee8023adLag/' ; $config [ 'device_traffic_iftype' ][] = '/l2vlan/' ; $config [ 'device_traffic_iftype' ][] = '/ppp/' ; $config [ 'device_traffic_descr' ][] = '/loopback/' ; $config [ 'device_traffic_descr' ][] = '/vlan/' ; $config [ 'device_traffic_descr' ][] = '/tunnel/' ; $config [ 'device_traffic_descr' ][] = '/bond/' ; $config [ 'device_traffic_descr' ][] = '/null/' ; $config [ 'device_traffic_descr' ][] = '/dummy/' ; If you would like to re-include l2vlan interfaces for instance, you first need to unset the config array and set your options: unset ( $config [ 'device_traffic_iftype' ]); $config [ 'device_traffic_iftype' ][] = '/loopback/' ; $config [ 'device_traffic_iftype' ][] = '/tunnel/' ; $config [ 'device_traffic_iftype' ][] = '/virtual/' ; $config [ 'device_traffic_iftype' ][] = '/mpls/' ; $config [ 'device_traffic_iftype' ][] = '/ieee8023adLag/' ; $config [ 'device_traffic_iftype' ][] = '/ppp/' ;","title":" Why do I not see all interfaces in the Overall traffic graph for a device?"},{"location":"Support/FAQ/#how-do-i-migrate-my-librenms-install-to-another-server","text":"If you are moving from one CPU architecture to another then you will need to dump the rrd files and re-create them. If you are in this scenario then you can use Dan Brown's migration scripts . If you are just moving to another server with the same CPU architecture then the following steps should be all that's needed: Install LibreNMS as per our normal documentation; you don't need to run through the web installer or building the sql schema. Stop cron by commenting out all lines in /etc/cron.d/librenms Dump the MySQL database librenms from your old server ( mysqldump librenms -u root -p > librenms.sql )... and import it into your new server ( mysql -u root -p librenms < librenms.sql ). Copy the rrd/ folder to the new server. Copy the .env and config.php files to the new server. Check for modified files (eg specific os, ...) with git status and migrate them. Ensure ownership of the copied files and folders (substitute your user if necessary) - chown -R librenms:librenms /opt/librenms Delete old pollers on the GUI (gear icon --> Pollers --> Pollers) Validate your installation (/opt/librenms/validate.php) Re-enable cron by uncommenting all lines in /etc/cron.d/librenms","title":" How do I migrate my LibreNMS install to another server?"},{"location":"Support/FAQ/#why-is-my-edgerouter-device-not-detected","text":"If you have service snmp description set in your config then this will be why, please remove this. For some reason Ubnt have decided setting this value should override the sysDescr value returned which breaks our detection. If you don't have that set then this may be then due to an update of EdgeOS or a new device type, please create an issue .","title":" Why is my EdgeRouter device not detected?"},{"location":"Support/FAQ/#why-are-some-of-my-disks-not-showing","text":"If you are monitoring a linux server then net-snmp doesn't always expose all disks via hrStorage (HOST-RESOURCES-MIB). We have additional support which will retrieve disks via dskTable (UCD-SNMP-MIB). To expose these disks you need to add additional config to your snmpd.conf file. For example, to expose /dev/sda1 which may be mounted as /storage you can specify: disk /dev/sda1 Or disk /storage Restart snmpd and LibreNMS should populate the additional disk after a fresh discovery.","title":" Why are some of my disks not showing?"},{"location":"Support/FAQ/#why-are-my-disks-reporting-an-incorrect-size","text":"There is a known issue for net-snmp, which causes it to report incorrect disk size and disk usage when the size of the disk (or raid) are larger then 16TB, a workaround has been implemented but is not active on Centos 6.8 by default due to the fact that this workaround breaks official SNMP specs, and as such could cause unexpected behaviour in other SNMP tools. You can activate the workaround by adding to /etc/snmp/snmpd.conf : realStorageUnits 0","title":" Why are my disks reporting an incorrect size?"},{"location":"Support/FAQ/#what-does-mean-ignore-alert-tag-on-device-component-service-and-port","text":"Tag device, component, service and port to ignore alerts. Alert checks will still run. However, ignore tag can be read in alert rules. For example on device, if devices.ignore = 0 or macros.device = 1 condition is is set and ignore alert tag is on, the alert rule won't match. The alert rule is ignored.","title":" What does mean \\\"ignore alert tag\\\" on device, component, service and port?"},{"location":"Support/FAQ/#how-do-i-clean-up-alerts-from-my-switches-and-routers-about-ports-being-down-or-changing-speed","text":"Some properties used for alerting (ending in _prev ) are only updated when a change is detected, and not every time the poller runs. This means that if you make a permanant change to your network such as removing a device, performing a major firmware upgrade, or downgrading a WAN connection, you may be stuck with some unresolvable alerts. If a port will be permantly down, it's best practice to configure it to be administratively down on the device to prevent malicious access. You can then only run alerts on ports with ifAdminStatus = up . Otherwise, you'll need to reset the device port state history. On the device generating alerts, use the cog button to go to the edit device page. At the top of the device settings pane is a button labelled Reset Port State - this will clear the historic state for all ports on that device, allowing any active alerts to clear.","title":" How do I clean up alerts from my switches and routers about ports being down or changing speed"},{"location":"Support/FAQ/#why-cant-normal-and-global-view-users-see-oxidized","text":"Configs can often contain sensitive data. Because of that only global admins can see configs.","title":" Why can't Normal and Global View users see Oxidized?"},{"location":"Support/FAQ/#what-is-the-demo-user-for","text":"Demo users allow full access except adding/editing users and deleting devices and can't change passwords.","title":" What is the Demo User for?"},{"location":"Support/FAQ/#why-does-modifying-default-alert-template-fail","text":"This template's entry could be missing in the database. Please run this from the LibreNMS directory: php artisan db:seed --class = DefaultAlertTemplateSeeder","title":" Why does modifying 'Default Alert Template' fail?"},{"location":"Support/FAQ/#why-would-alert-un-mute-itself","text":"If alert un-mutes itself then it most likely means that the alert cleared and is then triggered again. Please review eventlog as it will tell you in there.","title":" Why would alert un-mute itself?"},{"location":"Support/FAQ/#how-do-i-change-the-device-type","text":"You can change the Device Type by going to the device you would like to change, then click on the Gear Icon -> Edit. If you would like to define custom types, we suggest using Device Groups . They will be listed in the menu similarly to device types.","title":" How do I change the Device Type?"},{"location":"Support/FAQ/#editing-large-device-groups-gives-error-messages","text":"If the device group contains large amount of devices, editing it from the UI might cause errors on the form even when all the data seems correct. This is caused by PHP's max_input_vars -variable. You should be able to confirm that this is the case by inspecting the PHP's error logs. With the basic installation on Ubuntu 22.04 LTS with Nginx and PHP 8.1 FPM this value can be tuned by editing the file /etc/php/8.1/fpm/php.ini and adjusting the value of max_input_vars to be at least the size of the large group. In larger installations a value such as 10000 should suffice.","title":" Editing large device groups gives error messages"},{"location":"Support/FAQ/#where-do-i-update-my-database-credentials","text":"If you've changed your database credentials then you will need to update LibreNMS with those new details. Please edit .env .env : DB_HOST= DB_DATABASE= DB_USERNAME= DB_PASSWORD= DB_PORT=","title":"Where do I update my database credentials?"},{"location":"Support/FAQ/#my-reverse-proxy-is-not-working","text":"Make sure your proxy is passing the proper variables. At a minimum: X-Forwarded-For and X-Forwarded-Proto (X-Forwarded-Port if needed) You also need to Set the proxy or proxies as trusted If you are using a subdirectory on the reverse proxy and not on the actual web server, you may need to set APP_URL and $config['base_url'] .","title":"My reverse proxy is not working"},{"location":"Support/FAQ/#my-alerts-arent-being-delivered-on-time","text":"If you're running MySQL/MariaDB on a separate machine or container make sure the timezone is set properly on both the LibreNMS and MySQL/MariaDB instance. Alerts will be delivered according to MySQL/MariaDB's time, so a mismatch between the two can cause alerts to be delivered late if LibreNMS is on a timezone later than MySQL/MariaDB.","title":"My alerts aren't being delivered on time"},{"location":"Support/FAQ/#my-alert-templates-stopped-working","text":"You should probably have a look in the documentation concerning the new template syntax . Since version 1.42, syntax changed, and you basically need to convert your templates to this new syntax (including the titles).","title":"My alert templates stopped working"},{"location":"Support/FAQ/#how-do-i-use-trend-prediction-in-graphs","text":"As of Ver. 1.55 a new feature has been added where you can view a simple linear prediction in port graphs. It doesn't work on non-port graphs or consolidated graphs at the time this FAQ entry was written. To view a prediction: Click on any port graph of any network device Select a From date to your liking (not earlier than the device was actually added to LNMS), and then select a future date in the To field. Click update You should now see a linear prediction line on the graph.","title":"How do I use trend prediction in graphs"},{"location":"Support/FAQ/#how-do-i-move-only-the-db-to-another-server","text":"There is already a reference how to move your whole LNMS installation to another server. But the following steps will help you to split up an \"All-in-one\" installation to one LibreNMS installation with a separate database install. *Note: This section assumes you have a MySQL/MariaDB instance Stop the apache and mysql service in you LibreNMS installation. Edit out all the cron entries in /etc/cron.d/librenms . Dump your librenms database on your current install by issuing mysqldump librenms -u root -p > librenms.sql . Stop and disable the MySQL server on your current install. On your new server make sure you create a new database with the standard install command, no need to add a user for localhost though. Copy this over to your new database server and import it with mysql -u root -p librenms < librenms.sql . Enter to mysql and add permissions with the following two commands: GRANT ALL PRIVILEGES ON librenms . * TO 'librenms' @ 'IP_OF_YOUR_LNMS_SERVER' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION ; GRANT ALL PRIVILEGES ON librenms . * TO 'librenms' @ 'FQDN_OF_YOUR_LNMS_SERVER' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION ; FLUSH PRIVILEGES ; exit ; Enable and restart MySQL server. Edit your config.php file to point the install to the new database server location. Very important : On your LibreNMS server, inside your install directory is a .env file, in it you need to edit the DBHOST paramater to point to your new server location. After all this is done, enable all the cron entries again and start apache.","title":"How do I move only the DB to another server?"},{"location":"Support/FAQ/#what-are-the-optional-requirements-message-when-i-add-snmpv3-devices","text":"When you add a device via the WebUI you may see a little message stating \"Optional requirements are not met so some options are disabled\". Do not panic. This simply means your system does not contain openssl >= 1.1 and net-snmp >= 5.8 , which are the minimum specifications needed to be able to use SHA-224|256|384|512 as auth algorithms. For crypto algorithms AES-192, AES-256 you need net-snmp compiled with --enable-blumenthal-aes .","title":"What are the \"optional requirements message\" when I add SNMPv3 devices?"},{"location":"Support/FAQ/#developing","text":"","title":"Developing"},{"location":"Support/FAQ/#how-do-i-add-support-for-a-new-os","text":"Please see Supporting a new OS if you are adding all the support yourself, i.e. writing all of the supporting code. If you are only able to supply supporting info, and would like the help of others to write up the code, please follow the below steps.","title":" How do I add support for a new OS?"},{"location":"Support/FAQ/#what-information-do-you-need-to-add-a-new-os","text":"Please open a feature request in the community forum and provide the output of Discovery, Poller, and Snmpwalk as separate non-expiring https://p.libren.ms/ links : Please use preferably the command line to obtain the information. Especially, if snmpwalk results in a large amount of data. Replace the relevant information in these commands such as HOSTNAME and COMMUNITY. Use snmpwalk instead of snmpbulkwalk for v1 devices. These commands will automatically upload the data to LibreNMS servers. ./discovery.php -h HOSTNAME -d | ./pbin.sh lnms device:poll HOSTNAME -vv | ./pbin.sh snmpbulkwalk -OUneb -v2c -c COMMUNITY HOSTNAME . | ./pbin.sh You can use the links provided by these commands within the community post. If possible please also provide what the OS name should be if it doesn't exist already, as well as any useful link (MIBs from vendor, logo, etc etc)","title":" What information do you need to add a new OS?"},{"location":"Support/FAQ/#what-can-i-do-to-help","text":"Thanks for asking, sometimes it's not quite so obvious and everyone can contribute something different. So here are some ways you can help LibreNMS improve. Code. This is a big thing. We want this community to grow by the software developing and evolving to cater for users needs. The biggest area that people can help make this happen is by providing code support. This doesn't necessarily mean contributing code for discovering a new device: Web UI, a new look and feel has been adopted but we are not finished by any stretch of the imagination. Make suggestions, find and fix bugs, update the design / layout. Poller / Discovery code. Improving it (we think a lot can be done to speed things up), adding new device support and updating old ones. The LibreNMS main website, this is hosted on GitHub like the main repo and we accept use contributions here as well :) Hardware. We don't physically need it but if we are to add device support, it's made a whole lot easier with access to the kit via SNMP. If you've got MIBs, they are handy as well :) If you know the vendor and can get permission to use logos that's also great. Bugs. Found one? We want to know about it. Most bugs are fixed after being spotted and reported by someone, I'd love to say we are amazing developers and will fix all bugs before you spot them but that's just not true. Feature requests. Can't code / won't code. No worries, chuck a feature request into our community forum with enough detail and someone will take a look. A lot of the time this might be what interests someone, they need the same feature or they just have time. Please be patient, everyone who contributes does so in their own time. Documentation. Documentation can always be improved and every little bit helps. Not all features are currently documented or documented well, there's spelling mistakes etc. It's very easy to submit updates through the GitHub website , no git experience needed. Be nice, this is the foundation of this project. We expect everyone to be nice. People will fall out, people will disagree but please do it so in a respectable way. Ask questions. Sometimes just by asking questions you prompt deeper conversations that can lead us to somewhere amazing so please never be afraid to ask a question.","title":" What can I do to help?"},{"location":"Support/FAQ/#how-can-i-test-another-users-branch","text":"LibreNMS can and is developed by anyone, this means someone may be working on a new feature or support for a device that you want. It can be helpful for others to test these new features, using Git, this is made easy. cd /opt/librenms Firstly ensure that your current branch is in good state: git status If you see nothing to commit, working directory clean then let's go for it :) Let's say that you want to test a users (f0o) new development branch (issue-1337) then you can do the following: git remote add f0o https://github.com/f0o/librenms.git git remote update f0o git checkout issue-1337 Once you are done testing, you can easily switch back to the master branch: git checkout master If you want to pull any new updates provided by f0o's branch then whilst you are still in it, do the following: git pull f0o issue-1337","title":" How can I test another users branch?"},{"location":"Support/Features/","text":"Features Here's a brief list of supported features, some might be missing. If you think something is missing, feel free to ask us. Auto discovery Alerting Multiple environment sensors support Multiple protocols data collection (STP, OSPF, BGP etc) VLAN, ARP and FDB table collection Customizable Dashboards Device Backup integration (Oxidized, RANCID) Distributed Polling Multiple Authentication Methods (MySQL, LDAP, Active Directory, HTTP) NetFlow, sFlow, IPFIX (NfSen) Service monitoring (Nagios Plugins) Syslog (Integrated, Graylog) Traffic Billing (Quota, 95th Percentile) Two Factor Authentication API Auto Updating Supported Vendors Here's a list of supported vendors, some might be missing. If you are unsure of whether your device is supported or not, feel free to ask us. 3 3Com A A10 Networks Acano OS Accedian AEN Adtran AOS ADVA FSP150CC ADVA FSP3000 R7 ADVA OptiSwitch Advantech Aerohive HiveOS Airconsole Server AIX AKCP SensorProbe Alcatel OmniPCX Alcatel-Lucent Enterprise Stellar Wireless OS (AWOS) Alcatel-Lucent OS Alcoma ALGCOM DC UPS Allied Telesis Wireless (TQ) Alliedware Alliedware Plus Allworx VoIP Alpha Comp@s Alpha CXC HP Controller Alpha FXM Alpine OptoElectronics TDCM-EDFA platform AlteonOS Alvarion Breeze Anue AnyOS APC Environmental Monitoring Unit APC ePDU APC Management Module APC MGE UPS Apex Lynx Apex Plus Apple AirPort Apple OS X Aprisa ApsoluteOS ArbOS Areca RAID Subsystem Arista EOS Arista MOS Array Networks Arris Apex Arris CMTS Arris D5 Universal EdgeQAM ARRIS DOCSIS Arris Satellite Receiver Aruba Clearpass Aruba Instant ArubaOS ArubaOS-CX Ascom Asentria SiteBoss AsusWRT Merlin Aten PDU Audiocodes Automatic Transfer Switch Avaya Scopia AvediaPlayer Receivers AvediaStream Encoder Aviat WTM Avocent Avtech Environment Sensor AXIS Audio Appliances AXIS Network Camera AXIS Network Document Server B Barco Clickshare Barracuda Email Security Gateway Barracuda Load Balancer Barracuda NG Firewall Barracuda Web Application Firewall BATS AATS BDCOM(tm) Software BeagleBoard Benu Bintec Be.IP Plus Bintec Smart Router BKE BKtel Blade Network Technologies BladeShelter PDU by PowerTek Blue Coat PacketShaper Blue Coat SSL Visibility Bluecat Networks BlueCoat ProxySG Broadcom BCM963xx Brocade FabricOS Brocade IronWare Brocade NOS Brocade ServerIron Brother Printer BTI SA-800 Buffalo C C&C Power Commander plus Calix AXOS Calix B6 System Calix EXA Calix Legacy Cambium Cambium CMM Cambium CMM4 Cambium cnMatrix Cambium cnPilot Cambium cnPilot Router Cambium cnWave60 Cambium epmp Cambium PTP 250 Cambium PTP 300/500 Cambium PTP 600 Cambium PTP 650 Cambium PTP 670 Cambium PTP 800 Canon Printer Carel pCOWeb cdata Ceragon CeraOS CET TSI Controller Chatsworth PDU Check Point GAiA CheckPoint SecurePlatform Christie Projector Ciena SAOS Ciena Service Delivery Switch Ciena Waveserver Ciena Z-Series cirpack Cisco ACE Cisco ACS Cisco APIC Cisco ASA Cisco AsyncOS Cisco Catalyst 1900 Cisco CatOS Cisco EPC Cisco FTD Cisco FX-OS Cisco Identity Services Engine Cisco Integrated Management Controller Cisco Intrusion Prevention System Cisco IOS Cisco IOS-XE Cisco IOS-XR Cisco ME1200 Cisco Nexus 3550 Series Cisco NX-OS Cisco ONS Cisco PIX-OS Cisco SAN-OS Cisco Satellite Receiver Cisco SCE Cisco Services Ready Platform Cisco Small Business Cisco Unified Communications Manager Cisco Voice Gateway Cisco WAAS Cisco Wireless Access Point Cisco WLC Citrix Netscaler Comet System Web Sensor Comtrol Industrial Switch Controlbox TH-332B CoreOS Corero CMS Coriant TNMS CradlePoint WiPipe CTC Union Cumulus Linux CXR Networks TS Cyberoam UTM Cyberpower D D-Link Access Point D-Link Switch Dahua NVR Dantel Webmon Dantherm Dasan NOS Datacom dd-wrt DDN Storage Deliberant OS Dell DRAC Dell EMC Networking OS10 Enterprise Dell EqualLogic Dell Laser Dell Networking OS Dell OpenManage Enterprise Modular Dell PowerConnect Dell PowerVault Dell PowerVault MD Dell Rack PDU Dell Remote Console Dell Storage Dell UPS Delta Orion Controller Delta UPS Develop Printer DHCPatriot Digipower Digital China Networks DKT Comega DPS Telecom NetGuardian DragonflyBSD Dragonwave Harmony Enhanced Dragonwave Horizon Compact Dragonwave Horizon Compact Plus Dragonwave Horizon Duo DrayTek DVB Modulator & Ampiflier DVB-T Transmitter E E3 Meter E3 Meter DataConcentrator Eagle-I East Eaton ATS Eaton Matrix Eaton MGE PDU Eaton PDU Eaton SC200 Controller Eaton UPS EDFA Edgecore EdgeOS EdgeSwitch EDS EfficientIP SOLIDserver Ekinops Optical Eltek Valere Eltek Valere eNexus Eltek WebPower Eltex OLT Eltex-MES21xx Eltex-MES23xx EMC Data Domain EMC Flare OS EMC Isilon OneFS Emerson Energy System Emerson Netsure Endian EndRun EnGenius Access Point enLogic PDU Enterasys Epson Printer Epson Projector Ericsson 6600 series Ericsson IPOS Ericsson LG iPECS UCP Ericsson MINI-LINK Ericsson Traffic Node EricssonLG IPECS ES Etherwan Managed Switch EUROstor RAID Subsystem Exagrid Exalt ExtendAir Exinda Extrahop Appliance Extreme BOSS Extreme SLX-OS Extreme VOSS Extreme Wireless Convergence Extreme XOS Extremeware F F5 Big IP F5OS Fiberhome FiberHome Switch Fibernet XMUX 4+ Fiberstore GBN Fiberstore Switch Firebrick FireEye OS Force10 FTOS Fortinet Application Deliver Controller Fortinet FortiAuthenticator Fortinet Fortigate Fortinet FortiMail Fortinet FortiSandbox Fortinet FortiSwitch Fortinet FortiVoice Fortinet FortiWeb Fortinet FortiWLC FortiOS Foundry Networking FreeBSD FreshTomato FS.COM monitored pdu Fujitsu Fujitsu ETERNUS FUJITSU iRMC Fujitsu NAS FusionHub G Gamatronic UPS Stack Gandi Packet Journey GE Digital Energy UPS GE MDS Orbit network Operating System GE Pulsar Geist PDU Geist Watchdog Generex UPS SNMP adapter Generic Generic Device Gestetner Printer GigaVUE Glass Way WDM EYDFA Grandstream HT Greenbone OS Gude Expert Transfer Switch gwd H Halon Hanwha Techwin HAProxy ALOHA Hardware Appliance Hatteras Overdue DSLAM Helios IP Hikvision Camera Hikvision NVR Hillstone StoneOs Himoinsa Generator Sets Hirschmann Railswitch Hitachi Storage Virtualization Operating System (SVOS) HP Blade Management HP MSM HP PDU Management Module HP Print server HP ProCurve HP UPS HP Virtual Connect HPE 3PAR HPE Comware HPE Integrated Lights Out HPE iPDU HPE Managed Power Distribution Unit HPE MSA HPE OpenVMS HPE StoreEver MSL Huawei iBMC Management Console Huawei OceanStor Huawei SmartAX Huawei SmartAX MDU Huawei SMU Huawei UPS Huawei VRP HWg Poseidon HWg STE HWg STE2 HWg WLD Hytera Repeater I IBM AMM IBM DPI IBM i IBM IMM IBM Networking Operating System IBM Tape Library iBoot PDU Icotera OS ICR-OS ICT Digital Series Power Supply ICT Distribution Series ICT Modular Power System ICT Sine Wave Inverter Ifotec IgniteNet FusionSwitch IgniteNet HeliOS Illustra Network Camera Imco Power Imco Power LS110 Infinera Groove Infinera PON Infinera XTM Infoblox Ingrasys iPoMan Innovaphone ISDN Inteno GW IONODES IP Infusion OcNOS IP Office Firmware ITWatchDogs Goose J Jacarta InterSeptor Janitza Janitza UMG96 Juniper EX2500 Juniper JunOS Juniper JunOSe Juniper JWOS Juniper MSS Juniper ScreenOS K Kemp Loadbalancer Konica-Minolta Printer KTI Kyocera Mita Printer L Lambdatrail Lancom OS Lanier Printer LANTIME v6 Lantronix SLC Lantronix UDS Last Mile Gear CTM Lenovo Cloud Network Operating System Lenovo XCC IMPI LenovoEMC Lexmark Printer Liebert LigoWave Infinity LigoWave LigoOS Linksys Smart Switch Linux Loadbalancer.org LogMaster Loop Telecom Operating System M m0n0wall Maipu MyPower Marathon UPS McAfee Linux OS - ATD McAfee Linux OS - NSP McAfee SIEM Nitro Mcafee Web Gateway MegaTec NetAgent II Mellanox Meraki AP Meraki MX Appliance Meraki Switch Microsemi PowerDsine Midspan PoE Microsemi Synchronization Supply Unit Microsoft Windows Mikrotik RouterOS Mikrotik SwOS Mimosa Minkels RMS Mirth Connect Mitel Standard Linux MNI Microwave Radio MobileIron Montclair EDFA Motorola DOCSIS Cable Modem Motorola Netopia Moxa Moxa AWK MRV LambdaDriver MRV OptiDriver N NEC Univerge NetApp NetBotz Environment Sensor NetBSD Netgear ProSafe NetMan Plus NetModule Netonix NetScaler SD-WAN Network Management Unit Nexans Nimble OS NOKIA ISAM Nokia SR OS (TiMOS) Novell Netware NRG Printer NTI Nutanix AOS NVT Phybridge O OKI Printer Omnitron iConverter OneAccess Open Access Netspire Open-E OpenBSD Opengear OpenIndiana OpenSystems OpenWrt OPNsense Oracle ILOM Orvaldi UPS P Packetflux SiteMonitor Packetlight Panasonic KX-NS Series Panduit PDU PanOS Papouch QUIDO Papouch TME Paradyne (by Zhone) Patton SmartNode PBI Digital Decoder PBN PBN P2P CP100 Series Platform Pegasus Pepwave Perle pfSense Pica8 OS Ping only PLANET Polycom Videoconferencing System Powercode BMU PowerWalker UPS PowerWalker VFI Prime Infrastructure Procera Networks Proxim proxmox pve Pulse Secure Q QNAP TurboNAS QTECH Quanta QuantaStor R Radlan RADWIN Raisecom ROAP Raisecom ROS Raritan EMX Raritan KVM Raritan PDU RAy RAy3 RecoveryOS Red Lion Sixnet Redback Networks SmartEdge Redlion N-Tron Ribbon GSX Ribbon SBC Ricoh Printer Rittal CMC Rittal CMC III PU Rittal IT Chiller Rittal LCP Rittal LCP DX Chiller Riverbed RNX UPDU Rohde & Schwarz Rubrik Ruckus Wireless HotZone Ruckus Wireless SmartZone Ruckus Wireless Unleashed Ruckus Wireless ZoneDirector Ruijie Networks S SAF CFM SAF Integra B SAF Integra E SAF Integra W SAF Integra X SAF Tehnika Sagem ADR IONOS Samsung Printer Savin Printer Schleifenbauer SPDM Schneider PowerLogic SCS KS Sensatronics EM1 Sensatronics ITTM ServersCheck ServerTech Sentry3 ServerTech Sentry4 Sharp Printer SIAE Alfoplus 80HD Siemens Ruggedcom Switches (ROS) Siemens SCALANCE Siklu Wireless Silver Peak VXOA Sinetica UPS SM-OS SmartOptics DCP-M Series SmartOptics M-Series SmartOptics T-Series snr snr-erd Socomec Net Vision Socomec PDU Software Appliance Solid Optics EDFAMUX SonicWALL Sophos UTM Firewall Sophos XG Stormshield NS-BSD Stulz GMBH Klimatechnik Sub10 Systems Sun OpenSolaris Sun Solaris Supermicro Switch Symbol AP SyncServer Synology DSM T Tait Infra93 Series Tait TN Admin OS Tandberg Magnum technicolor TG MediaAcces Tegile IntelliFlash Telco Systems BiNOS Telco Systems BiNOX Teldat TelePresence Codec TelePresence Conductor Teleste Luminato teltonika rutos Teltonika RutOS RUTX Series Teradici PCoIP Terra Thomson DOCSIS Cable Modem Thomson Speedtouch Tomato TopVision Toshiba Printer Toshiba RemotEye4 TP-Link JetStream TP-Link Switch Transition Tranzeo TRENDnet Switch Tripp Lite PowerAlert TrueNAS TSC Printer Tycon Systems TPDIN U Ubiquiti AirFiber Ubiquiti AirFiber 60 Ubiquiti AirFiber LTU Ubiquiti AirOS Ubiquiti Edgepower Ubiquiti UniFi Ubiquoss PON Ucopia UFiber UHP Networks VSAT Terminal UniPing V V-Solution Vanguard ApplicationsWare Vertiv Avocent MergePoint Unity Vertiv PDU Video Communication Server Viprinux Viptela Vivotek Camera VMware ESXi VMware SD-WAN VMware vCenter Volius Voswall Vubiq Networks Vutlan Vyatta VyOS W Watchguard Fireware Waystream iBOS Web-Thermo-Hygrometer WebPower West Mountain RMCU WISI Tangram WTI CONSOLE WTI MPC WTI POWER X Xerox Printer Xirrus ArrayOS Z ZebraNet Zhone MXK Zmtel Greenpacket ZTE ZXA10 ZTE ZXR10 ZXDSL ZyXEL AC ZyXEL DSLAM ZyXEL Ethernet Switch ZyXEL IES MSAN ZyXEL IES-5000 DSLAM ZyXEL NWA ZyXEL Prestige ZyXEL ZyWALL","title":"Features"},{"location":"Support/Features/#features","text":"Here's a brief list of supported features, some might be missing. If you think something is missing, feel free to ask us. Auto discovery Alerting Multiple environment sensors support Multiple protocols data collection (STP, OSPF, BGP etc) VLAN, ARP and FDB table collection Customizable Dashboards Device Backup integration (Oxidized, RANCID) Distributed Polling Multiple Authentication Methods (MySQL, LDAP, Active Directory, HTTP) NetFlow, sFlow, IPFIX (NfSen) Service monitoring (Nagios Plugins) Syslog (Integrated, Graylog) Traffic Billing (Quota, 95th Percentile) Two Factor Authentication API Auto Updating","title":"Features"},{"location":"Support/Features/#supported-vendors","text":"Here's a list of supported vendors, some might be missing. If you are unsure of whether your device is supported or not, feel free to ask us.","title":"Supported Vendors"},{"location":"Support/Features/#3","text":"3Com","title":"3"},{"location":"Support/Features/#a","text":"A10 Networks Acano OS Accedian AEN Adtran AOS ADVA FSP150CC ADVA FSP3000 R7 ADVA OptiSwitch Advantech Aerohive HiveOS Airconsole Server AIX AKCP SensorProbe Alcatel OmniPCX Alcatel-Lucent Enterprise Stellar Wireless OS (AWOS) Alcatel-Lucent OS Alcoma ALGCOM DC UPS Allied Telesis Wireless (TQ) Alliedware Alliedware Plus Allworx VoIP Alpha Comp@s Alpha CXC HP Controller Alpha FXM Alpine OptoElectronics TDCM-EDFA platform AlteonOS Alvarion Breeze Anue AnyOS APC Environmental Monitoring Unit APC ePDU APC Management Module APC MGE UPS Apex Lynx Apex Plus Apple AirPort Apple OS X Aprisa ApsoluteOS ArbOS Areca RAID Subsystem Arista EOS Arista MOS Array Networks Arris Apex Arris CMTS Arris D5 Universal EdgeQAM ARRIS DOCSIS Arris Satellite Receiver Aruba Clearpass Aruba Instant ArubaOS ArubaOS-CX Ascom Asentria SiteBoss AsusWRT Merlin Aten PDU Audiocodes Automatic Transfer Switch Avaya Scopia AvediaPlayer Receivers AvediaStream Encoder Aviat WTM Avocent Avtech Environment Sensor AXIS Audio Appliances AXIS Network Camera AXIS Network Document Server","title":"A"},{"location":"Support/Features/#b","text":"Barco Clickshare Barracuda Email Security Gateway Barracuda Load Balancer Barracuda NG Firewall Barracuda Web Application Firewall BATS AATS BDCOM(tm) Software BeagleBoard Benu Bintec Be.IP Plus Bintec Smart Router BKE BKtel Blade Network Technologies BladeShelter PDU by PowerTek Blue Coat PacketShaper Blue Coat SSL Visibility Bluecat Networks BlueCoat ProxySG Broadcom BCM963xx Brocade FabricOS Brocade IronWare Brocade NOS Brocade ServerIron Brother Printer BTI SA-800 Buffalo","title":"B"},{"location":"Support/Features/#c","text":"C&C Power Commander plus Calix AXOS Calix B6 System Calix EXA Calix Legacy Cambium Cambium CMM Cambium CMM4 Cambium cnMatrix Cambium cnPilot Cambium cnPilot Router Cambium cnWave60 Cambium epmp Cambium PTP 250 Cambium PTP 300/500 Cambium PTP 600 Cambium PTP 650 Cambium PTP 670 Cambium PTP 800 Canon Printer Carel pCOWeb cdata Ceragon CeraOS CET TSI Controller Chatsworth PDU Check Point GAiA CheckPoint SecurePlatform Christie Projector Ciena SAOS Ciena Service Delivery Switch Ciena Waveserver Ciena Z-Series cirpack Cisco ACE Cisco ACS Cisco APIC Cisco ASA Cisco AsyncOS Cisco Catalyst 1900 Cisco CatOS Cisco EPC Cisco FTD Cisco FX-OS Cisco Identity Services Engine Cisco Integrated Management Controller Cisco Intrusion Prevention System Cisco IOS Cisco IOS-XE Cisco IOS-XR Cisco ME1200 Cisco Nexus 3550 Series Cisco NX-OS Cisco ONS Cisco PIX-OS Cisco SAN-OS Cisco Satellite Receiver Cisco SCE Cisco Services Ready Platform Cisco Small Business Cisco Unified Communications Manager Cisco Voice Gateway Cisco WAAS Cisco Wireless Access Point Cisco WLC Citrix Netscaler Comet System Web Sensor Comtrol Industrial Switch Controlbox TH-332B CoreOS Corero CMS Coriant TNMS CradlePoint WiPipe CTC Union Cumulus Linux CXR Networks TS Cyberoam UTM Cyberpower","title":"C"},{"location":"Support/Features/#d","text":"D-Link Access Point D-Link Switch Dahua NVR Dantel Webmon Dantherm Dasan NOS Datacom dd-wrt DDN Storage Deliberant OS Dell DRAC Dell EMC Networking OS10 Enterprise Dell EqualLogic Dell Laser Dell Networking OS Dell OpenManage Enterprise Modular Dell PowerConnect Dell PowerVault Dell PowerVault MD Dell Rack PDU Dell Remote Console Dell Storage Dell UPS Delta Orion Controller Delta UPS Develop Printer DHCPatriot Digipower Digital China Networks DKT Comega DPS Telecom NetGuardian DragonflyBSD Dragonwave Harmony Enhanced Dragonwave Horizon Compact Dragonwave Horizon Compact Plus Dragonwave Horizon Duo DrayTek DVB Modulator & Ampiflier DVB-T Transmitter","title":"D"},{"location":"Support/Features/#e","text":"E3 Meter E3 Meter DataConcentrator Eagle-I East Eaton ATS Eaton Matrix Eaton MGE PDU Eaton PDU Eaton SC200 Controller Eaton UPS EDFA Edgecore EdgeOS EdgeSwitch EDS EfficientIP SOLIDserver Ekinops Optical Eltek Valere Eltek Valere eNexus Eltek WebPower Eltex OLT Eltex-MES21xx Eltex-MES23xx EMC Data Domain EMC Flare OS EMC Isilon OneFS Emerson Energy System Emerson Netsure Endian EndRun EnGenius Access Point enLogic PDU Enterasys Epson Printer Epson Projector Ericsson 6600 series Ericsson IPOS Ericsson LG iPECS UCP Ericsson MINI-LINK Ericsson Traffic Node EricssonLG IPECS ES Etherwan Managed Switch EUROstor RAID Subsystem Exagrid Exalt ExtendAir Exinda Extrahop Appliance Extreme BOSS Extreme SLX-OS Extreme VOSS Extreme Wireless Convergence Extreme XOS Extremeware","title":"E"},{"location":"Support/Features/#f","text":"F5 Big IP F5OS Fiberhome FiberHome Switch Fibernet XMUX 4+ Fiberstore GBN Fiberstore Switch Firebrick FireEye OS Force10 FTOS Fortinet Application Deliver Controller Fortinet FortiAuthenticator Fortinet Fortigate Fortinet FortiMail Fortinet FortiSandbox Fortinet FortiSwitch Fortinet FortiVoice Fortinet FortiWeb Fortinet FortiWLC FortiOS Foundry Networking FreeBSD FreshTomato FS.COM monitored pdu Fujitsu Fujitsu ETERNUS FUJITSU iRMC Fujitsu NAS FusionHub","title":"F"},{"location":"Support/Features/#g","text":"Gamatronic UPS Stack Gandi Packet Journey GE Digital Energy UPS GE MDS Orbit network Operating System GE Pulsar Geist PDU Geist Watchdog Generex UPS SNMP adapter Generic Generic Device Gestetner Printer GigaVUE Glass Way WDM EYDFA Grandstream HT Greenbone OS Gude Expert Transfer Switch gwd","title":"G"},{"location":"Support/Features/#h","text":"Halon Hanwha Techwin HAProxy ALOHA Hardware Appliance Hatteras Overdue DSLAM Helios IP Hikvision Camera Hikvision NVR Hillstone StoneOs Himoinsa Generator Sets Hirschmann Railswitch Hitachi Storage Virtualization Operating System (SVOS) HP Blade Management HP MSM HP PDU Management Module HP Print server HP ProCurve HP UPS HP Virtual Connect HPE 3PAR HPE Comware HPE Integrated Lights Out HPE iPDU HPE Managed Power Distribution Unit HPE MSA HPE OpenVMS HPE StoreEver MSL Huawei iBMC Management Console Huawei OceanStor Huawei SmartAX Huawei SmartAX MDU Huawei SMU Huawei UPS Huawei VRP HWg Poseidon HWg STE HWg STE2 HWg WLD Hytera Repeater","title":"H"},{"location":"Support/Features/#i","text":"IBM AMM IBM DPI IBM i IBM IMM IBM Networking Operating System IBM Tape Library iBoot PDU Icotera OS ICR-OS ICT Digital Series Power Supply ICT Distribution Series ICT Modular Power System ICT Sine Wave Inverter Ifotec IgniteNet FusionSwitch IgniteNet HeliOS Illustra Network Camera Imco Power Imco Power LS110 Infinera Groove Infinera PON Infinera XTM Infoblox Ingrasys iPoMan Innovaphone ISDN Inteno GW IONODES IP Infusion OcNOS IP Office Firmware ITWatchDogs Goose","title":"I"},{"location":"Support/Features/#j","text":"Jacarta InterSeptor Janitza Janitza UMG96 Juniper EX2500 Juniper JunOS Juniper JunOSe Juniper JWOS Juniper MSS Juniper ScreenOS","title":"J"},{"location":"Support/Features/#k","text":"Kemp Loadbalancer Konica-Minolta Printer KTI Kyocera Mita Printer","title":"K"},{"location":"Support/Features/#l","text":"Lambdatrail Lancom OS Lanier Printer LANTIME v6 Lantronix SLC Lantronix UDS Last Mile Gear CTM Lenovo Cloud Network Operating System Lenovo XCC IMPI LenovoEMC Lexmark Printer Liebert LigoWave Infinity LigoWave LigoOS Linksys Smart Switch Linux Loadbalancer.org LogMaster Loop Telecom Operating System","title":"L"},{"location":"Support/Features/#m","text":"m0n0wall Maipu MyPower Marathon UPS McAfee Linux OS - ATD McAfee Linux OS - NSP McAfee SIEM Nitro Mcafee Web Gateway MegaTec NetAgent II Mellanox Meraki AP Meraki MX Appliance Meraki Switch Microsemi PowerDsine Midspan PoE Microsemi Synchronization Supply Unit Microsoft Windows Mikrotik RouterOS Mikrotik SwOS Mimosa Minkels RMS Mirth Connect Mitel Standard Linux MNI Microwave Radio MobileIron Montclair EDFA Motorola DOCSIS Cable Modem Motorola Netopia Moxa Moxa AWK MRV LambdaDriver MRV OptiDriver","title":"M"},{"location":"Support/Features/#n","text":"NEC Univerge NetApp NetBotz Environment Sensor NetBSD Netgear ProSafe NetMan Plus NetModule Netonix NetScaler SD-WAN Network Management Unit Nexans Nimble OS NOKIA ISAM Nokia SR OS (TiMOS) Novell Netware NRG Printer NTI Nutanix AOS NVT Phybridge","title":"N"},{"location":"Support/Features/#o","text":"OKI Printer Omnitron iConverter OneAccess Open Access Netspire Open-E OpenBSD Opengear OpenIndiana OpenSystems OpenWrt OPNsense Oracle ILOM Orvaldi UPS","title":"O"},{"location":"Support/Features/#p","text":"Packetflux SiteMonitor Packetlight Panasonic KX-NS Series Panduit PDU PanOS Papouch QUIDO Papouch TME Paradyne (by Zhone) Patton SmartNode PBI Digital Decoder PBN PBN P2P CP100 Series Platform Pegasus Pepwave Perle pfSense Pica8 OS Ping only PLANET Polycom Videoconferencing System Powercode BMU PowerWalker UPS PowerWalker VFI Prime Infrastructure Procera Networks Proxim proxmox pve Pulse Secure","title":"P"},{"location":"Support/Features/#q","text":"QNAP TurboNAS QTECH Quanta QuantaStor","title":"Q"},{"location":"Support/Features/#r","text":"Radlan RADWIN Raisecom ROAP Raisecom ROS Raritan EMX Raritan KVM Raritan PDU RAy RAy3 RecoveryOS Red Lion Sixnet Redback Networks SmartEdge Redlion N-Tron Ribbon GSX Ribbon SBC Ricoh Printer Rittal CMC Rittal CMC III PU Rittal IT Chiller Rittal LCP Rittal LCP DX Chiller Riverbed RNX UPDU Rohde & Schwarz Rubrik Ruckus Wireless HotZone Ruckus Wireless SmartZone Ruckus Wireless Unleashed Ruckus Wireless ZoneDirector Ruijie Networks","title":"R"},{"location":"Support/Features/#s","text":"SAF CFM SAF Integra B SAF Integra E SAF Integra W SAF Integra X SAF Tehnika Sagem ADR IONOS Samsung Printer Savin Printer Schleifenbauer SPDM Schneider PowerLogic SCS KS Sensatronics EM1 Sensatronics ITTM ServersCheck ServerTech Sentry3 ServerTech Sentry4 Sharp Printer SIAE Alfoplus 80HD Siemens Ruggedcom Switches (ROS) Siemens SCALANCE Siklu Wireless Silver Peak VXOA Sinetica UPS SM-OS SmartOptics DCP-M Series SmartOptics M-Series SmartOptics T-Series snr snr-erd Socomec Net Vision Socomec PDU Software Appliance Solid Optics EDFAMUX SonicWALL Sophos UTM Firewall Sophos XG Stormshield NS-BSD Stulz GMBH Klimatechnik Sub10 Systems Sun OpenSolaris Sun Solaris Supermicro Switch Symbol AP SyncServer Synology DSM","title":"S"},{"location":"Support/Features/#t","text":"Tait Infra93 Series Tait TN Admin OS Tandberg Magnum technicolor TG MediaAcces Tegile IntelliFlash Telco Systems BiNOS Telco Systems BiNOX Teldat TelePresence Codec TelePresence Conductor Teleste Luminato teltonika rutos Teltonika RutOS RUTX Series Teradici PCoIP Terra Thomson DOCSIS Cable Modem Thomson Speedtouch Tomato TopVision Toshiba Printer Toshiba RemotEye4 TP-Link JetStream TP-Link Switch Transition Tranzeo TRENDnet Switch Tripp Lite PowerAlert TrueNAS TSC Printer Tycon Systems TPDIN","title":"T"},{"location":"Support/Features/#u","text":"Ubiquiti AirFiber Ubiquiti AirFiber 60 Ubiquiti AirFiber LTU Ubiquiti AirOS Ubiquiti Edgepower Ubiquiti UniFi Ubiquoss PON Ucopia UFiber UHP Networks VSAT Terminal UniPing","title":"U"},{"location":"Support/Features/#v","text":"V-Solution Vanguard ApplicationsWare Vertiv Avocent MergePoint Unity Vertiv PDU Video Communication Server Viprinux Viptela Vivotek Camera VMware ESXi VMware SD-WAN VMware vCenter Volius Voswall Vubiq Networks Vutlan Vyatta VyOS","title":"V"},{"location":"Support/Features/#w","text":"Watchguard Fireware Waystream iBOS Web-Thermo-Hygrometer WebPower West Mountain RMCU WISI Tangram WTI CONSOLE WTI MPC WTI POWER","title":"W"},{"location":"Support/Features/#x","text":"Xerox Printer Xirrus ArrayOS","title":"X"},{"location":"Support/Features/#z","text":"ZebraNet Zhone MXK Zmtel Greenpacket ZTE ZXA10 ZTE ZXR10 ZXDSL ZyXEL AC ZyXEL DSLAM ZyXEL Ethernet Switch ZyXEL IES MSAN ZyXEL IES-5000 DSLAM ZyXEL NWA ZyXEL Prestige ZyXEL ZyWALL","title":"Z"},{"location":"Support/Install%20Validation/","text":"Install validation With a lot of configuration possibilities, manually editing config.php means it's not uncommon that mistakes get made. It's also impossible to validate user input in config.php when you're just using a text editor :) So, to try and help with some of the general issues people come across we've put together a simple validation tool which at present will: Validate config.php from a php perspective including whitespace where it shouldn't be. Connection to your MySQL server to verify credentials. Checks if you are running the older alerting system. Checks your rrd directory setup if not running rrdcached. Checks disk space for where /opt/librenms is installed. Checks location to fping Tests MySQL strict mode being enabled Tests for files not owned by librenms user (if configured) Optionally you can also pass -m and a module name for that to be tested. Current modules are: mail - This will validate your mail transport configuration. dist-poller - This will test your distributed poller configuration. rrdcheck - This will test your rrd files to see if they are unreadable or corrupted (source of broken graphs). You can run validate.php as root by executing ./validate.php within your install directory. The output will provide you either a clean bill of health or a list of things you need to fix: OK - This is a good thing, you can skip over these :) WARN - You probably want to check this out. FAIL - This is going to need your attention! Validate from the WebUI You can validate your LibreNMS install from the WebUI, using the nav bar and clicking on the little Gear Icon -> Validate Config. Then You should see the results of validate. Below is just example of the results.","title":"Install Validation"},{"location":"Support/Install%20Validation/#install-validation","text":"With a lot of configuration possibilities, manually editing config.php means it's not uncommon that mistakes get made. It's also impossible to validate user input in config.php when you're just using a text editor :) So, to try and help with some of the general issues people come across we've put together a simple validation tool which at present will: Validate config.php from a php perspective including whitespace where it shouldn't be. Connection to your MySQL server to verify credentials. Checks if you are running the older alerting system. Checks your rrd directory setup if not running rrdcached. Checks disk space for where /opt/librenms is installed. Checks location to fping Tests MySQL strict mode being enabled Tests for files not owned by librenms user (if configured) Optionally you can also pass -m and a module name for that to be tested. Current modules are: mail - This will validate your mail transport configuration. dist-poller - This will test your distributed poller configuration. rrdcheck - This will test your rrd files to see if they are unreadable or corrupted (source of broken graphs). You can run validate.php as root by executing ./validate.php within your install directory. The output will provide you either a clean bill of health or a list of things you need to fix: OK - This is a good thing, you can skip over these :) WARN - You probably want to check this out. FAIL - This is going to need your attention!","title":"Install validation"},{"location":"Support/Install%20Validation/#validate-from-the-webui","text":"You can validate your LibreNMS install from the WebUI, using the nav bar and clicking on the little Gear Icon -> Validate Config. Then You should see the results of validate. Below is just example of the results.","title":"Validate from the WebUI"},{"location":"Support/Performance/","text":"Performance optimisations This document will give you some guidance on optimising your setup. The suggestions are in a rough order of how much impact they will have. RRDCached We absolutely recommend running this, it will save on IO load . RRDCached MySQL Optimisation It's advisable after 24 hours of running MySQL that you run MySQL Tuner which will make suggestions on things you can change specific to your setup. One recommendation we can make is that you set the following in my.cnf under a [mysqld] group: innodb_flush_log_at_trx_commit = 0 You can also set this to 2. This will have the possibility that you could lose up to 1 second on mysql data in the event MySQL crashes or your server does but it provides an amazing difference in IO use. Polling modules Review the graph of poller module time take under gear > pollers > performance to see what modules are consuming poller time. This data is shown per device under device > graphs > poller. Disable polling (and discovery) modules that you do not need. You can do this globally in config.php like: Disable OSPF polling poller/poller_modules lnms config:set poller_modules.ospf false You can disable modules globally then re-enable the module per device or the opposite way. For a list of modules please see Poller modules SNMP Max Repeaters We have support for SNMP Max repeaters which can be handy on devices where we poll a lot of ports or bgp sessions for instance and where snmpwalk or snmpbulkwalk is used. This needs to be enabled on a per device basis under edit device -> snmp -> Max repeaters. You can also set this globally with the config option $config['snmp']['max_repeaters'] = X; . It's advisable to test the time taken to snmpwalk IF-MIB or something similar to work out what the best value is. To do this run the following but replace -REPEATERS- with varying numbers from 10 upto around 50. You will also need to set the correct snmp version, hostname and community string: time snmpbulkwalk -v2c -cpublic HOSTNAME -Cr-REPEATERS- -M /opt/librenms/mibs -m IF-MIB IfEntry NOTE: Do not go blindly setting this value as you can impact polling negatively. SNMP Max OIDs For sensors polling we now do bulk snmp gets to speed things up. By default this is ten but you can overwrite this per device under edit device -> snmp -> Max OIDs. You can also set this globally with the config option $config['snmp']['max_oid'] = X; . NOTE: It is advisable to monitor sensor polling when you change this to ensure you don't set the value too high. fping tuning You can change some of the default fping options used globally or per device. The defaults are: poller/ping lnms config:set fping_options.timeout 500 lnms config:set fping_options.count 3 lnms config:set fping_options.interval 500 If your devices are slow to respond then you will need to increase the timeout value and potentially the interval value. However if your network is stable, you can increase poller performance by dropping the count value to 1 and/or the timeout+millsec value to 200 or 300: poller/ping lnms config:set fping_options.timeout 300 lnms config:set fping_options.count 1 lnms config:set fping_options.interval 300 This will mean that we no longer delay each icmp packet sent (we send 3 in total by default) by 0.5 seconds. With only 1 icmp packet being sent then we will receive a response quicker. The defaults mean it will take at least 1 second for a response no matter how quick the icmp packet is returned. Optimise poller-wrapper poller-wrapper.py defaults to using 16 threads, this isn't necessarily optimal. A general rule of thumb is 2 threads per core but we suggest that you play around with lowering / increasing the number until you get the optimal value. Note KEEP in MIND that this doesn't always help, it depends on your system and CPU. So be careful. This can be changed by going to the cron job for librenms. Usually in /etc/cron.d/librenms and changing the \"16\" */5 * * * * librenms /opt/librenms/cronic /opt/librenms/poller-wrapper.py 16 Please also see Dispatcher Service Recursive DNS If your install uses hostnames for devices and you have quite a lot then it's advisable to setup a local recursive dns instance on the LibreNMS server. Something like pdns-recursor can be used and then configure /etc/resolv.conf to use 127.0.0.1 for queries. Per port polling - experimental By default the polling ports module will walk ifXEntry + some items from ifEntry regardless of the port. So if a port is marked as deleted because you don't want to see them or it's disabled then we still collect data. For the most part this is fine as the walks are quite quick. However for devices with a lot of ports and good % of those are either deleted or disabled then this approach isn't optimal. So to counter this you can enable 'selected port polling' per device within the edit device -> misc section or by globally enabling it ( not recommended ): $config['polling']['selected_ports'] = true; . This is truly not recommended, as it has been proven to affect cpu usage of your poller negatively. You can also set it for a specific OS: $config['os']['ios']['polling']['selected_ports'] = true; . Running ./scripts/collect-port-polling.php will poll your devices with both full and selective polling, display a table with the difference and optionally enable or disable selected ports polling for devices which would benefit from a change. Note that it doesn't continuously re-evaluate this, it will only be updated when the script is run. There are a number of options: -h | Poll single device or wildcard hostname -e Enable/disable selected ports polling for devices which would benefit from a change If you want to run this script to have it set selected port polling on devices where a change of 10% or more is evaluated , run it with ./scripts/collect-port-polling.php -e 10 . But note: it will not blindly use only the 10%. There is a second condition that the change has to be more than one second in polling time. Web interface HTTP/2 If you are running https then you should enable http/2 support in whatever web server you use: For Nginx (1.9.5 and above) change listen 443 ssl; to listen 443 ssl http2; in the Virtualhost config. For Apache (2.4.17 and above) set Protocols h2 http/1.1 in the Virtualhost config. PHP-opcache A lot of performance can be gained from setting up php-opcache correctly. Note: Memory based caching with PHP cli will increase memory usage and slow things down. File based caching is not as fast as memory based and is more likely to have stale cache issues. Some distributions allow separate cli, mod_php and php-fpm configurations, we can use this to set the optimal config. For web servers using mod_php and php-fpm Update your web PHP opcache.ini. Possible locations: /etc/php/8.1/fpm/conf.d/opcache.ini , /etc/php.d/opcache.ini , or /etc/php/conf.d/opcache.ini . zend_extension=opcache opcache.enable=1 opcache.memory_consumption=256 If you are having caching issues, you can clear the opcache by simply restarting httpd or php-fpm. For pollers Create a cache directory that is writable by the librenms user first: sudo mkdir -p /tmp/cache && sudo chmod 775 /tmp/cache && sudo chown -R librenms /tmp/cache Update your PHP opcache.ini. Possible locations: /etc/php/8.1/cli/conf.d/opcache.ini , /etc/php.d/opcache.ini , or /etc/php/conf.d/opcache.ini . zend_extension=opcache.so opcache.enable=1 opcache.enable_cli=1 opcache.file_cache=\"/tmp/cache/\" opcache.file_cache_only=0 opcache.file_cache_consistency_checks=1 opcache.memory_consumption=256 If you are having caching issues, you can clear the file based opcache with rm -rf /tmp/cache .","title":"Performance"},{"location":"Support/Performance/#performance-optimisations","text":"This document will give you some guidance on optimising your setup. The suggestions are in a rough order of how much impact they will have.","title":"Performance optimisations"},{"location":"Support/Performance/#rrdcached","text":"We absolutely recommend running this, it will save on IO load . RRDCached","title":"RRDCached"},{"location":"Support/Performance/#mysql-optimisation","text":"It's advisable after 24 hours of running MySQL that you run MySQL Tuner which will make suggestions on things you can change specific to your setup. One recommendation we can make is that you set the following in my.cnf under a [mysqld] group: innodb_flush_log_at_trx_commit = 0 You can also set this to 2. This will have the possibility that you could lose up to 1 second on mysql data in the event MySQL crashes or your server does but it provides an amazing difference in IO use.","title":"MySQL Optimisation"},{"location":"Support/Performance/#polling-modules","text":"Review the graph of poller module time take under gear > pollers > performance to see what modules are consuming poller time. This data is shown per device under device > graphs > poller. Disable polling (and discovery) modules that you do not need. You can do this globally in config.php like: Disable OSPF polling poller/poller_modules lnms config:set poller_modules.ospf false You can disable modules globally then re-enable the module per device or the opposite way. For a list of modules please see Poller modules","title":"Polling modules"},{"location":"Support/Performance/#snmp-max-repeaters","text":"We have support for SNMP Max repeaters which can be handy on devices where we poll a lot of ports or bgp sessions for instance and where snmpwalk or snmpbulkwalk is used. This needs to be enabled on a per device basis under edit device -> snmp -> Max repeaters. You can also set this globally with the config option $config['snmp']['max_repeaters'] = X; . It's advisable to test the time taken to snmpwalk IF-MIB or something similar to work out what the best value is. To do this run the following but replace -REPEATERS- with varying numbers from 10 upto around 50. You will also need to set the correct snmp version, hostname and community string: time snmpbulkwalk -v2c -cpublic HOSTNAME -Cr-REPEATERS- -M /opt/librenms/mibs -m IF-MIB IfEntry NOTE: Do not go blindly setting this value as you can impact polling negatively.","title":"SNMP Max Repeaters"},{"location":"Support/Performance/#snmp-max-oids","text":"For sensors polling we now do bulk snmp gets to speed things up. By default this is ten but you can overwrite this per device under edit device -> snmp -> Max OIDs. You can also set this globally with the config option $config['snmp']['max_oid'] = X; . NOTE: It is advisable to monitor sensor polling when you change this to ensure you don't set the value too high.","title":"SNMP Max OIDs"},{"location":"Support/Performance/#fping-tuning","text":"You can change some of the default fping options used globally or per device. The defaults are: poller/ping lnms config:set fping_options.timeout 500 lnms config:set fping_options.count 3 lnms config:set fping_options.interval 500 If your devices are slow to respond then you will need to increase the timeout value and potentially the interval value. However if your network is stable, you can increase poller performance by dropping the count value to 1 and/or the timeout+millsec value to 200 or 300: poller/ping lnms config:set fping_options.timeout 300 lnms config:set fping_options.count 1 lnms config:set fping_options.interval 300 This will mean that we no longer delay each icmp packet sent (we send 3 in total by default) by 0.5 seconds. With only 1 icmp packet being sent then we will receive a response quicker. The defaults mean it will take at least 1 second for a response no matter how quick the icmp packet is returned.","title":"fping tuning"},{"location":"Support/Performance/#optimise-poller-wrapper","text":"poller-wrapper.py defaults to using 16 threads, this isn't necessarily optimal. A general rule of thumb is 2 threads per core but we suggest that you play around with lowering / increasing the number until you get the optimal value. Note KEEP in MIND that this doesn't always help, it depends on your system and CPU. So be careful. This can be changed by going to the cron job for librenms. Usually in /etc/cron.d/librenms and changing the \"16\" */5 * * * * librenms /opt/librenms/cronic /opt/librenms/poller-wrapper.py 16 Please also see Dispatcher Service","title":"Optimise poller-wrapper"},{"location":"Support/Performance/#recursive-dns","text":"If your install uses hostnames for devices and you have quite a lot then it's advisable to setup a local recursive dns instance on the LibreNMS server. Something like pdns-recursor can be used and then configure /etc/resolv.conf to use 127.0.0.1 for queries.","title":"Recursive DNS"},{"location":"Support/Performance/#per-port-polling-experimental","text":"By default the polling ports module will walk ifXEntry + some items from ifEntry regardless of the port. So if a port is marked as deleted because you don't want to see them or it's disabled then we still collect data. For the most part this is fine as the walks are quite quick. However for devices with a lot of ports and good % of those are either deleted or disabled then this approach isn't optimal. So to counter this you can enable 'selected port polling' per device within the edit device -> misc section or by globally enabling it ( not recommended ): $config['polling']['selected_ports'] = true; . This is truly not recommended, as it has been proven to affect cpu usage of your poller negatively. You can also set it for a specific OS: $config['os']['ios']['polling']['selected_ports'] = true; . Running ./scripts/collect-port-polling.php will poll your devices with both full and selective polling, display a table with the difference and optionally enable or disable selected ports polling for devices which would benefit from a change. Note that it doesn't continuously re-evaluate this, it will only be updated when the script is run. There are a number of options: -h | Poll single device or wildcard hostname -e Enable/disable selected ports polling for devices which would benefit from a change If you want to run this script to have it set selected port polling on devices where a change of 10% or more is evaluated , run it with ./scripts/collect-port-polling.php -e 10 . But note: it will not blindly use only the 10%. There is a second condition that the change has to be more than one second in polling time.","title":"Per port polling - experimental"},{"location":"Support/Performance/#web-interface","text":"","title":"Web interface"},{"location":"Support/Performance/#http2","text":"If you are running https then you should enable http/2 support in whatever web server you use: For Nginx (1.9.5 and above) change listen 443 ssl; to listen 443 ssl http2; in the Virtualhost config. For Apache (2.4.17 and above) set Protocols h2 http/1.1 in the Virtualhost config.","title":"HTTP/2"},{"location":"Support/Performance/#php-opcache","text":"A lot of performance can be gained from setting up php-opcache correctly. Note: Memory based caching with PHP cli will increase memory usage and slow things down. File based caching is not as fast as memory based and is more likely to have stale cache issues. Some distributions allow separate cli, mod_php and php-fpm configurations, we can use this to set the optimal config.","title":"PHP-opcache"},{"location":"Support/Performance/#for-web-servers-using-mod_php-and-php-fpm","text":"Update your web PHP opcache.ini. Possible locations: /etc/php/8.1/fpm/conf.d/opcache.ini , /etc/php.d/opcache.ini , or /etc/php/conf.d/opcache.ini . zend_extension=opcache opcache.enable=1 opcache.memory_consumption=256 If you are having caching issues, you can clear the opcache by simply restarting httpd or php-fpm.","title":"For web servers using mod_php and php-fpm"},{"location":"Support/Performance/#for-pollers","text":"Create a cache directory that is writable by the librenms user first: sudo mkdir -p /tmp/cache && sudo chmod 775 /tmp/cache && sudo chown -R librenms /tmp/cache Update your PHP opcache.ini. Possible locations: /etc/php/8.1/cli/conf.d/opcache.ini , /etc/php.d/opcache.ini , or /etc/php/conf.d/opcache.ini . zend_extension=opcache.so opcache.enable=1 opcache.enable_cli=1 opcache.file_cache=\"/tmp/cache/\" opcache.file_cache_only=0 opcache.file_cache_consistency_checks=1 opcache.memory_consumption=256 If you are having caching issues, you can clear the file based opcache with rm -rf /tmp/cache .","title":"For pollers"},{"location":"Support/Poller%20Support/","text":"lnms device:poll This document will explain how to use lnms device:poll to debug issues or manually running to process data. Command options Description: Poll data from device ( s ) as defined by discovery Usage: device:poll [ options ] [ -- ] Arguments: device spec Device spec to poll: device_id, hostname, wildcard ( * ) , odd, even, all Options: -m, --modules = MODULES Specify single module to be run. Comma separate modules, submodules may be added with / -x, --no-data Do not update datastores ( RRD, InfluxDB, etc ) -h, --help Display help for the given command. When no command is given display help for the list command -q, --quiet Do not output any message -V, --version Display this application version --ansi | --no-ansi Force ( or disable --no-ansi ) ANSI output -n, --no-interaction Do not ask any interactive question --env [= ENV ] The environment the command should run under -v | vv | vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Poller Wrapper We have a poller-wrapper.py script by Job Snijders . This script is currently the default. If you need to debug the output of poller-wrapper.py then you can add -d to the end of the command - it is NOT recommended to do this in cron. Poller config These are the default poller config items. You can globally disable a module by setting it to 0. If you just want to disable it for one device then you can do this within the WebUI Device -> Edit -> Modules. poller/poller_modules lnms config:set poller_modules.unix-agent false lnms config:set poller_modules.os true lnms config:set poller_modules.ipmi true lnms config:set poller_modules.sensors true lnms config:set poller_modules.processors true lnms config:set poller_modules.mempools true lnms config:set poller_modules.storage true lnms config:set poller_modules.netstats true lnms config:set poller_modules.hr-mib true lnms config:set poller_modules.ucd-mib true lnms config:set poller_modules.ipSystemStats true lnms config:set poller_modules.ports true lnms config:set poller_modules.nac false lnms config:set poller_modules.bgp-peers true lnms config:set poller_modules.junose-atm-vp false lnms config:set poller_modules.printer-supplies false lnms config:set poller_modules.ucd-diskio true lnms config:set poller_modules.wireless true lnms config:set poller_modules.ospf true lnms config:set poller_modules.cisco-ipsec-flow-monitor false lnms config:set poller_modules.cisco-remote-access-monitor false lnms config:set poller_modules.cisco-cef false lnms config:set poller_modules.slas false lnms config:set poller_modules.cisco-mac-accounting false lnms config:set poller_modules.cipsec-tunnels false lnms config:set poller_modules.cisco-ace-loadbalancer false lnms config:set poller_modules.cisco-ace-serverfarms false lnms config:set poller_modules.cisco-asa-firewall false lnms config:set poller_modules.cisco-voice false lnms config:set poller_modules.cisco-cbqos false lnms config:set poller_modules.cisco-otv false lnms config:set poller_modules.cisco-vpdn false lnms config:set poller_modules.netscaler-vsvr false lnms config:set poller_modules.aruba-controller false lnms config:set poller_modules.entity-physical true lnms config:set poller_modules.entity-state false lnms config:set poller_modules.applications true lnms config:set poller_modules.availability true lnms config:set poller_modules.stp true lnms config:set poller_modules.vminfo false lnms config:set poller_modules.ntp true lnms config:set poller_modules.services true lnms config:set poller_modules.loadbalancers false lnms config:set poller_modules.mef false lnms config:set poller_modules.mef false OS based Poller config You can enable or disable modules for a specific OS by add corresponding line in config.php OS based settings have preference over global. Device based settings have preference over all others Poller performance improvement can be achieved by deactivating all modules that are not supported by specific OS. E.g. to deactivate spanning tree but activate unix-agent module for linux OS poller/poller_modules lnms config:set os.linux.poller_modules.stp false lnms config:set os.linux.poller_modules.unix-agent true Poller modules unix-agent : Enable the check_mk agent for external support for applications. system : Provides information on some common items like uptime, sysDescr and sysContact. os : Os detection. This module will pick up the OS of the device. ipmi : Enables support for IPMI if login details have been provided for IPMI. sensors : Sensor detection such as Temperature, Humidity, Voltages + More. processors : Processor support for devices. mempools : Memory detection support for devices. storage : Storage detection for hard disks netstats : Statistics for IP, TCP, UDP, ICMP and SNMP. hr-mib : Host resource support. ucd-mib : Support for CPU, Memory and Load. ipSystemStats : IP statistics for device. ports : This module will detect all ports on a device excluding ones configured to be ignored by config options. xdsl : This module will collect more metrics for xdsl interfaces. nac : Network Access Control (NAC) or 802.1X support. bgp-peers : BGP detection and support. junose-atm-vp : Juniper ATM support. printer-supplies : Toner levels support. ucd-diskio : Disk I/O support. wifi : WiFi Support for those devices with support. ospf : OSPF Support. cisco-ipsec-flow-monitor : IPSec statistics support. cisco-remote-access-monitor : Cisco remote access support. cisco-cef : CEF detection and support. slas : SLA detection and support. cisco-mac-accounting : MAC Address account support. cipsec-tunnels : IPSec tunnel support. cisco-ace-loadbalancer : Cisco ACE Support. cisco-ace-serverfarms : Cisco ACE Support. netscaler-vsvr : Netscaler support. aruba-controller : Aruba wireless controller support. entity-physical : Module to pick up the devices hardware support. applications : Device application support. availability : Device Availability Calculation. cisco-asa-firewall : Cisco ASA firewall support. Running Here are some examples of running poller from within your install directory. lnms device:poll localhost lnms device:poll localhost -m ports Debugging To provide debugging output you will need to run the poller process with the -vv flag. You can do this either against all modules, single or multiple modules: All Modules lnms device:poll localhost -vv Single Module lnms device:poll localhost -m ports -vv Multiple Modules lnms device:poll localhost -m ports,entity-physical -vv Using -vv shouldn't output much sensitive information, -vvv will so it is then advisable to sanitise the output before pasting it somewhere as the debug output will contain snmp details amongst other items including port descriptions. The output will contain: DB Updates RRD Updates SNMP Response","title":"Poller Support"},{"location":"Support/Poller%20Support/#lnms-devicepoll","text":"This document will explain how to use lnms device:poll to debug issues or manually running to process data.","title":"lnms device:poll"},{"location":"Support/Poller%20Support/#command-options","text":"Description: Poll data from device ( s ) as defined by discovery Usage: device:poll [ options ] [ -- ] Arguments: device spec Device spec to poll: device_id, hostname, wildcard ( * ) , odd, even, all Options: -m, --modules = MODULES Specify single module to be run. Comma separate modules, submodules may be added with / -x, --no-data Do not update datastores ( RRD, InfluxDB, etc ) -h, --help Display help for the given command. When no command is given display help for the list command -q, --quiet Do not output any message -V, --version Display this application version --ansi | --no-ansi Force ( or disable --no-ansi ) ANSI output -n, --no-interaction Do not ask any interactive question --env [= ENV ] The environment the command should run under -v | vv | vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug","title":"Command options"},{"location":"Support/Poller%20Support/#poller-wrapper","text":"We have a poller-wrapper.py script by Job Snijders . This script is currently the default. If you need to debug the output of poller-wrapper.py then you can add -d to the end of the command - it is NOT recommended to do this in cron.","title":"Poller Wrapper"},{"location":"Support/Poller%20Support/#poller-config","text":"These are the default poller config items. You can globally disable a module by setting it to 0. If you just want to disable it for one device then you can do this within the WebUI Device -> Edit -> Modules. poller/poller_modules lnms config:set poller_modules.unix-agent false lnms config:set poller_modules.os true lnms config:set poller_modules.ipmi true lnms config:set poller_modules.sensors true lnms config:set poller_modules.processors true lnms config:set poller_modules.mempools true lnms config:set poller_modules.storage true lnms config:set poller_modules.netstats true lnms config:set poller_modules.hr-mib true lnms config:set poller_modules.ucd-mib true lnms config:set poller_modules.ipSystemStats true lnms config:set poller_modules.ports true lnms config:set poller_modules.nac false lnms config:set poller_modules.bgp-peers true lnms config:set poller_modules.junose-atm-vp false lnms config:set poller_modules.printer-supplies false lnms config:set poller_modules.ucd-diskio true lnms config:set poller_modules.wireless true lnms config:set poller_modules.ospf true lnms config:set poller_modules.cisco-ipsec-flow-monitor false lnms config:set poller_modules.cisco-remote-access-monitor false lnms config:set poller_modules.cisco-cef false lnms config:set poller_modules.slas false lnms config:set poller_modules.cisco-mac-accounting false lnms config:set poller_modules.cipsec-tunnels false lnms config:set poller_modules.cisco-ace-loadbalancer false lnms config:set poller_modules.cisco-ace-serverfarms false lnms config:set poller_modules.cisco-asa-firewall false lnms config:set poller_modules.cisco-voice false lnms config:set poller_modules.cisco-cbqos false lnms config:set poller_modules.cisco-otv false lnms config:set poller_modules.cisco-vpdn false lnms config:set poller_modules.netscaler-vsvr false lnms config:set poller_modules.aruba-controller false lnms config:set poller_modules.entity-physical true lnms config:set poller_modules.entity-state false lnms config:set poller_modules.applications true lnms config:set poller_modules.availability true lnms config:set poller_modules.stp true lnms config:set poller_modules.vminfo false lnms config:set poller_modules.ntp true lnms config:set poller_modules.services true lnms config:set poller_modules.loadbalancers false lnms config:set poller_modules.mef false lnms config:set poller_modules.mef false","title":"Poller config"},{"location":"Support/Poller%20Support/#os-based-poller-config","text":"You can enable or disable modules for a specific OS by add corresponding line in config.php OS based settings have preference over global. Device based settings have preference over all others Poller performance improvement can be achieved by deactivating all modules that are not supported by specific OS. E.g. to deactivate spanning tree but activate unix-agent module for linux OS poller/poller_modules lnms config:set os.linux.poller_modules.stp false lnms config:set os.linux.poller_modules.unix-agent true","title":"OS based Poller config"},{"location":"Support/Poller%20Support/#poller-modules","text":"unix-agent : Enable the check_mk agent for external support for applications. system : Provides information on some common items like uptime, sysDescr and sysContact. os : Os detection. This module will pick up the OS of the device. ipmi : Enables support for IPMI if login details have been provided for IPMI. sensors : Sensor detection such as Temperature, Humidity, Voltages + More. processors : Processor support for devices. mempools : Memory detection support for devices. storage : Storage detection for hard disks netstats : Statistics for IP, TCP, UDP, ICMP and SNMP. hr-mib : Host resource support. ucd-mib : Support for CPU, Memory and Load. ipSystemStats : IP statistics for device. ports : This module will detect all ports on a device excluding ones configured to be ignored by config options. xdsl : This module will collect more metrics for xdsl interfaces. nac : Network Access Control (NAC) or 802.1X support. bgp-peers : BGP detection and support. junose-atm-vp : Juniper ATM support. printer-supplies : Toner levels support. ucd-diskio : Disk I/O support. wifi : WiFi Support for those devices with support. ospf : OSPF Support. cisco-ipsec-flow-monitor : IPSec statistics support. cisco-remote-access-monitor : Cisco remote access support. cisco-cef : CEF detection and support. slas : SLA detection and support. cisco-mac-accounting : MAC Address account support. cipsec-tunnels : IPSec tunnel support. cisco-ace-loadbalancer : Cisco ACE Support. cisco-ace-serverfarms : Cisco ACE Support. netscaler-vsvr : Netscaler support. aruba-controller : Aruba wireless controller support. entity-physical : Module to pick up the devices hardware support. applications : Device application support. availability : Device Availability Calculation. cisco-asa-firewall : Cisco ASA firewall support.","title":"Poller modules"},{"location":"Support/Poller%20Support/#running","text":"Here are some examples of running poller from within your install directory. lnms device:poll localhost lnms device:poll localhost -m ports","title":"Running"},{"location":"Support/Poller%20Support/#debugging","text":"To provide debugging output you will need to run the poller process with the -vv flag. You can do this either against all modules, single or multiple modules: All Modules lnms device:poll localhost -vv Single Module lnms device:poll localhost -m ports -vv Multiple Modules lnms device:poll localhost -m ports,entity-physical -vv Using -vv shouldn't output much sensitive information, -vvv will so it is then advisable to sanitise the output before pasting it somewhere as the debug output will contain snmp details amongst other items including port descriptions. The output will contain: DB Updates RRD Updates SNMP Response","title":"Debugging"},{"location":"Support/Remote-Monitoring-VPN/","text":"Remote monitoring using tinc VPN This article describes how to use tinc to connect several remote sites and their subnets to your central monitoring server. This will let you connect to devices on remote private IP ranges through one gateway on each site, routing them securely back to your LibreNMS installation. Configuring the monitoring server tinc should be available on nearly all Linux distributions via package management. If you are running something different, just take a look at tinc's homepage to find an appropriate version for your operating system: https://www.tinc-vpn.org/download/ I am going to describe the setup for Debian-based systems, but there are virtually no differences for e.g. CentOS or similar. First make sure your firewall accepts connections on port 655 UDP and TCP. Then install tinc via apt-get install tinc . Create the following directory structure to hold all your configuration files: mkdir -p /etc/tinc/myvpn/hosts \"myvpn\" is your VPN network's name and can be chosen freely. Create your main configuration file: vim /etc/tinc/myvpn/tinc.conf Name = monitoring AddressFamily = ipv4 Device = /dev/net/tun Next we need network up- and down scripts to define a few network settings for inside our VPN: vim /etc/tinc/myvpn/tinc-up #!/bin/sh ifconfig $INTERFACE 10 .6.1.1 netmask 255 .255.255.0 ip route add 10 .6.1.1/24 dev $INTERFACE ip route add 10 .0.0.0/22 dev $INTERFACE ip route add 10 .100.0.0/22 dev $INTERFACE ip route add 10 .200.0.0/22 dev $INTERFACE In this example we have 10.6.1.1 as the VPN IP address for the monitoring server on a /24 subnet. $INTERFACE will be automatically substituted with the name of the VPN, \"myvpn\" in this case. Then we have a route for the VPN subnet, so we can reach other sites via their VPN address. The last 3 lines designate the remote subnets. In the example I want to reach devices on three different remote private /22 subnets and be able to monitor devices on them from this server, so I set up routes for each of those remote sites in my tinc-up script. The tinc-down script is relatively simple as it just removes the custom interface, which should get rid of the routes as well: vim /etc/tinc/myvpn/tinc-down #!/bin/sh ifconfig $INTERFACE down Make sure your scripts scan be executed: chmod +x /etc/tinc/myvpn/tinc-* As a last step we need a host configuration file. This should be named the same as the \"Name\" you defined in tinc.conf: vim /etc/tinc/myvpn/hosts/monitoring Subnet = 10 .6.1.1/32 On the monitoring server we will just fill in the subnet and not define its external IP address to make sure it listens on all available external interfaces. It's time to use tinc to create our key-pair: tincd -n myvpn -K Now the file /etc/tinc/myvpn/hosts/monitoring should have an RSA public key appended to it and your private key should reside in /etc/tinc/myvpn/rsa_key.priv . To make sure that the connection will be restored after each reboot, you can add your VPN name to /etc/tinc/nets.boot . Now you can start tinc with tincd -n myvpn and it will listen for your remote sites to connect to it. Remote site configuration Essentially the same steps as for your central monitoring server apply for all remote gateway devices. These can be routers, or just any computer or VM running on the remote subnet, able to reach the internet with the ability to forward IP packets externally. Install tinc Create directory structure: mkdir -p /etc/tinc/myvpn/hosts Create main configuration: vim /etc/tinc/myvpn/tinc.conf Name = remote1 AddressFamily = ipv4 Device = /dev/net/tun ConnectTo = monitoring Create up script: vim /etc/tinc/myvpn/tinc-up #!/bin/sh ifconfig $INTERFACE 10 .6.1.2 netmask 255 .255.255.0 ip route add 10 .6.1.2/32 dev $INTERFACE Create down script: vim /etc/tinc/myvpn/tinc-down #!/bin/sh ifconfig $INTERFACE down Make executable: chmod +x /etc/tinc/myvpn/tinc* Create device configuration: vim /etc/tinc/myvpn/hosts/remote1 Address = 198 .51.100.2 Subnet = 10 .0.0.0/22 This defines the device IP address outside of the VPN and the subnet it will expose. Copy over the monitoring server's host configuration (including the embedded public key) and add it's external IP address: vim /etc/tinc/myvpn/hosts/monitoring Address = 203 .0.113.6 Subnet = 10 .6.1.1/32 -----BEGIN RSA PUBLIC KEY----- VeDyaqhKd4o2Fz... Generate this device's keys: tincd -n myvpn -K Copy over this devices host file including the embedded public key to your monitoring server. Add the name for the VPN to /etc/tinc/nets.boot if you want to autostart the connection upon reboot. Start tinc: tincd -n myvpn These steps can basically be repeated for every remote site just choosing different names and other internal IP addresses. In my case I connected 3 remote sites running behind Ubiquiti EdgeRouters. Since those devices let me install software through Debian's package management it was very easy to set up. Just create the necessary configuration files and network scripts on each device and distribute the host configurations including the public keys to each device that will actively connect back. Now you can add all devices you want to monitor in LibreNMS using their internal IP address on the remote subnets or using some form of name resolution. I opted to declare the most important devices in my /etc/hosts file on the monitoring server. As an added bonus tinc is a mesh VPN, so in theory you could specify several \"ConnectTo\" on each device and they should hold connections even if one network path goes down.","title":"Remote Monitoring VPN"},{"location":"Support/Remote-Monitoring-VPN/#remote-monitoring-using-tinc-vpn","text":"This article describes how to use tinc to connect several remote sites and their subnets to your central monitoring server. This will let you connect to devices on remote private IP ranges through one gateway on each site, routing them securely back to your LibreNMS installation.","title":"Remote monitoring using tinc VPN"},{"location":"Support/Remote-Monitoring-VPN/#configuring-the-monitoring-server","text":"tinc should be available on nearly all Linux distributions via package management. If you are running something different, just take a look at tinc's homepage to find an appropriate version for your operating system: https://www.tinc-vpn.org/download/ I am going to describe the setup for Debian-based systems, but there are virtually no differences for e.g. CentOS or similar. First make sure your firewall accepts connections on port 655 UDP and TCP. Then install tinc via apt-get install tinc . Create the following directory structure to hold all your configuration files: mkdir -p /etc/tinc/myvpn/hosts \"myvpn\" is your VPN network's name and can be chosen freely. Create your main configuration file: vim /etc/tinc/myvpn/tinc.conf Name = monitoring AddressFamily = ipv4 Device = /dev/net/tun Next we need network up- and down scripts to define a few network settings for inside our VPN: vim /etc/tinc/myvpn/tinc-up #!/bin/sh ifconfig $INTERFACE 10 .6.1.1 netmask 255 .255.255.0 ip route add 10 .6.1.1/24 dev $INTERFACE ip route add 10 .0.0.0/22 dev $INTERFACE ip route add 10 .100.0.0/22 dev $INTERFACE ip route add 10 .200.0.0/22 dev $INTERFACE In this example we have 10.6.1.1 as the VPN IP address for the monitoring server on a /24 subnet. $INTERFACE will be automatically substituted with the name of the VPN, \"myvpn\" in this case. Then we have a route for the VPN subnet, so we can reach other sites via their VPN address. The last 3 lines designate the remote subnets. In the example I want to reach devices on three different remote private /22 subnets and be able to monitor devices on them from this server, so I set up routes for each of those remote sites in my tinc-up script. The tinc-down script is relatively simple as it just removes the custom interface, which should get rid of the routes as well: vim /etc/tinc/myvpn/tinc-down #!/bin/sh ifconfig $INTERFACE down Make sure your scripts scan be executed: chmod +x /etc/tinc/myvpn/tinc-* As a last step we need a host configuration file. This should be named the same as the \"Name\" you defined in tinc.conf: vim /etc/tinc/myvpn/hosts/monitoring Subnet = 10 .6.1.1/32 On the monitoring server we will just fill in the subnet and not define its external IP address to make sure it listens on all available external interfaces. It's time to use tinc to create our key-pair: tincd -n myvpn -K Now the file /etc/tinc/myvpn/hosts/monitoring should have an RSA public key appended to it and your private key should reside in /etc/tinc/myvpn/rsa_key.priv . To make sure that the connection will be restored after each reboot, you can add your VPN name to /etc/tinc/nets.boot . Now you can start tinc with tincd -n myvpn and it will listen for your remote sites to connect to it.","title":"Configuring the monitoring server"},{"location":"Support/Remote-Monitoring-VPN/#remote-site-configuration","text":"Essentially the same steps as for your central monitoring server apply for all remote gateway devices. These can be routers, or just any computer or VM running on the remote subnet, able to reach the internet with the ability to forward IP packets externally. Install tinc Create directory structure: mkdir -p /etc/tinc/myvpn/hosts Create main configuration: vim /etc/tinc/myvpn/tinc.conf Name = remote1 AddressFamily = ipv4 Device = /dev/net/tun ConnectTo = monitoring Create up script: vim /etc/tinc/myvpn/tinc-up #!/bin/sh ifconfig $INTERFACE 10 .6.1.2 netmask 255 .255.255.0 ip route add 10 .6.1.2/32 dev $INTERFACE Create down script: vim /etc/tinc/myvpn/tinc-down #!/bin/sh ifconfig $INTERFACE down Make executable: chmod +x /etc/tinc/myvpn/tinc* Create device configuration: vim /etc/tinc/myvpn/hosts/remote1 Address = 198 .51.100.2 Subnet = 10 .0.0.0/22 This defines the device IP address outside of the VPN and the subnet it will expose. Copy over the monitoring server's host configuration (including the embedded public key) and add it's external IP address: vim /etc/tinc/myvpn/hosts/monitoring Address = 203 .0.113.6 Subnet = 10 .6.1.1/32 -----BEGIN RSA PUBLIC KEY----- VeDyaqhKd4o2Fz... Generate this device's keys: tincd -n myvpn -K Copy over this devices host file including the embedded public key to your monitoring server. Add the name for the VPN to /etc/tinc/nets.boot if you want to autostart the connection upon reboot. Start tinc: tincd -n myvpn These steps can basically be repeated for every remote site just choosing different names and other internal IP addresses. In my case I connected 3 remote sites running behind Ubiquiti EdgeRouters. Since those devices let me install software through Debian's package management it was very easy to set up. Just create the necessary configuration files and network scripts on each device and distribute the host configurations including the public keys to each device that will actively connect back. Now you can add all devices you want to monitor in LibreNMS using their internal IP address on the remote subnets or using some form of name resolution. I opted to declare the most important devices in my /etc/hosts file on the monitoring server. As an added bonus tinc is a mesh VPN, so in theory you could specify several \"ConnectTo\" on each device and they should hold connections even if one network path goes down.","title":"Remote site configuration"},{"location":"Support/SNMP-Configuration-Examples/","text":"SNMP configuration examples Devices Cisco Adaptive Security Appliance (ASA) ASDM Launch ASDM and connect to your device Go to Configuration > Management Access > SNMP Add your community string Add in the \"SNMP Host Access List\" section your LibreNMS server IP address Click Apply and Save CLI # SNMPv2c snmp-server community snmp-server contact snmp-server location snmp-server host poll community version 2c # SNMPv3 snmp-server group v3 priv snmp-server user v3 auth sha priv aes 128 snmp-server contact snmp-server location snmp-server host poll version 3 Note: If the device is unable to find the SNMP user, reboot the ASA. Once rebooted, continue the steps as normal. IOS / IOS XE # SNMPv2c snmp-server community RO snmp-server contact snmp-server location # SNMPv3 snmp-server group v3 priv snmp-server user v3 auth sha priv aes 128 snmp-server contact snmp-server location # Note: The following is also required if using SNMPv3 and you want to populate the FDB table, STP info and others. snmp-server group v3 priv context vlan- match prefix Note: If the device is unable to find the SNMP user, reboot the ASA. Once rebooted, continue the steps as normal. NX-OS # SNMPv2c snmp-server community RO snmp-server contact snmp-server location # SNMPv3 snmp-server user v3 auth sha priv aes 128 snmp-server contact snmp-server location Wireless LAN Controller (WLC) Access the web admin page and log in If you are running version 8.1 and later, on the new dashboard click \"Advanced\" Go to management Tab On SNMP sub-menu, select \"Communities\" Click \"New...\" Add your community name and leave IP addresses empty Click Apply and Save Eaton Network Card-MS Connect to the Web UI of the device Upgrade to the latest available manufacturer firmware which applies to your hardware revision. Refer to the release notes. For devices which can use the Lx releases, do install LD. After rebooting the card (safe for connected load), configure Network, System and Access Control. Save config for each step. Configure SNMP. The device defaults to both SNMP v1 and v3 enabled, with default credentials. Disable what you do not need. SNMP v3 works, but uses MD5/DES. You may have to add another section to your SNMP credentials table in LibreNMS. Save. HPE / 3PAR Comware SNMPv2c snmp-agent community read snmp-agent sys-info contact snmp-agent sys-info location snmp-agent sys-info version all snmp-agent packet max-size 6000 packet max-size is required for some walks to complete, but the path must support fragmentation. SNMPv3 snmp-agent mib-view excluded ExcludeAll snmp snmp-agent group v3 V3ROGroup privacy read-view ViewDefault write-view ExcludeAll snmp-agent usm-user v3 V3ROGroup simple authentication-mode sha privacy-mode aes128 snmp-agent sys-info contact snmp-agent sys-info location snmp-agent sys-info version v3 undo snmp-agent sys-info version v1 v2c snmp-agent packet max-size 6000 packet max-size is required for some walks to complete, but the path must support fragmentation. Inform OS 3.2.x Access the CLI Add an SNMP Manager with your LibreNMS IP address: addsnmpmgr Add your SNMP community: setsnmppw Infoblox NIOS 7.x+ Access the web admin page and log in Go to Grid tab > Grid Manager In the right menu select \"Grid properties\" Select \"SNMP\" menu Click \"Enable SNMPv1/SNMPv2 Queries\" Add your community Click Save & Close Juniper Junos OS for SNMPv1/v2c set snmp description description set snmp location location set snmp contact contact set snmp community YOUR-COMMUNITY authorization read-only for SNMPv3 (authPriv): set snmp v3 usm local-engine user authpriv authentication-sha authentication-password YOUR_AUTH_SECRET set snmp v3 usm local-engine user authpriv privacy-aes128 privacy-password YOUR_PRIV_SECRET set snmp v3 vacm security-to-group security-model usm security-name authpriv group mysnmpv3 set snmp v3 vacm access group mysnmpv3 default-context-prefix security-model any security-level authentication read-view mysnmpv3view set snmp v3 vacm access group mysnmpv3 default-context-prefix security-model any security-level privacy read-view mysnmpv3view set snmp view mysnmpv3view oid iso include Mikrotik RouterOS 6.x CLI SNMP v2 Configuration /snmp community set [ find default=yes ] read-access=no add addresses= name= /snmp set contact=\"\" enabled=yes engine-id= location=\"\" Notes: About the snmp community commands: The commands change the default snmp community. It is probably possible to create a new one instead. specify the address and host (not network) netmask of the LibreNMS server. Example: 192.168.8.71/32 trap-version=2 must also be specified if some other trap-version has been set trap-interfaces may also be used to limit the interfaces the router listens on About the snmp command: contact, engine-id and location are optional trap-community is probably required if a new snmp community has been created. CLI SNMP v3 Configuration for authPriv /snmp community add name=\"\" addresses=\"\" set \"\" authentication-password=\"\" authentication-protocol=MD5 set \"\" encryption-password=\"\" encryption-protocol=AES set \"\" read-access=yes write-access=no security=private #Disable public SNMP set public read-access=no write-access=no security=private /snmp set contact=\"\" enabled=yes engine-id=\"\" location=\"\" Notes: Use password with length of min 8 chars Notes for both SNMP v2 and v3 In some cases of advanced routing one may need to set explicitly the source IP address from which the SNMP daemon will reply - /snmp set src-address= Palo Alto PANOS 6.x/7.x Access the web admin page and log in Go to Device tab > Setup Go to the sub-tab \"Operations\" Click \"SNMP Setup\" Enter your SNMP community and then click \"OK\" Click Apply Note that you need to allow SNMP on the needed interfaces. To do that you need to create a network \"Interface Mgmt\" profile for standard interface and allow SNMP under \"Device > Management > Management Interface Settings\" for out of band management interface. One may also configure SNMP from the command line, which is useful when you need to configure more than one firewall for SNMP monitoring. Log into the firewall(s) via ssh, and perform these commands for basic SNMPv3 configuration: username@devicename> configure username@devicename# set deviceconfig system service disable-snmp no username@devicename# set deviceconfig system snmp-setting access-setting version v3 views pa view iso oid 1.3.6.1 username@devicename# set deviceconfig system snmp-setting access-setting version v3 views pa view iso option include username@devicename# set deviceconfig system snmp-setting access-setting version v3 views pa view iso mask 0xf0 username@devicename# set deviceconfig system snmp-setting access-setting version v3 users authpriv authpwd YOUR_AUTH_SECRET username@devicename# set deviceconfig system snmp-setting access-setting version v3 users authpriv privpwd YOUR_PRIV_SECRET username@devicename# set deviceconfig system snmp-setting access-setting version v3 users authpriv view pa username@devicename# set deviceconfig system snmp-setting snmp-system location \"Yourcity, Yourcountry [60.4,5.31]\" username@devicename# set deviceconfig system snmp-setting snmp-system contact noc@your.org username@devicename# commit username@devicename# exit Ubiquiti EdgeOs If you use the HTTP interface: 1. Access the legacy web admin page and log in 1. Go to System > Advanced Configuration 1. Go to the sub-tab \"SNMP\" > \"Community\" 1. Click \"Add Community Group\" 1. Enter your SNMP community, ip address and click submit 1. Go to System > Summary 1. Go to the sub-tab \"Description\" 1. Enter your System Name, System Location and System Contact. 1. Click submit 1. Click \"Save Configuration\" If you use CLI: username@devicename> enable username@devicename# configure username@devicename (Config)# snmp-server community \"public\" ro username@devicename (Config)# snmp-server sysname \"devicename\" username@devicename (Config)# snmp-server contact \"noc@example.com\" username@devicename (Config)# exit username@devicename# write memory VMware ESX/ESXi 5.x/6.x Log on to your ESX server by means of ssh. You may have to enable the ssh service in the GUI first. From the CLI, execute the following commands: esxcli system snmp set --authentication SHA1 esxcli system snmp set --privacy AES128 esxcli system snmp hash --auth-hash YOUR_AUTH_SECRET --priv-hash YOUR_PRIV_SECRET --raw-secret This command produces output like this Authhash: f3d8982fc28e8d1346c26eee49eb2c4a5950c934 Privhash: 0596ab30b315576a4e9f7d7bde65bf49b749e335 Now define a SNMPv3 user: esxcli system snmp set --users /f3d8982fc28e8d1346c26eee49eb2c4a5950c934/0596ab30b315576a4e9f7d7bde65bf49b749e335/priv esxcli system snmp set -L \"Yourcity, Yourcountry [60.4,5.3]\" esxcli system snmp set -C noc@your.org esxcli system snmp set --enable true Note: In case of snmp timeouts, disable the firewall with esxcli network firewall set --enabled false If snmp timeouts still occur with firewall disabled, migrate VMs if needed and reboot ESXi host. VCenter 6.x Log on to your ESX server by means of ssh. You may have to enable the ssh service in the GUI first. From the CLI, execute the following commands: snmp.set --authentication SHA1 snmp.set --privacy AES128 snmp.hash --auth_hash YOUR_AUTH_SECRET --priv_hash YOUR_PRIV_SECRET --raw_secret true This command produces output like this Privhash: 0596ab30b315576a4e9f7d7bde65bf49b749e335 Authhash: f3d8982fc28e8d1346c26eee49eb2c4a5950c934 Now define a SNMPv3 user: snmp.set --users authpriv/f3d8982fc28e8d1346c26eee49eb2c4a5950c934/0596ab30b315576a4e9f7d7bde65bf49b749e335/priv snmp.enable Operating systems Linux (snmpd v2) Replace your snmpd.conf file by the example below and edit it with appropriate community in \"RANDOMSTRINGGOESHERE\". vi /etc/snmp/snmpd.conf # Change RANDOMSTRINGGOESHERE to your preferred SNMP community string com2sec readonly default RANDOMSTRINGGOESHERE group MyROGroup v2c readonly view all included .1 80 access MyROGroup \"\" any noauth exact all none none syslocation Rack, Room, Building, City, Country [GPSX,Y] syscontact Your Name #Distro Detection extend distro /usr/bin/distro #Hardware Detection (uncomment to enable) #extend hardware '/bin/cat /sys/devices/virtual/dmi/id/product_name' #extend manufacturer '/bin/cat /sys/devices/virtual/dmi/id/sys_vendor' #extend serial '/bin/cat /sys/devices/virtual/dmi/id/product_serial' NOTE : On some systems the snmpd is running as its own user, which means it can't read /sys/devices/virtual/dmi/id/product_serial which is mode 0400. One solution is to include @reboot chmod 444 /sys/devices/virtual/dmi/id/product_serial in the crontab for root or equivalent. Non-x86 or SMBIOS-based systems, such as ARM-based Raspberry Pi units should query device tree locations for this metadata, for example: extend hardware '/bin/cat /sys/firmware/devicetree/base/model' extend serial '/bin/cat /sys/firmware/devicetree/base/serial-number' The LibreNMS server include a copy of this example here: /opt/librenms/snmpd.conf.example The binary /usr/bin/distro must be copied from the original source repository: curl -o /usr/bin/distro https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/distro chmod +x /usr/bin/distro Linux (snmpd v3) Go to /etc/snmp/snmpd.conf Open the file in vi or nano /etc/snmp/snmpd.conf and add the following line to create SNMPV3 User (replace username and passwords with your own): createUser authPrivUser SHA \"authPassword\" AES \"privPassword\" Make sure the agent listens to all interfaces by adding the following line inside snmpd.conf: agentAddress udp:161,udp6:161 This line simply means listen to connections across all interfaces IPv4 and IPv6 respectively Uncomment and change the following line to give read access to the username created above (rouser is what LibreNMS uses) : #rouser authPrivUser priv Change the following details inside snmpd.conf syslocation Rack, Room, Building, City, Country [GPSX,Y] syscontact Your Name Save and exit the file Restart the snmpd service CentOS 6 / Red hat 6 service snmpd restart CentOS 7 / Red hat 7 systemctl restart snmpd Add SNMP to Firewalld firewall-cmd --zone=public --permanent --add-service=snmp firewall-cmd --reload Ubuntu service snmpd restart Arch Linux (snmpd v2) Install SNMP Package pacman -S net-snmp create SNMP folder mkdir /etc/snmp/ set community echo rocommunity read_only_community_string >> /etc/snmp/snmpd.conf set contact echo syscontact Firstname Lastname >> /etc/snmp/snmpd.conf set location echo syslocation L69 4RX >> /etc/snmp/snmpd.conf enable startup systemctl enable snmpd.service start snmp systemctl restart snmpd.service Windows Server 2008 R2 Log in to your Windows Server 2008 R2 Start \"Server Manager\" under \"Administrative Tools\" Click \"Features\" and then click \"Add Feature\" Check (if not checked) \"SNMP Service\", click \"Next\" until \"Install\" Start \"Services\" under \"Administrative Tools\" Edit \"SNMP Service\" properties Go to the security tab In \"Accepted community name\" click \"Add\" to add your community string and permission In \"Accept SNMP packets from these hosts\" click \"Add\" and add your LibreNMS server IP address Validate change by clicking \"Apply\" Windows Server 2012 R2 and newer GUI Log in to your Windows Server 2012 R2 or newer Start \"Server Manager\" under \"Administrative Tools\" Click \"Manage\" and then \"Add Roles and Features\" Continue by pressing \"Next\" to the \"Features\" menu Install (if not installed) \"SNMP Service\" Start \"Services\" under \"Administrative Tools\" Edit \"SNMP Service\" properties Go to the security tab In \"Accepted community name\" click \"Add\" to add your community string and permission In \"Accept SNMP packets from these hosts\" click \"Add\" and add your LibreNMS server IP address Validate change by clicking \"Apply\" PowerShell The following example will install SNMP, set the Librenms IP and set a read only community string. Replace $IP and $communitystring with your values. Install-WindowsFeature -Name 'SNMP-Service' , 'RSAT-SNMP' New-ItemProperty -Path \"HKLM:\\SYSTEM\\CurrentControlSet\\services\\SNMP\\Parameters\\PermittedManagers\" -Name 2 -Value $IP New-ItemProperty -Path \"HKLM:\\SYSTEM\\CurrentControlSet\\services\\SNMP\\Parameters\\ValidCommunities\" -Name $communitystring -Value 4 Note: SNMPv3 can be supported on Windows platforms with the use of Net-SNMP. Mac OSX Step 1: sudo nano /etc/snmp/snmpd.conf #Allow read-access with the following SNMP Community String: rocommunity public # all other settings are optional but recommended. # Location of the device syslocation data centre A # Human Contact for the device syscontact SysAdmin # System Name of the device sysName SystemName # the system OID for this device. This is optional but recommended, # to identify this as a MAC OS system. sysobjectid 1 .3.6.1.4.1.8072.3.2.16 Step 2: sudo launchctl load -w /System/Library/LaunchDaemons/org.net-snmp.snmpd.plist","title":"SNMP Configuration Examples"},{"location":"Support/SNMP-Configuration-Examples/#snmp-configuration-examples","text":"","title":"SNMP configuration examples"},{"location":"Support/SNMP-Configuration-Examples/#devices","text":"","title":"Devices"},{"location":"Support/SNMP-Configuration-Examples/#cisco","text":"","title":"Cisco"},{"location":"Support/SNMP-Configuration-Examples/#adaptive-security-appliance-asa","text":"ASDM Launch ASDM and connect to your device Go to Configuration > Management Access > SNMP Add your community string Add in the \"SNMP Host Access List\" section your LibreNMS server IP address Click Apply and Save CLI # SNMPv2c snmp-server community snmp-server contact snmp-server location snmp-server host poll community version 2c # SNMPv3 snmp-server group v3 priv snmp-server user v3 auth sha priv aes 128 snmp-server contact snmp-server location snmp-server host poll version 3 Note: If the device is unable to find the SNMP user, reboot the ASA. Once rebooted, continue the steps as normal.","title":"Adaptive Security Appliance (ASA)"},{"location":"Support/SNMP-Configuration-Examples/#ios-ios-xe","text":"# SNMPv2c snmp-server community RO snmp-server contact snmp-server location # SNMPv3 snmp-server group v3 priv snmp-server user v3 auth sha priv aes 128 snmp-server contact snmp-server location # Note: The following is also required if using SNMPv3 and you want to populate the FDB table, STP info and others. snmp-server group v3 priv context vlan- match prefix Note: If the device is unable to find the SNMP user, reboot the ASA. Once rebooted, continue the steps as normal.","title":"IOS / IOS XE"},{"location":"Support/SNMP-Configuration-Examples/#nx-os","text":"# SNMPv2c snmp-server community RO snmp-server contact snmp-server location # SNMPv3 snmp-server user v3 auth sha priv aes 128 snmp-server contact snmp-server location ","title":"NX-OS"},{"location":"Support/SNMP-Configuration-Examples/#wireless-lan-controller-wlc","text":"Access the web admin page and log in If you are running version 8.1 and later, on the new dashboard click \"Advanced\" Go to management Tab On SNMP sub-menu, select \"Communities\" Click \"New...\" Add your community name and leave IP addresses empty Click Apply and Save","title":"Wireless LAN Controller (WLC)"},{"location":"Support/SNMP-Configuration-Examples/#eaton","text":"","title":"Eaton"},{"location":"Support/SNMP-Configuration-Examples/#network-card-ms","text":"Connect to the Web UI of the device Upgrade to the latest available manufacturer firmware which applies to your hardware revision. Refer to the release notes. For devices which can use the Lx releases, do install LD. After rebooting the card (safe for connected load), configure Network, System and Access Control. Save config for each step. Configure SNMP. The device defaults to both SNMP v1 and v3 enabled, with default credentials. Disable what you do not need. SNMP v3 works, but uses MD5/DES. You may have to add another section to your SNMP credentials table in LibreNMS. Save.","title":"Network Card-MS"},{"location":"Support/SNMP-Configuration-Examples/#hpe-3par","text":"","title":"HPE / 3PAR"},{"location":"Support/SNMP-Configuration-Examples/#comware","text":"SNMPv2c snmp-agent community read snmp-agent sys-info contact snmp-agent sys-info location snmp-agent sys-info version all snmp-agent packet max-size 6000 packet max-size is required for some walks to complete, but the path must support fragmentation. SNMPv3 snmp-agent mib-view excluded ExcludeAll snmp snmp-agent group v3 V3ROGroup privacy read-view ViewDefault write-view ExcludeAll snmp-agent usm-user v3 V3ROGroup simple authentication-mode sha privacy-mode aes128 snmp-agent sys-info contact snmp-agent sys-info location snmp-agent sys-info version v3 undo snmp-agent sys-info version v1 v2c snmp-agent packet max-size 6000 packet max-size is required for some walks to complete, but the path must support fragmentation.","title":"Comware"},{"location":"Support/SNMP-Configuration-Examples/#inform-os-32x","text":"Access the CLI Add an SNMP Manager with your LibreNMS IP address: addsnmpmgr Add your SNMP community: setsnmppw ","title":"Inform OS 3.2.x"},{"location":"Support/SNMP-Configuration-Examples/#infoblox","text":"","title":"Infoblox"},{"location":"Support/SNMP-Configuration-Examples/#nios-7x","text":"Access the web admin page and log in Go to Grid tab > Grid Manager In the right menu select \"Grid properties\" Select \"SNMP\" menu Click \"Enable SNMPv1/SNMPv2 Queries\" Add your community Click Save & Close","title":"NIOS 7.x+"},{"location":"Support/SNMP-Configuration-Examples/#juniper","text":"","title":"Juniper"},{"location":"Support/SNMP-Configuration-Examples/#junos-os","text":"for SNMPv1/v2c set snmp description description set snmp location location set snmp contact contact set snmp community YOUR-COMMUNITY authorization read-only for SNMPv3 (authPriv): set snmp v3 usm local-engine user authpriv authentication-sha authentication-password YOUR_AUTH_SECRET set snmp v3 usm local-engine user authpriv privacy-aes128 privacy-password YOUR_PRIV_SECRET set snmp v3 vacm security-to-group security-model usm security-name authpriv group mysnmpv3 set snmp v3 vacm access group mysnmpv3 default-context-prefix security-model any security-level authentication read-view mysnmpv3view set snmp v3 vacm access group mysnmpv3 default-context-prefix security-model any security-level privacy read-view mysnmpv3view set snmp view mysnmpv3view oid iso include","title":"Junos OS"},{"location":"Support/SNMP-Configuration-Examples/#mikrotik","text":"","title":"Mikrotik"},{"location":"Support/SNMP-Configuration-Examples/#routeros-6x","text":"CLI SNMP v2 Configuration /snmp community set [ find default=yes ] read-access=no add addresses= name= /snmp set contact=\"\" enabled=yes engine-id= location=\"\" Notes: About the snmp community commands: The commands change the default snmp community. It is probably possible to create a new one instead. specify the address and host (not network) netmask of the LibreNMS server. Example: 192.168.8.71/32 trap-version=2 must also be specified if some other trap-version has been set trap-interfaces may also be used to limit the interfaces the router listens on About the snmp command: contact, engine-id and location are optional trap-community is probably required if a new snmp community has been created. CLI SNMP v3 Configuration for authPriv /snmp community add name=\"\" addresses=\"\" set \"\" authentication-password=\"\" authentication-protocol=MD5 set \"\" encryption-password=\"\" encryption-protocol=AES set \"\" read-access=yes write-access=no security=private #Disable public SNMP set public read-access=no write-access=no security=private /snmp set contact=\"\" enabled=yes engine-id=\"\" location=\"\" Notes: Use password with length of min 8 chars Notes for both SNMP v2 and v3 In some cases of advanced routing one may need to set explicitly the source IP address from which the SNMP daemon will reply - /snmp set src-address=","title":"RouterOS 6.x"},{"location":"Support/SNMP-Configuration-Examples/#palo-alto","text":"","title":"Palo Alto"},{"location":"Support/SNMP-Configuration-Examples/#panos-6x7x","text":"Access the web admin page and log in Go to Device tab > Setup Go to the sub-tab \"Operations\" Click \"SNMP Setup\" Enter your SNMP community and then click \"OK\" Click Apply Note that you need to allow SNMP on the needed interfaces. To do that you need to create a network \"Interface Mgmt\" profile for standard interface and allow SNMP under \"Device > Management > Management Interface Settings\" for out of band management interface. One may also configure SNMP from the command line, which is useful when you need to configure more than one firewall for SNMP monitoring. Log into the firewall(s) via ssh, and perform these commands for basic SNMPv3 configuration: username@devicename> configure username@devicename# set deviceconfig system service disable-snmp no username@devicename# set deviceconfig system snmp-setting access-setting version v3 views pa view iso oid 1.3.6.1 username@devicename# set deviceconfig system snmp-setting access-setting version v3 views pa view iso option include username@devicename# set deviceconfig system snmp-setting access-setting version v3 views pa view iso mask 0xf0 username@devicename# set deviceconfig system snmp-setting access-setting version v3 users authpriv authpwd YOUR_AUTH_SECRET username@devicename# set deviceconfig system snmp-setting access-setting version v3 users authpriv privpwd YOUR_PRIV_SECRET username@devicename# set deviceconfig system snmp-setting access-setting version v3 users authpriv view pa username@devicename# set deviceconfig system snmp-setting snmp-system location \"Yourcity, Yourcountry [60.4,5.31]\" username@devicename# set deviceconfig system snmp-setting snmp-system contact noc@your.org username@devicename# commit username@devicename# exit","title":"PANOS 6.x/7.x"},{"location":"Support/SNMP-Configuration-Examples/#ubiquiti","text":"","title":"Ubiquiti"},{"location":"Support/SNMP-Configuration-Examples/#edgeos","text":"If you use the HTTP interface: 1. Access the legacy web admin page and log in 1. Go to System > Advanced Configuration 1. Go to the sub-tab \"SNMP\" > \"Community\" 1. Click \"Add Community Group\" 1. Enter your SNMP community, ip address and click submit 1. Go to System > Summary 1. Go to the sub-tab \"Description\" 1. Enter your System Name, System Location and System Contact. 1. Click submit 1. Click \"Save Configuration\" If you use CLI: username@devicename> enable username@devicename# configure username@devicename (Config)# snmp-server community \"public\" ro username@devicename (Config)# snmp-server sysname \"devicename\" username@devicename (Config)# snmp-server contact \"noc@example.com\" username@devicename (Config)# exit username@devicename# write memory","title":"EdgeOs"},{"location":"Support/SNMP-Configuration-Examples/#vmware","text":"","title":"VMware"},{"location":"Support/SNMP-Configuration-Examples/#esxesxi-5x6x","text":"Log on to your ESX server by means of ssh. You may have to enable the ssh service in the GUI first. From the CLI, execute the following commands: esxcli system snmp set --authentication SHA1 esxcli system snmp set --privacy AES128 esxcli system snmp hash --auth-hash YOUR_AUTH_SECRET --priv-hash YOUR_PRIV_SECRET --raw-secret This command produces output like this Authhash: f3d8982fc28e8d1346c26eee49eb2c4a5950c934 Privhash: 0596ab30b315576a4e9f7d7bde65bf49b749e335 Now define a SNMPv3 user: esxcli system snmp set --users /f3d8982fc28e8d1346c26eee49eb2c4a5950c934/0596ab30b315576a4e9f7d7bde65bf49b749e335/priv esxcli system snmp set -L \"Yourcity, Yourcountry [60.4,5.3]\" esxcli system snmp set -C noc@your.org esxcli system snmp set --enable true Note: In case of snmp timeouts, disable the firewall with esxcli network firewall set --enabled false If snmp timeouts still occur with firewall disabled, migrate VMs if needed and reboot ESXi host.","title":"ESX/ESXi 5.x/6.x"},{"location":"Support/SNMP-Configuration-Examples/#vcenter-6x","text":"Log on to your ESX server by means of ssh. You may have to enable the ssh service in the GUI first. From the CLI, execute the following commands: snmp.set --authentication SHA1 snmp.set --privacy AES128 snmp.hash --auth_hash YOUR_AUTH_SECRET --priv_hash YOUR_PRIV_SECRET --raw_secret true This command produces output like this Privhash: 0596ab30b315576a4e9f7d7bde65bf49b749e335 Authhash: f3d8982fc28e8d1346c26eee49eb2c4a5950c934 Now define a SNMPv3 user: snmp.set --users authpriv/f3d8982fc28e8d1346c26eee49eb2c4a5950c934/0596ab30b315576a4e9f7d7bde65bf49b749e335/priv snmp.enable","title":"VCenter 6.x"},{"location":"Support/SNMP-Configuration-Examples/#operating-systems","text":"","title":"Operating systems"},{"location":"Support/SNMP-Configuration-Examples/#linux-snmpd-v2","text":"Replace your snmpd.conf file by the example below and edit it with appropriate community in \"RANDOMSTRINGGOESHERE\". vi /etc/snmp/snmpd.conf # Change RANDOMSTRINGGOESHERE to your preferred SNMP community string com2sec readonly default RANDOMSTRINGGOESHERE group MyROGroup v2c readonly view all included .1 80 access MyROGroup \"\" any noauth exact all none none syslocation Rack, Room, Building, City, Country [GPSX,Y] syscontact Your Name #Distro Detection extend distro /usr/bin/distro #Hardware Detection (uncomment to enable) #extend hardware '/bin/cat /sys/devices/virtual/dmi/id/product_name' #extend manufacturer '/bin/cat /sys/devices/virtual/dmi/id/sys_vendor' #extend serial '/bin/cat /sys/devices/virtual/dmi/id/product_serial' NOTE : On some systems the snmpd is running as its own user, which means it can't read /sys/devices/virtual/dmi/id/product_serial which is mode 0400. One solution is to include @reboot chmod 444 /sys/devices/virtual/dmi/id/product_serial in the crontab for root or equivalent. Non-x86 or SMBIOS-based systems, such as ARM-based Raspberry Pi units should query device tree locations for this metadata, for example: extend hardware '/bin/cat /sys/firmware/devicetree/base/model' extend serial '/bin/cat /sys/firmware/devicetree/base/serial-number' The LibreNMS server include a copy of this example here: /opt/librenms/snmpd.conf.example The binary /usr/bin/distro must be copied from the original source repository: curl -o /usr/bin/distro https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/distro chmod +x /usr/bin/distro","title":"Linux (snmpd v2)"},{"location":"Support/SNMP-Configuration-Examples/#linux-snmpd-v3","text":"Go to /etc/snmp/snmpd.conf Open the file in vi or nano /etc/snmp/snmpd.conf and add the following line to create SNMPV3 User (replace username and passwords with your own): createUser authPrivUser SHA \"authPassword\" AES \"privPassword\" Make sure the agent listens to all interfaces by adding the following line inside snmpd.conf: agentAddress udp:161,udp6:161 This line simply means listen to connections across all interfaces IPv4 and IPv6 respectively Uncomment and change the following line to give read access to the username created above (rouser is what LibreNMS uses) : #rouser authPrivUser priv Change the following details inside snmpd.conf syslocation Rack, Room, Building, City, Country [GPSX,Y] syscontact Your Name Save and exit the file","title":"Linux (snmpd v3)"},{"location":"Support/SNMP-Configuration-Examples/#restart-the-snmpd-service","text":"","title":"Restart the snmpd service"},{"location":"Support/SNMP-Configuration-Examples/#centos-6-red-hat-6","text":"service snmpd restart","title":"CentOS 6 / Red hat 6"},{"location":"Support/SNMP-Configuration-Examples/#centos-7-red-hat-7","text":"systemctl restart snmpd Add SNMP to Firewalld firewall-cmd --zone=public --permanent --add-service=snmp firewall-cmd --reload","title":"CentOS 7 / Red hat 7"},{"location":"Support/SNMP-Configuration-Examples/#ubuntu","text":"service snmpd restart","title":"Ubuntu"},{"location":"Support/SNMP-Configuration-Examples/#arch-linux-snmpd-v2","text":"Install SNMP Package pacman -S net-snmp create SNMP folder mkdir /etc/snmp/ set community echo rocommunity read_only_community_string >> /etc/snmp/snmpd.conf set contact echo syscontact Firstname Lastname >> /etc/snmp/snmpd.conf set location echo syslocation L69 4RX >> /etc/snmp/snmpd.conf enable startup systemctl enable snmpd.service start snmp systemctl restart snmpd.service","title":"Arch Linux (snmpd v2)"},{"location":"Support/SNMP-Configuration-Examples/#windows-server-2008-r2","text":"Log in to your Windows Server 2008 R2 Start \"Server Manager\" under \"Administrative Tools\" Click \"Features\" and then click \"Add Feature\" Check (if not checked) \"SNMP Service\", click \"Next\" until \"Install\" Start \"Services\" under \"Administrative Tools\" Edit \"SNMP Service\" properties Go to the security tab In \"Accepted community name\" click \"Add\" to add your community string and permission In \"Accept SNMP packets from these hosts\" click \"Add\" and add your LibreNMS server IP address Validate change by clicking \"Apply\"","title":"Windows Server 2008 R2"},{"location":"Support/SNMP-Configuration-Examples/#windows-server-2012-r2-and-newer","text":"","title":"Windows Server 2012 R2 and newer"},{"location":"Support/SNMP-Configuration-Examples/#gui","text":"Log in to your Windows Server 2012 R2 or newer Start \"Server Manager\" under \"Administrative Tools\" Click \"Manage\" and then \"Add Roles and Features\" Continue by pressing \"Next\" to the \"Features\" menu Install (if not installed) \"SNMP Service\" Start \"Services\" under \"Administrative Tools\" Edit \"SNMP Service\" properties Go to the security tab In \"Accepted community name\" click \"Add\" to add your community string and permission In \"Accept SNMP packets from these hosts\" click \"Add\" and add your LibreNMS server IP address Validate change by clicking \"Apply\"","title":"GUI"},{"location":"Support/SNMP-Configuration-Examples/#powershell","text":"The following example will install SNMP, set the Librenms IP and set a read only community string. Replace $IP and $communitystring with your values. Install-WindowsFeature -Name 'SNMP-Service' , 'RSAT-SNMP' New-ItemProperty -Path \"HKLM:\\SYSTEM\\CurrentControlSet\\services\\SNMP\\Parameters\\PermittedManagers\" -Name 2 -Value $IP New-ItemProperty -Path \"HKLM:\\SYSTEM\\CurrentControlSet\\services\\SNMP\\Parameters\\ValidCommunities\" -Name $communitystring -Value 4 Note: SNMPv3 can be supported on Windows platforms with the use of Net-SNMP.","title":"PowerShell"},{"location":"Support/SNMP-Configuration-Examples/#mac-osx","text":"Step 1: sudo nano /etc/snmp/snmpd.conf #Allow read-access with the following SNMP Community String: rocommunity public # all other settings are optional but recommended. # Location of the device syslocation data centre A # Human Contact for the device syscontact SysAdmin # System Name of the device sysName SystemName # the system OID for this device. This is optional but recommended, # to identify this as a MAC OS system. sysobjectid 1 .3.6.1.4.1.8072.3.2.16 Step 2: sudo launchctl load -w /System/Library/LaunchDaemons/org.net-snmp.snmpd.plist","title":"Mac OSX"},{"location":"Support/Device-Notes/AsuswrtMerlin/","text":"To use Wireless Sensors on AsuswrtMerlin, an agent of sorts is required. The purpose of the agent is to execute on the client (AsuswrtMerlin) side, to ensure that the needed Wireless Sensor information is returned for SNMP queries (from LibreNMS). Installation AsuswrtMerlin Two items are required on the AsuswrtMerlin side - scripts to generate the necessary information (for SNMP replies), and an SNMP extend configuration update (to return the information vs. the expected query). 1: Install the scripts: Copy the scripts from librenms-agent/snmp/Openwrt - preferably inside /etc/librenms on AsuswrtMerlin (and add this directory to /etc/sysupgrade.conf, to survive firmware updates). The only file that needs to be edited is wlInterfaces.txt, which is a mapping from the wireless interfaces, to the desired display name in LibreNMS. For example, wlan0,wl-2.4G wlan1,wl-5.0G 2: Update the AsuswrtMerlin SNMP configuration, adding extend support for the Wireless Sensor queries: vi /etc/config/snmpd , adding the following entries (assuming the scripts are installed in /etc/librenms, and are executable), and update the network interfaces as needed to match the hardware, config extend option name interfaces option prog \"/bin/cat /etc/librenms/wlInterfaces.txt\" config extend option name clients-wlan0 option prog \"/etc/librenms/wlClients.sh wlan0\" config extend option name clients-wlan1 option prog \"/etc/librenms/wlClients.sh wlan1\" config extend option name clients-wlan option prog \"/etc/librenms/wlClients.sh\" config extend option name frequency-wlan0 option prog \"/etc/librenms/wlFrequency.sh wlan0\" config extend option name frequency-wlan1 option prog \"/etc/librenms/wlFrequency.sh wlan1\" config extend option name rate-tx-wlan0-min option prog \"/etc/librenms/wlRate.sh wlan0 tx min\" config extend option name rate-tx-wlan0-avg option prog \"/etc/librenms/wlRate.sh wlan0 tx avg\" config extend option name rate-tx-wlan0-max option prog \"/etc/librenms/wlRate.sh wlan0 tx max\" config extend option name rate-tx-wlan1-min option prog \"/etc/librenms/wlRate.sh wlan1 tx min\" config extend option name rate-tx-wlan1-avg option prog \"/etc/librenms/wlRate.sh wlan1 tx avg\" config extend option name rate-tx-wlan1-max option prog \"/etc/librenms/wlRate.sh wlan1 tx max\" config extend option name rate-rx-wlan0-min option prog \"/etc/librenms/wlRate.sh wlan0 rx min\" config extend option name rate-rx-wlan0-avg option prog \"/etc/librenms/wlRate.sh wlan0 rx avg\" config extend option name rate-rx-wlan0-max option prog \"/etc/librenms/wlRate.sh wlan0 rx max\" config extend option name rate-rx-wlan1-min option prog \"/etc/librenms/wlRate.sh wlan1 rx min\" config extend option name rate-rx-wlan1-avg option prog \"/etc/librenms/wlRate.sh wlan1 rx avg\" config extend option name rate-rx-wlan1-max option prog \"/etc/librenms/wlRate.sh wlan1 rx max\" config extend option name noise-floor-wlan0 option prog \"/etc/librenms/wlNoiseFloor.sh wlan0\" config extend option name noise-floor-wlan1 option prog \"/etc/librenms/wlNoiseFloor.sh wlan1\" config extend option name snr-wlan0-min option prog \"/etc/librenms/wlSNR.sh wlan0 min\" config extend option name snr-wlan0-avg option prog \"/etc/librenms/wlSNR.sh wlan0 avg\" config extend option name snr-wlan0-max option prog \"/etc/librenms/wlSNR.sh wlan0 max\" config extend option name snr-wlan1-min option prog \"/etc/librenms/wlSNR.sh wlan1 min\" config extend option name snr-wlan1-avg option prog \"/etc/librenms/wlSNR.sh wlan1 avg\" config extend option name snr-wlan1-max option prog \"/etc/librenms/wlSNR.sh wlan1 max\" NOTE, any of the scripts above can be tested simply by running the corresponding command. NOTE, to check the output data from any of these extensions, on the LibreNMS machine, run (for example), snmpwalk -v 2c -c public -Osqnv 'NET-SNMP-EXTEND-MIB::nsExtendOutputFull.\"frequency-wlan0\"' NOTE, on the LibreNMS machine, ensure that snmp-mibs-downloader is installed. NOTE, on the AsuswrtMerlin machine, ensure that distro is installed (i.e. that the OS is correctly detected!). 3: Restart the snmp service on AsuswrtMerlin: service snmpd restart And then wait for discovery and polling on LibreNMS!","title":"Asuswrt-Merlin"},{"location":"Support/Device-Notes/AsuswrtMerlin/#installation","text":"","title":"Installation"},{"location":"Support/Device-Notes/AsuswrtMerlin/#asuswrtmerlin","text":"Two items are required on the AsuswrtMerlin side - scripts to generate the necessary information (for SNMP replies), and an SNMP extend configuration update (to return the information vs. the expected query). 1: Install the scripts: Copy the scripts from librenms-agent/snmp/Openwrt - preferably inside /etc/librenms on AsuswrtMerlin (and add this directory to /etc/sysupgrade.conf, to survive firmware updates). The only file that needs to be edited is wlInterfaces.txt, which is a mapping from the wireless interfaces, to the desired display name in LibreNMS. For example, wlan0,wl-2.4G wlan1,wl-5.0G 2: Update the AsuswrtMerlin SNMP configuration, adding extend support for the Wireless Sensor queries: vi /etc/config/snmpd , adding the following entries (assuming the scripts are installed in /etc/librenms, and are executable), and update the network interfaces as needed to match the hardware, config extend option name interfaces option prog \"/bin/cat /etc/librenms/wlInterfaces.txt\" config extend option name clients-wlan0 option prog \"/etc/librenms/wlClients.sh wlan0\" config extend option name clients-wlan1 option prog \"/etc/librenms/wlClients.sh wlan1\" config extend option name clients-wlan option prog \"/etc/librenms/wlClients.sh\" config extend option name frequency-wlan0 option prog \"/etc/librenms/wlFrequency.sh wlan0\" config extend option name frequency-wlan1 option prog \"/etc/librenms/wlFrequency.sh wlan1\" config extend option name rate-tx-wlan0-min option prog \"/etc/librenms/wlRate.sh wlan0 tx min\" config extend option name rate-tx-wlan0-avg option prog \"/etc/librenms/wlRate.sh wlan0 tx avg\" config extend option name rate-tx-wlan0-max option prog \"/etc/librenms/wlRate.sh wlan0 tx max\" config extend option name rate-tx-wlan1-min option prog \"/etc/librenms/wlRate.sh wlan1 tx min\" config extend option name rate-tx-wlan1-avg option prog \"/etc/librenms/wlRate.sh wlan1 tx avg\" config extend option name rate-tx-wlan1-max option prog \"/etc/librenms/wlRate.sh wlan1 tx max\" config extend option name rate-rx-wlan0-min option prog \"/etc/librenms/wlRate.sh wlan0 rx min\" config extend option name rate-rx-wlan0-avg option prog \"/etc/librenms/wlRate.sh wlan0 rx avg\" config extend option name rate-rx-wlan0-max option prog \"/etc/librenms/wlRate.sh wlan0 rx max\" config extend option name rate-rx-wlan1-min option prog \"/etc/librenms/wlRate.sh wlan1 rx min\" config extend option name rate-rx-wlan1-avg option prog \"/etc/librenms/wlRate.sh wlan1 rx avg\" config extend option name rate-rx-wlan1-max option prog \"/etc/librenms/wlRate.sh wlan1 rx max\" config extend option name noise-floor-wlan0 option prog \"/etc/librenms/wlNoiseFloor.sh wlan0\" config extend option name noise-floor-wlan1 option prog \"/etc/librenms/wlNoiseFloor.sh wlan1\" config extend option name snr-wlan0-min option prog \"/etc/librenms/wlSNR.sh wlan0 min\" config extend option name snr-wlan0-avg option prog \"/etc/librenms/wlSNR.sh wlan0 avg\" config extend option name snr-wlan0-max option prog \"/etc/librenms/wlSNR.sh wlan0 max\" config extend option name snr-wlan1-min option prog \"/etc/librenms/wlSNR.sh wlan1 min\" config extend option name snr-wlan1-avg option prog \"/etc/librenms/wlSNR.sh wlan1 avg\" config extend option name snr-wlan1-max option prog \"/etc/librenms/wlSNR.sh wlan1 max\" NOTE, any of the scripts above can be tested simply by running the corresponding command. NOTE, to check the output data from any of these extensions, on the LibreNMS machine, run (for example), snmpwalk -v 2c -c public -Osqnv 'NET-SNMP-EXTEND-MIB::nsExtendOutputFull.\"frequency-wlan0\"' NOTE, on the LibreNMS machine, ensure that snmp-mibs-downloader is installed. NOTE, on the AsuswrtMerlin machine, ensure that distro is installed (i.e. that the OS is correctly detected!). 3: Restart the snmp service on AsuswrtMerlin: service snmpd restart And then wait for discovery and polling on LibreNMS!","title":"AsuswrtMerlin"},{"location":"Support/Device-Notes/Carel-pCOweb-Devices/","text":"Carel pCOweb Devices The pCOWeb card is used to interface the pCO system to networks that use the HVAC protocols based on the Ethernet physical standard such as SNMP. The problem with this card is that the implementation is based on the final manufacturer of the HVAC (Heating, Ventilation and Air Conditioning) and not based on a standard given by Carel. So each pCOweb card has a different configuration that needs a different MIB depending on the manufacturers implementation. The main problem is that LibreNMS will by default discover this card as pCOweb and not as your real manufacturer like it should. A solution was found to bypass this issue, but it's LibreNMS independent and you need to first configure your pCOWeb through the admin interface. Accessing the pCOWeb card Log on to the configuration page of the pCOWeb card. The pCOWeb interface is not always found when accessing the ip directly but rather a subdirectory. If you cant directly reach the configuration page try /config . The default username and password is admin/fadmin . Modern browsers require you to enter this 2 or 3 times. Configuring the pCOweb card SNMP for LibreNMS First you need to configure your SNMP card using the admin interface. An SNMP tab in the configuration menu leaves you the choice to choose a System OID and a Enterprise OID. This is a little tricky but based on this information we defined a \"standard\" for all implementation of Carel products with LibreNMS. The base Carel OID is 1.3.6.1.4.1.9839. To this OID we will add the final manufacturer Enterprise OID. You can find all enterprise OID following this link . This will allow us to create a specific support for this device. Librenms uses this value to detect which HVAC device is connected to the pCOWeb card. Example for the Rittal IT Chiller that uses a pCOweb card: Base Carel OID : 1.3.6.1.4.1.9839 Rittal (the manufacturer) base enterprise OID : 2606 Adding value to identify this device in LibreNMS : 1 Complete System OID for a Rittal Chiller using a Carel pCOweb card: 1.3.6.1.4.1.9839.2606.1 Use 9839 as Enterprise OID The way this works is that the pCOWeb card pretends to be another device. In reality the pCOWeb card just inserts the \"enterprise OID\" in place of the vendor id in the OID. In the table below you can find the values needed for devices which are already supported. Supported devices LibreNMS is ready for the devices listed in this table. You only need to configure your pCOweb card with the accorded System OID and Enterprise OID: Manufacturer Description System OID Enterprise OID Rittal IT Chiller 1.3.6.1.4.1.9839.2606.1 9839 Rittal LCP DX 3311 1.3.6.1.4.1.9839.2606.3311 9839.2606 Unsupported devices After constructing the correct System OID for your SNMP card, you can start the LibreNMS new OS implementation and use this new OID as sysObjectID for the YAML definition file.","title":"Carel pCOweb"},{"location":"Support/Device-Notes/Carel-pCOweb-Devices/#carel-pcoweb-devices","text":"The pCOWeb card is used to interface the pCO system to networks that use the HVAC protocols based on the Ethernet physical standard such as SNMP. The problem with this card is that the implementation is based on the final manufacturer of the HVAC (Heating, Ventilation and Air Conditioning) and not based on a standard given by Carel. So each pCOweb card has a different configuration that needs a different MIB depending on the manufacturers implementation. The main problem is that LibreNMS will by default discover this card as pCOweb and not as your real manufacturer like it should. A solution was found to bypass this issue, but it's LibreNMS independent and you need to first configure your pCOWeb through the admin interface.","title":"Carel pCOweb Devices"},{"location":"Support/Device-Notes/Carel-pCOweb-Devices/#accessing-the-pcoweb-card","text":"Log on to the configuration page of the pCOWeb card. The pCOWeb interface is not always found when accessing the ip directly but rather a subdirectory. If you cant directly reach the configuration page try /config . The default username and password is admin/fadmin . Modern browsers require you to enter this 2 or 3 times.","title":"Accessing the pCOWeb card"},{"location":"Support/Device-Notes/Carel-pCOweb-Devices/#configuring-the-pcoweb-card-snmp-for-librenms","text":"First you need to configure your SNMP card using the admin interface. An SNMP tab in the configuration menu leaves you the choice to choose a System OID and a Enterprise OID. This is a little tricky but based on this information we defined a \"standard\" for all implementation of Carel products with LibreNMS. The base Carel OID is 1.3.6.1.4.1.9839. To this OID we will add the final manufacturer Enterprise OID. You can find all enterprise OID following this link . This will allow us to create a specific support for this device. Librenms uses this value to detect which HVAC device is connected to the pCOWeb card. Example for the Rittal IT Chiller that uses a pCOweb card: Base Carel OID : 1.3.6.1.4.1.9839 Rittal (the manufacturer) base enterprise OID : 2606 Adding value to identify this device in LibreNMS : 1 Complete System OID for a Rittal Chiller using a Carel pCOweb card: 1.3.6.1.4.1.9839.2606.1 Use 9839 as Enterprise OID The way this works is that the pCOWeb card pretends to be another device. In reality the pCOWeb card just inserts the \"enterprise OID\" in place of the vendor id in the OID. In the table below you can find the values needed for devices which are already supported.","title":"Configuring the pCOweb card SNMP for LibreNMS"},{"location":"Support/Device-Notes/Carel-pCOweb-Devices/#supported-devices","text":"LibreNMS is ready for the devices listed in this table. You only need to configure your pCOweb card with the accorded System OID and Enterprise OID: Manufacturer Description System OID Enterprise OID Rittal IT Chiller 1.3.6.1.4.1.9839.2606.1 9839 Rittal LCP DX 3311 1.3.6.1.4.1.9839.2606.3311 9839.2606","title":"Supported devices"},{"location":"Support/Device-Notes/Carel-pCOweb-Devices/#unsupported-devices","text":"After constructing the correct System OID for your SNMP card, you can start the LibreNMS new OS implementation and use this new OID as sysObjectID for the YAML definition file.","title":"Unsupported devices"},{"location":"Support/Device-Notes/Openwrt/","text":"To use Wireless Sensors on Openwrt, an agent of sorts is required. The purpose of the agent is to execute on the client (Openwrt) side, to ensure that the needed Wireless Sensor information is returned for SNMP queries (from LibreNMS). Installation Openwrt Two items are required on the Openwrt side - scripts to generate the necessary information (for SNMP replies), and an SNMP extend configuration update (to return the information vs. the expected query). 1: Install the scripts: Copy the scripts from librenms-agent repository - preferably inside /etc/librenms on Openwrt (and add this directory to /etc/sysupgrade.conf, to survive firmware updates): wget -O /etc/librenms/wlClients.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlClients.sh wget -O /etc/librenms/wlFrequency.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlFrequency.sh wget -O /etc/librenms/wlInterfaces.txt https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlInterfaces.txt wget -O /etc/librenms/wlNoiseFloor.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlNoiseFloor.sh wget -O /etc/librenms/wlRate.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlRate.sh wget -O /etc/librenms/wlSNR.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlSNR.sh wget -O /etc/librenms/distro https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/distro chmod +x /etc/librenms/*.sh chmod +x /etc/librenms/distro The only file that needs to be edited is wlInterfaces.txt, which is a mapping from the wireless interfaces, to the desired display name in LibreNMS. For example, wlan0,wl-2.4G wlan1,wl-5.0G 2: Update the Openwrt SNMP configuration, adding extend support for the OS detection and the Wireless Sensor queries: vi /etc/config/snmpd , adding the following entries (assuming the scripts are installed in /etc/librenms, and are executable), and update the network interfaces as needed to match the hardware, config extend option name distro option prog '/etc/librenms/distro' config extend option name hardware option prog '/bin/cat' option args '/sys/firmware/devicetree/base/model' config extend option name interfaces option prog \"/bin/cat /etc/librenms/wlInterfaces.txt\" config extend option name clients-wlan0 option prog \"/etc/librenms/wlClients.sh wlan0\" config extend option name clients-wlan1 option prog \"/etc/librenms/wlClients.sh wlan1\" config extend option name clients-wlan option prog \"/etc/librenms/wlClients.sh\" config extend option name frequency-wlan0 option prog \"/etc/librenms/wlFrequency.sh wlan0\" config extend option name frequency-wlan1 option prog \"/etc/librenms/wlFrequency.sh wlan1\" config extend option name rate-tx-wlan0-min option prog \"/etc/librenms/wlRate.sh wlan0 tx min\" config extend option name rate-tx-wlan0-avg option prog \"/etc/librenms/wlRate.sh wlan0 tx avg\" config extend option name rate-tx-wlan0-max option prog \"/etc/librenms/wlRate.sh wlan0 tx max\" config extend option name rate-tx-wlan1-min option prog \"/etc/librenms/wlRate.sh wlan1 tx min\" config extend option name rate-tx-wlan1-avg option prog \"/etc/librenms/wlRate.sh wlan1 tx avg\" config extend option name rate-tx-wlan1-max option prog \"/etc/librenms/wlRate.sh wlan1 tx max\" config extend option name rate-rx-wlan0-min option prog \"/etc/librenms/wlRate.sh wlan0 rx min\" config extend option name rate-rx-wlan0-avg option prog \"/etc/librenms/wlRate.sh wlan0 rx avg\" config extend option name rate-rx-wlan0-max option prog \"/etc/librenms/wlRate.sh wlan0 rx max\" config extend option name rate-rx-wlan1-min option prog \"/etc/librenms/wlRate.sh wlan1 rx min\" config extend option name rate-rx-wlan1-avg option prog \"/etc/librenms/wlRate.sh wlan1 rx avg\" config extend option name rate-rx-wlan1-max option prog \"/etc/librenms/wlRate.sh wlan1 rx max\" config extend option name noise-floor-wlan0 option prog \"/etc/librenms/wlNoiseFloor.sh wlan0\" config extend option name noise-floor-wlan1 option prog \"/etc/librenms/wlNoiseFloor.sh wlan1\" config extend option name snr-wlan0-min option prog \"/etc/librenms/wlSNR.sh wlan0 min\" config extend option name snr-wlan0-avg option prog \"/etc/librenms/wlSNR.sh wlan0 avg\" config extend option name snr-wlan0-max option prog \"/etc/librenms/wlSNR.sh wlan0 max\" config extend option name snr-wlan1-min option prog \"/etc/librenms/wlSNR.sh wlan1 min\" config extend option name snr-wlan1-avg option prog \"/etc/librenms/wlSNR.sh wlan1 avg\" config extend option name snr-wlan1-max option prog \"/etc/librenms/wlSNR.sh wlan1 max\" NOTE, any of the scripts above can be tested simply by running the corresponding command. NOTE, to check the output data from any of these extensions, on the LibreNMS machine, run (for example), snmpwalk -v 2c -c public -Osqnv 'NET-SNMP-EXTEND-MIB::nsExtendOutputFull.\"frequency-wlan0\"' NOTE, on the LibreNMS machine, ensure that snmp-mibs-downloader is installed. NOTE, on the AsuswrtMerlin machine, ensure that distro is installed (i.e. that the OS is correctly detected!). 3: Restart the snmp service on Openwrt: service snmpd restart And then wait for discovery and polling on LibreNMS!","title":"OpenWRT"},{"location":"Support/Device-Notes/Openwrt/#installation","text":"","title":"Installation"},{"location":"Support/Device-Notes/Openwrt/#openwrt","text":"Two items are required on the Openwrt side - scripts to generate the necessary information (for SNMP replies), and an SNMP extend configuration update (to return the information vs. the expected query). 1: Install the scripts: Copy the scripts from librenms-agent repository - preferably inside /etc/librenms on Openwrt (and add this directory to /etc/sysupgrade.conf, to survive firmware updates): wget -O /etc/librenms/wlClients.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlClients.sh wget -O /etc/librenms/wlFrequency.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlFrequency.sh wget -O /etc/librenms/wlInterfaces.txt https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlInterfaces.txt wget -O /etc/librenms/wlNoiseFloor.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlNoiseFloor.sh wget -O /etc/librenms/wlRate.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlRate.sh wget -O /etc/librenms/wlSNR.sh https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/Openwrt/wlSNR.sh wget -O /etc/librenms/distro https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/distro chmod +x /etc/librenms/*.sh chmod +x /etc/librenms/distro The only file that needs to be edited is wlInterfaces.txt, which is a mapping from the wireless interfaces, to the desired display name in LibreNMS. For example, wlan0,wl-2.4G wlan1,wl-5.0G 2: Update the Openwrt SNMP configuration, adding extend support for the OS detection and the Wireless Sensor queries: vi /etc/config/snmpd , adding the following entries (assuming the scripts are installed in /etc/librenms, and are executable), and update the network interfaces as needed to match the hardware, config extend option name distro option prog '/etc/librenms/distro' config extend option name hardware option prog '/bin/cat' option args '/sys/firmware/devicetree/base/model' config extend option name interfaces option prog \"/bin/cat /etc/librenms/wlInterfaces.txt\" config extend option name clients-wlan0 option prog \"/etc/librenms/wlClients.sh wlan0\" config extend option name clients-wlan1 option prog \"/etc/librenms/wlClients.sh wlan1\" config extend option name clients-wlan option prog \"/etc/librenms/wlClients.sh\" config extend option name frequency-wlan0 option prog \"/etc/librenms/wlFrequency.sh wlan0\" config extend option name frequency-wlan1 option prog \"/etc/librenms/wlFrequency.sh wlan1\" config extend option name rate-tx-wlan0-min option prog \"/etc/librenms/wlRate.sh wlan0 tx min\" config extend option name rate-tx-wlan0-avg option prog \"/etc/librenms/wlRate.sh wlan0 tx avg\" config extend option name rate-tx-wlan0-max option prog \"/etc/librenms/wlRate.sh wlan0 tx max\" config extend option name rate-tx-wlan1-min option prog \"/etc/librenms/wlRate.sh wlan1 tx min\" config extend option name rate-tx-wlan1-avg option prog \"/etc/librenms/wlRate.sh wlan1 tx avg\" config extend option name rate-tx-wlan1-max option prog \"/etc/librenms/wlRate.sh wlan1 tx max\" config extend option name rate-rx-wlan0-min option prog \"/etc/librenms/wlRate.sh wlan0 rx min\" config extend option name rate-rx-wlan0-avg option prog \"/etc/librenms/wlRate.sh wlan0 rx avg\" config extend option name rate-rx-wlan0-max option prog \"/etc/librenms/wlRate.sh wlan0 rx max\" config extend option name rate-rx-wlan1-min option prog \"/etc/librenms/wlRate.sh wlan1 rx min\" config extend option name rate-rx-wlan1-avg option prog \"/etc/librenms/wlRate.sh wlan1 rx avg\" config extend option name rate-rx-wlan1-max option prog \"/etc/librenms/wlRate.sh wlan1 rx max\" config extend option name noise-floor-wlan0 option prog \"/etc/librenms/wlNoiseFloor.sh wlan0\" config extend option name noise-floor-wlan1 option prog \"/etc/librenms/wlNoiseFloor.sh wlan1\" config extend option name snr-wlan0-min option prog \"/etc/librenms/wlSNR.sh wlan0 min\" config extend option name snr-wlan0-avg option prog \"/etc/librenms/wlSNR.sh wlan0 avg\" config extend option name snr-wlan0-max option prog \"/etc/librenms/wlSNR.sh wlan0 max\" config extend option name snr-wlan1-min option prog \"/etc/librenms/wlSNR.sh wlan1 min\" config extend option name snr-wlan1-avg option prog \"/etc/librenms/wlSNR.sh wlan1 avg\" config extend option name snr-wlan1-max option prog \"/etc/librenms/wlSNR.sh wlan1 max\" NOTE, any of the scripts above can be tested simply by running the corresponding command. NOTE, to check the output data from any of these extensions, on the LibreNMS machine, run (for example), snmpwalk -v 2c -c public -Osqnv 'NET-SNMP-EXTEND-MIB::nsExtendOutputFull.\"frequency-wlan0\"' NOTE, on the LibreNMS machine, ensure that snmp-mibs-downloader is installed. NOTE, on the AsuswrtMerlin machine, ensure that distro is installed (i.e. that the OS is correctly detected!). 3: Restart the snmp service on Openwrt: service snmpd restart And then wait for discovery and polling on LibreNMS!","title":"Openwrt"},{"location":"Support/Device-Notes/Routeros/","text":"This agent script will allow LibreNMS to run a script on a Mikrotik / RouterOS device to gather the vlan information from both /interface/vlan/ and /interface/bridge/vlan/ Installation Go to https://github.com/librenms/librenms-agent/tree/master/snmp/Routeros Copy and paste the contents of LNMS_vlans.scr file into a script within a RouterOS device. Name this script LNMS_vlans. (This is NOT the same thing as creating a txt file and importing it into the Files section of the device) If you're unsure how to create the script. Download the LNMS_vlans.scr file. Rename to remove the .scr extension. Copy this file onto all the Mikrotik devices you want to monitor. Open a Terminal / CLI on each tik and run this. { :global txtContent [/file get LNMS_vlans contents]; /system/script/add name=LNMS_vlans owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=$txtContent ;} This will import the contents of that txt file into a script named LNMS_vlans Enable an SNMP community that has both READ and WRITE capabilities. This is important, otherwise, LibreNMS will not be able to run the above script. It is recommended to use SNMP v3 for this. Discover / Force rediscover your Mikrotik devices. After discovery has been completed the vlans menu should appear within LibreNMS for the device. IMPORTANT NOTE It is strongly recommended that SNMP service only be allowed to be communicated on a very limited set of IP addresses that LibreNMS and related systems will be coming from. (usually /32 address for each) because the write permission could allow an attack on a device. (such as dropping all firewall filters or changing the admin credentials) Theory of operation: Mikrotik vlan discovery plugin using the ability of ROS to \"fire up\" a script through SNMP. At first, LibreNMS check for the existence of the script, and if it is present, it will start the LNMS_vlans script. The script will gather information from: - /interface/bridge/vlan for tagged ports inside bridge - /interface/bridge/vlan for currently untagged ports inside bridge - /interface/bridge/port for ports PVID (untagged) inside bridge - /interface/vlan for vlan interfaces after the information is gathered, it is transmitted to LibreNMS over SNMP protocol is: type,vlanId,ifName i.e: T,254,ether1 is translated to Tagged vlan 254 on port ether1 U,100,wlan2 is translated to Untagged vlan 100 on port wlan2","title":"RouterOS"},{"location":"Support/Device-Notes/Routeros/#installation","text":"Go to https://github.com/librenms/librenms-agent/tree/master/snmp/Routeros Copy and paste the contents of LNMS_vlans.scr file into a script within a RouterOS device. Name this script LNMS_vlans. (This is NOT the same thing as creating a txt file and importing it into the Files section of the device) If you're unsure how to create the script. Download the LNMS_vlans.scr file. Rename to remove the .scr extension. Copy this file onto all the Mikrotik devices you want to monitor. Open a Terminal / CLI on each tik and run this. { :global txtContent [/file get LNMS_vlans contents]; /system/script/add name=LNMS_vlans owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=$txtContent ;} This will import the contents of that txt file into a script named LNMS_vlans Enable an SNMP community that has both READ and WRITE capabilities. This is important, otherwise, LibreNMS will not be able to run the above script. It is recommended to use SNMP v3 for this. Discover / Force rediscover your Mikrotik devices. After discovery has been completed the vlans menu should appear within LibreNMS for the device.","title":"Installation"},{"location":"Support/Device-Notes/Routeros/#important-note","text":"It is strongly recommended that SNMP service only be allowed to be communicated on a very limited set of IP addresses that LibreNMS and related systems will be coming from. (usually /32 address for each) because the write permission could allow an attack on a device. (such as dropping all firewall filters or changing the admin credentials)","title":"IMPORTANT NOTE"},{"location":"Support/Device-Notes/Routeros/#theory-of-operation","text":"Mikrotik vlan discovery plugin using the ability of ROS to \"fire up\" a script through SNMP. At first, LibreNMS check for the existence of the script, and if it is present, it will start the LNMS_vlans script. The script will gather information from: - /interface/bridge/vlan for tagged ports inside bridge - /interface/bridge/vlan for currently untagged ports inside bridge - /interface/bridge/port for ports PVID (untagged) inside bridge - /interface/vlan for vlan interfaces after the information is gathered, it is transmitted to LibreNMS over SNMP protocol is: type,vlanId,ifName i.e: T,254,ether1 is translated to Tagged vlan 254 on port ether1 U,100,wlan2 is translated to Untagged vlan 100 on port wlan2","title":"Theory of operation:"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index f5706ed3..6e1e1883 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,647 +2,652 @@ https://docs.librenms.org/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/API/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/API/ARP/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/API/Alerts/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/API/Bills/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/API/DeviceGroups/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/API/Devices/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/API/Inventory/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/API/Locations/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/API/Logs/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/API/PollerGroups/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/API/PortGroups/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/API/Port_Groups/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/API/Ports/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/API/Routing/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/API/Services/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/API/Switching/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/API/System/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Alerting/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Alerting/Creating-Transport/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Alerting/Device-Dependencies/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Alerting/Entities/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Alerting/Macros/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Alerting/Rules/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Alerting/Templates/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Alerting/Testing/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Alerting/Transports/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/Application-Notes/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/Code-Structure/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/Creating-Documentation/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/Creating-Release/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/Dynamic-Config/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/Getting-Started/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/Merging-Pull-Requests/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/SNMP-Traps/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/Sensor-State-Support/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/Support-New-OS/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/Using-Git/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/Validating-Code/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/os/Custom-Graphs/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/os/Health-Information/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/os/Initial-Detection/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/os/Mem-CPU-Information/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/os/Settings/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/os/Test-Units/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Developing/os/Wireless-Sensors/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Agent-Setup/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Applications/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Authentication/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Auto-Discovery/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Availability-Map/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Billing-Module/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Component/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Custom-Map/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Customizing-the-Web-UI/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Dashboards/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Dell-OpenManage/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Dependency-Map/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Device-Groups/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Dispatcher-Service/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Distributed-Poller/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Fast-Ping-Check/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Galera-Cluster/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Gateone/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Graylog/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/IRC-Bot-Extensions/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/IRC-Bot/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Interface-Description-Parsing/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Metric-Storage/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/NFSen/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Network-Map/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/OAuth-SAML/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Oxidized/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/PeeringDB/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Plugin-System/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Proxmox/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/RRDCached/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/RRDTune/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Rancid/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/SNMP-Proxy/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/SNMP-Trap-Handler/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Services/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Smokeping/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Sub-Directory/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Supermicro/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Syslog/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Two-Factor-Auth/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Varnish/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/VisJS-Config/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/Weathermap/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/World-Map/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/metrics/Graphite/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/metrics/InfluxDB/ - 2024-03-03 + 2024-03-07 + daily + + + https://docs.librenms.org/Extensions/metrics/InfluxDBv2/ + 2024-03-07 daily https://docs.librenms.org/Extensions/metrics/OpenTSDB/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Extensions/metrics/Prometheus/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/General/Acknowledgement/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/General/Callback-Stats-and-Privacy/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/General/Changelog/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/General/Releases/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/General/Security/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/General/Updating/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/General/Welcome-to-Observium-users/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Installation/Docker/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Installation/Images/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Installation/Install-LibreNMS/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Installation/Migrating-from-Observium/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/1-Minute-Polling/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Adding-a-Device/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Bare-Dashboard/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/CLI-Tools/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Cleanup-options/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Configuration/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Device-Sensors/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Device-Troubleshooting/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Discovery%20Support/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Environment-Variables/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Example-Hardware-Setup/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/FAQ/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Features/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Install%20Validation/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Performance/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Poller%20Support/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Remote-Monitoring-VPN/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/SNMP-Configuration-Examples/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Device-Notes/AsuswrtMerlin/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Device-Notes/Carel-pCOweb-Devices/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Device-Notes/Openwrt/ - 2024-03-03 + 2024-03-07 daily https://docs.librenms.org/Support/Device-Notes/Routeros/ - 2024-03-03 + 2024-03-07 daily \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 0870fd72..81c1c347 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ