Skip to content

1.12 Step | GenerateConfig

Omisen edited this page Jul 26, 2026 · 4 revisions

Genera odoo<N>.conf dal template, in modo reversibile. Vive in src/steps/generate_config.rs. Port di generate_config di lib/config.sh. Il template è embedded nel binario (include_str!): nessuna dipendenza da file esterni a runtime.

Due novità rispetto agli step precedenti: il primo undo che ripristina invece di rimuovere, e la cura perché la master password non sia mai world-readable.


Il primo undo "ripristinante"

Fin qui l'undo di uno step Preexisting era un no-op (non è nostro, non lo tocchiamo). Qui è diverso: il run sovrascrive un odoo.conf preesistente, quindi l'undo deve ripristinare l'originale.

Fase Comportamento
snapshot il file esiste già? → Preexisting/Untracked
run se Preexisting, backup odoo<N>.conf.bak.<timestamp> prima di sovrascrivere (path salvato nello snapshot); poi rendering + scrittura
undo CreatedByUsrm -f (l'abbiamo creato noi); Preexisting → ripristina il backup sul file di destinazione

Nel caso Preexisting l'undo NON lascia il file sovrascritto, NON lo cancella: rimette al suo posto esattamente l'originale del cliente, dal backup. È il primo undo che restaura invece di distruggere.

Un test lo dimostra con un round-trip su disco reale: dopo l'undo, il file è byte-per-byte l'originale.


Master password mai world-readable

Il file contiene admin_passwd (e db_password). Non deve mai transitare da un file leggibile da altri utenti, in nessun istante. Il pattern (fedele al Bash, verificato in analisi):

1. render → scrivi in un temp PRIVATO (mode 0600, owned root)   ← password mai leggibile da altri
2. move   → sposta il temp a destinazione (stesso filesystem, atomico)
3. chown odoo:odoo
4. chmod 0640                                                    ← leggibile solo da odoo e root

La password in chiaro entra solo in render_config (l'unico expose() del Secret) e da lì nel contenuto del file; non è mai loggata né stampata nel riepilogo. Il mock nei test registra la scrittura come "privata" senza catturarne il contenuto.


Rendering + normalizzazione

  • Sostituzione dei ${VAR} con i valori del Context (versione, porta, db_user/name, addons_path, data_dir, limiti, proxy_mode, logfile, …).
  • Direttive vuote → False: ogni key = rimasta senza valore diventa key = False (Odoo rifiuta i valori vuoti). Così db_host, db_port, db_password, logfile vuoti finiscono a False, non lasciati pendenti.
  • Validazione post-render: sezione [options] presente, addons_path e http_port valorizzati, nessun placeholder ${...} residuo. In caso contrario → errore (niente file incoerente).

render_config, normalize_empty_directives e validate_rendered sono funzioni pure, testate a parte.


Note di design

  • Il temp è scritto nella stessa directory della destinazione → move è un rename atomico sullo stesso filesystem.
  • Undo best-effort: se il backup manca, logga warning e prosegue senza distruggere nulla.
  • Permessi finali 0640 odoo:odoo.
  • Test: CreatedByUs (genera 640, undo rm), Preexisting (undo ripristina il backup), rendering (empty→False, no residui), validazione (residuo/sezione mancante → errore).

Clone this wiki locally