Vai al contenuto

infra-lib (infra-cli)

Analisi del 29/10/2026 sul repository infra-lib (branch main, versione 0.1.9, commit 0eb1be5 del 12/05/2026) e sul suo uso in mdm_installation.

Cos'è

Libreria Python con un comando, infra-cli, per gestire gli ambienti (local, stage, prod) e lanciare "operazioni" di infrastruttura. Autore: Franco Merenda. Origine: CodeCommit infra-lib. Build di controllo su CodeBuild (buildspec.yml: ruff, vulture, pytest); nessuna immagine o pacchetto pubblicato.

  • infra-cli run -e <ambiente> --project-root ./infra -op <operazione>:
  • carica il contesto dell'ambiente da infra/environments/<env>/<env>.py;
  • trova le operazioni decorate con @infra_operation in infra/operations/;
  • le esegue rispettando le dipendenze (depends_on).
  • infra-cli init --template …: crea progetti da modelli AWS (generic, .NET 8, Lambda .NET e Python). Non è usato nei progetti MDM.
  • EnvironmentContext (src/infra_lib/infra/env_context/env_context.py):
  • unisce, in quest'ordine di precedenza crescente, i file .env dell'ambiente, TARGET_ENV e le variabili extra del progetto;
  • con DockerCompose.up() scrive tutto in infra/environments/<env>/.infra.generated.env (utils/docker_compose.py).
  • DockerCompose: lancia docker compose -p <nome> -f … --profile <ambiente> --profile … con queste variabili.
  • Utilità AWS (S3, Lambda, SQS, API Gateway, EventBridge) pensate anche per LocalStack (creds.py).

Chi lo usa

Repository Come Versione
mdm_installation linea stage (3.8/3.9) sottomodulo external/infra-lib (.gitmodules) e dipendenza infra-lib in pyproject.toml ([tool.uv.sources], percorso locale) commit 66379db = v0.1.9; su main di infra-lib c'è un solo commit in più
mdm_installation linea main (3.2.x) non lo usa; contiene però lo stesso riferimento al sottomodulo senza .gitmodules (resto della divergenza, innocuo) —
Altri progetti (midserver, pannello, qAlarm, wrapper) non lo usano —

Come lo usa il box (linea stage)

  • Ambienti: infra/environments/prod/prod.py e stage/stage.py leggono i file .env e .env.build_tag dell'ambiente. Poi chiedono ad AWS Secrets Manager il segreto mdm/installation/prod o mdm/installation/stage (infra/secrets_loader.py), che deve contenere almeno le chiavi MQTT e INSTALLATION_MONITORING_DELAY_SECONDS.
  • Operazioni: infra/operations/stack_operations.py definisce l'avvio e l'arresto dello stack per Frigate e per GANZ, con il progetto Compose installation e il file infra/compose/docker-compose.yml.
  • Chi le lancia: l'installer e l'update (mdm update → infra-cli run --environment <env> --operation <detector>-up).

Conseguenze per il box: - Ogni avvio con infra-cli (installazione, update) richiede AWS raggiungibile e credenziali con accesso al segreto. Le credenziali sono quelle scritte nell'updater (rischio M1). Un riavvio normale dei container (Docker restart) non passa da infra-cli e funziona anche senza AWS. - I valori del segreto finiscono in chiaro sul disco del box, nel file infra/environments/<env>/.infra.generated.env, comprese le credenziali MQTT (M29). - Il box deve poter scaricare il sottomodulo da CodeCommit durante l'update (git submodule update).

Soluzione ideale

  • Il box non ha bisogno di credenziali AWS generiche: legge solo il proprio segreto, con una credenziale per box o di sola lettura su mdm/installation/<env> (T10.6).
  • .infra.generated.env leggibile solo da root, e ricreato a ogni avvio.
  • infra-lib fissato a una versione con tag (oggi è fissato per commit, che coincide con v0.1.9) e aggiornato con un changelog nel repository del box.

Cosa dobbiamo fare

# Passo Ticket
1 Credenziale minima per il box (solo lettura del proprio segreto) al posto della chiave scritta nell'updater T10.6
2 Permessi del file .infra.generated.env e verifica che non finisca nei log o nei backup MDM-081
3 Prova di update e installazione con AWS non raggiungibile: il box deve restare funzionante con la versione precedente MDM-081