From 69d357a03bb3908a974e021a3f8f40bd4325a097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20H=C3=B6=C3=9F?= Date: Tue, 29 Sep 2020 12:45:47 +0000 Subject: [PATCH] SMART-Discovery+Monitoring: Add bash version --- zbx-smart.bash | 146 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 zbx-smart.bash diff --git a/zbx-smart.bash b/zbx-smart.bash new file mode 100644 index 0000000..a5a0750 --- /dev/null +++ b/zbx-smart.bash @@ -0,0 +1,146 @@ +#!/bin/bash + +# By MH 2020, MIT-License + + +_smart_is_usb() +{ + rem=$(lsblk -d "$1" -o SUBSYSTEMS | grep "usb" | wc -l) + if [[ "${rem}" == "0" ]]; then + echo 0 + else + echo 1 + fi +} + +_smart_getval() +{ + echo -e "$1" | grep -i "^${2} = " | cut -d "=" -f 2 | cut -d '"' -f 2 +} + +_smart_getval_i() +{ + res=$(echo -e "$1" | grep -i "^${2} = " | cut -d "=" -f 2 | cut -d ' ' -f 2 | tr -d ";") + if [[ "$res" == "" ]]; then + res=0 + fi + echo "${res}" +} + + +smart_disco() { + c=0 + devs="" + while read ln; do + dev=$(echo ${ln} | cut -d " " -f 1 | sed -e "s/\/dev\///g") + typ=$(echo ${ln} | cut -d " " -f 3) + + + # Removable + # rem=$(lsblk -d /dev/${dev} -o SUBSYSTEMS | grep "usb" | wc -l) + rem=$(_smart_is_usb "/dev/${dev}") + + if [[ "${rem}" == "0" ]]; then + smart="$(smartctl -n standby -a /dev/${dev} --json=g)" + model="$(_smart_getval "${smart}" "json.model_name")" + sn="$(_smart_getval "${smart}" "json.serial_number")" + rot="$(_smart_getval_i "${smart}" "json.rotation_rate")" + lbs="$(_smart_getval_i "${smart}" "json.logical_block_size")" + + #SSD: TODO + isSSD=0 + fi + + if (( c == 1 )); then + devs="${devs},\n" + fi + c=1 + + devs="${devs} {\n" + + if [[ "${rem}" == "0" ]]; then + devs="${devs} \"name\": \"${dev}\",\n" + devs="${devs} \"type\": \"${typ}\",\n" + devs="${devs} \"model\": \"${model}\",\n" + devs="${devs} \"sn\": \"${sn}\",\n" + devs="${devs} \"rotations\": ${rot},\n" + devs="${devs} \"lbs\": ${lbs},\n" + devs="${devs} \"isExternal\": ${rem},\n" + devs="${devs} \"isSSD\": ${isSSD}\n" + else + devs="${devs} \"name\": \"${dev}\",\n" + devs="${devs} \"isExternal\": ${rem}\n" + fi + devs="${devs} }" + + done < <(smartctl -n standby --scan) + + + + json2="\n{" + json2="${json2} \"devices\": [\n" + json2="${json2} ${devs}\n" + json2="${json2} ]\n" + json2="${json2}}" + echo -e "$json2" + + # Remove newline for use as parameter + sentval="$(echo -e $json2)" + + #json=$(smartctl --json --scan) + #json=$(echo "${json}" | sed -e "s/\/dev\///g") + #echo $json + + zabbix_sender -vv -k "8o_smartcheck.disco_devs" -o "${sentval}" -c /etc/zabbix/zabbix_agentd.conf 2>&1 | logger -t "zabbix-smart_disco" +} + + +smart_check() { + (for dev in $(smartctl --scan | sed -e "s/\/dev\///g" | cut -d " " -f 1 ); do + + rem=$(_smart_is_usb "/dev/${dev}") + if [[ "${rem}" == "1" ]] && [[ "${SMART_WITH_EXTERNAL}" == "0" ]]; then + #echo "X" 1>&2 + continue; + fi + + smartctl -s on /dev/${dev} > /dev/null + status="$(smartctl -n standby -q errorsonly -H /dev/${dev})" + if [[ "${status}" == "" ]]; then + status="OK" + fi + + smart="$(smartctl -n standby -a /dev/${dev} --json=g)" + + poh="$(_smart_getval_i "${smart}" "json.power_on_time.hours")" + poc="$(_smart_getval_i "${smart}" "json.power_cycle_count")" + temp="$(_smart_getval_i "${smart}" "json.temperature.current")" + + + + #zabbix_sender -vv -k "8o_smartcheck.[${dev}.health]" -o "${status}" -c /etc/zabbix/zabbix_agentd.conf \ + # 2>&1 | logger -t "zabbix-smart_health" + + echo "- 8o_smartcheck.[${dev}.health] ${status}" + echo "- 8o_smartcheck.[${dev}.power_on_hours] ${poh}" + echo "- 8o_smartcheck.[${dev}.power_cycle_count] ${poc}" + echo "- 8o_smartcheck.[${dev}.temperature] ${temp}" + + #echo "8o_smartcheck.[${dev}.health]" + #echo ${dev} + done) | zabbix_sender -vv -i - -c /etc/zabbix/zabbix_agentd.conf 2>&1 | logger -t "zabbix-smart_health" + +} + + +SMART_WITH_EXTERNAL=0 + +if [ "$1" == "--smart-with-external" ]; then + SMART_WITH_EXTERNAL=1 +fi + +if [ "$1" == "--disco" ]; then + smart_disco +else + smart_check +fi