paint-brush
Python + SNMP = Monitor temperature NAS diska u stvarnom vremenu!🌡️ Saznajte kako sam to napraviopo@support2minlog
279 čitanja

Python + SNMP = Monitor temperature NAS diska u stvarnom vremenu!🌡️ Saznajte kako sam to napravio

po 2minlog6m2024/10/31
Read on Terminal Reader

Predugo; Čitati

Postavio sam pouzdan sustav za nadzor temperature NAS HDD-a u stvarnom vremenu. Python skripta radi u Docker okruženju izravno na NAS-u. Prikuplja temperaturu putem SNMP protokola i šalje podatke na platformu za vizualizaciju podataka 2minlog. Vizualiziram razvoj temperature putem Matplotliba i prikazujem ga na Android tabletu.
featured image - Python + SNMP = Monitor temperature NAS diska u stvarnom vremenu!🌡️ Saznajte kako sam to napravio
2minlog HackerNoon profile picture
0-item
1-item
2-item

Uvijek sam se pitao o temperaturi HDD-ova u mom NAS-u. Imam NAS u zatvorenoj prostoriji bez klime. Štoviše, rastavio sam NAS prije nekog vremena, i diskovi su bili jako vrući… Tada nisam mjerio temperaturu, ali sam se počeo brinuti. Možete pronaći mnoge rasprave o temperaturi NAS diska i njenom nadzoru iz okruženja Linux/Python. Ali nijedno od rješenja nije uspjelo za mene!


Što sam htio:

  • Praćenje temperature NAS HDD-a na pouzdan, dokumentiran način - Nisam želio čitati vrijednost iz nekog dijela Linux podsustava, što bi moglo promijeniti sljedeće izdanje NAS softvera.
  • Htio sam vidjeti svoj kućni NAS i moj rezervni NAS , koji je u bratovom podrumu, u jednom grafikonu.
  • Želio sam vidjeti vrijednosti u grafikonu koji izgleda cool. Želio sam potpunu fleksibilnost u izgledu grafikona, po mogućnosti sam ga postavio u Matplotlibu.
  • Želim biti u mogućnosti preuzeti vrijednosti s nadzorne ploče NAS-a i prikazati grafikone u stvarnom vremenu . Na stolu imam 2minlog zaslon . Već pokazuje temperaturu, vlažnost i razine zagađenja na mom balkonu te povijest dostupnosti moje internetske veze. Tamo želim vidjeti povijest temperature HDD-a.


Korak 1: Prikupljanje podataka o temperaturi

Podatke ćemo prikupljati putem SNMP protokola putem paketa pysnmp .


Razumijevanje SNMP-a i MIB-ova

SNMP (Simple Network Management Protocol) je široko korišten protokol za praćenje zdravlja i performansi mrežnih uređaja. Omogućuje prikupljanje podataka kao što su temperature, upotreba CPU-a i status diska.

MIB (Management Information Bases) su baze podataka informacija koje se mogu pretraživati putem SNMP-a. Svaki dio podataka identificiran je OID-om (Object Identifier), koji jedinstveno identificira varijablu koja se može pročitati ili postaviti putem SNMP-a.


Morate navesti MIB vrijednosti za prikupljanje. Imam Synology NAS. Oni objavljuju MIB datoteku na svojim stranicama. Moramo skupiti:

  • Naziv diska: 1.3.6.1.4.1.6574.2.1.1.2
  • Model diska: 1.3.6.1.4.1.6574.2.1.1.3
  • Temperatura diska: 1.3.6.1.4.1.6574.2.1.1.6


Na stranici pysnmp postoji izvrstan chatbot . Napisao je tijelo Python skripte za mene, rješavajući sve poteškoće sa SNMP API-jem i rukovanjem asinkronim pozivima. Slijedi ključni dio:

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


Morate omogućiti SNMP protokol u Synology NAS postavkama:

Korak 2: implementirajte skriptu i pošaljite podatke na obradu

Skriptu sam postavio izravno na NAS u Docker okruženju. Morate osigurati da se Docker spremnik ponovno pokrene nakon eventualnog ponovnog pokretanja. Iz tog sam razloga postavio jednostavnu datoteku docker-compose.yaml:

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

Zatim pokrenite Docker s docker-compose up -d .


Povezan sam s 2minlog - jednostavnim sustavom za prikupljanje, obradu i vizualizaciju podataka. Tamo šaljete podatke putem HTTPS zahtjeva (kodiranih u URL-u ili u tijelu) i tamo postavljate skriptu za vizualizaciju. Grafikoni su tada lako dostupni s bilo kojeg mjesta.


Možete koristiti 2minlog. Alternativno, možete poslati podatke u bazu podataka ili lokalni datotečni sustav.

Korak 3: Vizualizacija podataka

Postavio sam jednostavnu Matplotlib skriptu za prikaz grafikona. Zapravo, zamolio sam ChatGPT (o1-preview) da to učini i bilo je prilično dobro. Python skripta nije bila savršena, ali je bila dovoljno dobra da brzo završi zadatak. Upit je ispod.

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


Skripta za vizualizaciju postavljena je unutar platforme 2minlog. Možete ga pokrenuti i lokalno.


Skripta je dostupna na GitHubu .

Zamatanje

Možete koristiti potpuno upravljani 2minlog za prikupljanje, obradu i vizualizaciju podataka. Provjerite dokumentaciju . Prikazujem rezultate na Android tabletu koji stoji na mom stolu i kružim različitim grafikonima pomoću Image Tunera . Također možete spremiti podatke na svoj lokalni datotečni sustav i učiniti isto.


Rješenje je testirano na Synology NAS-u, ali se može prilagoditi za druge.

Reference:


#Synology #SynologyNAS #Temperature #Monitoring #DataVisualization #Matplotlib #SNMP #2minlog #Python #Docker