#!/bin/sh
# Le travail de 51-joyeuse-clat-garde, detache. Voir son en-tete pour la mesure
# qui le justifie.
#
# ⚠️ IL JOURNALISE MEME QUAND IL NE FAIT RIEN, et c'est delibere : une garde
#    silencieuse ne se distingue pas d'une garde qui ne tourne pas. C'est le
#    piege paye ici avec les .post-install, qui ne s'executent jamais sans que
#    rien ne le dise.

PATH=/usr/sbin:/sbin:$PATH

DIRE() { logger -t joyeuse-clat-garde "$*"; }

PREFIXE_NAT64=64:ff9b::/96

lien_mobile() {
	ip -6 -br addr show scope global 2>/dev/null \
		| awk '$1 ~ /^qmapmux/ { sub(/@.*/,"",$1); print $1; exit }'
}

# ☠️ CE QUE clatd A REELLEMENT CHOISI, pas ce qu'on croit lui avoir dit. Il
#    inscrit son lien dans sa propre table nftables, seconde regle :
#      iif "qmapmux0.0" ip6 saddr 64:ff9b::/96 ip6 daddr <adresse du CLAT> ...
#    C'est la seule trace vivante du choix ; le journal de son demarrage, lui,
#    peut dater d'une relance precedente.
plat_choisi() {
	nft list table ip6 clatd 2>/dev/null \
		| sed -n 's/.*iif "\([^"]*\)" ip6 saddr 64:ff9b.*/\1/p' | head -1
}

sleep 8

# ⛔ clatd ne tourne qu'avec Waydroid. S'il est arrete, il n'y a rien a garder —
#    et surtout rien a demarrer.
if ! systemctl is-active --quiet clatd; then
	exit 0
fi

MOBILE=$(lien_mobile)

if [ -z "$MOBILE" ]; then
	DIRE "clatd tourne mais aucun lien mobile ne porte d'adresse globale — rien a juger"
	exit 0
fi

ROUTE=$(ip -6 route get "${PREFIXE_NAT64%/*}" 2>/dev/null \
	| awk '{ for (i = 1; i <= NF; i++) if ($i == "dev") { print $(i + 1); exit } }')

if [ "$ROUTE" != "$MOBILE" ]; then
	ip -6 route replace "$PREFIXE_NAT64" dev "$MOBILE" metric 100 2>/dev/null \
		&& DIRE "route $PREFIXE_NAT64 remise sur $MOBILE (elle visait : ${ROUTE:-rien})"
fi

PLAT=$(plat_choisi)

if [ "$PLAT" != "$MOBILE" ]; then
	DIRE "le CLAT est pose sur « ${PLAT:-inconnu} » au lieu de « $MOBILE » — il ne traduit rien"
	systemctl try-restart clatd
	sleep 6
	PLAT=$(plat_choisi)
	if [ "$PLAT" = "$MOBILE" ]; then
		DIRE "RETABLI — le CLAT est refait sur $MOBILE"
	else
		DIRE "ECHEC — le CLAT est toujours sur « ${PLAT:-inconnu} »"
		exit 1
	fi
fi

# ☠️ ET ON NE S'ARRETE PAS AU BON NOM D'INTERFACE : la preuve est qu'un litteral
#    IPv4 repond. C'est tout ce que le CLAT existe pour faire, et c'est la seule
#    mesure qui distingue « monte » de « traduit ».
# ⚖️ On n'AGIT PAS sur ce resultat : un reseau peut jeter l'ICMP sans casser le
#    TCP. On l'ecrit, et c'est au journal de trancher si le doute revient.
if ping -c1 -W3 -I clat 1.1.1.1 >/dev/null 2>&1; then
	DIRE "CLAT sain sur $MOBILE — un litteral IPv4 repond a travers lui"
else
	DIRE "CLAT pose sur $MOBILE, mais un litteral IPv4 ne repond PAS a travers lui"
fi

exit 0
