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

⚙️ L'ingegnere: planner (compilazione del piano ed esclusioni)

Il pacchetto coa/pkg/planner è il ponte tra l'astrazione del Brain (renderizzata dal Parser) e gli esecutori (oa in C e coa ell in Go). Il suo compito è compilare le intenzioni dell'utente nella Single Source of Truth: /tmp/coa/oa-plan.json, agendo come un compilatore Just-In-Time un istante prima del decollo.

Anche il Planner non esegue comandi sul sistema: prepara il terreno affinché i motori possano lavorare senza sorprese.


🧱 1. Il formato dei compiti: OATask​

In types.go, il Planner definisce OATask incorporando (embedding) parser.Step: grazie all'appiattimento JSON, ogni task eredita automaticamente name, module, chroot e params dal Brain, a cui il Planner aggiunge i campi operativi risolti a runtime:

  • work_dir — la radice dell'area di lavoro (es. /home/eggs), usata dal modulo nativo umount;
  • live_root — il percorso risolto del filesystem live (<work_dir>/liveroot), iniettato in tutti i task che operano sugli utenti o in chroot: true.

⚙️ 2. Il compilatore: GeneratePlan()​

GeneratePlan() scorre profile.Remaster ed espande i moduli strategici:

  • mount_logic → Bootstrap dell'ambiente: l'astrazione viene tradotta nel task shell che invoca bootstrap-liveroot.sh, preparando l'albero di staging (liveroot, overlay, bind mount e API filesystem).
  • users → Due task concreti (oa-users.go):
    1. create-live-home (shell): crea la home directory popolandola da /etc/skel.
    2. inject-live-users (users, C nativo): inietta le identità. La password dell'utente live viene sottoposta a hashing SHA-512 in Go (openssl passwd -6) e i gruppi dell'utente host vengono specchiati sull'utente live.
  • Pipeline Crittografica --crypted (luks-steps.go): quando la modalità è crypted (famiglia Debian), il Planner intercetta e trasforma 3 step standard:
    1. initramfs → sostituito da luks-initrd-prep (inietta gli hook di sblocco LUKS nell'initramfs live);
    2. copy-kernel-initrd → sostituito da luks-kernel-copy;
    3. mksquashfs → seguito immediatamente da luks-wrap-squashfs, che avvolge filesystem.squashfs dentro un contenitore LUKS2 ext4 (root.img) passando la passphrase a cryptsetup via stdin senza mai scriverla su disco.
  • xorriso + .disk metadata: risolve output_file e source_dir, inserendo subito prima il task coa-dot-disk che genera i metadati .disk/ (info, UUID kernel, timestamp).
  • Il Breakpoint (--stop-after <step>): se impostato, una volta compilato lo step indicato il Planner scarta tutti gli step successivi ad eccezione del task finale cleanup (umount), garantendo l'ispezione sicura del chroot senza lasciare mount orfani.
  • Ispezione (--debug): stampa oa-plan.json formattato a terminale ed esce immediatamente senza avviare oa.

🧹 3. Sicurezza dei dati: GenerateExcludeList()​

Prima della pianificazione, il Planner genera /tmp/coa/excludes.list indicando a mksquashfs cosa non includere nella ISO:

  • Filesystem virtuali e workspace: dev, proc, sys, run, tmp, var/tmp e la cartella di lavoro (home/eggs/.overlay, home/eggs/isodir, *.iso).
  • Identità della macchina ospite: etc/fstab, etc/mtab, chiavi SSH host (etc/ssh/ssh_host_*), connessioni Wi-Fi/rete salvate (NetworkManager/system-connections/*), regole udev persistenti e swapfile.
  • Cache dei pacchetti: archivi e indici binari di apt, pacman/pkg, dnf (oltre ai kernel rescue su Fedora).
  • Privacy in base alla modalità: in modalità standard il contenuto di root/* e le home personali vengono esclusi; in modalità --clone / --crypted i dati utente vengono preservati ma la cronologia della shell, i cestini e le cache dei browser vengono comunque purgati.
  • Esclusioni personalizzate: se presente, /etc/penguins-eggs.d/custom.exclude.list viene ripulito e accodato automaticamente.