Tienda Wifi

Tienda Wifi
CiudadWireless es la tienda Wifi recomendada por elhacker.NET

Entradas Mensuales

Síguenos en:

Canal Oficial Telegram de elhacker.NET Grupo Facebook elhacker.NET Twitter elhacker.NET Canal Youtube elhacker.NET Comunidad Steam: Grupo elhacker.NET Mastodon

Entradas populares

PostHeaderIcon Configurar Telegraf, InfluxDB y Grafana para monitorizar Router Asus


 En este tutorial aprenderemos a configurar tres herramientas mediante docker que nos permitirán monitorizar en tiempo real múltiples valores de un Router Asus mediante consultas SNMP.




Utilizando Grafana podemos crear un Dashboard, un completo panel de control totalmente personalizable para visualizar los parámetros que nos interesen en este caso de un router Asus (Temperatura CPU, Temperatura WiFi 2,4ghz, 5ghz, Uso de la red, paquetes enviados, conexiones activas, etc).

El manual es un poco largo porque se utilizan 3 herramientas muy potentes.

¿Qué es Telegraf, InfluxDBv2 y Grafana?

Para la realización del sistema de monitorización, vamos a usar tres softwares que son Telegraf, InfluxDBv2 y Grafana. Todos ellos son imprescindibles y hacen una labor fundamental para recopilar, enviar los datos, escribirlos a una base de datos y mostrarlos en un panel de control totalmente personalizable. Si no conoces estos tres softwares, a continuación, os vamos a explicar qué es lo que hacen y para qué nos servirán.

Telegraf es un agente que nos permitirá recopilar, procesar, agregar y escribir las métricas, registros y otros datos arbitrarios. Este software incorpora más de 300 complementos para adaptarse a cualquier origen de datos, por lo que cubren una amplia gama de funciones que incluyen la monitorización del sistema, servicios en la nube y transmisión de los mensajes. Este software permite la integración de código para recopilar, transformar y transmitir los datos de forma eficiente. El archivo de configuración está en lenguaje TOML, por lo que la sintaxis es bastante amigable en comparación con otros.

Este software es bastante fácil de configurar, básicamente tendremos un origen de datos que puede ser HTTP, sensores usando diferentes protocolos y también la nube. En la parte de «Input» o entrada, podremos leer los estados de CPU, RAM, los mensajes MQTT, leer el estado del sistema a través de SNMP y mucho más. Una vez que hayamos recopilado toda esta información, tenemos la posibilidad de procesar estos datos e incluso hacer agregación de ellos, para posteriormente escribir en una base de datos o en un archivo, para su posterior tratamiento.

 


En este tutorial usaremos Telegraf para recopilar el estado del router del fabricante ASUS vía SNMP, que disponen de un servidor SNMPv3 desde donde podemos leer una gran cantidad de datos del equipo. Los MIB necesaria para poder leer todos los datos, y poder configurar Telegraf adecuadamente para su posterior envío a la base de datos de InfluxDBv2.

InfluxDB es la base de datos de series temporales Open Source más utilizada, esta base de datos tiene todo lo que necesitamos en el mismo software, y es que no solo contamos con la propia base de datos, sino también una interfaz gráfica de usuario que nos permitirá mostrar los datos que nosotros queramos, e incluso tiene herramientas para hacer agregación de datos de manera avanzada. No obstante, para mostrar toda la información con sus gráficas y demás usaremos Grafana. La interfaz gráfica de usuario de InfluxDB nos permitirá crear las bases de datos, y también obtener el código de la consulta para posteriormente copiarlo y pegarlo en Grafana.

 


En este tutorial nosotros usaremos InfluxDBv2, y veréis que el lenguaje Flux no es ningún problema, y el funcionamiento es simplemente perfecto. Además, todas las comunicaciones las haremos vía HTTPS para proporcionar la mejor seguridad posible, los certificados SSL/TLS serán autofirmados.


 

Grafana es un software libre que nos permite la visualización de cualquier dato, permitiéndonos crear cuadros de mando y gráficos muy útiles a partir de múltiples fuentes. Este software es compatible con bases de datos relacionales, noSQL e incluso bases de datos de series de tiempo como Graphite o InfluxDB entre otras. Lo mejor de este software es que es multiplataforma, aunque también lo podemos instalar perfectamente en Docker. Este software dispone de una grandísima cantidad de orígenes donde leer la información para poder mostrarla, además, incorpora muchísimos plugins que podemos instalar para aumentar las funcionalidades.

En nuestro tutorial, usaremos Grafana para conectarse con InfluxDBv2 y obtener todos los datos, para posteriormente mostrarlos en gráficas realmente impresionantes. Las posibilidades de Grafana son inmensas, porque también nos permitirá transformar los datos obtenidos en otros, directamente «al vuelo», sin necesidad de escribirlos en una base de datos adicional. La comunicación de este software con InfluxDBv2 será a través de HTTPS con certificados autofirmados, y comprobando la CA para dotar al sistema de la máxima seguridad.

El objetivo de este tutorial es poder crear un panel de control donde podamos ver mucha información del router ASUS o cualquier otro equipo que envíe datos a InfluxDBv2. Podemos monitorizar el tiempo de encendido, firmware actual, CPU y RAM, temperaturas, los conjuntos de almacenamiento y en definitiva, todo lo que nos permita la MIB del SNMP del sistema operativo.


 

Gracias a las diferentes gráficas que nos permite crear Grafana, tenemos la posibilidad de verlo todo de una manera realmente espectacular. Dependiendo de los datos que nos interese mostrar, tendremos un tipo de gráfico u otros. El límite lo pone tu imaginación y lo que quieras realmente mostrar.

Una vez que ya conocéis para qué sirven todos los softwares que vamos a instalar, os vamos a hacer un pequeño resumen de cómo sería el flujo de datos para que lo tengáis muy claro:

  • Telegraf se encargará de leer todos los estados vía SNMP hacia el router,que ya tiene un servidor SNMP en su interior que debemos activar y configurar, y tendremos la MIB para poder leer todos los datos. Telegraf enviará los datos a InfluxDBv2 vía HTTPS a un «Bucket» concreto.
  • InfluxDBv2 se encargará de recibir todos los datos de Telegraf instalado mediante docker, o bien desde cualquier Telegraf que tengamos en otros equipos, porque podemos estar recibiendo datos desde todos los que queramos de forma completamente simultánea. Tanto el acceso a la web de administración como la recepción de los datos se hará con HTTPS con certificados autofirmados y una CA.
  • Grafana se encargará de conectarse a InfluxDBv2 vía HTTPS para leer todos los datos, y mostrarlos en paneles de control muy configurables.

Requisitos previos

  •     Firmware Asuswrt-Merlin instalado en el router.
  •     SNMP activado en el router. (Menú: Administración -> SNMP)
  •     JFFS custom scripts and configs habilitado en el router. (Menú: Administración -> Sistema -> Partición JFFS2 persistente -> Habilitar scripts y configuraciones personalizadas JFFS)
  •     Conocimiento de cómo configurar scripts de usuario y tareas programadas en el router.
  •     Implementar TIG (Telegraf, InfluxDB, Grafana) en docker o no

Nota: No todos los routers con Asuswrt-Merlin soportan SNMP, una opción es instalarlo con Entware

Configurar SNMP en el router Asus vía SSH

Editamos el fichero:

nano /jffs/configs/snmpd.conf.add
Añadimos el contenido:

extend tmpc /bin/ash /jffs/scripts/asus_snmp_tempc.sh
extend tmp2 /bin/ash /jffs/scripts/asus_snmp_tempw2.sh
extend tmp5 /bin/ash /jffs/scripts/asus_snmp_tempw5.sh
extend ssha /bin/ash /jffs/scripts/asus_snmp_sshact.sh
extend webt /bin/ash /jffs/scripts/asus_snmp_webtime.sh
extend webi /bin/ash /jffs/scripts/asus_snmp_webip.sh
extend conc /bin/ash /jffs/scripts/asus_snmp_conncount.sh
extend cona /bin/ash /jffs/scripts/asus_snmp_connactive.sh
extend inet /bin/ash /jffs/scripts/asus_snmp_inetstat.sh
extend jffs /bin/ash /jffs/scripts/asus_snmp_jffsusage.sh
extend proc /bin/ash /jffs/scripts/asus_snmp_proccount.sh
extend w2cl /bin/ash /jffs/scripts/asus_snmp_w2clients.sh
extend w5cl /bin/ash /jffs/scripts/asus_snmp_w5clients.sh
Ahora editamos y creamos los scripts:


cd /jffs/scripts/

asus_snmp_connactive.sh

Contenido:

#!/bin/ash

# Connections active
cat /proc/net/nf_conntrack | grep -i -c -E "(tcp.*established)|(udp.*assured)"

asus_snmp_conncount.sh

#!/bin/ash

# Connections
cat /proc/sys/net/netfilter/nf_conntrack_count

asus_snmp_inetstat.sh

#!/bin/ash

# Internet connection status (2: normal)
nvram get link_internet

 asus-snmp_scripts/asus_snmp_jffsusage.sh

 

#!/bin/ash

# % of JFFS partition used (47MB total on RT-AX86U)
df | grep "jffs" | awk '{print $5 - "%"}'
asus_snmp_proccount.sh

#!/bin/ash

# Number of running processes
ps | wc -l | awk '{print $1 - 1}'
asus_snmp_sshact.sh

#!/bin/ash

# Active SSH connections
netstat -tnp | grep -c 'ESTABLISHED.*dropbear'

asus_snmp_tempc.sh

#!/bin/ash

# CPU Temperature with mC->C calculation performed
cat /sys/class/thermal/thermal_zone0/temp | awk '{print $1 / 1000}'

asus_snmp_tempw2.sh

#!/bin/ash

# Wireless Temperature command with calculations performed (eth6: 2.4GHz, eth7: 5GHz)
wl -i eth6 phy_tempsense | awk '{print $1 / 2 + 20}'
asus_snmp_tempw5.sh
#!/bin/ash

# Wireless Temperature command with calculations performed (eth6: 2.4GHz, eth7: 5GHz)
wl -i eth7 phy_tempsense | awk '{print $1 / 2 + 20}'
asus_snmp_w2clients.sh

#!/bin/ash

# Number of 2.4GHz wireless clients connected
wl -i eth6 assoclist | wc -l
asus_snmp_w5clients.sh

#!/bin/ash

# Number of 5GHz wireless clients connected
wl -i eth7 assoclist | wc -l
asus_snmp_webip.sh

#!/bin/ash

# Web admin session - last logged in IP
nvram get login_ip_str
asus_snmp_webtime.sh

#!/bin/ash

# Web admin session active timestamp (returns no value if no one is logged in)
nvram get login_timestamp

Permisos de ejecución para todos los scripts:


 chmod a+rx /jffs/scripts/*.sh


Habilitar del SNMP en Routers ASUS

Ahora debemos habilitar el servidor SNMP, que es al que se conectará Telegraf para «leer» absolutamente todos los estados del router. Para hacer esto, tenemos que irnos a «Administración - SNMP«. En este menú pinchamos en el botón de «Habilitar servicio SNMP» y realizamos estos ajustes:

  • Versión SNMP: SNMP v3. Es la última versión y más segura.
  • Nombre de usuario: telegraf (podemos poner el que queramos, pero debe corresponderse con la configuración del propio Telegraf, de lo contrario no funcionará).
  • Usar autenticación: activado
    • Protocolo de autenticación: SHA
    • Contraseña de autenticación: ehn
  • Privacidad de uso: activado
    • Protocolo de privacidad: AES
    • Contraseña de privacidad: ehn



  • Enable SNMP -> Yes
  • Allow access from WAN -> No
  • SNMP Get Community -> read (Public)
  • SNMP Set Community -> Read-Write (Private)
  • SNMPv3 Authentication Type -> SHA
  • SNMPv3 Authentication Password
  • SNMPv3 Privacy Type -> AES)
  • SNMPv3 Privacy Password

Ahora pinchamos en «Aplicar» y esperamos unos segundos.


Si miramos en el System Log debería aparecer:


Oct  8 13:30:28 rc_service: httpds 2354:notify_rc restart_snmpd
Oct  8 13:30:28 custom_script: Running /jffs/scripts/service-event (args: restart snmpd)
Oct  8 13:30:28 custom_config: Appending content of /jffs/configs/snmpd.conf.add.


Podremos monitorizar

  •     Recuento de conexiones
  •     Recuento de conexiones activas
  •     Admin sesión web - IP de origen de la sesión activa/última sesión
  •     Admin sesión web - timestamp (devuelve un valor cuando alguien está conectado)
  •     Estado de la conexión a Internet
  •     Uso de la partición JFFS (%)
  •     Número de sesiones SSH activas
  •     Número de procesos en ejecución
  •     Temperatura - CPU
  •     Temperatura - Módulo inalámbrico de 2,4 GHz
  •     Temperatura - Módulo inalámbrico de 5 GHz
  •     Número de clientes inalámbricos - 2,4 GHz
  •     Número de clientes inalámbricos - 5 GHz

 

Creación del árbol de directorios para Docker

Con el fin de evitar problemas de Docker a la hora de levantar los diferentes contenedores, vamos a crear la carpeta compartida o dataset donde almacenaremos todos los contenedores e información. En nuestro caso, la ruta donde tendremos absolutamente todo lo relacionado con Docker es «/share/MaquinasVirtuales/Docker». De este directorio colgará todo el software. Aunque a la hora de ejecutar el stack en Portainer se creará el árbol de directorio, debido a que vamos a configurar «volumes» con archivos específicos, es necesario crear previamente estos archivos, y también asignarles adecuadamente los permisos necesarios.

Para que Telegraf se cree correctamente con el Docker-compose, es necesario crear el archivo de configuración vacío, luego lo editaremos:

 

touch /share/MaquinasVirtuales/Docker/telegraf/telegraf.conf

Para que Grafana se inicie correctamente, es necesario proporcionar los permisos adecuados a la carpeta que creará el contenedor, para ello ejecutamos:

 

mkdir -p /share/MaquinasVirtuales/Docker/grafana/grafana_data
chmod 777 -R /share/MaquinasVirtuales/Docker/grafana/grafana_data

Ahora ya tendremos toda la estructura lista, ahora procedemos a crear los certificados digitales SSL/TLS que usaremos para todos los contenedores, así toda la comunicación se hace vía HTTPS.

Instalar todo el software usando Docker

Para la instalación de todo el software vamos a usar la consola por SSH de cualquier máquina Linux con Docker

Primero crearemos un Docker-compose con solamente el contenedor de Portainer, que se encargará de crear y gestionar el resto de contenedores muy fácilmente. Después crearemos un Stack con el resto de contenedores. Os vamos a proporcionar todo el código en un archivo .ZIP para su descarga sencilla.

 

Crearemos un archivo llamado docker-compose.yaml en el directorio «/share/MaquinasVirtuales/Docker» con el siguiente contenido:

#Comprobar Docker-compose:
#docker-compose -f docker-compose.yml config
version: '3.7'
networks:
dockerportainer:
name: dockerportainer
driver: bridge
ipam:
config:
- subnet: 172.30.1.0/24
services:
## Portainer - Gestor Dockers
portainer:
container_name: Portainer
image: portainer/portainer-ce:2.19.5
command: -H unix:///var/run/docker.sock
restart: always
networks:
dockerportainer:
ipv4_address: 172.30.1.2
ports:
- '10.11.1.9:9443:9443/tcp'
security_opt:
- no-new-privileges:true
volumes:
- /share/MaquinasVirtuales/Docker/portainer:/data
- /var/run/docker.sock:/var/run/docker.sock
- /etc/localtime:/etc/localtime:ro
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Madrid

Solamente tendrás que modificar la dirección IP 10.11.1.9 por la de tu servidor Linux. Es muy importante que sea lenguaje yaml, podéis usar un validador de sintaxis para los espacios. De todas formas, si usáis el código fuente nuestro vais a poder ejecutarlo sin problemas, es simplemente copiar y pegar. Para hacerlo tendrás que ejecutar «vim docker-compose.yaml» y dentro copiar todo el contenido, si no sabes usar de manera básica vim o nano.

Ahora lo ejecutaremos con la orden siguiente:

docker compose up -d

Esperamos unos segundos y ya podremos iniciar sesión en Portainer a través de la dirección IP de tu servidor Limux y el puerto 9443. Tendrás que poner la dirección https://IP:9443 y te pedirá el nombre de usuario «admin» y poner una contraseña robusta. Una vez creada la clave, ya podrás acceder a su administración y crear el nuevo stack.


 

Para crear el nuevo stack en Portainer, debemos irnos a «Dashboard / Stacks«:

Una vez que estemos en el menú anterior, tendremos que copiar el siguiente código:

version: '3.7'

networks:
  dockertig:
    name: dockertig
    driver: bridge
    ipam:
      config:
        - subnet: 172.30.2.0/24

services:

#Telegraf para leer datos del Router Asus via SNMP
  telegraf:
    image: telegraf:latest
    hostname: "Telegraf"
    container_name: telegraf
    restart: unless-stopped
    networks:
      dockertig:
         ipv4_address: 172.30.2.2
    ports:
       - '192.168.0.3:8125:8125/tcp'
    environment:
      - TZ=Europe/Madrid
    volumes:
       - /home/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf
       - /home/telegraf/mibs:/usr/share/snmp/mibs
       - /home/telegraf/conf.d:/etc/telegraf/telegraf.d
       - /home/tig/ehn-ca.crt:/etc/telegraf/ehn-ca.crt
    depends_on:
      - influxdb

#InfluxDB para Home Assistant y otros servicios
  influxdb:
    image: influxdb:latest
    container_name: influxdb
    restart: unless-stopped
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=router
      - DOCKER_INFLUXDB_INIT_PASSWORD=routerasus123
      - DOCKER_INFLUXDB_INIT_ORG=ASUSORG
      - DOCKER_INFLUXDB_INIT_BUCKET=tig
      - INFLUXD_TLS_CERT=/etc/ssl/ehn-autofirmado.crt
      - INFLUXD_TLS_KEY=/etc/ssl/ehn-autofirmado.key
    networks:
      dockertig:
         ipv4_address: 172.30.2.3
    ports:
      - '192.168.0.3:8086:8086/tcp'
    volumes:
      - /home/tig/influxdb/influxdb_data:/var/lib/influxdb2
      - /home/tig/influxdb/config:/etc/influxdb2
      - /home/tig/ehn-autofirmado.crt:/etc/ssl/ehn-autofirmado.crt
      - /home/tig/ehn-autofirmado.key:/etc/ssl/ehn-autofirmado.key

#Grafana para mostrar todo lo de InfluxDB
  grafana:
    #image: grafana/grafana:latest
    image: grafana/grafana-oss
    container_name: grafana
    restart: unless-stopped
    networks:
      dockertig:
         ipv4_address: 172.30.2.4
    ports:
      - '192.168.0.3:8088:3000/tcp'
    volumes:
      - grafana-storage:/var/lib/grafana
      #- /home/tig/grafana/grafana_data:/var/lib/grafana
      #- /home/tig/grafana/plugins:/var/lib/grafana/plugins
      #- /etc/grafana/grafana.db:/var/lib/grafana/grafana.db
      - /home/tig/ehn-autofirmado.crt:/etc/ssl/ehn-autofirmado.crt
      - /home/tig/ehn-autofirmado.key:/etc/ssl/ehn-autofirmado.key
    depends_on:
      - influxdb
    environment:
       - GF_SERVER_CERT_FILE=/etc/ssl/ehn-autofirmado.crt
       - GF_SERVER_CERT_KEY=/etc/ssl/ehn-autofirmado.key
       - GF_SERVER_PROTOCOL=https
       - GF_SECURITY_ADMIN_USER=router
       - GF_SECURITY_ADMIN_PASSWORD=routerasus123
volumes:
  grafana-storage: {}       

## FIN ##


 

Tal y como ocurre en el caso anterior, es necesario que cambiéis la dirección IP 10.11.1.9 de nuestro NAS, por la del vuestro. Este fichero de docker-compose ya se encargará de crear los usuarios de administración en InfluxDB y Grafana de forma automática, activar el HTTPS y cargar los certificados digitales anteriores. Por este motivo, es muy importante tenerlo todo listo previamente, sino dará error a la hora de desplegar el stack. Este archivo de Docker-compose también lo tenéis disponible en la descarga de todo el código fuente, así no tendréis errores con la sintaxis.


 

Configuración del software

Ha llegado el momento de empezar con la configuración de los tres softwares. Primero vamos a configurar el InfluxDBv2 que es la base de datos, porque debemos crear los TOKEN necesarios para que tanto Telegraf como Grafana puedan conectarse correctamente. Os vamos a enseñar cómo crear un nuevo TOKEN con determinados permisos, y cómo conseguir los diferentes identificadores necesarios para el buen funcionamiento del sistema de monitorización.

Configuración de InfluxDBv2

Lo primero que tenemos que hacer es configurar la base de datos de InfluxDBv2, concretamente tenemos que coger cierta información y crear varios TOKEN para que los otros dos softwares (Telegraf y Grafana) puedan tener acceso. Para ello iniciamos sesión vía web, poniendo la dirección HTTPS://IP_SERVIDOR:8086 que es el puerto que hemos elegido. El nombre de usuario es «router» y la contraseña es «routerasus123» tal y como teníamos en el docker-compose.


 

Una vez que estemos dentro, podemos ver en la parte superior izquierda la organización a la que pertenecemos, que es la que configuramos a través del «environment» del Docker-compose.

En este menú de «About» podemos ver el «Organization ID» que lo necesitaremos posteriormente para configurar Grafana, así que no lo olvidéis.

Lo más importante son los «Buckets«, esto son las bases de datos donde se almacenará todo el contenido. Tenemos la posibilidad de crear todos los buckets que nosotros queramos, simplemente le daremos un nombre. Con el docker-compose ya generamos uno automáticamente llamado «tig» que será donde Telegraf escribirá toda la información que recoja vía SNMP. No obstante, podemos crear uno nuevo sin problemas y que recoja toda la información ahí.

En la sección de «API TOKENS» es donde podemos generar TOKEN nuevos con ciertos permisos, tanto de lectura como escritura en todos los BUCKETS o solamente en ciertos.

En este menú, tendremos que darle un nombre el TOKEN, por ejemplo, «Telegraf«, y a continuación, elegiremos el Bucket donde Telegraf trabajará, y le daremos permisos de lectura y escritura. No es recomendable crear un TOKEN universal para todos los buckets por cuestiones de seguridad.

Una vez que lo hayamos creado, copiamos todo ese TOKEN en el portapapeles, será el que usaremos en Telegraf para escribir, o bien en Grafana para leer toda la información.

La configuración de los TOKEN que debemos realizar en InfluxDB son los siguientes:

  • Token para Telegraf: creamos un token con permisos de escritura (no es necesario lectura) solamente en el bucket de trabajo.
  • Token para Grafana: creamos un token con permisos de lectura (no es necesario escritura) para todos los buckets. Si no lo hacemos así, el día de mañana si creamos un nuevo bucket, tendremos que reconfigurar Grafana con un nuevo token que tenga permisos para todos. También podrías hacerlo individualmente para mayor seguridad, pero tendrás que reconfigurar Grafana cada vez que pongas uno nuevo.

Configuración de Telegraf

Ha llegado el momento de configurar Telegraf adecuadamente para que escriba todos los datos conseguidos por SNMP al InfluxDB. Esta parte es la más compleja y delicada, sobre todo si nunca has trabajo con SNMP.

Deberemos copiar los MIBs del sistema operativo de Linux en el directorio de «/share/MaquinasVirtuales/Docker/telegraf/mibs», también debemos copiar la MIB SNMPv2 que podéis bajar de aquí. Una vez que estén las dos en el directorio, ya estaremos listos para configurar el archivo de configuración telegraf.conf.


Deberemos copiar los MIBS al contenedor Telegraf

docker cp /usr/share/snmp/mibs/. ID_CONTENEDOR_DOCKER:/usr/share/snmp/mibs/

 

Con el contenido outputs:

[[outputs.influxdb_v2]]
  urls = ["https://IP_INFLUXDB:8086/"]
  token = "XXX"
  organization = "ASUSORG"
  bucket = "tig"
  tls_ca = "/etc/telegraf/ehn-ca.crt"

Por defecto el intervalo de tiempo es 1 minuto (60s) pero se puede cambiar.

Y el siguiente contenido inputs:

# # Retrieves SNMP values from remote agents
[[inputs.snmp]]
#   ## Agent addresses to retrieve values from.
#   ##   format:  agents = ["<scheme://><hostname>:<port>"]
#   ##   scheme:  optional, either udp, udp4, udp6, tcp, tcp4, tcp6.
#   ##            default is udp
#   ##   port:    optional
#   ##   example: agents = ["udp://127.0.0.1:161"]
#   ##            agents = ["tcp://127.0.0.1:161"]
#   ##            agents = ["udp4://v4only-snmp-agent"]
   agents = ["routerIP:161"]

    # Timeout for each request.
    timeout = "15s"

    # SNMP version; can be 1, 2, or 3.
    version = 3

#   ## Agent host tag; the tag used to reference the source host
#   # agent_host_tag = "asus.snmp"

    # measurement name override
    name_override = "router_asus"

#   ## SNMP community string.
#   # community = "public"

    # Number of retries to attempt.
    retries = 3
    
    # Time between polls
    interval = "60s"

    # The GETBULK max-repetitions parameter.
    max_repetitions = 10

    ## SNMPv3 authentication and encryption options.
    ##
    # Security Name.
    sec_name = "username"
    # Authentication protocol; one of "MD5", "SHA", or "".
    auth_protocol = "SHA"
    # Authentication password.
    auth_password = "password"
    # Security Level; one of "noAuthNoPriv", "authNoPriv", or "authPriv".
    sec_level = "authPriv"
#   ## Context Name.
#   # context_name = ""
    # Privacy protocol used for encrypted messages; one of "DES", "AES" or "".
    priv_protocol = "AES"
    # Privacy password used for encrypted messages.
    priv_password = "password"   
   


#      fielddrop = [ "laErrorFlag", "laErrMessage" ]
#   [inputs.snmp.tagdrop]
#     diskIODevice = [ "loop*", "ram*" ]

  ###
  ### System details ###
  ###
 
   #  System name (hostname) - e.g. RT-AX86U-xxxx
   [[inputs.snmp.field]]
     name = "sysName"
     oid = "SNMPv2-MIB::sysName.0"
     is_tag = true
   
#   #  System vendor OID - e.g. ".1.3.6.1.4.1.8072.3.2.10"
#   [[inputs.snmp.field]]
#     name = "sysObjectID"
#     oid = "SNMPv2-MIB::sysObjectID.0"
   
#   #  System description - e.g. "Linux RT-AX86U-xxxx 4.1.52 #2 SMP PREEMPT Fri Feb 12 18:27:21 EST 2021 aarch64"
#   [[inputs.snmp.field]]
#     name = "sysDescr"
#     oid = "SNMPv2-MIB::sysDescr.0"
   
#   #  System contact
#   [[inputs.snmp.field]]
#     name = "sysContact"
#     oid = "SNMPv2-MIB::sysContact.0"
   
#   #  System location - e.g. "Unknown"
#   [[inputs.snmp.field]]
#     name = "sysLocation"
#     oid = "SNMPv2-MIB::sysLocation.0"
 
 
  ###
  ### Host/System Resources ###
  ###
 
  #  System uptime "The amount of time since this host was last initialized."
  #  TimeTicks /6000 for minutes.
   [[inputs.snmp.field]]
     name = "sysUpTime"
     oid = "HOST-RESOURCES-MIB::hrSystemUptime.0"

   #  Number of user sessions
   #  "The number of user sessions for which this host is
   #     storing state information.  A session is a collection
   #     of processes requiring a single act of user
   #     authentication and possibly subject to collective job
   #     control."
   [[inputs.snmp.field]]
     name = "hrSystemNumUsers"
     oid = "HOST-RESOURCES-MIB::hrSystemNumUsers.0"

#   #  Number of process contexts - did not return result based on test.
#    #    Error: "No Such Instance currently exists at this OID"
#   [[inputs.snmp.field]]
#     name = "hrSystemProcesses"
#     oid = "HOST-RESOURCES-MIB::hrSystemProcesses.0"

   #  Device Listing
   #  Lists all the network interfaces and their statuses
   #  hrDeviceStatus values: unknown(1), running(2), warning(3), testing(4), down(5)
   [[inputs.snmp.table]]
     oid = "HOST-RESOURCES-MIB::hrDeviceTable"
     [[inputs.snmp.table.field]]
       oid = "HOST-RESOURCES-MIB::hrDeviceIndex"
       is_tag = true


#  ### Context Switches & Interrupts ###
#   #  Number of system interrupts processed
#   [[inputs.snmp.field]]
#     name = "ssRawInterrupts"
#     oid = "UCD-SNMP-MIB::ssRawInterrupts.0"
#   #  Number of context switches
#   [[inputs.snmp.field]]
#     name = "ssRawContexts"
#     oid = "UCD-SNMP-MIB::ssRawContexts.0"
 
 
  ###
  ### Host performance metrics ###
  ###
 
   #  System Load Average
   #  laLoad: "The 1,5 and 15 minute load averages (one per row)."
   #  laLoadFloat: "The 1,5 and 15 minute load averages
   #  as an opaquely wrapped floating point number."
   #  laLoadInt: "The 1,5 and 15 minute load averages as an integer. Computed by taking
   #  the floating point loadaverage value and multiplying by 100,
   #  then converting the value to an integer."
   [[inputs.snmp.table]]
     oid = "UCD-SNMP-MIB::laTable"
     [[inputs.snmp.table.field]]
       oid = "UCD-SNMP-MIB::laNames"
       is_tag = true
 
 
  ### CPU inventory ###
 
   #  Processor listing
   #  hrProcessorFrwID: "The product ID of the firmware associated with the processor."
   #  hrProcessorLoad: "The average, over the last minute, of the percentage of time
   #  that this processor was not idle. Implementations may approximate
   #  this one minute smoothing period if necessary."
   [[inputs.snmp.table]]
#     index_as_tag = true
     oid = "HOST-RESOURCES-MIB::hrProcessorTable"
 
 
#  ### CPU utilization ### (does not seem super useful for my purposes)
#   ##  On a multi-processor system, the 'ssCpuRaw*' counters
#   ##  are cumulative over all CPUs, so their sum will typically be N*100 (for N processors)."
#   
#   #  Number of 'ticks' spent on user-level
#   #  "The number of 'ticks' (typically 1/100s) spent processing user-level code.
#   [[inputs.snmp.field]]
#     name = "ssCpuRawUser"
#     oid = "UCD-SNMP-MIB::ssCpuRawUser.0"
#   
#   #  Number of 'ticks' spent on reduced-priority
#   #  "The number of 'ticks' (typically 1/100s) spent processing reduced-priority code.
#   #  This object will not be implemented on hosts where the underlying operating system
#   #  does not measure this particular CPU metric."
#   [[inputs.snmp.field]]
#     name = "ssCpuRawNice"
#     oid = "UCD-SNMP-MIB::ssCpuRawNice.0"
#   
#   #  Number of 'ticks' spent on system-level
#   #  "The number of 'ticks' (typically 1/100s) spent processing system-level code.
#   #  This object may sometimes be implemented as the combination of the 'ssCpuRawWait(54)'
#   #  and 'ssCpuRawKernel(55)' counters, so care must be taken
#   #  when summing the overall raw counters."
#   [[inputs.snmp.field]]
#     name = "ssCpuRawSystem"
#     oid = "UCD-SNMP-MIB::ssCpuRawSystem.0"
#   
#   #  Number of 'ticks' spent idle
#   #  "The number of 'ticks' (typically 1/100s) spent idle."
#   [[inputs.snmp.field]]
#     name = "ssCpuRawIdle"
#     oid = "UCD-SNMP-MIB::ssCpuRawIdle.0"
#   
#   #  Number of 'ticks' spent waiting on I/O
#   #  "The number of 'ticks' (typically 1/100s) spent waiting for IO.
#   #  This object will not be implemented on hosts where the underlying operating system
#   #  does not measure this particular CPU metric. This time may also be included within the
#   #  'ssCpuRawSystem(52)' counter."
#   [[inputs.snmp.field]]
#     name = "ssCpuRawWait"
#     oid = "UCD-SNMP-MIB::ssCpuRawWait.0"
#   
#   #  Number of 'ticks' spent in kernel
#   #  "The number of 'ticks' (typically 1/100s) spent processing kernel-level code.
#   #  This object will not be implemented on hosts where the underlying operating system
#   #  does not measure this particular CPU metric. This time may also be included within the
#   #  'ssCpuRawSystem(52)' counter."
#   [[inputs.snmp.field]]
#     name = "ssCpuRawKernel"
#     oid = "UCD-SNMP-MIB::ssCpuRawKernel.0"
#   
#   #  Number of 'ticks' spent on hardware interrupts
#   #  "The number of 'ticks' (typically 1/100s) spent processing hardware interrupts.
#   #  This object will not be implemented on hosts where the underlying operating system
#   #  does not measure this particular CPU metric."
#   [[inputs.snmp.field]]
#     name = "ssCpuRawInterrupt"
#     oid = "UCD-SNMP-MIB::ssCpuRawInterrupt.0"
#   
#   #  Number of 'ticks' spent on software interrupts
#   #  "The number of 'ticks' (typically 1/100s) spent processing software interrupts.
#   #  This object will not be implemented on hosts where the underlying operating system
#   #  does not measure this particular CPU metric."
#   [[inputs.snmp.field]]
#     name = "ssCpuRawSoftIRQ"
#     oid = "UCD-SNMP-MIB::ssCpuRawSoftIRQ.0"
 

  ###
  ### SNMP Extend
  ###
 
  ### Temperatures
 
   # CPU in Celsius
   [[inputs.snmp.field]]
     name = "temp_CPU"
     oid = ".1.3.6.1.4.1.8072.1.3.2.4.1.2.4.116.109.112.99.1"
     conversion = "float"
     
   # 2.4GHz Wireless module in Celsius
   [[inputs.snmp.field]]
     name = "temp_2_4_GHz"
     oid = ".1.3.6.1.4.1.8072.1.3.2.4.1.2.4.116.109.112.50.1"
     conversion = "float"
   
   # 5GHz Wireless module in Celsius
   [[inputs.snmp.field]]
     name = "temp_5_GHz"
     oid = ".1.3.6.1.4.1.8072.1.3.2.4.1.2.4.116.109.112.53.1"
     conversion = "float"
    
 
  ### Active admin sessions
     
   # Active SSH connections
   [[inputs.snmp.field]]
     name = "ssh_sessions"
     oid = ".1.3.6.1.4.1.8072.1.3.2.4.1.2.4.115.115.104.97.1"
     conversion = "int"
     
   # Web admin session active time
   [[inputs.snmp.field]]
     name = "web_time"
     oid = ".1.3.6.1.4.1.8072.1.3.2.4.1.2.4.119.101.98.116.1"
     conversion = "int"

   # Web admin session - last logged in IP
   [[inputs.snmp.field]]
     name = "web_ip"
     oid = ".1.3.6.1.4.1.8072.1.3.2.4.1.2.4.119.101.98.105.1"

 
  ### Internet connection
 
  # Internet connection status
   [[inputs.snmp.field]]
     name = "internet_status"
     oid = ".1.3.6.1.4.1.8072.1.3.2.4.1.2.4.105.110.101.116.1"
     conversion = "int"
     
 
  ### Partition stats
 
  # JFFS partition usage in %
   [[inputs.snmp.field]]
     name = "partition_jffs_usage"
     oid = ".1.3.6.1.4.1.8072.1.3.2.4.1.2.4.106.102.102.115.1"
     conversion = "int"
 
 
  ### Processes
    
   # Running process count
   [[inputs.snmp.field]]
     name = "processes_running"
     oid = ".1.3.6.1.4.1.8072.1.3.2.4.1.2.4.112.114.111.99.1"
     conversion = "int"
 
 
  ### Router connections
    
   # Connection count
   [[inputs.snmp.field]]
     name = "connections_total"
     oid = ".1.3.6.1.4.1.8072.1.3.2.4.1.2.4.99.111.110.99.1"
     conversion = "int"

   # Connections active (TCP "ESTABLISHED" and UDP "ASSURED")
   [[inputs.snmp.field]]
     name = "connections_active"
     oid = ".1.3.6.1.4.1.8072.1.3.2.4.1.2.4.99.111.110.97.1"
     conversion = "int"
 
 
  ### Wireless client count
    
   # Clients connected via 2.4GHz
   [[inputs.snmp.field]]
     name = "wireless_clients_2_4_GHz"
     oid = ".1.3.6.1.4.1.8072.1.3.2.4.1.2.4.119.50.99.108.1"
     conversion = "int"
     
   # Clients connected via 5GHz
   [[inputs.snmp.field]]
     name = "wireless_clients_5_GHz"
     oid = ".1.3.6.1.4.1.8072.1.3.2.4.1.2.4.119.53.99.108.1"
     conversion = "int"
 
 
  ###
  ###  System Memory (physical/virtual) ###
  ###
   
   #  Size of physical memory (RAM) in KBytes
   #  "The amount of physical read-write main memory, typically RAM, contained by the host."
   [[inputs.snmp.field]]
     name = "hrMemorySize"
     oid = "HOST-RESOURCES-MIB::hrMemorySize.0"
   
   #  Size of real/phys mem installed in KBytes
   #  "The total amount of real/physical memory installed on this host."
   [[inputs.snmp.field]]
     name = "memTotalReal"
     oid = "UCD-SNMP-MIB::memTotalReal.0"
   
   #  Size of real/phys mem unused/available in KBytes
   #  "The amount of real/physical memory currently unused or available."
   [[inputs.snmp.field]]
     name = "memAvailReal"
     oid = "UCD-SNMP-MIB::memAvailReal.0"
   
   #  Total amount of mem unused/available in KBytes
   # "The total amount of memory free or available for use on this host.  
   # This value typically covers both real memory and swap space or virtual memory."
   [[inputs.snmp.field]]
     name = "memTotalFree"
     oid = "UCD-SNMP-MIB::memTotalFree.0"
   
   #  Size of mem used as shared memory in KBytes
   [[inputs.snmp.field]]
     name = "memShared"
     oid = "UCD-SNMP-MIB::memShared.0"
   
   #  Size of mem used for buffers in KBytes
   [[inputs.snmp.field]]
     name = "memBuffer"
     oid = "UCD-SNMP-MIB::memBuffer.0"
   
   #  Size of mem used for cache in KBytes
   [[inputs.snmp.field]]
     name = "memCached"
     oid = "UCD-SNMP-MIB::memCached.0"
   
   
#   ###
#   ### Block (Disk) performance
#   ###
#   
#   #  System-wide blocks written
#   #  (Returned 0 for me. Maybe useful for USB devices? -> Remained zero with USB stick connected)
#   [[inputs.snmp.field]]
#     name = "ssIORawSent"
#     oid = "UCD-SNMP-MIB::ssIORawSent.0"
#   
#   #  Number of blocks read
#   #  (Returned 0 for me. Maybe useful for USB devices? -> Remained zero with USB stick connected)
#   [[inputs.snmp.field]]
#     name = "ssIORawReceived"
#     oid = "UCD-SNMP-MIB::ssIORawReceived.0"
#   
#   #  Per-device (disk) performance
#   #  (No diskIO entries returned.
#   #  Maybe useful for connected USB devices?  -> No change with USB stick connected)
#   [[inputs.snmp.table]]
#     oid = "UCD-DISKIO-MIB::diskIOTable"
#     [[inputs.snmp.table.field]]
#       oid = "UCD-DISKIO-MIB::diskIODevice"
#       is_tag = true
   
   
   ###
   ### Disk/Partition/Filesystem inventory & usage
   ###
   
   #  Storage listing (all logical storage areas)
   #  "The (conceptual) table of logical storage areas on the host.
   #     An entry shall be placed in the storage table for each
   #     logical area of storage that is allocated and has
   #     fixed resource limits.  The amount of storage
   #     represented in an entity is the amount actually usable
   #     by the requesting entity, and excludes loss due to
   #     formatting or file system reference information."
   #  hrStorageSize and hrStorageUsed in KBytes
   [[inputs.snmp.table]]
     oid = "HOST-RESOURCES-MIB::hrStorageTable"
     [[inputs.snmp.table.field]]
       oid = "HOST-RESOURCES-MIB::hrStorageDescr"
       is_tag = true
   
   
   ##
   ## Interface metrics
   ##
   # The Interfaces table contains information on the entity's interfaces.
   # Each sub-layer below the internetwork-layer of a network interface
   # is considered to be an interface.
   
   #  Per-interface traffic, errors, drops
   [[inputs.snmp.table]]
     oid = "IF-MIB::ifTable"
     [[inputs.snmp.table.field]]
       oid = "IF-MIB::ifName"
       is_tag = true
   
   #  Per-interface high-capacity (HC) counters
   [[inputs.snmp.table]]
     oid = "IF-MIB::ifXTable"
     [[inputs.snmp.table.field]]
       oid = "IF-MIB::ifName"
       is_tag = true

   #  Decices on the network connected to the router
   #  "The IPv4 Address Translation table used for mapping from
   #         IPv4 addresses to physical addresses.
   #         This table has been deprecated, as a new IP version-neutral
   #         table has been added.  It is loosely replaced by the
   #         ipNetToPhysicalTable." (latter did not return results)
   #  ipNetToMediaType values: other(1),invalid(2),dynamic(3),static(4)
   [[inputs.snmp.table]]
     oid = "IP-MIB::ipNetToMediaTable"
   
   
#   ##
#   ## IP metrics
#   ##
#   
#   #  System-wide IP metrics
#   # (did not return results)
#   [[inputs.snmp.table]]
#     index_as_tag = true
#     oid = "IP-MIB::ipSystemStatsTable"
   
   
#   ##
#   ## ICMP Metrics
#   ##
#   
#   #  ICMP statistics
#   #  (Counts ICMP in and out packets system-wide, including errors.
#   #  Don't have a use case for it atm.)
#   [[inputs.snmp.table]]
#     index_as_tag = true
#     oid = "IP-MIB::icmpStatsTable"
#   #  ICMP per-type statistics
#   #  (Only counts ICMP in and out packets - don't have a use case for it atm)
#   [[inputs.snmp.table]]
#     index_as_tag = true
#     oid = "IP-MIB::icmpMsgStatsTable"
   
   
#   ##
#   ## UDP statistics
#   ##
#   #  "Discontinuities in the value of this counter can occur at
#   #  re-initialization of the management system, and at other times
#   #  as indicated by discontinuities in the value of sysUpTime."
#   #
#   #  (Note: not super useful atm. May consider it in the future.)
#   
#   #  Datagrams delivered to app
#   #  "The total number of UDP datagrams delivered to UDP users."
#   [[inputs.snmp.field]]
#     name = "udpInDatagrams"
#     oid = "UDP-MIB::udpInDatagrams.0"
#   
#   #  Datagrams received with no app
#   #  "The total number of received UDP datagrams for which
#   #  there was no application at the destination port."
#   [[inputs.snmp.field]]
#     name = "udpNoPorts"
#     oid = "UDP-MIB::udpNoPorts.0"
#   
#   #  Datagrams received with error
#   #  "The number of received UDP datagrams that could not be
#   #  delivered for reasons other than the lack of an
#   #  application at the destination port."
#   [[inputs.snmp.field]]
#     name = "udpInErrors"
#     oid = "UDP-MIB::udpInErrors.0"
#   
#   #  Datagrams sent
#   #  "The total number of UDP datagrams sent from this entity."
#   [[inputs.snmp.field]]
#     name = "udpOutDatagrams"
#     oid = "UDP-MIB::udpOutDatagrams.0"
   
   
#   ##
#   ## TCP statistics
#   ##
#   #  (Note: in TCP-MIB there is also a tcpConnectionTable and a tcpListenerTable,
#   #  for future consideration.)
#   #
#   #  (Note: not super useful atm. May consider it in the future.)
#   
#   #  Number of CLOSED -> SYN-SENT transitions
#   #  "The number of times that TCP connections have made a direct
#   #  transition to the SYN-SENT state from the CLOSED state."
#   [[inputs.snmp.field]]
#     name = "tcpActiveOpens"
#     oid = "TCP-MIB::tcpActiveOpens.0"
#   
#   #  Number of LISTEN -> SYN-RCVD transitions
#   #  "The number of times TCP connections have made a direct
#   #  transition to the SYN-RCVD state from the LISTEN state."
#   [[inputs.snmp.field]]
#     name = "tcpPassiveOpens"
#     oid = "TCP-MIB::tcpPassiveOpens.0"
#   
#   #  Number of SYN-SENT/RCVD -> CLOSED transitions
#   #  "The number of times that TCP connections have made a direct
#   #  transition to the CLOSED state from either the SYN-SENT
#   #  state or the SYN-RCVD state, plus the number of times that
#   #  TCP connections have made a direct transition to the
#   #  LISTEN state from the SYN-RCVD state."
#   [[inputs.snmp.field]]
#     name = "tcpAttemptFails"
#     oid = "TCP-MIB::tcpAttemptFails.0"
#   
#   #  Number of ESTABLISHED/CLOSE-WAIT -> CLOSED transitions
#   #  "The number of times that TCP connections have made a direct
#   #  transition to the CLOSED state from either the ESTABLISHED
#   #  state or the CLOSE-WAIT state."
#   [[inputs.snmp.field]]
#     name = "tcpEstabResets"
#     oid = "TCP-MIB::tcpEstabResets.0"
#   
#   #  Number of ESTABLISHED or CLOSE-WAIT
#   #  "The number of TCP connections for which the current state
#   #  is either ESTABLISHED or CLOSE-WAIT."
#   [[inputs.snmp.field]]
#     name = "tcpCurrEstab"
#     oid = "TCP-MIB::tcpCurrEstab.0"
#   
#  #  Number of segments received
#   #  "The total number of segments received, including those
#   #  received in error.  This count includes segments received
#   #  on currently established connections."
#   [[inputs.snmp.field]]
#     name = "tcpInSegs"
#     oid = "TCP-MIB::tcpInSegs.0"
#   
#   #  Number of segments sent
#   #  "The total number of segments sent, including those on
#   #  current connections but excluding those containing only
#   #  retransmitted octets.
#   [[inputs.snmp.field]]
#     name = "tcpOutSegs"
#     oid = "TCP-MIB::tcpOutSegs.0"
#   
#   #  Number of segments retransmitted
#   #  "The total number of segments retransmitted; that is, the
#   #   number of TCP segments transmitted containing one or more
#   #   previously transmitted octets."
#   [[inputs.snmp.field]]
#     name = "tcpRetransSegs"
#     oid = "TCP-MIB::tcpRetransSegs.0"
#   
#   #  Number of segments received with error
#   #  "The total number of segments received in error (e.g., bad
#   #   TCP checksums)."
#   [[inputs.snmp.field]]
#     name = "tcpInErrs"
#     oid = "TCP-MIB::tcpInErrs.0"
#   
#   #  Number of segments sent w/RST
#   #  "The number of TCP segments sent containing the RST flag."
#   [[inputs.snmp.field]]
#     name = "tcpOutRsts"
#     oid = "TCP-MIB::tcpOutRsts.0"
   
   
#   ##
#   ## IP routing statistics
#   ##
#   #  (did not return results)
#   
#   #  Number of valid routing entries
#   [[inputs.snmp.field]]
#     name = "inetCidrRouteNumber"
#     oid = "IP-FORWARD-MIB::inetCidrRouteNumber.0"
#   #  Number of valid entries discarded
#   [[inputs.snmp.field]]
#     name = "inetCidrRouteDiscards"
#     oid = "IP-FORWARD-MIB::inetCidrRouteDiscards.0"
#   #  Number of valid forwarding entries
#   [[inputs.snmp.field]]
#     name = "ipForwardNumber"
#     oid = "IP-FORWARD-MIB::ipForwardNumber.0"
   
   
#   ##
#   ## IP routing statistics
#   ##
#   #  (Note: not super useful atm. May consider it in the future.)
#   
#   #  Number of valid routes discarded
#   #  "The number of routing entries which were chosen
#   #  to be discarded even though they are valid.
#   #  One possible reason for discarding such an entry could be
#   #  to free-up buffer space for other routing entries."
#   [[inputs.snmp.field]]
#     name = "ipRoutingDiscards"
#     oid = "RFC1213-MIB::ipRoutingDiscards.0"
   
   
#   ##
#   ## SNMP metrics
#   ##
#   #  Number of SNMP messages received
#   [[inputs.snmp.field]]
#     name = "snmpInPkts"
#     oid = "SNMPv2-MIB::snmpInPkts.0"
#   #  Number of SNMP Get-Request received
#   [[inputs.snmp.field]]
#     name = "snmpInGetRequests"
#     oid = "SNMPv2-MIB::snmpInGetRequests.0"
#   #  Number of SNMP Get-Next received
#   [[inputs.snmp.field]]
#     name = "snmpInGetNexts"
#     oid = "SNMPv2-MIB::snmpInGetNexts.0"
#   #  Number of SNMP objects requested
#   [[inputs.snmp.field]]
#     name = "snmpInTotalReqVars"
#     oid = "SNMPv2-MIB::snmpInTotalReqVars.0"
#   #  Number of SNMP Get-Response received
#   [[inputs.snmp.field]]
#     name = "snmpInGetResponses"
#     oid = "SNMPv2-MIB::snmpInGetResponses.0"
#   #  Number of SNMP messages sent
#   [[inputs.snmp.field]]
#     name = "snmpOutPkts"
#     oid = "SNMPv2-MIB::snmpOutPkts.0"
#   #  Number of SNMP Get-Request sent
#   [[inputs.snmp.field]]
#     name = "snmpOutGetRequests"
#     oid = "SNMPv2-MIB::snmpOutGetRequests.0"
#   #  Number of SNMP Get-Next sent
#   [[inputs.snmp.field]]
#     name = "snmpOutGetNexts"
#     oid = "SNMPv2-MIB::snmpOutGetNexts.0"
#   #  Number of SNMP Get-Response sent
#   [[inputs.snmp.field]]
#     name = "snmpOutGetResponses"
#     oid = "SNMPv2-MIB::snmpOutGetResponses.0"

Este archivo es el «universal» para routers Asus . Aemás, con el fin de configurar adecuadamente los diferentes inputs.snmp.field, os recomendamos hacer uso de la herramienta snmpget para ver uno a uno los valores de vuestro router.

Otro aspecto muy importante es la parte de «outputs», aquí debes configurar adecuadamente la dirección IP del InfluxDB y el TOKEN correspondiente, así como la organización y el bucket elegido.

Una vez que lo tengamos todo configurado, reiniciamos el contenedor de Telegraf como os hemos indicado antes, y nos aseguramos de que no haya ningún tipo de error.

Para comprobar que todo ha ido bien podemos consultar los logs del contenedor de Telegraf con Portainer:


Una vez que esperemos aproximadamente un minuto, podremos ver en nuestro InfluxDB que ya hay información en el bucket configurado. Con el «Data Explorer» podemos ir navegando por la diferente información escrita en la base de datos, y al terminar podemos pinchar en «Submit» para que nos la muestre. Este «Data explorer» es muy completo, porque también nos permite tratar los datos e incluso generar el código fuente para posteriormente copiarlo en Grafana.


 


Configuración de Grafana



Lo primero que tenemos que hacer, es iniciar sesión vía web, poniendo la dirección HTTPS://IP_SERVIDOR:8088 que es el puerto que hemos elegido. El nombre de usuario es «router» y la contraseña es «asusrouter123» tal y como teníamos en el docker-compose. Nada más acceder, veremos acceso a algunos tutoriales que podemos seguir para realizar la puesta en marcha.

Lo primero que debemos hacer es irnos a «Connections» y elegir «InfluxDB»:

Ahora elegiremos el nombre del origen de los datos, nosotros hemos puesto simplemente «influxdb«. En la sección de «Query Language» debemos elegir «Flux» ya que estamos ante una base de datos InfluxDBv2. Abajo tendremos que empezar con la configuración para conectarnos a la base de datos:

  • HTTP:
    • URL: https://IP_LINUX:8086
    • Auth: «with CA cert» activado

Ahora en la sección de TLS/SSL Auth Details, debemos copiar el contenido del ehn-ca.crt, es decir, el certificado de la Autoridad de Certificación. Esto sirve para que Grafana verifique que se está conectando al servidor InfluxDBv2 correctamente y con seguridad.

En el menú de «InfluxDB Details», debemos poner:

  • Organization: tenemos que poner el identificador de la organización que teníamos en «ABOUT», es la cadena de caracteres.
  • Token: es el token que generamos en InfluxDB con permisos de lectura a todos los buckets. Debemos copiarlo aquí

Recuerda que el menú de «Organization» está en About

Una vez que lo hayamos hecho todo, pinchamos en «Save & Test» y nos indicará si se ha conectado correctamente o no. Si se ha conectado bien, nos indicará que el origen de los datos está correcto, y que se ha encontrado con un bucket.


Panel de Grafana monitorizando

Ahora ya podemos importar el dashboard del panel de control de Assus  vía fichero JSON de:
 

 

Recordar que el nombre del bucket de la plantilla es "tig", así que si vuestro bucket de InfluxDB tiene otro hombre, necesitamos cambiarlo "(query from bucket tig)"

 
Y el resultado debería ser:


Panel de control Wifi 

Y la plantilla para el control del Wifi:

El bucket se llama "test"




Fuentes:

https://github.com/pheetr/grafana-router-asus/tree/main

https://www.redeszone.net/marcas/qnap/instalar-configurar-telegraf-influxdbv2-grafana-monitorizar-nas-qnap/


0 comentarios :

Publicar un comentario

Los comentarios pueden ser revisados en cualquier momento por los moderadores.

Serán publicados aquellos que cumplan las siguientes condiciones:
- Comentario acorde al contenido del post.
- Prohibido mensajes de tipo SPAM.
- Evite incluir links innecesarios en su comentario.
- Contenidos ofensivos, amenazas e insultos no serán permitidos.

Debe saber que los comentarios de los lectores no reflejan necesariamente la opinión del STAFF.