-
Notifications
You must be signed in to change notification settings - Fork 0
1.12 Step | GenerateConfig
Genera
odoo<N>.confdal template, in modo reversibile. Vive insrc/steps/generate_config.rs. Port digenerate_configdilib/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.
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 |
CreatedByUs → rm -f (l'abbiamo creato noi); Preexisting → ripristina il backup sul file di destinazione |
Nel caso
Preexistingl'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.
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.
- Sostituzione dei
${VAR}con i valori del Context (versione, porta, db_user/name, addons_path, data_dir, limiti, proxy_mode, logfile, …). -
Direttive vuote →
False: ognikey =rimasta senza valore diventakey = False(Odoo rifiuta i valori vuoti). Cosìdb_host,db_port,db_password,logfilevuoti finiscono aFalse, non lasciati pendenti. -
Validazione post-render: sezione
[options]presente,addons_pathehttp_portvalorizzati, nessun placeholder${...}residuo. In caso contrario → errore (niente file incoerente).
render_config, normalize_empty_directives e validate_rendered sono funzioni pure, testate a
parte.
- 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).
Start here
Key concepts
References
For developers
Technical detail — how it works inside
Steps:
- 1.1 PrepareOptRoot
- 1.2 CreateOdooUser
- 1.3 SetupLogDir
- 1.3b SetupCacheDir
- 1.4 AptPackages (delta)
- 1.5 InstallWkhtmltopdf
- 1.6 SetupPostgres
- 1.7 CreateDbRole
- 1.8 CreateDatabase
- 1.9 CloneOdooRepo
- 1.10 CreateVirtualenv
- 1.11 InstallPythonRequirements
- 1.12 GenerateConfig
- 1.12b SetupDataDir
- 1.13 InitializeOdooDatabase
- 1.14 SetupSystemd
- 1.15 Nginx (6 sub-steps)
- 1.16 WriteControlScript + PatchBashrc
Cross-cutting: