Skip to main content
Deutsch  •  English  •  Español  •  Français  •  Italiano  •  Polska  •  Portuguese  •  Български  •  Русский  •  Українська  •  やまと  •  中国  •  فارsi

✈️ Il navigatore: parser (rilevamento e compilazione dei modelli)

Il pacchetto coa/pkg/parser è l'ufficio di navigazione di coa. Quando la CLI riceve l'ordine di partenza, il Parser apre le carte nautiche, controlla le condizioni meteo (il sistema ospite) e traccia la rotta renderizzando i template del Brain.

La sua responsabilità è puramente logica e strutturale: trasforma il Brain leggibile dall'uomo in una struct Go rigorosamente tipizzata (Profile), pronta per essere consegnata al Planner. Non esegue alcun comando sul sistema.


🗺️ 1. L'algoritmo di rilevamento: DetectAndLoad()​

Invece di costringere l'utente a specificare quale profilo utilizzare, il Parser lo scopre autonomamente in 4 mosse:

  1. Identità (distro.NewDistro()): legge /etc/os-release per identificare la distribuzione ospite (ID e ID_LIKE).
  2. Fallback Sviluppo / Produzione: cerca il Brain prima nel percorso di sviluppo locale (coa/brain.d) e poi nel percorso di sistema (/etc/penguins-eggs.d/brain.d). In questo modo eggs funziona identicamente sia mentre scrivi codice sia una volta installato.
  3. Lettura dell'Indice: analizza index.yaml decodificandolo nella struct BrainIndex.
  4. Motore di Matching: scorre la lista Distributions cercando una corrispondenza esatta sull'id della distro oppure una corrispondenza genetica tramite l'array like (comprendendo così automaticamente che una derivata Debian o Arch deve usare il modulo della rispettiva famiglia).

🧩 2. Elaborazione dei modelli: telaio e modulo​

L'architettura attuale ha superato il vecchio modello "un file YAML statico per ogni distro". Il Brain è composto da template Go (text/template):

  • base.yaml.tmpl — il telaio universale: definisce lo scheletro del volo di remastering, identico per tutte le distribuzioni.
  • modules/<distro>/ (remaster.bash.tmpl e install.bash.tmpl) — la cartella del modulo specifico della famiglia selezionata tramite index.yaml (alpine, arch-family, debian, fedora, opensuse).

Il Parser compila telaio + modulo in un unico motore di template arricchito da due funzioni helper:

  • include — renderizza un sotto-template per nome in una stringa, permettendo a base.yaml.tmpl di richiamare i blocchi definiti dal modulo della distro;
  • indent — ri-indenta i blocchi multi-riga mantenendo lo YAML generato sintatticamente perfetto.

Il contesto di rendering (TemplateContext) espone Family, DistroID e IsGitHubAction, permettendo ai template di adattarsi in modo dichiarativo all'ambiente. L'output finale viene decodificato con yaml.Unmarshal nella struct Profile (in caso di errore sintattico nel template, il Parser salva un dump di emergenza in /tmp/oa-failed-yaml.txt).


🧬 3. Le strutture dati (il DNA di Profile)​

  • Profile: la radice, contenente le sequenze di step (Remaster e Install) e le impostazioni (Settings).
  • Step: l'unità fondamentale di lavoro, definita da tre campi:
    • Module: quale esecutore gestisce il passo (shell, script, template, copy, users, autologin-gui, mksquashfs, xorriso, umount) — vedi oa e coa ell;
    • Chroot: indica se lo step deve girare dentro la liveroot anziché sull'host;
    • Params: mappa libera di parametri validata dal singolo worker.
  • Settings.Remaster (RemasterConfig): le manopole configurabili dall'utente (user, password, work_dir, algoritmo e livello di compression SquashFS).

🎛️ 4. Le personalizzazioni utente: LoadCustomSettings()​

Una volta assemblato il Profile, il Parser cerca /etc/penguins-eggs.d/custom.yaml (generato da sudo eggs config). Se presente, i suoi valori sostituiscono Settings.Remaster: è così che l'utente personalizza password live, prefisso ISO o compressione senza mai dover toccare i file del Brain.