94 lines
2.5 KiB
Bash
Executable File
94 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# ==== KONFIG ====
|
|
PUSH_URL="http://127.0.0.1:3001/api/push/O2EhJUkH4n"
|
|
LOG_FILE="/var/log/host-health.log"
|
|
|
|
CURL="/usr/bin/curl"
|
|
SYSTEMCTL="/bin/systemctl"
|
|
DATESTAMP="$(date -Is)"
|
|
|
|
# Warn- und Kritisch-Schwellen
|
|
CPU_WARN=5.0 # Load > 5 Warnung
|
|
CPU_CRIT=10.0 # Load > 10 kritisch
|
|
RAM_WARN=85 # >85% RAM Warnung
|
|
RAM_CRIT=95 # >95% RAM kritisch
|
|
DISK_WARN=80 # >80% Disk Warnung
|
|
DISK_CRIT=95 # >95% Disk kritisch
|
|
|
|
# ==== MESSWERTE ====
|
|
CPU_LOAD="$(awk '{print $1}' /proc/loadavg)"
|
|
RAM_PCT="$(free | awk '/Mem:/ {printf "%.0f", ($3/$2)*100}')"
|
|
DISK_PCT="$(df -P / | awk 'NR==2 {gsub("%","",$5); print $5}')"
|
|
|
|
# Ping zur Default-Gateway oder extern (hier Google DNS)
|
|
PING_MS="$(ping -c1 -W1 8.8.8.8 | awk -F'time=' '/time=/{print $2}' | cut -d' ' -f1 || echo "NaN")"
|
|
|
|
# Dienste-Status
|
|
svc_ok () { $SYSTEMCTL is-active --quiet "$1" && echo OK || echo FAIL; }
|
|
NGINX_STATUS="$(svc_ok nginx)"
|
|
DOCKER_STATUS="$(svc_ok docker)"
|
|
WG_STATUS="$(svc_ok wg-quick@wg0)"
|
|
PVEVM_STATUS="$(svc_ok proxmox-vm)"
|
|
|
|
# ==== STATUS LOGIK ====
|
|
STATUS="up"
|
|
MSG=""
|
|
|
|
# CPU Check
|
|
if (( $(echo "$CPU_LOAD > $CPU_CRIT" | bc -l) )); then
|
|
STATUS="down"; MSG+="CPU:CRIT(${CPU_LOAD}) "
|
|
elif (( $(echo "$CPU_LOAD > $CPU_WARN" | bc -l) )); then
|
|
MSG+="CPU:WARN(${CPU_LOAD}) "
|
|
else
|
|
MSG+="CPU:${CPU_LOAD} "
|
|
fi
|
|
|
|
# RAM Check
|
|
if [ "$RAM_PCT" -ge "$RAM_CRIT" ]; then
|
|
STATUS="down"; MSG+="RAM:CRIT(${RAM_PCT}%) "
|
|
elif [ "$RAM_PCT" -ge "$RAM_WARN" ]; then
|
|
MSG+="RAM:WARN(${RAM_PCT}%) "
|
|
else
|
|
MSG+="RAM:${RAM_PCT}% "
|
|
fi
|
|
|
|
# Disk Check
|
|
if [ "$DISK_PCT" -ge "$DISK_CRIT" ]; then
|
|
STATUS="down"; MSG+="DISK:CRIT(${DISK_PCT}%) "
|
|
elif [ "$DISK_PCT" -ge "$DISK_WARN" ]; then
|
|
MSG+="DISK:WARN(${DISK_PCT}%) "
|
|
else
|
|
MSG+="DISK:${DISK_PCT}% "
|
|
fi
|
|
|
|
# Dienste Check
|
|
for svc in NGINX:$NGINX_STATUS DOCKER:$DOCKER_STATUS WG:$WG_STATUS PVEVM:$PVEVM_STATUS; do
|
|
name="${svc%%:*}"; val="${svc##*:}"
|
|
if [ "$val" != "OK" ]; then
|
|
STATUS="down"; MSG+="$name:FAIL "
|
|
else
|
|
MSG+="$name:OK "
|
|
fi
|
|
done
|
|
|
|
# Ping (nur Info)
|
|
MSG+="PING:${PING_MS}ms"
|
|
|
|
# ==== PUSH ====
|
|
HTTP_CODE="$($CURL -sS -o /tmp/kuma_push.out -w "%{http_code}" \
|
|
--get \
|
|
--data-urlencode "status=${STATUS}" \
|
|
--data-urlencode "msg=${MSG}" \
|
|
--data-urlencode "ping=${PING_MS}" \
|
|
"${PUSH_URL}")" || true
|
|
|
|
# Logging
|
|
echo "${DATESTAMP} status=${STATUS} msg='${MSG}' http=${HTTP_CODE}" >> "$LOG_FILE"
|
|
|
|
if [[ "$HTTP_CODE" != "200" ]]; then
|
|
echo "${DATESTAMP} ERROR: Kuma Push HTTP ${HTTP_CODE}" >> "$LOG_FILE"
|
|
exit 1
|
|
fi
|