#!/usr/bin/env bash
# status-home-server.sh — dashboard status home server.
#
# Membaca snapshot beku dari folder data/ (ss.txt: hasil `ss -tln`,
# df.txt: hasil `df -h`) dan daftar run backup (backup-YYYYMMDD) di
# folder BACKUP_DIR, lalu menulis laporan status ke stdout sekaligus
# baris temuan ke berkas log. Pola snapshot membuat hasilnya bisa
# diulang dan diuji — pola yang sama dipakai Proyek Otomasi
# Pemeliharaan Sistem.
#
# Variabel lingkungan (berguna untuk pengujian):
#   CONF      berkas konfigurasi yang dibaca (default: home-server.conf)
#   DATA_DIR  folder snapshot (default: data)
#   HARI_INI  tanggal acuan umur backup (default: hari ini, YYYY-MM-DD)
#
# Kode keluar (temuan bisa gabungan — jumlahkan nilainya):
#   0 sehat                        1 disk data melewati ambang
#   2 layanan berbagi tidak jalan  4 backup terlalu tua / belum ada

set -u

CONF="${CONF:-home-server.conf}"
DATA_DIR="${DATA_DIR:-data}"
HARI_INI="${HARI_INI:-$(date +%F)}"

if [ -f "$CONF" ]; then
    # shellcheck source=/dev/null
    . "$CONF"
fi

PORT_BERBAGI="${PORT_BERBAGI:-8765}"
DATA_MOUNT="${DATA_MOUNT:-/srv/data}"
BACKUP_DIR="${BACKUP_DIR:-/srv/backup/run}"
BACKUP_MAX_UMUR_HARI="${BACKUP_MAX_UMUR_HARI:-2}"
DISK_AMBANG_PCT="${DISK_AMBANG_PCT:-85}"
LOG_FILE="${LOG_FILE:-status-home-server.log}"

GARIS='----------------------------------------------------------------'

# --- 1. Layanan berbagi: cari baris LISTEN pada port dari snapshot ----
# Kolom ke-4 output ss adalah "alamat:port", jadi port dicocokkan
# sebagai akhiran kolom — bentuk [::]:8765 pun lolos pola yang sama.
layanan="MATI"
if awk -v port="$PORT_BERBAGI" '
        $1 == "LISTEN" && $4 ~ ":" port "$" { ketemu = 1 }
        END { exit ketemu ? 0 : 1 }' "$DATA_DIR/ss.txt" 2> /dev/null; then
    layanan="JALAN"
fi

# --- 2. Disk data: persentase pemakaian dari snapshot df --------------
# Kolom ke-5 df adalah Use% ("+0" membuang tanda %), kolom ke-6
# mount point. Mount yang tidak ada berarti disk data gagal termuat.
disk_pct=$(awk -v mnt="$DATA_MOUNT" '
    $6 == mnt { print $5 + 0; exit }' "$DATA_DIR/df.txt" 2> /dev/null)

# --- 3. Backup terakhir: umur dihitung dari nama folder run -----------
backup_terakhir=$(ls -1 "$BACKUP_DIR" 2> /dev/null |
    grep -E '^backup-[0-9]{8}$' | sort | tail -n 1)

umur=""
if [ -n "$backup_terakhir" ]; then
    tgl="${backup_terakhir#backup-}"
    tgl_iso="${tgl:0:4}-${tgl:4:2}-${tgl:6:2}"
    umur=$(( ( $(date -d "$HARI_INI" +%s) -
               $(date -d "$tgl_iso" +%s) ) / 86400 ))
fi

# --- 4. Kumpulkan temuan ------------------------------------------------
temuan=0
n_temuan=0
daftar_temuan=""

catat() {
    n_temuan=$((n_temuan + 1))
    daftar_temuan="$daftar_temuan
- $1"
}

if [ "$layanan" = "MATI" ]; then
    temuan=$((temuan + 2))
    catat "layanan berbagi tidak jalan (port $PORT_BERBAGI tidak mendengarkan)"
fi

if [ -z "$disk_pct" ]; then
    temuan=$((temuan + 1))
    catat "disk data $DATA_MOUNT tidak termuat — periksa fstab"
elif [ "$disk_pct" -ge "$DISK_AMBANG_PCT" ]; then
    temuan=$((temuan + 1))
    catat "disk data melewati ambang: ${disk_pct}% dari ${DISK_AMBANG_PCT}%"
fi

if [ -z "$backup_terakhir" ]; then
    temuan=$((temuan + 4))
    catat "belum ada run backup di $BACKUP_DIR"
elif [ "$umur" -gt "$BACKUP_MAX_UMUR_HARI" ]; then
    temuan=$((temuan + 4))
    catat "backup terlalu tua: $umur hari (maksimal $BACKUP_MAX_UMUR_HARI)"
fi

# --- 5. Tulis laporan ke stdout dan temuan ke log -----------------------
printf '================================================================\n'
printf 'STATUS HOME SERVER\n'
printf 'Tanggal acuan : %s\n' "$HARI_INI"
printf '================================================================\n'
if [ "$layanan" = "JALAN" ]; then
    printf 'layanan berbagi : JALAN (port %s)\n' "$PORT_BERBAGI"
else
    printf 'layanan berbagi : MATI (port %s tidak mendengarkan)\n' "$PORT_BERBAGI"
fi
if [ -n "$disk_pct" ]; then
    if [ "$disk_pct" -ge "$DISK_AMBANG_PCT" ]; then
        printf 'disk data       : %s %s%% MELEWATI AMBANG %s%%\n' \
            "$DATA_MOUNT" "$disk_pct" "$DISK_AMBANG_PCT"
    else
        printf 'disk data       : %s %s%% (ambang %s%%)\n' \
            "$DATA_MOUNT" "$disk_pct" "$DISK_AMBANG_PCT"
    fi
else
    printf 'disk data       : %s tidak ada di snapshot df\n' "$DATA_MOUNT"
fi
if [ -n "$backup_terakhir" ]; then
    printf 'backup terakhir : %s (umur %s hari, maksimal %s)\n' \
        "$backup_terakhir" "$umur" "$BACKUP_MAX_UMUR_HARI"
else
    printf 'backup terakhir : belum ada run backup\n'
fi
printf '%s\n' "$GARIS"

if [ "$temuan" -eq 0 ]; then
    printf 'temuan          : tidak ada — server sehat\n'
else
    printf 'temuan          : %d\n' "$n_temuan"
    # ${var#$'\n'} membuang baris kosong pertama dari daftar.
    printf '%s\n' "${daftar_temuan#$'\n'}"
    # Alert sederhana: satu baris per temuan ke berkas log.
    mkdir -p "$(dirname "$LOG_FILE")"
    printf '%s\n' "${daftar_temuan#$'\n'}" |
        while IFS= read -r baris; do
            printf '[%s] TEMUAN: %s\n' "$HARI_INI" "${baris#- }" >> "$LOG_FILE"
        done
    printf 'temuan dicatat ke: %s\n' "$LOG_FILE"
fi

exit "$temuan"
