#!/usr/bin/env bash
# cek-kesiapan.sh — periksa kesiapan struktur home server.
#
# Memeriksa folder layanan di bawah SRV_ROOT, permission dan
# kepemilikan folder berbagi, serta entri fstab untuk disk data.
# Semua target bisa digeser lewat variabel lingkungan sehingga
# pemeriksaan bisa dilatih pada fixture:
#   SRV_ROOT     akar struktur layanan (default: /srv)
#   FSTAB_FILE   berkas fstab yang diperiksa (default: /etc/fstab)
#   LAYANAN_USER user pemilik folder berbagi (default: user saat ini)
#   DATA_MOUNT   mount point disk data (default: /srv/data)
#
# Kode keluar: 0 = siap dijalankan; selain itu = jumlah temuan.

set -u

SRV_ROOT="${SRV_ROOT:-/srv}"
FSTAB_FILE="${FSTAB_FILE:-/etc/fstab}"
LAYANAN_USER="${LAYANAN_USER:-$(id -un)}"
DATA_MOUNT="${DATA_MOUNT:-/srv/data}"

temuan=0

lolos() {
    printf 'OK    %s\n' "$1"
}

gagal() {
    printf 'GAGAL %s\n' "$1"
    temuan=$((temuan + 1))
}

# --- folder berbagi: ada, mode 750, dimiliki user layanan --------------
if [ -d "$SRV_ROOT/berbagi" ]; then
    mode=$(stat -c %a "$SRV_ROOT/berbagi")
    if [ "$mode" = "750" ]; then
        lolos "folder $SRV_ROOT/berbagi (mode $mode)"
    else
        gagal "folder $SRV_ROOT/berbagi mode $mode, harapan 750"
    fi
    pemilik=$(stat -c %U "$SRV_ROOT/berbagi")
    if [ "$pemilik" = "$LAYANAN_USER" ]; then
        lolos "pemilik $SRV_ROOT/berbagi sesuai user layanan"
    else
        gagal "pemilik $SRV_ROOT/berbagi bukan user layanan"
    fi
else
    gagal "folder $SRV_ROOT/berbagi tidak ditemukan"
    # permission dan kepemilikan tidak bisa diperiksa bila foldernya
    # pun tidak ada; dua temuan cukup mewakili satu folder hilang.
fi

# --- folder data keluarga -------------------------------------------------
for d in foto-keluarga backup; do
    if [ -d "$SRV_ROOT/$d" ]; then
        lolos "folder $SRV_ROOT/$d"
    else
        gagal "folder $SRV_ROOT/$d tidak ditemukan"
    fi
done

# --- entri fstab disk data: nofail wajib ----------------------------------
# $2 mount point, $4 opsi; nofail dicocokkan sebagai satu opsi utuh
# sehingga opsi seperti "mynofailx" tidak lolos mengaku nofail.
if awk -v mnt="$DATA_MOUNT" '
        $0 !~ /^[[:space:]]*#/ && $2 == mnt &&
        $4 ~ /(^|,)nofail(,|$)/ { found = 1 }
        END { exit found ? 0 : 1 }' "$FSTAB_FILE" 2> /dev/null; then
    lolos "entri fstab untuk $DATA_MOUNT memuat nofail"
else
    gagal "fstab belum memuat entri nofail untuk $DATA_MOUNT"
fi

# --- ringkasan ------------------------------------------------------------
if [ "$temuan" -eq 0 ]; then
    printf 'server siap dijalankan: 0 temuan\n'
else
    printf 'server belum siap: %d temuan\n' "$temuan"
fi
exit "$temuan"
