paint-brush
Python + SNMP = צג טמפרטורת דיסק NAS בזמן אמת!🌡️ למד כיצד עשיתי זאתעל ידי@support2minlog
279 קריאות

Python + SNMP = צג טמפרטורת דיסק NAS בזמן אמת!🌡️ למד כיצד עשיתי זאת

על ידי 2minlog6m2024/10/31
Read on Terminal Reader

יותר מדי זמן; לקרוא

הקמתי מערכת אמינה בזמן אמת של NAS HDD לניטור טמפרטורה. סקריפט של Python פועל בסביבת Docker ישירות על ה-NAS. הוא אוסף את הטמפרטורה באמצעות פרוטוקול SNMP ושולח את הנתונים לפלטפורמת הדמיית הנתונים 2minlog. אני מדמיין את התפתחות הטמפרטורה באמצעות Matplotlib ומציג אותה בטאבלט אנדרואיד.
featured image - Python + SNMP = צג טמפרטורת דיסק NAS בזמן אמת!🌡️ למד כיצד עשיתי זאת
2minlog HackerNoon profile picture
0-item
1-item
2-item

תמיד תהיתי לגבי טמפרטורת הדיסקים הקשיחים ב-NAS שלי. יש לי את ה-NAS בחדר סגור ללא מיזוג אוויר. יתרה מכך, פירקתי את ה-NAS לפני זמן מה, והדיסקים היו ממש לוהטים... לא מדדתי אז את הטמפרטורה, אבל התחלתי להיות מודאג. אתה יכול למצוא דיונים רבים על טמפרטורת כונן NAS וניטור זה מסביבת Linux/Python. אבל אף אחד מהפתרונות לא עבד בשבילי!


מה שרציתי:

  • ניטור טמפרטורת NAS HDD בצורה אמינה ומתועדת - לא רציתי לקרוא את הערך מחלק כלשהו של תת-מערכת לינוקס, מה שעשוי לשנות את המהדורה הבאה של תוכנת NAS.
  • רציתי לראות את ה-NAS הביתי שלי ואת ה-NAS הגיבוי שלי , שנמצא במרתף של אחי, בגרף אחד.
  • רציתי לראות את הערכים בגרף מגניב למראה. רציתי גמישות מוחלטת במראה הגרף, רצוי להגדיר אותו בעצמי ב-Matplotlib.
  • אני רוצה להיות מסוגל להוציא את הערכים מלוח המחוונים של ה-NAS ולהציג גרפים בזמן אמת . יש לי צג 2minlog יושב על השולחן שלי. זה כבר מראה את הטמפרטורה, הלחות ורמות הזיהום במרפסת שלי ואת ההיסטוריה של זמינות חיבור האינטרנט שלי. אני רוצה לראות את היסטוריית הטמפרטורה של HDD שם.


שלב 1: איסוף נתוני הטמפרטורה

נאסוף נתונים באמצעות פרוטוקול SNMP באמצעות חבילת pysnmp .


הבנת SNMP ו-MIBs

SNMP (Simple Network Management Protocol) הוא פרוטוקול בשימוש נרחב לניטור התקינות והביצועים של התקני רשת. זה מאפשר איסוף נתונים כגון טמפרטורות, שימוש במעבד ומצב דיסק.

MIBs (Management Information Bases) הם מסדי נתונים של מידע שניתן לבצע שאילתה באמצעות SNMP. כל פיסת נתונים מזוהה על ידי OID (זיהוי אובייקט), המזהה באופן ייחודי משתנה שניתן לקרוא או להגדיר באמצעות SNMP.


עליך לציין את ערכי ה-MIB לאיסוף. יש לי Synology NAS. הם מפרסמים את קובץ MIB בדפים שלהם. אנחנו צריכים לאסוף:

  • שם דיסק: 1.3.6.1.4.1.6574.2.1.1.2
  • דגם דיסק: 1.3.6.1.4.1.6574.2.1.1.3
  • טמפרטורת דיסק: 1.3.6.1.4.1.6574.2.1.1.6


יש צ'אט בוט מצוין בדף pysnmp. זה כתב לי את גוף הסקריפט של Python, טיפל בכל הקשיים עם SNMP API וטיפול בקריאות אסינכרון. להלן סעיף המפתח:

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


עליך להפעיל את פרוטוקול SNMP בהגדרות Synology NAS:

שלב 2: פרוס את הסקריפט ושלח נתונים לעיבוד

פרסתי את הסקריפט ישירות על ה-NAS בסביבת Docker. עליך לוודא שהמכולה של Docker מתחילה שוב לאחר ההפעלה מחדש. הגדרתי קובץ docker-compose.yaml פשוט מסיבה זו:

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

לאחר מכן הפעל את ה- Docker עם docker-compose up -d .


אני קשור ל -2minlog - מערכת פשוטה לאיסוף, עיבוד והצגה של נתונים. אתה שולח לשם את הנתונים באמצעות בקשות HTTPS (מקודדות ב-URL או בגוף) ומגדיר שם סקריפט להדמיה. לאחר מכן, הגרפים יהיו זמינים מכל מקום שאתה צריך.


אתה יכול להשתמש ב-2minlog. לחלופין, ניתן לשלוח את הנתונים למסד נתונים או למערכת קבצים מקומית.

שלב 3: הדמיה של נתונים

הגדרתי סקריפט פשוט של Matplotlib כדי להציג את הגרף. למעשה, ביקשתי מ-ChatGPT (o1-preview) לעשות את זה, וזה עשה די טוב. התסריט של Python לא היה מושלם, אבל הוא היה מספיק טוב כדי לסיים את המשימה במהירות. ההנחיה נמצאת למטה.

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


סקריפט ההדמיה נפרס בתוך פלטפורמת 2minlog. אתה יכול גם להפעיל אותו באופן מקומי.


התסריט זמין ב- GitHub .

עוטף את זה

אתה יכול להשתמש ב -2minlog מנוהל במלואו כדי לאסוף, לעבד ולהמחיש את הנתונים. בדוק את התיעוד . אני מציג את התוצאות בטאבלט אנדרואיד שיושב על השולחן שלי ועובר במחזוריות לפי הגרפים השונים עם Image Tuner . אתה יכול גם לשמור את הנתונים במערכת הקבצים המקומית שלך ולעשות אותו דבר.


הפתרון נבדק ב-Synology NAS, אך ניתן להתאים אותו לאחרים.

הפניות:


#Synology #SynologyNAS #טמפרטורה #ניטור #DataVisualization #Matplotlib #SNMP #2minlog #Python #Docker