synology-monitoring icon indicating copy to clipboard operation
synology-monitoring copied to clipboard

[Bug] When having 12+ drives, the regex's don't capture properly

Open lenaxia opened this issue 3 years ago • 3 comments

Specifically, Drive 2, which comes in with $id=1, get overwritten by Drive 12 which comes in with $id=11

Output capture form running the script. You can see that for Disk 2, it actually captures the id.11 entry because its only grabbing the first digit, not both, but then it fails because later regexs capture the 11 properly and now the id doesnt match and so the final output fails, is my guess.

synology_disk,nas_name=Omoikane,disk_name=Drive1 disk_model="SSD840EVO250GB",disk_type="SSD",disk_temp=30,disk_status=1
synology_disk,nas_name=Omoikane,disk_name=Drive2 disk_model=SYNOLOGY-DISK-MIB::diskModel.11=STRING:"HUH728080ALE600",disk_type=SYNOLOGY-DISK-MIB::diskType.11 = STRING: "SATA",disk_temp=SYNOLOGY-DISK-MIB::diskTemperature.11 = INTEGER: 39,disk_status=SYNOLOGY-DISK-MIB::diskStatus.11 = INTEGER: 1
synology_disk,nas_name=Omoikane,disk_name=Drive3 disk_model="HUH721212ALE600",disk_type="SATA",disk_temp=39,disk_status=1
synology_disk,nas_name=Omoikane,disk_name=Drive4 disk_model="HDN726040ALE614",disk_type="SATA",disk_temp=40,disk_status=1
synology_disk,nas_name=Omoikane,disk_name=Drive5 disk_model="SSD840EVO250GB",disk_type="SSD",disk_temp=35,disk_status=1
synology_disk,nas_name=Omoikane,disk_name=Drive6 disk_model="HDN726040ALE614",disk_type="SATA",disk_temp=39,disk_status=1
synology_disk,nas_name=Omoikane,disk_name=Drive7 disk_model="HUH721212ALE600",disk_type="SATA",disk_temp=39,disk_status=1
synology_disk,nas_name=Omoikane,disk_name=Drive8 disk_model="HUH728080ALE600",disk_type="SATA",disk_temp=39,disk_status=1
synology_disk,nas_name=Omoikane,disk_name=Drive9 disk_model="HDN724040ALE640",disk_type="SATA",disk_temp=35,disk_status=1
synology_disk,nas_name=Omoikane,disk_name=Drive10 disk_model="HUH728080ALE604",disk_type="SATA",disk_temp=36,disk_status=1
synology_disk,nas_name=Omoikane,disk_name=Drive11 disk_model="HUH728080ALE600",disk_type="SATA",disk_temp=38,disk_status=1
synology_disk,nas_name=Omoikane,disk_name=Drive12 disk_model="HUH728080ALE600",disk_type="SATA",disk_temp=39,disk_status=1

Running the SNMP walk commands manually generates the correct result

Omoikane:/volume1/scripts$ snmpwalk -v 2c -c public localhost SYNOLOGY-DISK-MIB::diskID
SYNOLOGY-DISK-MIB::diskID.0 = STRING: "Drive 1"
SYNOLOGY-DISK-MIB::diskID.1 = STRING: "Drive 2"
SYNOLOGY-DISK-MIB::diskID.2 = STRING: "Drive 3"
SYNOLOGY-DISK-MIB::diskID.3 = STRING: "Drive 4"
SYNOLOGY-DISK-MIB::diskID.4 = STRING: "Drive 5"
SYNOLOGY-DISK-MIB::diskID.5 = STRING: "Drive 6"
SYNOLOGY-DISK-MIB::diskID.6 = STRING: "Drive 7"
SYNOLOGY-DISK-MIB::diskID.7 = STRING: "Drive 8"
SYNOLOGY-DISK-MIB::diskID.8 = STRING: "Drive 9"
SYNOLOGY-DISK-MIB::diskID.9 = STRING: "Drive 10"
SYNOLOGY-DISK-MIB::diskID.10 = STRING: "Drive 11"
SYNOLOGY-DISK-MIB::diskID.11 = STRING: "Drive 12"
Omoikane:/volume1/scripts$ snmpwalk -v 2c -c public localhost SYNOLOGY-DISK-MIB::diskModel
SYNOLOGY-DISK-MIB::diskModel.0 = STRING: "SSD 840 EVO 250GB       "
SYNOLOGY-DISK-MIB::diskModel.1 = STRING: "HDN724040ALE640         "
SYNOLOGY-DISK-MIB::diskModel.2 = STRING: "HUH721212ALE600         "
SYNOLOGY-DISK-MIB::diskModel.3 = STRING: "HDN726040ALE614         "
SYNOLOGY-DISK-MIB::diskModel.4 = STRING: "SSD 840 EVO 250GB       "
SYNOLOGY-DISK-MIB::diskModel.5 = STRING: "HDN726040ALE614         "
SYNOLOGY-DISK-MIB::diskModel.6 = STRING: "HUH721212ALE600         "
SYNOLOGY-DISK-MIB::diskModel.7 = STRING: "HUH728080ALE600         "
SYNOLOGY-DISK-MIB::diskModel.8 = STRING: "HDN724040ALE640         "
SYNOLOGY-DISK-MIB::diskModel.9 = STRING: "HUH728080ALE604         "
SYNOLOGY-DISK-MIB::diskModel.10 = STRING: "HUH728080ALE600         "
SYNOLOGY-DISK-MIB::diskModel.11 = STRING: "HUH728080ALE600         "
Omoikane:/volume1/scripts$ snmpwalk -v 2c -c public localhost SYNOLOGY-DISK-MIB::diskType
SYNOLOGY-DISK-MIB::diskType.0 = STRING: "SSD"
SYNOLOGY-DISK-MIB::diskType.1 = STRING: "SATA"
SYNOLOGY-DISK-MIB::diskType.2 = STRING: "SATA"
SYNOLOGY-DISK-MIB::diskType.3 = STRING: "SATA"
SYNOLOGY-DISK-MIB::diskType.4 = STRING: "SSD"
SYNOLOGY-DISK-MIB::diskType.5 = STRING: "SATA"
SYNOLOGY-DISK-MIB::diskType.6 = STRING: "SATA"
SYNOLOGY-DISK-MIB::diskType.7 = STRING: "SATA"
SYNOLOGY-DISK-MIB::diskType.8 = STRING: "SATA"
SYNOLOGY-DISK-MIB::diskType.9 = STRING: "SATA"
SYNOLOGY-DISK-MIB::diskType.10 = STRING: "SATA"
SYNOLOGY-DISK-MIB::diskType.11 = STRING: "SATA"
Omoikane:/volume1/scripts$ snmpwalk -v 2c -c public localhost SYNOLOGY-DISK-MIB::diskTemperature
SYNOLOGY-DISK-MIB::diskTemperature.0 = INTEGER: 29
SYNOLOGY-DISK-MIB::diskTemperature.1 = INTEGER: 36
SYNOLOGY-DISK-MIB::diskTemperature.2 = INTEGER: 39
SYNOLOGY-DISK-MIB::diskTemperature.3 = INTEGER: 40
SYNOLOGY-DISK-MIB::diskTemperature.4 = INTEGER: 35
SYNOLOGY-DISK-MIB::diskTemperature.5 = INTEGER: 39
SYNOLOGY-DISK-MIB::diskTemperature.6 = INTEGER: 39
SYNOLOGY-DISK-MIB::diskTemperature.7 = INTEGER: 39
SYNOLOGY-DISK-MIB::diskTemperature.8 = INTEGER: 35
SYNOLOGY-DISK-MIB::diskTemperature.9 = INTEGER: 36
SYNOLOGY-DISK-MIB::diskTemperature.10 = INTEGER: 38
SYNOLOGY-DISK-MIB::diskTemperature.11 = INTEGER: 39
Omoikane:/volume1/scripts$ snmpwalk -v 2c -c public localhost SYNOLOGY-DISK-MIB::diskStatus
SYNOLOGY-DISK-MIB::diskStatus.0 = INTEGER: 1
SYNOLOGY-DISK-MIB::diskStatus.1 = INTEGER: 1
SYNOLOGY-DISK-MIB::diskStatus.2 = INTEGER: 1
SYNOLOGY-DISK-MIB::diskStatus.3 = INTEGER: 1
SYNOLOGY-DISK-MIB::diskStatus.4 = INTEGER: 1
SYNOLOGY-DISK-MIB::diskStatus.5 = INTEGER: 1
SYNOLOGY-DISK-MIB::diskStatus.6 = INTEGER: 1
SYNOLOGY-DISK-MIB::diskStatus.7 = INTEGER: 1
SYNOLOGY-DISK-MIB::diskStatus.8 = INTEGER: 1
SYNOLOGY-DISK-MIB::diskStatus.9 = INTEGER: 1
SYNOLOGY-DISK-MIB::diskStatus.10 = INTEGER: 1
SYNOLOGY-DISK-MIB::diskStatus.11 = INTEGER: 1

I suspect these lines are not capturing the regexs properly, specifically the $id*, will play around with it

247 if [[ $line == SYNOLOGY-DISK-MIB::diskModel.$id* ]]; then
248 disk_model=${line/"SYNOLOGY-DISK-MIB::diskModel."$id" = STRING: "/}; disk_model=${disk_model// /}
249 fi
250 
251 if [[ $line == SYNOLOGY-DISK-MIB::diskType.$id* ]]; then
252 disk_type=${line/"SYNOLOGY-DISK-MIB::diskType."$id" = STRING: "/}
253 fi
254 
255 if [[ $line == SYNOLOGY-DISK-MIB::diskStatus.$id* ]]; then
256 disk_status=${line/"SYNOLOGY-DISK-MIB::diskStatus."$id" = INTEGER: "/}
257 fi
258 
259 if [[ $line == SYNOLOGY-DISK-MIB::diskTemperature.$id* ]]; then
260 disk_temp=${line/"SYNOLOGY-DISK-MIB::diskTemperature."$id" = INTEGER: "/}
261 fi

lenaxia avatar May 21 '21 18:05 lenaxia

Yeah, this is definitely the case.

if I put an echo statement in the check:

248 if [[ $line == SYNOLOGY-DISK-MIB::diskModel.$id* ]]; then
249 if [ $id == 1 ]; then
250 echo "TEST $line"
251 fi
252 disk_model=${line/"SYNOLOGY-DISK-MIB::diskModel."$id" = STRING: "/}; disk_model=${disk_model// /}
253 fi

I get this output:

Capturing 3 times
TEST SYNOLOGY-DISK-MIB::diskModel.1 = STRING: "HDN724040ALE640         "
TEST SYNOLOGY-DISK-MIB::diskModel.10 = STRING: "HUH728080ALE600         "
TEST SYNOLOGY-DISK-MIB::diskModel.11 = STRING: "HUH728080ALE600         "

Meaning the $id==1 pass is matching $line from 10 and 11 as well

I don't have a whole lot of shell experience so trying to figure it out

lenaxia avatar May 21 '21 18:05 lenaxia

My guess would be to add a space between $id and the * This will force the comparison to be the entire number.

If having the space after the number is an issue, then you can use other bash commands to filter out any spaces from the string.

wallacebrf avatar Sep 06 '22 19:09 wallacebrf

so i only have a system with 9x drives, so i cannot 100% test this, but i replaced all instances of the lines like this

old: if [[ $line == SYNOLOGY-DISK-MIB::diskModel.$id* ]]; then

new if [[ "$line" == "SYNOLOGY-DISK-MIB::diskModel.$id ="* ]]; then

this forces the system to interpret the entire string section and with the added space and equals sign, it should ensure the entire ID number and not just the first digit is verified.

also, i have a more capable version of this script here https://github.com/wallacebrf/synology_snmp

this version supports a web admin page, supports DSM7 specific / added IODs, supports email notifications/alerts, supports GPU monitoring (for DVA units) and more. years ago i started with kernelkaribou's script and kept adding to it

wallacebrf avatar Sep 07 '22 00:09 wallacebrf