#!/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
# заполнение диска бэкапа (statfs — из памяти, спящий диск не будит)
if mountpoint -q /mnt/backup; then
  read -r size avail < <(df -B1 --output=size,avail /mnt/backup | tail -1)
  echo "backup_disk_size_bytes{mountpoint=\"/mnt/backup\"} $size" >> "$out"
  echo "backup_disk_avail_bytes{mountpoint=\"/mnt/backup\"} $avail" >> "$out"
fi
# диск в роутере (rclone SFTP-монтирование /mnt/router): жив ли и сколько занято.
# timeout — зависший FUSE не должен вешать сбор метрик
echo "# TYPE router_mount_up gauge" >> "$out"
if mountpoint -q /mnt/router && r=$(timeout 20 df -B1 --output=size,avail /mnt/router 2>/dev/null | tail -1) && [ -n "$r" ]; then
  read -r size avail <<< "$r"
  echo "router_mount_up 1" >> "$out"
  echo "backup_disk_size_bytes{mountpoint=\"/mnt/router\"} $size" >> "$out"
  echo "backup_disk_avail_bytes{mountpoint=\"/mnt/router\"} $avail" >> "$out"
else
  echo "router_mount_up 0" >> "$out"
fi
metrics-push smart < "$out"
