paint-brush
Python + SNMP = Gerçek Zamanlı NAS Disk Sıcaklık İzleme!🌡️ Bunu Nasıl Yaptığımı Öğreninile@support2minlog
Yeni tarih

Python + SNMP = Gerçek Zamanlı NAS Disk Sıcaklık İzleme!🌡️ Bunu Nasıl Yaptığımı Öğrenin

ile 2minlog6m2024/10/31
Read on Terminal Reader

Çok uzun; Okumak

Güvenilir bir gerçek zamanlı NAS HDD sıcaklık izleme sistemi kurdum. Bir Python betiği doğrudan NAS üzerinde bir Docker ortamında çalışır. Sıcaklığı SNMP protokolü aracılığıyla toplar ve verileri 2minlog veri görselleştirme platformuna gönderir. Sıcaklık gelişimini Matplotlib aracılığıyla görselleştiriyorum ve bir Android tablette görüntülüyorum.
featured image - Python + SNMP = Gerçek Zamanlı NAS Disk Sıcaklık İzleme!🌡️ Bunu Nasıl Yaptığımı Öğrenin
2minlog HackerNoon profile picture
0-item
1-item
2-item

NAS'ımdaki HDD'lerin sıcaklığını her zaman merak etmişimdir. NAS'ı kliması olmayan kapalı bir odada tutuyorum. Ayrıca, bir süre önce NAS'ı söktüm ve diskler gerçekten sıcaktı... O zamanlar sıcaklığı ölçmemiştim ama endişelenmeye başlamıştım. NAS sürücü sıcaklığı ve Linux/Python ortamından izlenmesi hakkında birçok tartışma bulabilirsiniz. Ama çözümlerin hiçbiri benim için işe yaramadı!


İstediğim:

  • Güvenilir ve belgelenmiş bir şekilde NAS HDD sıcaklık izleme - NAS yazılımının bir sonraki sürümünde değişebilecek Linux alt sisteminin bir kısmından değer okumak istemedim.
  • Evimdeki NAS'ı ve kardeşimin bodrum katındaki yedek NAS'ımı tek bir grafikte görmek istedim.
  • Değerleri havalı görünümlü bir grafikte görmek istedim. Grafik görünümünde tam esneklik istedim, tercihen bunu Matplotlib'de kendim kurmak istedim.
  • NAS panosundan değerleri alıp grafikleri gerçek zamanlı olarak gösterebilmek istiyorum. Masamda 2minlog ekranım var. Balkonumdaki sıcaklığı, nemi ve kirlilik seviyelerini ve internet bağlantımın kullanılabilirliğinin geçmişini gösteriyor. Orada HDD sıcaklık geçmişini görmek istiyorum.


Adım 1: Sıcaklık verilerinin toplanması

Verileri pysnmp paketi aracılığıyla SNMP protokolü üzerinden toplayacağız.


SNMP ve MIB'leri anlama

SNMP (Basit Ağ Yönetim Protokolü), ağ cihazlarının sağlığını ve performansını izlemek için yaygın olarak kullanılan bir protokoldür. Sıcaklıklar, CPU kullanımı ve disk durumu gibi verilerin toplanmasına olanak tanır.

MIB'ler (Yönetim Bilgi Tabanları), SNMP aracılığıyla sorgulanabilen bilgi veritabanlarıdır. Her veri parçası, SNMP aracılığıyla okunabilen veya ayarlanabilen bir değişkeni benzersiz şekilde tanımlayan bir OID (Nesne Tanımlayıcısı) tarafından tanımlanır.


Toplanacak MIB değerlerini belirtmeniz gerekir. Benim Synology NAS'ım var. MIB dosyasını sayfalarında yayınlıyorlar . Şunları toplamamız gerekiyor:

  • Disk adı: 1.3.6.1.4.1.6574.2.1.1.2
  • Disk modeli: 1.3.6.1.4.1.6574.2.1.1.3
  • Disk sıcaklığı: 1.3.6.1.4.1.6574.2.1.1.6


Pysnmp sayfasında mükemmel bir chatbot var. Python betiğinin gövdesini benim için yazdı, SNMP API'siyle ilgili tüm zorlukları ele aldı ve asenkron çağrıları yönetti. Anahtar bölüm şu şekildedir:

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


Synology NAS ayarlarında SNMP protokolünü etkinleştirmeniz gerekir:

Adım 2: Komut dosyasını dağıtın ve işlenmek üzere verileri gönderin

Komut dosyasını doğrudan Docker ortamındaki NAS'a dağıttım. Docker konteynerinin nihai yeniden başlatmadan sonra tekrar başladığından emin olmalısınız. Bu nedenle basit bir docker-compose.yaml dosyası ayarladım:

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

Daha sonra docker-compose up -d komutuyla Docker'ı başlatın.


2minlog ile bağlantılıyım - veri toplamak, işlemek ve görselleştirmek için basit bir sistem. Verileri HTTPS istekleri (URL'de veya gövdede kodlanmış) aracılığıyla oraya gönderiyorsunuz ve orada bir görselleştirme betiği ayarlıyorsunuz. Daha sonra grafiklere ihtiyacınız olan her yerden kolayca erişebilirsiniz.


2minlog'u kullanabilirsiniz. Alternatif olarak, verileri bir veritabanına veya yerel dosya sistemine gönderebilirsiniz.

Adım 3: Verilerin görselleştirilmesi

Grafiği görüntülemek için basit bir Matplotlib betiği kurdum. Aslında, bunu ChatGPT'den (o1-preview) yapmasını istedim ve oldukça iyi yaptı. Python betiği mükemmel değildi, ancak görevi hızlıca bitirmek için yeterince iyiydi. İstem aşağıdadır.

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


Görselleştirme betiği 2minlog platformunda dağıtılır. Bunu yerel olarak da çalıştırabilirsiniz.


Komut dosyası GitHub'da mevcuttur.

Özetle

Verileri toplamak, işlemek ve görselleştirmek için tam olarak yönetilen 2minlog kullanabilirsiniz. Belgelere göz atın. Sonuçları masamda oturan bir Android tablette görüntülüyorum ve Image Tuner ile çeşitli grafikler arasında geçiş yapıyorum. Ayrıca verileri yerel dosya sisteminize kaydedebilir ve aynısını yapabilirsiniz.


Çözüm bir Synology NAS'ta test edildi, ancak diğerlerine de uyarlanabilir.

Referanslar:


#Synology #SynologyNAS #Sıcaklık #İzleme #VeriGörselleştirme #Matplotlib #SNMP #2minlog #Python #Docker