paint-brush
Python + SNMP = Monitor de temperatura del disc NAS en temps real!🌡️ Apreneu com ho vaig ferper@support2minlog
Nova Història

Python + SNMP = Monitor de temperatura del disc NAS en temps real!🌡️ Apreneu com ho vaig fer

per 2minlog6m2024/10/31
Read on Terminal Reader

Massa Llarg; Per llegir

He configurat un sistema de control de temperatura del disc dur NAS fiable en temps real. Un script de Python s'executa en un entorn Docker directament al NAS. Reuneix la temperatura mitjançant el protocol SNMP i envia les dades a la plataforma de visualització de dades 2minlog. Visualitzo l'evolució de la temperatura mitjançant Matplotlib i el mostro en una tauleta Android.
featured image - Python + SNMP = Monitor de temperatura del disc NAS en temps real!🌡️ Apreneu com ho vaig fer
2minlog HackerNoon profile picture
0-item
1-item
2-item

Sempre m'he preguntat sobre la temperatura dels HDD al meu NAS. Tinc el NAS en una habitació tancada sense aire condicionat. A més, vaig desmuntar el NAS fa un temps, i els discs estaven molt calents... Aleshores no mesurava la temperatura, però em vaig començar a preocupar. Podeu trobar moltes discussions sobre la temperatura de la unitat NAS i el seguiment des d'un entorn Linux/Python. Però cap de les solucions em va funcionar!


El que volia:

  • Monitorització de la temperatura del disc dur NAS d'una manera fiable i documentada : no volia llegir el valor d'alguna part del subsistema Linux, cosa que pot canviar la propera versió del programari NAS.
  • Volia veure el meu NAS de casa i el meu NAS de seguretat , que es troba al soterrani del meu germà, en un gràfic.
  • Volia veure els valors en un gràfic d'aspecte genial. Volia una flexibilitat total en l'aspecte del gràfic, preferiblement configurar-lo jo mateix a Matplotlib.
  • Vull poder treure els valors del tauler del NAS i mostrar gràfics en temps real . Tinc una pantalla de 2 minlog asseguda al meu escriptori. Ja mostra la temperatura, la humitat i els nivells de contaminació del meu balcó i l'historial de la meva disponibilitat de connexió a Internet. Vull veure l'historial de la temperatura del disc dur allà.


Pas 1: recopilació de les dades de temperatura

Recollirem dades mitjançant el protocol SNMP mitjançant el paquet pysnmp .


Comprensió de SNMP i MIB

SNMP (Simple Network Management Protocol) és un protocol molt utilitzat per supervisar la salut i el rendiment dels dispositius de xarxa. Permet la recollida de dades com ara temperatures, ús de la CPU i estat del disc.

Les MIB (Management Information Bases) són bases de dades d'informació que es poden consultar mitjançant SNMP. Cada dada s'identifica mitjançant un OID (identificador d'objecte), que identifica de manera única una variable que es pot llegir o configurar mitjançant SNMP.


Heu d'especificar els valors de MIB que voleu recopilar. Tinc Synology NAS. Publiquen el fitxer MIB a les seves pàgines. Hem de reunir:

  • Nom del disc: 1.3.6.1.4.1.6574.2.1.1.2
  • Model de disc: 1.3.6.1.4.1.6574.2.1.1.3
  • Temperatura del disc: 1.3.6.1.4.1.6574.2.1.1.6


Hi ha un excel·lent bot de xat a la pàgina pysnmp. Va escriure el cos de l'script de Python per a mi, gestionant totes les dificultats amb l'API SNMP i gestionant trucades asíncrones. La secció clau és la següent:

 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})


Heu d'habilitar el protocol SNMP a la configuració del Synology NAS:

Pas 2: implementeu l'script i envieu dades per processar-les

Vaig implementar l'script directament al NAS a l'entorn Docker. Heu d'assegurar-vos que el contenidor Docker s'iniciï de nou després de l'eventual reinici. He configurat un fitxer simple docker-compose.yaml per aquest motiu:

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

A continuació, inicieu el Docker amb docker-compose up -d .


Estic afiliat al 2minlog , un sistema senzill per recopilar, processar i visualitzar dades. Envieu les dades allà mitjançant sol·licituds HTTPS (codificades a l'URL o al cos) i hi configureu un script de visualització. Aleshores, els gràfics estan disponibles des de qualsevol lloc que necessiteu.


Podeu utilitzar el 2minlog. Alternativament, podeu enviar les dades a una base de dades o un sistema de fitxers local.

Pas 3: Visualització de les dades

Vaig configurar un script Matplotlib senzill per mostrar el gràfic. De fet, vaig demanar a ChatGPT (o1-preview) que ho fes i ho va fer bastant bé. L'script de Python no era perfecte, però era prou bo per acabar la tasca ràpidament. La indicació és a continuació.

 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 ...


L'script de visualització es desplega a la plataforma 2minlog. També podeu executar-lo localment.


L'script està disponible a GitHub .

Embolicant-ho

Podeu utilitzar un 2minlog totalment gestionat per recopilar, processar i visualitzar les dades. Consulteu la documentació . Visualitzo els resultats en una tauleta d'Android asseguda a la meva taula i cicle pels diferents gràfics amb Image Tuner . També podeu desar les dades al vostre sistema de fitxers local i fer el mateix.


La solució es prova en un Synology NAS, però es pot adaptar per a altres.

Referències:


#Synology #SynologyNAS #Temperatura #Monitorització #Visualització de dades #Matplotlib #SNMP #2minlog #Python #Docker