በእኔ NAS ውስጥ ስላለው የኤችዲዲዎች ሙቀት ሁሌም አስብ ነበር። አየርኮ በሌለበት በተዘጋ ክፍል ውስጥ NAS አለኝ። በተጨማሪም፣ ከተወሰነ ጊዜ በፊት NAS ን ፈታሁት፣ እና ዲስኮች በጣም ሞቃት ነበሩ… በዛን ጊዜ የሙቀት መጠኑን አልለካሁም፣ ግን መጨነቅ ጀመርኩ። በ NAS ድራይቭ ሙቀት ላይ ብዙ ውይይቶችን ማግኘት እና ከሊኑክስ/ፓይቶን አካባቢ መከታተል ይችላሉ። ግን አንዱም መፍትሔ አልሰራልኝም!
የምፈልገው፡-
መረጃን በ SNMP ፕሮቶኮል በ pysnmp ጥቅል በኩል እንሰበስባለን ።
SNMP እና MIBsን መረዳት
SNMP (ቀላል የአውታረ መረብ አስተዳደር ፕሮቶኮል) የኔትወርክ መሳሪያዎችን ጤና እና አፈፃፀም ለመቆጣጠር በሰፊው ጥቅም ላይ የዋለ ፕሮቶኮል ነው። እንደ ሙቀት፣ የሲፒዩ አጠቃቀም እና የዲስክ ሁኔታ ያሉ መረጃዎችን ለመሰብሰብ ያስችላል።
MIBs (የአስተዳደር መረጃ ቤዝ) በ SNMP በኩል ሊጠየቁ የሚችሉ የመረጃ ቋቶች ናቸው። እያንዳንዱ የውሂብ ክፍል በኦአይዲ (ነገር መለያ) ተለይቷል፣ እሱም በልዩ ሁኔታ በ SNMP ሊነበብ ወይም ሊዘጋጅ የሚችል ተለዋዋጭ ይለያል።
ለመሰብሰብ የ MIB እሴቶችን መግለጽ ያስፈልግዎታል። ሲኖሎጂ NAS አለኝ። የ MIB ፋይልን በገጾቻቸው ላይ ያትማሉ ። መሰብሰብ አለብን:
በ pysnmp ገጽ ላይ በጣም ጥሩ የቻትቦት አለ። ሁሉንም ችግሮች በ 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})
በSynology NAS መቼቶች ውስጥ የ SNMP ፕሮቶኮልን ማንቃት አለቦት፡-
በ Docker አካባቢ ውስጥ ስክሪፕቱን በቀጥታ በ NAS ላይ አሰማርቻለሁ። የዶከር ኮንቴይነሩ በመጨረሻ እንደገና ከተጀመረ በኋላ እንደገና መጀመሩን ማረጋገጥ አለብዎት። ለዛ ምክንያት ቀላል docker-compose.yaml ፋይል አዘጋጅቻለሁ፡-
version: '3.8' services: pingchart: build: . restart: always container_name: synology-temperature
ከዚያ ዶከርን በ docker-compose up -d
ይጀምሩ።
ከ 2minlog ጋር ግንኙነት አለኝ - መረጃን ለመሰብሰብ ፣ ለማካሄድ እና ለመሳል ቀላል ስርዓት። ውሂቡን በኤችቲቲፒኤስ ጥያቄዎች (በዩአርኤል ውስጥ ወይም በሰውነት ውስጥ በኮድ ውስጥ) ይልካሉ እና የእይታ ስክሪፕት እዚያ ያዘጋጃሉ። ስዕሎቹ ከሚፈልጉት ቦታ ሆነው በቀላሉ ይገኛሉ።
2minlog መጠቀም ይችላሉ። በአማራጭ, ውሂቡን ወደ የውሂብ ጎታ ወይም የአካባቢ የፋይል ስርዓት መላክ ይችላሉ.
ግራፉን ለማሳየት ቀላል የማትፕሎትሊብ ስክሪፕት አዘጋጅቻለሁ። በእውነቱ፣ 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 መጠቀም ይችላሉ። ሰነዶቹን ይመልከቱ. ውጤቶቹን በአንድሮይድ ታብሌቴ ላይ በጠረጴዛዬ ላይ ተቀምጦ እና ዑደት ላይ በተለያዩ ግራፎች በምስል መቃኛ አሳይቻለሁ። እንዲሁም ውሂቡን በአካባቢዎ የፋይል ስርዓት ላይ ማስቀመጥ እና ተመሳሳይ ነገር ማድረግ ይችላሉ.
መፍትሄው በSynology NAS ላይ ተፈትኗል፣ ግን ለሌሎች ሊስማማ ይችላል።
#Synology #SynologyNAS #ሙቀት #ክትትል #ዳታ ቪዥዋልላይዜሽን #Matplotlib #SNMP #2minlog #Python #Docker