#!/bin/bash
# keepalived notify-Skript fuer die NFS-Service-VIP crb2.
# Aufruf durch keepalived: notify <INSTANCE|GROUP> <name> <state> <prio>
#
# MASTER      -> Replikation sperren, Datasets beschreibbar, nfsd hoch, exportieren
# BACKUP/FAULT-> Exporte weg, nfsd runter, Datasets readonly, Replikation frei
#
# Identisch auf nfs-1 und nfs-2 einsetzbar.

set -u
# Configuration is read from /etc/default/aep-nfs-ha (written by configuration
# management); the defaults below match the crb2 pair as built in 2026-08.
CONF=${AEP_NFS_HA_CONF:-/etc/default/aep-nfs-ha}
# shellcheck source=/dev/null
[ -r "$CONF" ] && . "$CONF"
POOL=${POOL:-nfs}
DATASETS=${DATASETS:-"pvc-prod pvc-nonprod backup"}
REPL_BLOCK=/run/replicate_nfs.blocked
LOG=/var/log/keepalived_nfs_notify.log

state="${3:-UNKNOWN}"
log() { echo "$(date '+%F %T') [$state] $*" >> "$LOG"; }

log "notify aufgerufen: $* "

case "$state" in
MASTER)
    # 1. Replikation aussperren: ein zfs recv wuerde Live-Daten zurueckrollen.
    echo "promoted $(date '+%F %T')" > "$REPL_BLOCK"
    log "Replikation gesperrt ($REPL_BLOCK)"

    # 2. Datasets beschreibbar machen und mounten.
    for ds in $DATASETS; do
        zfs set readonly=off "$POOL/$ds"  >>"$LOG" 2>&1 || log "WARN readonly=off $ds"
        zfs mount "$POOL/$ds"             >>"$LOG" 2>&1 || true   # ggf. schon gemountet
    done

    # 3. NFSv4-Client-Tracking von nfs-1 uebernehmen, damit die Clients ihre
    #    Locks in der Grace-Period zurueckfordern koennen. Muss VOR nfsd-Start
    #    passieren, nfsdcld liest die DB beim Start.
    if [ -f /var/lib/nfs-from-peer/nfsdcld/main.sqlite ]; then
        install -d -m 700 /var/lib/nfs/nfsdcld
        cp -a /var/lib/nfs-from-peer/nfsdcld/main.sqlite /var/lib/nfs/nfsdcld/main.sqlite \
            && log "nfsdcld-State vom Peer uebernommen" \
            || log "WARN nfsdcld-State nicht uebernehmbar"
        cp -a /var/lib/nfs-from-peer/sm/. /var/lib/nfs/sm/ 2>/dev/null
    else
        log "WARN kein gespiegelter nfsdcld-State vorhanden, Lock-Reclaim kann scheitern"
    fi

    # 4. NFS-Server hoch (s6, nicht systemd!).
    svctl start nfs >>"$LOG" 2>&1 || log "WARN svctl start nfs fehlgeschlagen"

    # 5. Exporte aktivieren.
    exportfs -ra >>"$LOG" 2>&1 || log "WARN exportfs -ra fehlgeschlagen"

    log "MASTER-Uebernahme abgeschlossen"
    ;;

BACKUP|FAULT|STOP)
    # 1. Exporte sofort zurueckziehen -- kein zweiter Server darf exportieren.
    exportfs -ua >>"$LOG" 2>&1 || log "WARN exportfs -ua fehlgeschlagen"

    # 2. NFS-Server runter.
    svctl stop nfs >>"$LOG" 2>&1 || log "WARN svctl stop nfs fehlgeschlagen"

    # 3. Datasets schreibschuetzen.
    for ds in $DATASETS; do
        zfs set readonly=on "$POOL/$ds" >>"$LOG" 2>&1 || log "WARN readonly=on $ds"
    done

    # 4. Replikation wieder zulassen.
    rm -f "$REPL_BLOCK"

    log "Rueckfall auf Standby abgeschlossen"
    ;;

*)
    log "unbekannter State, keine Aktion"
    ;;
esac

exit 0
