#!/bin/bash # SMART всех USB/SATA-дисков → pushgateway (job=smart). # -n standby: спящий диск НЕ будим (иначе опрос раз в 15 мин не дал бы ему спать) — # для него отдаём последние снятые значения из кэша и smart_disk_standby=1. set -uo pipefail CACHE=/var/lib/smart-metrics; mkdir -p "$CACHE" out=$(mktemp); trap 'rm -f "$out"' EXIT echo "# TYPE smart_disk_standby gauge" >> "$out" for dev in /dev/sd?; do [ -b "$dev" ] || continue json=$(smartctl -d sat -n standby,7 -j -H -i -A -l selftest "$dev"); rc=$? serial=$(udevadm info -q property -n "$dev" | sed -n 's/^ID_SERIAL_SHORT=//p') [ -n "$serial" ] || continue f="$CACHE/$serial.prom" if [ $rc -eq 7 ]; then standby=1 else standby=0 echo "$json" | jq -r --arg dev "${dev#/dev/}" ' (.model_name // "unknown") as $m | (.serial_number // "unknown") as $s | "{model=\"\($m)\",serial=\"\($s)\",device=\"\($dev)\"" as $l | "smart_health_passed\($l)} \(if .smart_status.passed then 1 else 0 end)", "smart_temperature_celsius\($l)} \(.temperature.current // "NaN")", "smart_power_on_hours\($l)} \(.power_on_time.hours // "NaN")", (.ata_smart_self_test_log.standard.table[0]? // empty | "smart_selftest_last_passed\($l)} \(if .status.passed then 1 else 0 end)"), (.ata_smart_attributes.table[]? | "smart_attribute_raw\($l),id=\"\(.id)\",name=\"\(.name)\"} \(.raw.value)", "smart_attribute_value\($l),id=\"\(.id)\",name=\"\(.name)\"} \(.value)"), "smart_last_read_timestamp\($l)} \(now|floor)" ' > "$f.tmp" && [ -s "$f.tmp" ] && mv "$f.tmp" "$f" fi [ -f "$f" ] && cat "$f" >> "$out" echo "smart_disk_standby{serial=\"$serial\",device=\"${dev#/dev/}\"} $standby" >> "$out" done metrics-push smart < "$out"