-
Notifications
You must be signed in to change notification settings - Fork 0
1.2 Step | CreateOdooUser
Crea l'utente di sistema
odoo(useradd --system), il suo gruppo dedicato, e rendeodoo:odool'owner della home/opt/odoo. Reversibile. Vive insrc/steps/create_odoo_user.rs. Segue il modello di 1.1 PrepareOptRoot su una risorsa più ricca (utente + gruppo + ownership).Port di
create_odoo_user/_verify_odoo_user_homedirdilib/system.sh.
| Fase | Comportamento |
|---|---|
| snapshot | rileva due cose indipendenti: (1) l'utente esiste già? → Preexisting/Untracked; (2) l'owner corrente di /opt/odoo prima del nostro chown (salvato per l'undo) |
| run |
Preexisting → skip useradd, nessun chown aggressivo; assente → useradd + chown odoo:odoo esplicito + chmod 0750, poi CreatedByUs. dry_run → solo log |
| undo | solo CreatedByUs: userdel senza -r + groupdel (best-effort) + ripristino owner originale della home. Preexisting/Untracked → no-op |
Argomenti di useradd (privilegio minimo, come nel Bash):
useradd --system --create-home --home-dir /opt/odoo --user-group --shell /bin/false odoo
--shell /bin/false → nessuna shell interattiva; --system → UID < 1000 senza password;
--user-group → gruppo dedicato odoo.
È il primo caso in cui due step insistono sullo stesso artefatto (/opt/odoo). Uno lo crea
(PrepareOptRoot), l'altro ne diventa owner (CreateOdooUser). La regola che scioglie il nodo:
Ogni step possiede la rimozione di ciò che ha creato.
Conseguenze concrete:
-
CreateOdooUser.undoesegueuserdelsenza-r: NON rimuove la home. Se usasse-r, cancellerebbe/opt/odoo, che è di competenza diPrepareOptRoot. - la home la rimuove
PrepareOptRoot.undo, che gira dopo nell'ordine inverso (SetupLogDir → CreateOdooUser → PrepareOptRoot). - se la home era
Preexisting(non nostra) e il nostrochownne ha cambiato l'owner,undoripristina l'owner originale salvato insnapshot— così non resta di proprietà di un utente che stiamo cancellando.
Regola invariante di
CLAUDE.md: maiuserdel -rsu un utentePreexisting. Qui l'undo agisce solo su utentiCreatedByUs, e comunque senza-r. Un utente preesistente non viene mai toccato.
Questo schema — proprietà della rimozione + ordine inverso — è il modello per i casi futuri in cui due step condividono un artefatto (es. ruolo che possiede il DB in PostgreSQL).
I comandi privilegiati (useradd/userdel/groupdel/chown/chmod) non sono chiamati direttamente:
passano da un trait SystemOps memorizzato dentro lo step. Così il trait
Step e il motore non cambiano.
| Impl | Uso |
|---|---|
RealSystemOps |
produzione: useradd via Command, chown/mkdir via nix+std::fs
|
MockSystemOps (test) |
registra quale operazione verrebbe eseguita e con quali argomenti, senza root |
I test verificano la logica di decisione (ramo PreState, argomenti esatti di useradd, userdel
senza -r, ripristino owner) senza eseguire nulla e senza toccare il sistema.
struct CreateUserSnapshot {
user_prestate: PreState, // Preexisting | Untracked | CreatedByUs
home_original_owner: Option<OwnerId>, // owner della home prima del nostro chown
}Serializzato (snapshot_value) e persistito: al resume/rollback si sa se l'utente è nostro e a chi
ripristinare la home.
-
Non-aggressività sui preesistenti: se l'utente c'era già, niente
useradde nientechown— non è nostro da riconfigurare. -
useraddnon ri-chowna una home preesistente: ilchown odoo:odooè esplicito dopo la creazione (come_verify_odoo_user_homedirnel Bash). - Tutti i passi dell'undo sono best-effort: un fallimento logga
warne prosegue, senza bloccare la pulizia degli altri step. - Test:
CreatedByUs(useradd+chown / userdel senza -r),Preexisting(mai toccato), ripristino owner su home preesistente,dry_run(nessuna operazione).
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: