#!/bin/sh /etc/rc.common
# velmod: l'interfaccia di comando e l'archivio. Dopo la rete: ascolta
# sull'indirizzo della WAN (lato casa), che risolve all'avvio; se il DHCP non ha
# ancora dato l'indirizzo esce, e procd lo riavvia.

START=96
STOP=05
USE_PROCD=1

start_service() {
	. /etc/velmo/router.conf
	. /usr/lib/velmo/comune.sh
	# Senza questa porta velmod legherebbe ":", cioè una porta effimera
	# qualunque scelta da Go: partirebbe, scriverebbe "in ascolto" nel suo
	# registro, e la console sarebbe irraggiungibile senza nessun errore da
	# nessuna parte. Meglio non partire, con una ragione scritta.
	[ -n "$VELMOD_PORTA_CASA" ] || { errore "VELMOD_PORTA_CASA vuota: non avvio velmod"; return 1; }
	# La console non ha più una deviazione fw3 da qui in avanti (Task 3): un
	# apparecchio aggiornato dalla versione precedente la porta ancora, e
	# l'aggiornamento online non richiama installa.sh - solo un riavvio di
	# questo servizio, che è la via che entrambi attraversano. Tutte e due le
	# deviazioni, quella del lato casa e quella della rete del primo avvio: la
	# seconda viveva dentro velmo-one.sh, dietro un'uscita anticipata che su un
	# apparecchio mai collegato a casa non lasciava mai passare nessuno (N2).
	pulisci_deviazioni_console
	# E, per la stessa ragione e dalla stessa via, gli ascolti dei servizi di
	# sistema (spec 2026-09-22 §5, Task 5): DNS, ora e SSH. Un apparecchio gia'
	# in campo non ripassa mai da installa.sh - l'aggiornamento online copia i
	# file e riavvia questo servizio - e resterebbe con SSH e il DNS aperti
	# verso casa per sempre. Nessuna delle tre puo' impedire a velmod di
	# partire: la console vale piu' di un ascolto di troppo, che il firewall
	# chiude comunque.
	lega_ascolti
	# Le metriche delle vie verso casa (comune.sh, ordina_vie_di_casa), dalla
	# stessa via per la stessa ragione: un Velmo già in campo le riceve con
	# l'aggiornamento. La rete si ricarica solo la volta che cambiano.
	ordina_vie_di_casa && /etc/init.d/network reload >/dev/null 2>&1
	# E dalla stessa via, per la stessa ragione, i moduli del kernel che Velmo
	# non usa (spec 2026-09-22 §6, Task 6): wireguard e i driver Wi-Fi USB
	# Ralink. Senza questa riga un apparecchio gia' in campo riceverebbe la
	# funzione dentro comune.sh - usr/lib/velmo/* e' fra i percorsi che
	# l'aggiornamento accetta - e non la eseguirebbe mai, continuando a
	# caricarli a ogni avvio finche' qualcuno non rifa' un'installazione intera
	# (C1, revisione del 22 settembre 2026). E' idempotente e torna 1 quando non
	# c'e' niente da fare: dal secondo avvio non costa niente e non annota
	# niente.
	spegni_moduli_non_usati || true
	[ -r /var/run/velmo/dati ] || /usr/lib/velmo/dati.sh prepara
	. /var/run/velmo/dati
	# Le pagine della bacheca (ADR 0016): le scrive velmod, le consegna
	# velmo-bacheca. La cartella sta in RAM e sparisce al riavvio, come la
	# RuntimeDirectory di systemd su main; qui la prepara l'init, perché procd
	# non ce l'ha. 0755: velmod scrive, il server le legge da nobody.
	mkdir -p /var/run/velmo-bacheca
	chown velmo:velmo /var/run/velmo-bacheca
	chmod 0755 /var/run/velmo-bacheca
	# L'interfaccia da cui si comanda Velmo è quella da cui Velmo esce, non una
	# scritta una volta per sempre: dal 20 settembre 2026 non ci sono topologie
	# da dichiarare, e casa può arrivare dal cavo o dalla radio. Senza nessuna
	# via - apparecchio appena acceso - ci si lega alla rete di configurazione.
	#
	# La sceglie interfaccia_di_gestione (comune.sh), che è lo stesso posto che
	# velmo-guardia interroga ogni minuto per controllare che velmod sia ancora
	# dove deve: qui si sceglie una volta, lì si corregge finché serve, e la
	# regola sta scritta una volta sola.
	gestione=$(interfaccia_di_gestione)
	# Dialix (spec 2026-09-30-dialix §3): velmod, sceso a velmo, apre qui il
	# socket solo durante una partita; il guardiano, da root, ci scrive.
	mkdir -p /var/run/velmo/dialix
	chown velmo:velmo /var/run/velmo/dialix
	chmod 0750 /var/run/velmo/dialix
	procd_open_instance
	procd_set_param command /usr/sbin/velmod \
		-ascolto ":$VELMOD_PORTA_CASA" \
		-scendi-a velmo \
		-interfaccia-gestione "$gestione" \
		-archivio "$ARCHIVIO/velmo.db" \
		-modi leggibile,protetto,aggressivo,bloccato:chiusa \
		-modo-iniziale protetto \
		-modo-misura leggibile \
		-raccolta "$RACCOLTA" \
		-disco "$VELMO_DATI" \
		-wan "$VELMO_WAN" \
		-dns "$VELMO_DATI/dns.log" \
		-eventi "$VELMO_DATI/eventi.log" \
		-flussi "$VELMO_DATI/flows/flows.log" \
		-liste-guardiano /etc/velmo/guardiano \
		-registro-guardiano "$VELMO_DATI/guardiano/connessioni.log" \
		-stato-guardiano /var/run/velmo/guardiano-liste.json \
		-lan "$VELMO_PONTE" \
		-contratti /tmp/velmo-dns/contratti \
		-blocco-richiesto /var/run/velmo-richieste/blocco-richiesto \
		-ammessi-richiesti /var/run/velmo-richieste/ammessi-richiesti \
		-ammessi-in-vigore /etc/velmo/ammessi \
		-liste-richieste /var/run/velmo-richieste/liste-richieste \
		-modi-file /etc/velmo/modi \
		-modi-in-vigore /var/run/velmo/modi-in-vigore \
		-richiesta /var/run/velmo-richieste/finestra-richiesta \
		-televisori-richiesti /var/run/velmo-richieste/televisori-richiesti \
		-riserve /etc/velmo/dns/televisori.conf \
		-rete-ssid "$(uci -q get wireless.velmo.ssid)" \
		-rete-chiave-file /etc/velmo/rete-chiave \
		-rete-chiave-richiesta /var/run/velmo-richieste/rete-chiave-richiesta \
		-rete-casa-richiesta /var/run/velmo-richieste/rete-casa-richiesta \
		-rete-casa-in-vigore /etc/velmo/rete-casa \
		-rete-casa-interfaccia wlancasa \
		-apparecchi-richiesta /var/run/velmo-richieste/apparecchi-richiesta \
		-apparecchi-max "$VELMO_APPARECCHI_MAX" \
		-apparecchi-max-file /etc/velmo/apparecchi-max \
		-contratto-richiesta /var/run/velmo-richieste/contratto-richiesta \
		-riavvio-richiesto /var/run/velmo-richieste/riavvio-richiesto \
		-azzeramento-richiesto /var/run/velmo-richieste/azzeramento-richiesto \
		${VELMO_NOME_HOST:+-nome-annunciato "$VELMO_NOME_HOST"} \
		-supporto-stato /var/run/velmo/dati \
		-usb-richiesta /var/run/velmo-richieste/usb-richiesta \
		-soglia-blocco "$VELMO_SOGLIA_BLOCCO" \
		-indirizzi "$VELMO_INDIRIZZO" \
		-servizi "$VELMOD_SERVIZI" \
		-coppie-richieste /var/run/velmo-richieste/coppie-richieste \
		-bacheca /var/run/velmo-bacheca \
		-bacheca-nome "$VELMO_BACHECA_NOME" \
		-doh-nomi "$(echo $VELMO_DOH_NOMI | tr ' ' ',')" \
		-doh-resolvers "$(echo $VELMO_DOH_RESOLVERS | tr ' ' ',')"
	# La cartella delle liste consegnate da un aggiornamento (spec 2026-09-21
	# §5.1): senza, contano solo quelle incorporate nel binario.
	procd_append_param command -liste-dir /etc/velmo/liste
	# Il socket di Dialix, nella cartella preparata qui sopra.
	procd_append_param command -dialix /var/run/velmo/dialix/dialix.sock
	# Il marcatore di un aggiornamento in corso (spec 2026-09-21 §9.2, §10):
	# velmo-soccorso, che parte prima di questo servizio, lo guarda per sapere
	# se l'avvio precedente e' andato bene. Non c'e' piu' un "segno di vita"
	# separato (/var/run/velmo/vivo): lo scriveva velmod, ma nessuno - nemmeno
	# il soccorso, la cui sorveglianza gira tutta su questo marcatore - lo
	# rileggeva mai (trovato in revisione, 21 settembre 2026).
	procd_append_param command -tentativo /etc/velmo/aggiornamento/tentativo
	# I cinque percorsi dell'aggiornamento online (spec 2026-09-21), che la
	# console usa per controllare, scaricare e chiedere l'applicazione.
	# VELMO_AGGIORNAMENTO_FONTE vuota: Velmo non esce e non inventa un
	# indirizzo. Lo scarico sta su /overlay (persistente): mai su /tmp, che è
	# RAM e sparisce a ogni riavvio - un pacchetto a metà scaricato non deve
	# ripartire da zero solo perché il dispositivo si è riavviato nel mezzo.
	# -aggiornamento-versione-file è /etc/velmo/versione, che
	# applica-aggiornamento.sh scrive con la versione presa dal manifesto
	# (C4): senza questo flag il file non lo legge nessuno, e un software già
	# installato torna a sembrare sempre nuovo.
	procd_append_param command \
		-aggiornamento-fonte "$VELMO_AGGIORNAMENTO_FONTE" \
		-contributi-chiave "$VELMO_CONTRIBUTI_CHIAVE" \
		-firma-contributo-richiesta /var/run/velmo-richieste/firma-contributo-richiesta \
		-aggiornamento-scarico "$VELMO_SCARICO" \
		-aggiornamento-stato /etc/velmo/aggiornamento \
		-aggiornamento-richiesta /var/run/velmo-richieste/aggiornamento-richiesta \
		-aggiornamento-versione-file /etc/velmo/versione
	# I soggetti osservati. Su main li scrive il provisioning
	# (velmo_indirizzi_televisori nell'unità systemd); qui il provisioning non
	# c'è, e router.conf da sola resta vuota per sempre: velmod partiva con
	# «raccolta disattivata, soggetti 0» e con lei restavano spenti anche il
	# riconoscimento della marca, i flussi e i nomi (cmd/velmod, tutto dentro
	# «len(soggetti) > 0»). Gli indirizzi sono quelli dei televisori dichiarati,
	# cioè le riserve DHCP che velmo-applica-televisori scrive; VELMOD_TELEVISORI
	# resta come scavalco per il banco.
	televisori=$VELMOD_TELEVISORI
	[ -n "$televisori" ] || televisori=$(awk -F, '
		/^dhcp-host=/ {
			for (i = 2; i <= NF; i++)
				if ($i ~ /^([0-9]{1,3}\.){3}[0-9]{1,3}$/) {
					printf "%s%s", (n++ ? "," : ""), $i
					break
				}
		}' /etc/velmo/dns/televisori.conf 2>/dev/null)
	[ -n "$televisori" ] && procd_append_param command -televisori "$televisori"
	# Non più «procd_set_param user velmo» (spec 2026-09-22 §4): velmod parte da
	# root per legare la 80, e scende da sé con -scendi-a velmo prima di servire
	# qualunque richiesta (control/internal/privilegi). no_new_privs impedisce
	# comunque a questo processo, o a chiunque exec da qui in avanti, di
	# riguadagnare privilegi con un binario setuid. Misurato sul banco, 22
	# settembre 2026: «grep -ac no_new_privs /sbin/procd» dà 1 (procd
	# 2018-11-23-d6673547-2, che porta anche seccomp).
	procd_set_param no_new_privs 1
	# Il fuso orario. Su OpenWrt sta in /etc/TZ (forma POSIX) e nel zonename di
	# UCI; /etc/localtime punta a /tmp/localtime, che non c'è, e zoneinfo non è
	# installato. Go legge TZ come nome di zona IANA - il database se lo porta
	# dentro il binario del router (cmd/velmod/fuso_router.go) - quindi qui si
	# passa il nome, non la forma POSIX. Senza, velmod girava in UTC e leggeva
	# il registro di dnsmasq, che scrive orari locali senza zona, come se fossero
	# UTC: i nomi finivano nell'archivio due ore avanti (16 settembre 2026).
	# Un router senza nome di zona (un'immagine appena flashata, fino alla 0.1.9)
	# lo riceve qui, prima di leggerlo: fuso_di_fabbrica, comune.sh.
	fuso_di_fabbrica || true
	# I MAC locali che le versioni 0.1.10-0.1.12 mettevano: via, tornano quelli
	# di fabbrica (comune.sh). La rete si ricarica solo se e' cambiato qualcosa,
	# in disparte: velmod parte lo stesso.
	if ripristina_mac_di_fabbrica; then
		( /etc/init.d/network reload; wifi reload ) >/dev/null 2>&1 &
	fi
	[ -n "$VELMO_FUSO" ] || VELMO_FUSO=$(uci -q get system.@system[0].zonename)
	# Un tetto morbido al mucchio di Go: il 15 settembre 2026 velmod è salito per
	# due minuti a 42,7 MB anonimi con la memoria del router a 5 MB (spec §14.7).
	# Con GOMEMLIMIT il raccoglitore lavora di più prima di chiedere memoria.
	procd_set_param env GOMEMLIMIT=20MiB ${VELMO_FUSO:+TZ=$VELMO_FUSO}
	procd_set_param respawn 3600 5 0
	procd_set_param stdout 1
	procd_set_param stderr 1
	procd_close_instance
}
