Censimento degli impianti¶
Script: tools/censimento_impianti.py. Sola lettura. Solo Python 3, libreria standard.
Cosa interroga¶
Per ogni impianto dell'elenco (export del database del Raspberry, raw/raspberry_db/ganzcortrol_controls.system.csv), sull'indirizzo VPN:
| Fonte | Chiamate | Cosa ricava |
|---|---|---|
| Porte TCP | 22, 80, 1883, 3389, 5000, 5005, 5050, 8554 e 10101–10106 (solo connessione) | tipo di macchina, servizi attivi, porte del proxy verso i dispositivi locali |
| Box MDM (porta 5005) | GET /get_mac, GET /status |
MAC, versione dichiarata del box (da .env.build_tag, vedi sotto), ambiente, detector, inserito/disinserito, telecamere (totali, online, con detect), privacy mode, CPU, load, RAM, disco, thread fermi, avvisi, eventi in corso, log non sincronizzati |
| Frigate (porta 5000) | GET /api/version, GET /api/stats |
versione di Frigate, uptime, detector (es. Coral), velocità di inferenza, telecamere a 0 FPS, spazio usato dalle registrazioni, GPU |
| Frigate wrapper (porta 5050) | GET /api/v1/health/summary, /api/v1/detection/status, /api/v1/webhooks |
salute del wrapper e delle telecamere, rilevazione attiva, destinazione degli webhook (solo host e percorso) |
SSH (opzionale, --ssh-user) |
docker ps -a, docker version, uptime, /etc/os-release |
tag esatti di tutte le immagini ECR (installation, frigate_wrapper, dsniff, Frigate, Mosquitto…), container fermi, sistema operativo, uptime |
Non chiama mai /heartbeat (modifica lo stato del box) né /api/v1/frigate/config (contiene le credenziali delle telecamere). Dell'endpoint /api/v1/webhooks, che restituisce anche le credenziali dei webhook (M24), salva solo host e percorso.
I dettagli del wrapper arrivano solo dai box 3.2.9: le versioni precedenti del wrapper non hanno quegli endpoint. Il wrapper non dichiara la propria versione; lo script ne ricava la generazione (FastAPI con impronta dell'elenco degli endpoint, oppure Flask vecchio con l'intestazione Server).
Attenzione: la versione che il box dichiara non è per forza quella in esecuzione. Il compose del box monta dall'host il file .env.build_tag dentro il container (./.env.build_tag:/app/.env.build_tag), e il box legge la propria versione da lì (INTERNAL_BUILD_TAG, app/config/app_config.py). L'aggiornamento remoto fa prima git pull (che cambia il file) e poi docker compose pull + up -d (dev_scripts/updater.py): se il secondo passo fallisce, il box dichiara la versione nuova ma esegue ancora l'immagine vecchia. Lo stesso file indica anche WRAPPER_BUILD_TAG e DSNIFF_BUILD_TAG (sul main di oggi: installation 3.2.9, wrapper 3.4.0, dsniff 1.0.0, Frigate fissato a 0.17.1 nel compose), ma nessuna API li espone. L'unica fonte affidabile dei tag in esecuzione è docker ps sul box (opzione --ssh-user del censimento).
Come si lancia¶
Da un PC che raggiunge la VPN degli impianti (es. la VPN aziendale di Cava), dalla radice della repository mdm_docs:
python tools/censimento_impianti.py # tutti gli impianti
python tools/censimento_impianti.py --solo 172.16.16.49 # un solo indirizzo
python tools/censimento_impianti.py --nomi # nomi dei clienti a schermo
python tools/censimento_impianti.py --ssh-user <utente> # aggiunge i tag delle immagini via SSH
python tools/censimento_impianti.py --ssh-user <utente> --ssh-key <chiave>
L'opzione SSH funziona solo con autenticazione a chiave (BatchMode): non chiede e non usa password. Se docker richiede privilegi, prova sudo -n (senza password); se non è permesso, salta. Le chiavi host dei box vengono salvate in raw/censimento/known_hosts, non nel file globale.
Durata: circa un minuto per 68 impianti senza SSH.
Output¶
In raw/censimento/ (contiene dati dei clienti: non versionare né condividere):
censimento-AAAAMMGG-HHMM.csv: una riga per impianto, con tutte le colonne sopra;immagini-AAAAMMGG-HHMM.csv: una riga per container (impianto, container, immagine, tag, stato), solo con--ssh-user.
A schermo, senza --nomi, compaiono solo ID e IP, più un riepilogo di versioni, detector e destinazioni degli webhook.
Classi¶
| Classe | Significato |
|---|---|
mdm-ok |
box MDM che risponde |
mdm-detector-irraggiungibile |
il box risponde, ma il detector è fermo da troppo tempo (HTTP 503) |
mdm-errore-<codice> / mdm-api-non-risponde |
API del box presente ma in errore |
linux-senza-api-5005 |
SSH aperto ma porta 5005 chiusa: box Linux con API locale ferma o filtrata |
windows (probabile GANZ) |
RDP aperto, niente SSH |
raggiungibile-altro |
risponde solo su altre porte (es. solo 80) |
risponde-al-ping (porte filtrate) |
acceso, ma nessuna porta raggiungibile |
irraggiungibile |
nessuna risposta: spento, VPN scollegata o tutto filtrato |
Limiti¶
- Vede gli impianti dalla rete aziendale di Cava: un impianto "irraggiungibile" da qui può comunque essere collegato alla VPN e parlare con il midserver. Per lo stato della VPN fa fede pfSense (VPN → WireGuard → Status).
- I box Windows/GANZ non hanno un'API da interrogare: si vede solo quali porte rispondono.
- Impianti non presenti nel database del Raspberry non vengono interrogati.
Censimento delle telecamere¶
Script: tools/censimento_telecamere.py. Parte dall'ultimo censimento degli impianti e interroga i box MDM con Frigate che rispondevano. Una riga per telecamera (telecamere-<data>.csv) e una per sorgente (dispositivi-<data>.csv), in raw/censimento/.
Cosa ricava, senza toccare le telecamere¶
- Dalla configurazione di Frigate (
/api/config, letta sul box): - sorgente del rilevamento: diretta o via go2rtc;
- indirizzo e percorso RTSP senza credenziali;
- marca probabile e canale, dedotti dal formato del percorso (Hikvision, Dahua, Uniview, Reolink, Axis, Hanwha, generici);
- flusso principale o secondario;
- più telecamere sullo stesso indirizzo, cioè probabilmente un DVR/NVR;
- registrazione e risoluzione del rilevamento.
- Da
/api/statse/api/go2rtc/streams: fps per telecamera e numero di lettori di ogni stream go2rtc, per esempio la centrale. - Opzionali:
--snapshot: l'ultimo fotogramma di ogni telecamera;--campioni-ore 3,14,22: un fotogramma dalle registrazioni di ieri a quelle ore, utile per tarare l'anti-manomissione di giorno e di notte;--intestazioni-proxy: intestazione e titolo dei dispositivi dietro le porte 101xx, senza credenziali.
Rischio di disservizio¶
| Azione | Rischio | Scelta |
|---|---|---|
| Lettura delle API di Frigate sul box | trascurabile: dati già in memoria, pochi box in parallelo (4) | sempre |
Snapshot latest.jpg e fotogrammi dalle registrazioni |
basso: una codifica JPEG per telecamera, pausa di 0,3 s tra le richieste; qualche decina di MB sulla VPN | solo se richiesto |
GET / sui dispositivi dietro il proxy |
basso: pagina iniziale senza credenziali, resta nei log del dispositivo | solo se richiesto |
| Connessioni RTSP a telecamere o DVR | alto: occupano sessioni e possono far perdere il flusso al detector (R14) | mai |
| Login o ONVIF con credenziali su telecamere, DVR o GANZ | alto: tentativi sbagliati possono bloccare gli account | mai |
| Scansioni della rete del cliente | medio: allarmi su firewall o IDS, apparati vecchi instabili | mai |
Limiti¶
- Box GANZ esclusi: le telecamere stanno nel GANZ, che richiede le sue credenziali (M-12).
- Slave degli impianti con più box non interrogati.
- Marca e tipo sono probabili: molti OEM riusano i formati di Hikvision e Dahua.
rilevamento_orasegue lo stato inserito/disinserito, non la configurazione.- Snapshot e fotogrammi sono immagini dei locali dei clienti: accesso limitato, da cancellare dopo l'uso.
Risultati del 29/10/2026¶
Eseguito in modalità sicura (solo API di Frigate, nessuna immagine, nessun dispositivo dietro il proxy) su 24 box Frigate: tutti hanno risposto. Nessuna credenziale nei file.
| Dato | Valore |
|---|---|
| Telecamere | 235 (234 attive), tutte con registrazione |
| Ingressi per telecamera | 1, con ruoli detect e record insieme |
| Rilevamento via go2rtc | 49 telecamere su 4 box (3 box per tutte, 1 per una parte); 20 box senza nessuno stream go2rtc |
| Lettori degli stream go2rtc | 1 (Frigate) su 41 stream, 2 su 6, 0 su 2 |
| Flusso del rilevamento | principale 112, secondario 114, non riconosciuto 9 |
| Risoluzione del rilevamento | 1280×720 su 195 telecamere; 640×480, 704×576, 720×576 sulle altre |
| Sorgenti probabili DVR/NVR | 12 apparati in 11 impianti, 86 telecamere |
| Telecamere attive con 0 fps | 7, su 3 impianti |
| Marche probabili | Hikvision o compatibili 81; generiche /profileN 61, /media/videoN 33, chID/streamType 10, /chN/N 10; Uniview 18; Dahua 13; non riconosciute 9 |
Conseguenze, riportate nelle pagine collegate: - l'ipotesi che la maggior parte degli impianti usi go2rtc era sbagliata (connessioni-telecamere); - il traffico della centrale sulla 8554 va ricontrollato; - la proposta di usare il DVR come sorgente del live (P10) ha già una base in 11 impianti.