This commit is contained in:
xbl
2025-07-21 14:46:36 +02:00
parent 9c5303c4b3
commit 800190b21e

View File

@ -0,0 +1,51 @@
#!/usr/bin/env bash
#
#SMARTEST - Proxmox SMART Monitoring for PRTG | v2.0 Mar 2025
#
channel_id="2"
output="/home/monitoring/prtgout.xml"
log="/home/monitoring/prtg_smartest.log"
active_disks="/home/monitoring/active_disks.txt"
excluded_disks="/home/monitoring/excluded_disks.txt"
disk_count_real="$(lsblk -d | tail -n +2 | wc -l)"
disk_count_current="$(cat "$active_disks" | wc -l)"
if [ ! -f "$active_disks" ] || [ ! -s "$active_disks" ]; then
lsblk -d | awk '{print $1}' | tail -n +2 > "$active_disks"
elif [ "$disk_count_real" -gt "$disk_count_current" ]; then
lsblk -d | awk '{print $1}' | tail -n +2 > "$active_disks"
echo "Disk(s) added" >> "$log" 2>&1
else
echo "<prtg>" > "$output"
for disk in $(cat "$active_disks")
do
if grep "$disk" "$excluded_disks" >> "$log" 2>&1; then
echo "$disk is excluded" >> "$log" 2>&1
elif [[ "$disk" == zd* ]]; then
echo "$disk is a ZFS device node, excluding" >> "$log" 2>&1
elif [[ "$disk" == rbd* ]]; then
echo "$disk is a Ceph device node, excluding" >> "$log" 2>&1
else
smartresult=$(/usr/sbin/smartctl -a /dev/"$disk")
if grep -E "OK|PASSED" <<< "$smartresult" >> "$log" 2>&1; then
echo "$disk is okay" >> "$log"
echo -e "<result>\n<id>channel_$channel_id</id>\n<channel>$disk SMART Status</channel>\n<LimitMode>1</LimitMode>\n<LimitMinError>0.5</LimitMinError>\n<unit>Custom</unit>\n<customunit></customunit>\n<value>1</value>\n</result>" >> "$output"
channel_id=$((channel_id + 1))
if grep -i "Wear_Leveling_Count" <<< "$smartresult" >> "$log" 2>&1; then
wlcresult=$(/usr/sbin/smartctl -a /dev/"$disk" | grep -i Wear_Leveling_Count | awk '{print $4}' | sed 's/^0*//')
echo "$disk: $wlcresult% Lifetime remaining" >> "$log" 2>&1
echo -e "<result>\n<id>channel_$channel_id</id>\n<channel>$disk WLC Lifetime</channel>\n<LimitMode>1</LimitMode>\n<LimitMinWarning>25</LimitMinWarning>\n<LimitMinError>10</LimitMinError>\n<unit>Custom</unit>\n<customunit>%</customunit>\n<value>$wlcresult</value>\n</result>" >> "$output"
channel_id=$((channel_id + 1))
else
echo "$disk: No WLC available" >> "$log" 2>&1
fi
else
echo "$disk: SMART failed" >> "$log" 2>&1
echo -e "<result>\n<id>channel_$channel_id</id>\n<channel>$disk SMART Status</channel>\n<LimitMode>1</LimitMode>\n<LimitMinError>0.5</LimitMinError>\n<unit>Custom</unit>\n<customunit></customunit>\n<value>0</value>\n</result>" >> "$output"
fi
fi
done
fi
echo "</prtg>" >> "$output"
# EOF