paint-brush
Python + SNMP = Valós idejű NAS-lemez hőmérséklet-figyelő!🌡️ Ismerje meg, hogyan csináltamáltal@support2minlog
Új történelem

Python + SNMP = Valós idejű NAS-lemez hőmérséklet-figyelő!🌡️ Ismerje meg, hogyan csináltam

által 2minlog6m2024/10/31
Read on Terminal Reader

Túl hosszú; Olvasni

Beállítottam egy megbízható valós idejű NAS HDD hőmérséklet-figyelő rendszert. A Python-szkript Docker-környezetben fut közvetlenül a NAS-on. Az SNMP protokollon keresztül összegyűjti a hőmérsékletet, és elküldi az adatokat a 2minlog adatvizualizációs platformra. A hőmérséklet alakulását a Matplotlib segítségével vizualizálom, és megjelenítem egy Android táblagépen.
featured image - Python + SNMP = Valós idejű NAS-lemez hőmérséklet-figyelő!🌡️ Ismerje meg, hogyan csináltam
2minlog HackerNoon profile picture
0-item
1-item
2-item

Mindig is kíváncsi voltam a HDD hőmérsékletére a NAS-omban. A NAS egy zárt szobában van, légkondi nélkül. Ráadásul régebben szétszedtem a NAS-t, és nagyon forrók voltak a lemezek... Akkor még nem mértem a hőmérsékletet, de kezdtem aggódni. Számos vitát találhat a NAS-meghajtó hőmérsékletéről és annak Linux/Python környezetből történő megfigyeléséről. De nekem egyik megoldás sem vált be!


Amit akartam:

  • NAS HDD hőmérséklet-figyelés megbízható, dokumentált módon – nem akartam kiolvasni az értéket a Linux alrendszer valamely részéből, ami megváltoztathatja a NAS szoftver következő kiadását.
  • Egy grafikonon akartam látni az otthoni NAS-omat és a tartalék NAS-omat , amely a bátyám pincéjében van.
  • Az értékeket egy jó megjelenésű grafikonon akartam látni. Teljes rugalmasságot akartam a grafikon megjelenésében, lehetőleg magam állítva be a Matplotlibben.
  • Szeretném kivenni az értékeket a NAS irányítópultjáról, és valós időben megjeleníteni a grafikonokat . Van egy 2 minlogos kijelző az asztalomon. Már mutatja az erkélyem hőmérsékletét, páratartalmát és szennyezettségi szintjét, valamint internetkapcsolatom elérhetőségének történetét. Ott szeretném látni a HDD hőmérséklet előzményeit.


1. lépés: A hőmérsékleti adatok összegyűjtése

Az adatokat SNMP protokollon keresztül gyűjtjük a pysnmp csomagon keresztül.


Az SNMP és a MIB megértése

Az SNMP (Simple Network Management Protocol) egy széles körben használt protokoll a hálózati eszközök állapotának és teljesítményének figyelésére. Lehetővé teszi olyan adatok gyűjtését, mint például a hőmérséklet, a CPU-használat és a lemez állapota.

A MIB-ek (Management Information Bases) olyan információk adatbázisai, amelyek SNMP-n keresztül lekérdezhetők. Minden adatot egy OID (Object Identifier) azonosít, amely egyedileg azonosít egy változót, amely SNMP-n keresztül olvasható vagy beállítható.


Meg kell adnia a begyűjtendő MIB értékeket. Synology NAS-om van. A MIB fájlt közzéteszik az oldalaikon. Össze kell gyűjtenünk:

  • Lemez neve: 1.3.6.1.4.1.6574.2.1.1.2
  • Lemezmodell: 1.3.6.1.4.1.6574.2.1.1.3
  • Lemez hőmérséklete: 1.3.6.1.4.1.6574.2.1.1.6


A pysnmp oldalon van egy kiváló chatbot . Ez írta nekem a Python szkript törzsét, kezelve az SNMP API-val kapcsolatos összes nehézséget és kezelve az aszinkron hívásokat. A legfontosabb rész a következő:

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


Engedélyeznie kell az SNMP protokollt a Synology NAS beállításaiban:

2. lépés: Telepítse a szkriptet, és küldje el az adatokat feldolgozásra

A szkriptet közvetlenül a NAS-ra telepítettem a Docker környezetben. Biztosítania kell, hogy a Docker-tároló újrainduljon az esetleges újraindítás után. Ebből az okból állítottam be egy egyszerű docker-compose.yaml fájlt:

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

Ezután indítsa el a Dockert docker-compose up -d paranccsal.


Csatlakozom a 2minloghoz – egy egyszerű rendszer az adatok összegyűjtésére, feldolgozására és megjelenítésére. Az adatokat HTTPS-kéréseken keresztül (az URL-ben vagy a törzsben kódolva) küldi el, és ott beállít egy vizualizációs szkriptet. A grafikonok ezután bárhonnan elérhetők.


Használhatja a 2minlogot. Alternatív megoldásként elküldheti az adatokat adatbázisba vagy helyi fájlrendszerbe.

3. lépés: Az adatok megjelenítése

Beállítottam egy egyszerű Matplotlib szkriptet a grafikon megjelenítéséhez. Valójában a ChatGPT-t (o1-preview) kértem meg, és elég jól sikerült. A Python szkript nem volt tökéletes, de elég jó volt a feladat gyors befejezéséhez. A felszólítás lent található.

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


A vizualizációs szkript a 2minlog platformon belül kerül telepítésre. Helyben is futtathatja.


A szkript elérhető a GitHubon .

Becsomagolva

Használhat egy teljesen felügyelt 2minlogot az adatok összegyűjtésére, feldolgozására és megjelenítésére. Tekintse meg a dokumentációt . Az eredményeket az asztalomon ülő Android táblagépen jelenítem meg, és az Image Tuner segítségével körbejárom a különböző grafikonokat. Az adatokat a helyi fájlrendszerére is mentheti, és ugyanezt megteheti.


A megoldást Synology NAS-on tesztelték, de másokhoz is adaptálható.

Referenciák:


#Synology #SynologyNAS #Hőmérséklet #Monitoring #DataVisualization #Matplotlib #SNMP #2minlog #Python #Docker