paint-brush
Python + SNMP = ¡Monitor de temperatura de disco NAS en tiempo real!🌡️ Descubra cómo lo hicepor@support2minlog
Nueva Historia

Python + SNMP = ¡Monitor de temperatura de disco NAS en tiempo real!🌡️ Descubra cómo lo hice

por 2minlog6m2024/10/31
Read on Terminal Reader

Demasiado Largo; Para Leer

He instalado un sistema fiable de monitorización de la temperatura de los discos duros NAS en tiempo real. Se ejecuta un script de Python en un entorno Docker directamente en el NAS. Recopila la temperatura a través del protocolo SNMP y envía los datos a la plataforma de visualización de datos 2minlog. Visualizo el desarrollo de la temperatura a través de Matplotlib y lo muestro en una tableta Android.
featured image - Python + SNMP = ¡Monitor de temperatura de disco NAS en tiempo real!🌡️ Descubra cómo lo hice
2minlog HackerNoon profile picture
0-item
1-item
2-item

Siempre me he preguntado por la temperatura de los discos duros de mi NAS. Tengo el NAS en una habitación cerrada sin aire acondicionado. Además, desmonté el NAS hace un tiempo y los discos estaban muy calientes... No medí la temperatura en ese momento, pero empecé a preocuparme. Puedes encontrar muchas discusiones sobre la temperatura de la unidad NAS y su monitoreo desde un entorno Linux/Python. ¡Pero ninguna de las soluciones funcionó para mí!


Lo que quería:

  • Monitoreo de temperatura del disco duro NAS de manera confiable y documentada : no quería leer el valor de alguna parte del subsistema Linux, que puede cambiar la próxima versión del software NAS.
  • Quería ver mi NAS doméstico y mi NAS de respaldo , que está en el sótano de mi hermano, en un gráfico.
  • Quería ver los valores en un gráfico atractivo. Quería total flexibilidad en el aspecto del gráfico, preferiblemente configurándolo yo mismo en Matplotlib.
  • Quiero poder sacar los valores del panel del NAS y mostrar gráficos en tiempo real . Tengo una pantalla 2minlog en mi escritorio. Ya muestra la temperatura, la humedad y los niveles de contaminación en mi balcón y el historial de disponibilidad de mi conexión a Internet. Quiero ver el historial de temperatura del disco duro allí.


Paso 1: Recopilación de datos de temperatura

Recopilaremos datos a través del protocolo SNMP mediante el paquete pysnmp .


Comprensión de SNMP y MIB

SNMP (Simple Network Management Protocol) es un protocolo ampliamente utilizado para supervisar el estado y el rendimiento de los dispositivos de red. Permite la recopilación de datos como temperaturas, uso de la CPU y estado del disco.

Las MIB (Bases de información de gestión) son bases de datos de información que se pueden consultar a través de SNMP. Cada dato se identifica mediante un OID (Identificador de objeto), que identifica de forma única una variable que se puede leer o configurar a través de SNMP.


Debes especificar los valores MIB que se recopilarán. Tengo un servidor NAS de Synology. Publican el archivo MIB en sus páginas. Necesitamos recopilar:

  • Nombre del disco: 1.3.6.1.4.1.6574.2.1.1.2
  • Modelo de disco: 1.3.6.1.4.1.6574.2.1.1.3
  • Temperatura del disco: 1.3.6.1.4.1.6574.2.1.1.6


Hay un excelente chatbot en la página pysnmp. Escribió el cuerpo del script de Python para mí, se ocupó de todas las dificultades con la API de SNMP y de las llamadas asincrónicas. La sección clave es la siguiente:

 async def run(server_name, ipaddress, username, passwd, outinfo): # SNMP walk for disk name, model, and temperature oids = [ ObjectType(ObjectIdentity('1.3.6.1.4.1.6574.2.1.1.2')), # Disk name (diskID) ObjectType(ObjectIdentity('1.3.6.1.4.1.6574.2.1.1.3')), # Disk model (diskModel) ObjectType(ObjectIdentity('1.3.6.1.4.1.6574.2.1.1.6')) # Disk temperature (diskTemperature) ] errorIndication, errorStatus, errorIndex, varBinds = await bulkCmd( SnmpEngine(), UsmUserData(username, passwd, authProtocol=usmHMACSHAAuthProtocol), # Use the appropriate auth protocol await UdpTransportTarget.create((ipaddress, 161)), ContextData(), 0, 10, # Increase the max-repetitions to get more results in one request *oids # Query disk name, model, and temperature ) if errorIndication: print(f"Error: {errorIndication}") elif errorStatus: print(f"Error Status: {errorStatus.prettyPrint()} at {errorIndex and varBinds[int(errorIndex) - 1] or '?'}") else: disk_data = {} for varBind in varBinds: oid, value = varBind oid_str = str(oid) # Disk name if oid_str.startswith('1.3.6.1.4.1.6574.2.1.1.2'): index = oid_str.split('.')[-1] if index not in disk_data: disk_data[index] = {} disk_data[index]['name'] = value # Disk model elif oid_str.startswith('1.3.6.1.4.1.6574.2.1.1.3'): index = oid_str.split('.')[-1] if index not in disk_data: disk_data[index] = {} disk_data[index]['model'] = value # Disk temperature elif oid_str.startswith('1.3.6.1.4.1.6574.2.1.1.6'): index = oid_str.split('.')[-1] if index not in disk_data: disk_data[index] = {} disk_data[index]['temperature'] = value # Print out the disk information for index, info in disk_data.items(): name = info.get('name', 'Unknown') model = info.get('model', 'Unknown') temperature = info.get('temperature', 'Unknown') name = str(name) model = str(model) temperature = str(temperature) print(f"IP Address {ipaddress}, Disk {index}: Name: {name}, Model: {model}, Temperature: {temperature} °C") outinfo.append({'server_name': server_name, 'ip': ipaddress, 'disk': index, 'name': name, 'model': model, 'temperature': temperature})


Debe habilitar el protocolo SNMP en la configuración de Synology NAS:

Paso 2: Implementar el script y enviar datos para su procesamiento

Implementé el script directamente en el NAS en el entorno de Docker. Debe asegurarse de que el contenedor de Docker se inicie nuevamente después del reinicio final. Por ese motivo, configuré un archivo docker-compose.yaml simple:

 version: '3.8' services: pingchart: build: . restart: always container_name: synology-temperature

Luego inicie Docker con docker-compose up -d .


Estoy afiliado a 2minlog , un sistema simple para recopilar, procesar y visualizar datos. Envías los datos allí a través de solicitudes HTTPS (codificadas en la URL o en el cuerpo) y configuras un script de visualización allí. Los gráficos están disponibles desde cualquier lugar que los necesites.


Puedes utilizar 2minlog. También puedes enviar los datos a una base de datos o a un sistema de archivos local.

Paso 3: Visualización de datos

Configuré un script Matplotlib simple para mostrar el gráfico. En realidad, le pedí a ChatGPT (o1-preview) que lo hiciera y lo hizo bastante bien. El script Python no era perfecto, pero era lo suficientemente bueno como para terminar la tarea rápidamente. El mensaje se muestra a continuación.

 Here is a csv file. Can you write a code: Split data into different graphs by combining the server name and name (eg, DS920+ / Disk 1). Each graph will show the temperature. There will be a title in each graph (eg, DS920+ / Disk 1) The graphs will have the same temperature range. The background will be black, graph background will be also black, the graph color will be from dark green (low temperatures) to light green (high temperatures). There will be two thin lines - 20 °C (blue) and 45 °C (red). Trim the data for last week with tickmarks at midnight of every day. The data are in UTC time. Convert it to Europe/Berlin time zone. The resolution of the total image is hxw 600 x 1024 pixels. Save the image to PNG. disk,ip,model,name,server_name,temperature,timestamp 0,10.0.0.9,ST4000VN008-2DR166,Disk 3,DS920+,38,2024-09-19T20:19:48.723761 1,10.0.0.9,ST16000NM000J-2TW103,Disk 4,DS920+,42,2024-09-19T20:19:49.253975 2,10.0.0.9,ST4000VX007-2DT166,Disk 1,DS920+,38,2024-09-19T20:19:49.818734 3,10.0.0.9,ST4000VX007-2DT166,Disk 2,DS920+,39,2024-09-19T20:19:50.393793 0,10.0.2.9,ST12000NM001G-2MV103,Disk 1,DS220j,28,2024-09-19T20:19:50.873142 0,10.0.0.9,ST4000VN008-2DR166,Disk 3,DS920+,38,2024-09-19T20:20:02.119583 1,10.0.0.9,ST16000NM000J-2TW103,Disk 4,DS920+,42,2024-09-19T20:20:02.596654 2,10.0.0.9,ST4000VX007-2DT166,Disk 1,DS920+,38,2024-09-19T20:20:03.101480 3,10.0.0.9,ST4000VX007-2DT166,Disk 2,DS920+,39,2024-09-19T20:20:03.697423 0,10.0.2.9,ST12000NM001G-2MV103,Disk 1,DS220j,28,2024-09-19T20:20:04.221348 0,10.0.0.9,ST4000VN008-2DR166,Disk 3,DS920+,38,2024-09-19T20:25:02.254611 1,10.0.0.9,ST16000NM000J-2TW103,Disk 4,DS920+,42,2024-09-19T20:25:02.714633 2,10.0.0.9,ST4000VX007-2DT166,Disk 1,DS920+,38,2024-09-19T20:25:03.295622 3,10.0.0.9,ST4000VX007-2DT166,Disk 2,DS920+,39,2024-09-19T20:25:03.780728 ...


El script de visualización se implementa dentro de la plataforma 2minlog. También puede ejecutarlo localmente.


El script está disponible en GitHub .

Para terminar

Puede utilizar un 2minlog totalmente administrado para recopilar, procesar y visualizar los datos. Consulte la documentación . Muestro los resultados en una tableta Android que está sobre mi mesa y hago un ciclo entre los distintos gráficos con Image Tuner . También puede guardar los datos en su sistema de archivos local y hacer lo mismo.


La solución se ha probado en un NAS Synology, pero se puede adaptar a otros.

Referencias:


#Synology #SynologyNAS #Temperatura #Monitoreo #Visualización de datos #Matplotlib #SNMP #2minlog #Python #Docker