#!/usr/bin/env bash
# SPDX-License-Identifier: LicenseRef-CMSD-1.0
# Copyright (c) 2026 CyberMind — Gérald Kerma <devel@cybermind.fr>
# Source-Disclosed License — All rights reserved except as expressly granted.
# See LICENCE-CMSD-1.0.md for terms.

# SecuBox-Deb :: proxypac-wpad — applique l'échelon WPAD selon le rôle détecté.
set -euo pipefail
DRYRUN="${WPAD_DRYRUN:-0}"
DNSMASQ_D="${WPAD_DNSMASQ_D:-/etc/dnsmasq.d}"
UNBOUND_D="${WPAD_UNBOUND_D:-/etc/unbound/unbound.conf.d}"
DOMAIN="${WPAD_DOMAIN:-$(hostname -d 2>/dev/null || echo local)}"
LAN_IP="${WPAD_LAN_IP:-$(/usr/sbin/tor-lan-ip 2>/dev/null || echo 127.0.0.1)}"
WPAD_CONFIG="${WPAD_CONFIG:-/etc/secubox/proxypac/proxypac.toml}"
# racine du paquet source (sbin/../) : fallback sys.path pour que
# `from proxypac.config import load` résolve aussi en environnement de test,
# où le module n'est pas installé sous /usr/lib/secubox/proxypac.
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PKG_ROOT="$(dirname "$SCRIPT_DIR")"
# rôle : override explicite (WPAD_ROLE, priorité tests) sinon override toml
# (role=master|slave|off dans proxypac.toml) sinon détection auto complète.
role() {
  if [ -n "${WPAD_ROLE:-}" ]; then echo "$WPAD_ROLE"; return; fi
  python3 - "$PKG_ROOT" "$WPAD_CONFIG" <<'PY'
import sys
sys.path.insert(0, "/usr/lib/secubox/proxypac")
sys.path.insert(0, sys.argv[1])
from proxypac.config import load
from proxypac.role import detect

override = load(sys.argv[2]).get("role", "auto")
if override == "master":
    print("master")
elif override == "off":
    print("off")
elif override == "slave":
    r = detect()
    print("slave-dns" if r.get("dns_resolver") else "slave")
else:
    r = detect()
    print("master" if r["tier"] == 1 else ("slave-dns" if r["tier"] == 2 else "slave"))
PY
}
_reload(){ [ "$DRYRUN" = "1" ] && return 0; "$@" || true; }

apply() {
  local r; r="$(role)"
  # nettoyage : on retire nos deux dropins puis on repose celui du tier courant
  rm -f "$DNSMASQ_D/secubox-wpad.conf" "$UNBOUND_D/secubox-wpad.conf"
  case "$r" in
    master)
      printf '# secubox-proxypac WPAD (auto)\ndhcp-option=252,"http://wpad.%s/wpad.dat"\n' "$DOMAIN" > "$DNSMASQ_D/secubox-wpad.conf"
      _reload systemctl reload dnsmasq ;;
    slave-dns)
      # UN DOMAINE VIDE COUPE LE DNS DE TOUT LE LAN.
      #
      # Sans domaine, ce printf produit `local-data: "wpad.. A <ip>"` — un
      # label vide. Unbound ne l'ignore pas : il REFUSE DE DEMARRER
      # (« fatal error: Could not set up local zones »), et repart en boucle.
      # Le 2026-08-17 il a redemarre 18 fois d'affilee, plus aucun nom ne se
      # resolvait sur la board ni sur le LAN, et toute la surface web est
      # devenue injoignable — pour une variable vide dans un fichier auxiliaire.
      #
      # On n'ecrit donc rien plutot qu'un fichier qui casse le resolveur : sans
      # WPAD, les postes configurent leur proxy a la main ; sans DNS, plus rien
      # ne fonctionne.
      if [ -z "${DOMAIN:-}" ] || [ -z "${LAN_IP:-}" ]; then
        echo "wpad: domaine ou adresse absents — aucun dropin ecrit (un label vide empecherait unbound de demarrer)" >&2
        rm -f "$UNBOUND_D/secubox-wpad.conf"
        _reload unbound-control reload
        exit 0
      fi
      printf '# secubox-proxypac WPAD via DNS (auto)\nserver:\n    local-data: "wpad.%s. A %s"\n' "$DOMAIN" "$LAN_IP" > "$UNBOUND_D/secubox-wpad.conf"
      _reload unbound-control reload ;;
    *) : ;;  # slave (tier3) et off : no-op réseau (aucun dropin, garde-fou anti double-DHCP)
  esac
  echo "wpad applied role=$r domain=$DOMAIN"
}
state() {
  local r; r="$(role)"
  printf '{"role":"%s","domain":"%s","lan_ip":"%s","pac_url":"http://wpad.%s/wpad.dat"}\n' "$r" "$DOMAIN" "$LAN_IP" "$DOMAIN"
}
case "${1:-}" in apply) apply;; state) state;; *) echo "usage: proxypac-wpad {apply|state}" >&2; exit 2;; esac
