Vai al contenuto

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/stats e /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_ora segue 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.