-
Notifications
You must be signed in to change notification settings - Fork 0
2. UI + dry run
L'interfaccia guidata che veste il motore, e il
--dry-runfunzionale. Vive insrc/prompt.rs(input coninquire),src/progress.rs(progresso conindicatif), e nel flusso disrc/main.rs.È una fase di vestizione, non di logica: non tocca il rollback, non cambia gli step. Il valore sta tutto nel disaccoppiamento — se la UI è un guscio attorno a un motore che non la conosce, la puoi cambiare (o aggiungerne un'altra) senza toccare l'installazione e il rollback.
Da CLAUDE.md: lo stesso installer gira interattivo o non-interattivo con un solo flusso.
- Gli step non sanno nulla della UI: non importano
inquire/indicatif, non stampano prompt. Leggono dalContexte loggano viatracing. - La raccolta input avviene prima del motore, in
prompt.rs, e popola ilContext. Il motore riceve unContextgià risolto e non sa se i valori vengono dainquire, da--configo dai default. - Il progresso è un observer del motore ([
ProgressReporter]), non parte degli step.
La prova che è fatto bene: tutti i test delle Fasi 0–10 restano verdi senza modifiche. La firma di
executenon è cambiata (executedelega aexecute_with_reportercon unNoopReporter), il traitStepnon è stato toccato. Un vestito, non un corpo riscritto.
Un test strutturale verifica il disaccoppiamento: nessuno step importa inquire/indicatif, e il
motore non usa indicatif:: (dipende solo dall'astrazione).
prompt.rs reimplementa la raccolta input dietro lo stesso confine della Fase 1: la logica di
cascata resta in config; cambia solo il come si chiede.
| Campo | Widget |
|---|---|
| Versione |
Select (16.0/17.0/18.0/19.0) |
| Utente OS, DB name, porta, install-subdir |
Text con validazione inline (riusa i validatori di config) |
| Password admin |
Password mascherata → entra nel Secret, mai loggata |
| Nginx, conferma finale | Confirm |
Si prompta solo per i campi non passati da CLI: la priorità resta CLI > env > interattivo >
default. In assenza di TTY, main bypassa i prompt e usa CLI → env → default: inquire non blocca
mai senza terminale.
Il motore notifica un'astrazione, non indicatif:
trait ProgressReporter {
fn step_start(&self, name, index, total);
fn step_done(&self, name);
fn step_failed(&self, name);
fn rollback_start(&self, total); // il rollback è visibile: l'utente capisce che sta annullando
fn undo_start(&self, name);
fn undo_done(&self, name);
}| Impl | Uso |
|---|---|
IndicatifReporter |
TTY interattivo: spinner + barra [pos/len] con lo step corrente |
LogReporter |
no-TTY / output su file: solo tracing
|
NoopReporter |
silenzioso (default di execute) |
Il reporter è passato a execute_with_reporter, non al trait Step: gli step restano ignari.
dry_run_plan mostra il piano completo senza mutare:
per ogni step: snapshot (read-only) → run in dry-run (LOGGA l'intenzione, non muta)
nessuna persistenza · nessun rollback
- Ogni step, in dry-run, distingue "agirebbe" da "no-op (preexisting)" in base al proprio snapshot (es. "creerei la directory" vs "già presente, skip").
- Uno snapshot non disponibile non interrompe il piano: viene segnalato e si prosegue.
- In dry-run
mainsalta i preflight che richiedono root: è una preview senza sudo, utile allo stagista per capire cosa succederà e al dev per validare un.envprima di lanciarlo davvero.
Test: in dry-run il motore non chiama alcuna operazione mutante del SystemOps e non scrive lo
stato.
-
executeinvariato → compatibilità totale coi test precedenti. Aggiuntoexecute_with_reporter(erollback_with_reporter); il traitStepnon è cambiato. - Selezione automatica del reporter in
main: TTY + installazione reale →indicatif; altrimenti log. - La password non è mai loggata:
Passwordmascherato in input,Secretper lo storage. - Dopo questa fase resta solo la Fase 12: test di rollback end-to-end + hardening finale.
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: