Research-Stack/4-Infrastructure/auto/nodes/system.sh
2026-05-25 16:24:21 -05:00

69 lines
2.1 KiB
Bash
Executable file

#!/bin/bash
# system.sh — basic node health probe (disk, mem, load, zram, systemd)
# Output: JSON to stdout. No external dependencies beyond coreutils + procfs.
set -e
HOSTNAME=$(hostname)
DISK_PCT=0
DISK_TOTAL=0
DISK_FREE=0
MEM_PCT=0
MEM_TOTAL=0
MEM_FREE=0
LOAD_1M=0
LOAD_5M=0
LOAD_15M=0
UPTIME=0
ZRAM_USED=0
ZRAM_TOTAL=0
# disk usage on /
disk_info=$(df -k / 2>/dev/null | awk 'NR==2 {print $2, $4, $5}')
if [ -n "$disk_info" ]; then
DISK_TOTAL=$(echo "$disk_info" | awk '{printf "%.0f", $1/1024}')
DISK_FREE=$(echo "$disk_info" | awk '{printf "%.0f", $2/1024}')
DISK_PCT=$(echo "$disk_info" | awk '{print $3}' | tr -d '%')
fi
# memory
mem_info=$(free -m 2>/dev/null | awk 'NR==2 {print $2, $7}')
if [ -n "$mem_info" ]; then
MEM_TOTAL=$(echo "$mem_info" | awk '{print $1}')
MEM_FREE=$(echo "$mem_info" | awk '{print $2}')
if [ "$MEM_TOTAL" -gt 0 ]; then
used=$((MEM_TOTAL - MEM_FREE))
MEM_PCT=$((used * 100 / MEM_TOTAL))
fi
fi
# load average
load_info=$(awk '{print $1, $2, $3}' /proc/loadavg 2>/dev/null)
if [ -n "$load_info" ]; then
LOAD_1M=$(echo "$load_info" | awk '{printf "%.2f", $1}')
LOAD_5M=$(echo "$load_info" | awk '{printf "%.2f", $2}')
LOAD_15M=$(echo "$load_info" | awk '{printf "%.2f", $3}')
fi
# uptime in seconds
UPTIME=$(awk '{printf "%.0f", $1}' /proc/uptime 2>/dev/null || echo 0)
# zram
if command -v zramctl &>/dev/null; then
zram_info=$(zramctl --output-all --bytes 2>/dev/null | awk -F'[[:space:]]+' 'NR>1 {
used+=$3; total+=$4
} END {
printf "%.0f %.0f", used/1048576, total/1048576
}')
if [ -n "$zram_info" ]; then
ZRAM_USED=$(echo "$zram_info" | awk '{print $1}')
ZRAM_TOTAL=$(echo "$zram_info" | awk '{print $2}')
fi
fi
printf '{"node":"%s","hostname":"%s","disk":{"total_mb":%s,"free_mb":%s,"used_pct":%s},"memory":{"total_mb":%s,"free_mb":%s,"used_pct":%s},"load":{"1m":%s,"5m":%s,"15m":%s},"uptime_seconds":%s,"zram":{"used_mb":%s,"total_mb":%s}}\n' \
"$HOSTNAME" "$HOSTNAME" \
"$DISK_TOTAL" "$DISK_FREE" "$DISK_PCT" \
"$MEM_TOTAL" "$MEM_FREE" "$MEM_PCT" \
"$LOAD_1M" "$LOAD_5M" "$LOAD_15M" \
"$UPTIME" "$ZRAM_USED" "$ZRAM_TOTAL"