#!/usr/bin/env bash
# notifar.io — метрики сервера в JSON (Linux). Запуск по cron: */1 * * * * /usr/local/bin/notifar-resources.sh > /var/www/html/notifar-resources.json
set -u
cpu() { read -r _ a b c d e f g h _ < /proc/stat; t1=$((a+b+c+d+e+f+g+h)); i1=$((d+e)); sleep 0.2; read -r _ a b c d e f g h _ < /proc/stat; t2=$((a+b+c+d+e+f+g+h)); i2=$((d+e)); dt=$((t2-t1)); [ "$dt" -gt 0 ] && echo "scale=1; (1 - ($i2-$i1)/$dt)*100" | bc || echo null; }
ram() { awk '/MemTotal/{t=$2} /MemAvailable/{a=$2} END{ if(t>0) printf "%.1f", (1-a/t)*100; else print "null"}' /proc/meminfo; }
disk() { df -P "$1" 2>/dev/null | awk 'NR==2{gsub("%","",$5); print $5}'; }
LOAD=$(cut -d' ' -f1-3 /proc/loadavg | sed 's/ /, /g')
UP=$(cut -d. -f1 /proc/uptime)
DISKS="{\"mount\":\"/\",\"pct\":$(disk /)}"
for m in /data /home /var; do p=$(disk "$m"); [ -n "$p" ] && [ "$(df -P "$m" | awk 'NR==2{print $1}')" != "$(df -P / | awk 'NR==2{print $1}')" ] && DISKS="$DISKS,{\"mount\":\"$m\",\"pct\":$p}"; done
printf '{"cpu":%s,"ram":%s,"disk":%s,"disks":[%s],"load":[%s],"uptime":%s,"generated_at":"%s"}\n' "$(cpu)" "$(ram)" "$(disk /)" "$DISKS" "$LOAD" "$UP" "$(date -Iseconds)"
