diff --git a/AGENTS.md b/AGENTS.md index 1f00213..59f2fc3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -12,8 +12,8 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux Mint and Fr ## Topology - Current personal desktop: `ikaros = platform_mint + role_personal_workstation + desktop_cinnamon` -- Current laptop/lab: `nymph = platform_freebsd + role_lab + desktop_niri` -- Void desktop profile remains available for future/reference hosts via `platform_void + graphical_desktop` +- Current laptop/lab: `nymph = platform_void + role_lab + desktop_niri` +- Void desktop profile is also the base for other future/reference hosts via `platform_void + graphical_desktop` - Native Linux workstation: `deadalus-fedora` - WSL dev: `deadalus-wsl` - Ubuntu server: `prometheus` @@ -38,7 +38,7 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux Mint and Fr - `yamllint ansible/` - Host-focused dry runs: - Mint desktop work: `ansible-playbook ansible/site.yml --limit ikaros --check --diff` - - FreeBSD laptop work: `ansible-playbook ansible/site.yml --limit nymph --check --diff` + - Void laptop work: `ansible-playbook ansible/site.yml --limit nymph --check --diff` - Fedora workstation: `ansible-playbook ansible/site.yml --limit deadalus-fedora --check --diff` - WSL dev: `ansible-playbook ansible/site.yml --limit deadalus-wsl --check --diff` - Server: `ansible-playbook ansible/site.yml --limit prometheus --check --diff` @@ -57,7 +57,7 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux Mint and Fr ## Desktop Notes - `desktop_profile` names independently selectable desktop groups such as `desktop_hyprland`, `desktop_sway`, `desktop_niri`, and `desktop_cinnamon`. Keep platform-specific session bootstrap in platform-specific roles. -- `desktop_environment` selects the mutually exclusive `minimal` (default), `xfce`, or `kde` desktop mode. `profile_desktop_common` owns shared bootstrap; the minimal mode uses `profile_desktop_sway` and `profile_desktop_hyprland`, `profile_desktop_xfce` owns the reproducible XFCE setup, and `profile_desktop_kde` owns KDE-specific defaults and cleanup. `desktop_sessions_enabled` and `desktop_default_session` apply only to the minimal mode. +- `desktop_environment` selects the mutually exclusive `minimal` (default), `xfce`, or `kde` desktop mode. `profile_desktop_common` owns shared bootstrap; the minimal mode uses `profile_desktop_sway`, `profile_desktop_hyprland`, and `profile_desktop_niri`, `profile_desktop_xfce` owns the reproducible XFCE setup, and `profile_desktop_kde` owns KDE-specific defaults and cleanup. `desktop_sessions_enabled` and `desktop_default_session` apply only to the minimal mode. - Emacs packages and `.emacs.d` deploy are disabled by default via `emacs_enabled: false`; keep the dotfiles in the repo for reversible opt-in only. - NTFS filesystem support is provided by `ntfs-3g` in `ansible/inventory/group_vars/void.yml`. - Void user services are managed by `turnstile` and live under `dotfiles/desktop/.config/service/`. @@ -66,9 +66,10 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux Mint and Fr - `dotfiles/desktop/.config/sway/config` plus `host.conf` and `session-env` deployed via `host_sway_dotfiles` (sway / Wayland) - `dotfiles/desktop/.config/hypr/hyprland.conf` plus `host.conf` and `session-env` deployed via `host_hyprland_dotfiles` (Hyprland / Wayland) - `dotfiles/desktop/.config/niri/config.kdl` and `session-env` deployed via `desktop_niri_dotfiles` (Niri / Wayland) -- FreeBSD Niri must keep FreeBSD-specific package, rc, DBus, seat, portal, and launcher behavior in `profile_desktop_niri_freebsd` or FreeBSD platform vars. +- Void Niri (the `nymph` target) lives in `profile_desktop_niri`, gated on `'niri' in desktop_sessions_enabled`; it installs the `emptty` `niri.desktop` session, the `/usr/local/bin/start-niri` launcher, and the xdg-desktop-portal config, mirroring `profile_desktop_sway`. +- FreeBSD Niri (dormant; `platform_freebsd` currently has no hosts) must keep FreeBSD-specific package, rc, DBus, seat, portal, and launcher behavior in `profile_desktop_niri_freebsd` or FreeBSD platform vars. - Do not switch or restart a display manager during a playbook run from an active graphical session. Changing among `emptty`, LightDM, and SDDM requires an explicit run from another TTY/SSH session with `desktop_allow_display_manager_switch=true`. Apply managed XFCE XML while logged out of XFCE so `xfconfd` cannot overwrite it from its in-memory state. -- `nymph` is the FreeBSD/Niri laptop target; prefer minimal scrollable-tiling defaults first, then host-specific tuning after real use. +- `nymph` is the Void/Niri laptop target; prefer minimal scrollable-tiling defaults first, then host-specific tuning after real use. ## Void Package And Dotfile Bucket Rules `platform_void` is the reusable Void platform selection. The legacy `void` group remains a compatibility parent so existing `group_vars/void.yml` and `when: "'void' in group_names"` checks keep working during the transition. diff --git a/README.md b/README.md index 34dc286..b6e30cc 100644 --- a/README.md +++ b/README.md @@ -55,85 +55,85 @@ Il repository è diviso in due componenti principali: # Macchine gestite -Il repository modella attualmente tre tipologie di profilo, con i filoni workstation Linux nativa e WSL. -La nuova direzione del repository separa tre assi indipendenti: - -```text -common user environment -+ host-specific platform -+ role-specific software -+ independently selectable desktop -+ host hardware overrides -``` - -Matrice target: - -| Host | Platform | Role | Desktop | -| -------------- | ---------- | -------------------- | --------------------------------- | -| ikaros | Linux Mint | Personal workstation | Cinnamon | -| nymph | FreeBSD | Lab | Niri | -| void-reference | Void Linux | Lab/reference | Current preserved desktop profile | - -Regola operativa: - -```text -ikaros must be boring -nymph is allowed to break -``` - -`ikaros` usa il target stabile Linux Mint/Cinnamon; `nymph` usa il target -FreeBSD/Niri per il workflow laptop scrollable-tiling. I gruppi legacy `void` e -`desktop` restano alias di compatibilita per eventuali host Void futuri mentre i -nuovi assi sono `platform_*`, `role_*` e `desktop_*`. - -Prima di una migrazione reale degli host e consigliato creare uno snapshot -logico, per esempio: - -```bash -git switch -c refactor/platform-role-desktop -git tag void-desktop-before-platform-refactor -``` +Il repository modella attualmente tre tipologie di profilo, con i filoni workstation Linux nativa e WSL. +La nuova direzione del repository separa tre assi indipendenti: + +```text +common user environment ++ host-specific platform ++ role-specific software ++ independently selectable desktop ++ host hardware overrides +``` + +Matrice target: + +| Host | Platform | Role | Desktop | +| -------------- | ---------- | -------------------- | --------------------------------- | +| ikaros | Linux Mint | Personal workstation | Cinnamon | +| nymph | Void Linux | Lab | Niri | +| void-reference | Void Linux | Lab/reference | Current preserved desktop profile | + +Regola operativa: + +```text +ikaros must be boring +nymph is allowed to break +``` + +`ikaros` usa il target stabile Linux Mint/Cinnamon; `nymph` usa il target +Void/Niri per il workflow laptop scrollable-tiling. I gruppi legacy `void` e +`desktop` restano alias di compatibilita per eventuali host Void futuri mentre i +nuovi assi sono `platform_*`, `role_*` e `desktop_*`. + +Prima di una migrazione reale degli host e consigliato creare uno snapshot +logico, per esempio: + +```bash +git switch -c refactor/platform-role-desktop +git tag void-desktop-before-platform-refactor +``` Nota sullo stato attuale del playbook principale: -- `ansible/site.yml` applica oggi in automatico Cinnamon su Linux Mint e Niri su FreeBSD +- `ansible/site.yml` applica oggi in automatico Cinnamon su Linux Mint e Niri su FreeBSD - `ansible/site.yml` applica la workstation Linux nativa separando il layer dev comune dal layer host GNOME - `ansible/site.yml` applica anche il ramo `workstation_dev_wsl` per il modello dev in WSL - `ansible/site.yml` applica anche il profilo `ubuntu_server` con baseline apt, systemd, dotfiles server e firewall UFW -## Desktop - -Target operativi: - -- `ikaros`: Linux Mint + Cinnamon, desktop personale stabile/floating. -- `nymph`: FreeBSD + Niri, laptop scrollable-tiling per sfruttare meglio lo schermo piccolo. - -Il profilo Void desktop resta disponibile come modello riutilizzabile per host -futuri. `desktop_environment` continua a selezionare in modo esclusivo -`minimal`, `xfce` oppure `kde` per i desktop Void; Niri e Cinnamon sono profili -desktop indipendenti via gruppi `desktop_niri` e `desktop_cinnamon`. +## Desktop + +Target operativi: + +- `ikaros`: Linux Mint + Cinnamon, desktop personale stabile/floating. +- `nymph`: Void Linux + Niri, laptop scrollable-tiling per sfruttare meglio lo schermo piccolo. + +Il profilo Void desktop resta disponibile come modello riutilizzabile per host +futuri. `desktop_environment` continua a selezionare in modo esclusivo +`minimal`, `xfce` oppure `kde` per i desktop Void; Niri e Cinnamon sono profili +desktop indipendenti via gruppi `desktop_niri` e `desktop_cinnamon`. Lo stato attuale del profilo desktop include, tra le altre cose: - dotfiles comuni e desktop -- sessioni sway e Hyprland per eventuali host Void in modalita `minimal` -- KDE Plasma con applicazioni KDE curate e SDDM disponibile come alternativa esclusiva -- XFCE con pannello, keybinding, terminale, tema e workspace dichiarativi, LightDM e Thunderbird come client grafico principale -- `emptty` con default host-specific in modalita `minimal`, con session file Wayland esposti per `sway` e `hyprland` +- sessioni sway e Hyprland per eventuali host Void in modalita `minimal` +- KDE Plasma con applicazioni KDE curate e SDDM disponibile come alternativa esclusiva +- XFCE con pannello, keybinding, terminale, tema e workspace dichiarativi, LightDM e Thunderbird come client grafico principale +- `emptty` con default host-specific in modalita `minimal`, con session file Wayland esposti per `sway` e `hyprland` - pacchetti Void Linux e servizi runit; le liste pacchetti Void desktop sono separate per criterio: - `void_packages_base` per il runtime sistema (init, kernel, audio core, networking, firewall, hw daemons) - - `desktop_common_packages` per l'infrastruttura condivisa dalle modalita - - `desktop_minimal_packages` per applicazioni GTK/XFCE e `emptty` - - `desktop_xfce_packages` per XFCE, LightDM e le relative integrazioni - - `desktop_kde_packages` per Plasma, SDDM e le applicazioni KDE equivalenti + - `desktop_common_packages` per l'infrastruttura condivisa dalle modalita + - `desktop_minimal_packages` per applicazioni GTK/XFCE e `emptty` + - `desktop_xfce_packages` per XFCE, LightDM e le relative integrazioni + - `desktop_kde_packages` per Plasma, SDDM e le applicazioni KDE equivalenti - `desktop_sway_packages` e `desktop_hyprland_packages` per i binari specifici di ciascuna sessione -- `turnstile` per i servizi utente Void, incluso `ssh-agent` -- `ssh-agent` con socket stabile condiviso tra shell e SSH in `~/.local/state/ssh-agent/socket` -- Emacs e i relativi dotfile restano nel repo ma sono disabilitati di default tramite `emacs_enabled: false` +- `turnstile` per i servizi utente Void, incluso `ssh-agent` +- `ssh-agent` con socket stabile condiviso tra shell e SSH in `~/.local/state/ssh-agent/socket` +- Emacs e i relativi dotfile restano nel repo ma sono disabilitati di default tramite `emacs_enabled: false` - `tmux` con plugin gestiti da TPM al bootstrap del profilo desktop - Flatpak con remoto Flathub -- GNOME Keyring e `udiskie` nella modalita minimale; KWallet e integrazione UDisks di Plasma nella modalita KDE -- multi-monitor Void: sotto sway è gestito da `kanshi`; sotto Hyprland gli override monitor vivono in `host_hyprland_dotfiles` +- GNOME Keyring e `udiskie` nella modalita minimale; KWallet e integrazione UDisks di Plasma nella modalita KDE +- multi-monitor Void: sotto sway è gestito da `kanshi`; sotto Hyprland gli override monitor vivono in `host_hyprland_dotfiles` --- @@ -232,36 +232,36 @@ ansible-playbook ansible/site.yml --limit prometheus -e server_username=myuser - # Composizione della configurazione -Emacs è disabilitato di default. Per riattivare temporaneamente il deploy Emacs: - -```bash -ansible-playbook ansible/site.yml --limit --tags emacs -e emacs_enabled=true -``` +Emacs è disabilitato di default. Per riattivare temporaneamente il deploy Emacs: -La configurazione finale di una macchina è ottenuta combinando più livelli. - -```text -common configuration -+ platform configuration -+ role configuration -+ desktop configuration -+ host overrides -``` - -Esempi correnti: - -```text -ikaros -> common + platform_mint + role_personal_workstation + desktop_cinnamon + ikaros -nymph -> common + platform_freebsd + role_lab + desktop_niri + nymph -``` +```bash +ansible-playbook ansible/site.yml --limit --tags emacs -e emacs_enabled=true +``` + +La configurazione finale di una macchina è ottenuta combinando più livelli. + +```text +common configuration ++ platform configuration ++ role configuration ++ desktop configuration ++ host overrides +``` + +Esempi correnti: + +```text +ikaros -> common + platform_mint + role_personal_workstation + desktop_cinnamon + ikaros +nymph -> common + platform_void + role_lab + desktop_niri + nymph +``` Questo approccio consente di: -- mantenere configurazioni condivise -- applicare override specifici per host -- evitare duplicazioni -- riutilizzare il profilo Void corrente su un host futuro assegnandolo a - `platform_void + graphical_desktop + role_lab + desktop_hyprland` +- mantenere configurazioni condivise +- applicare override specifici per host +- evitare duplicazioni +- riutilizzare il profilo Void corrente su un host futuro assegnandolo a + `platform_void + graphical_desktop + role_lab + desktop_hyprland` --- @@ -269,26 +269,26 @@ Questo approccio consente di: I principali ruoli attualmente presenti sono: -| Role | Descrizione | -| ------------------------- | ----------------------------------- | -| base | configurazione base comune | -| packages_void | installazione pacchetti su Void | -| packages_mint | installazione pacchetti su Linux Mint via APT | -| packages_freebsd | installazione pacchetti su FreeBSD via pkg | -| packages_ubuntu | installazione pacchetti su Ubuntu | -| packages_fedora | installazione pacchetti su Fedora | -| services_runit | gestione servizi runit | -| services_systemd | gestione servizi systemd | -| services_freebsd | gestione servizi FreeBSD rc.conf/rc.d | -| profile_desktop_common | bootstrap desktop Void condiviso | -| profile_desktop_sway | sessione desktop sway / SwayFX (Wayland) | -| profile_desktop_hyprland | sessione desktop Hyprland (Wayland) | -| profile_desktop_niri_freebsd | adattamenti FreeBSD per Niri | -| profile_desktop_cinnamon | impostazioni Cinnamon circoscritte | -| profile_desktop_host | override desktop specifici per host | -| profile_personal_workstation | layer stabile per workstation personale | -| profile_lab | layer sperimentale/lab | -| profile_workstation_dev_common | configurazione dev workstation condivisa | +| Role | Descrizione | +| ------------------------- | ----------------------------------- | +| base | configurazione base comune | +| packages_void | installazione pacchetti su Void | +| packages_mint | installazione pacchetti su Linux Mint via APT | +| packages_freebsd | installazione pacchetti su FreeBSD via pkg | +| packages_ubuntu | installazione pacchetti su Ubuntu | +| packages_fedora | installazione pacchetti su Fedora | +| services_runit | gestione servizi runit | +| services_systemd | gestione servizi systemd | +| services_freebsd | gestione servizi FreeBSD rc.conf/rc.d | +| profile_desktop_common | bootstrap desktop Void condiviso | +| profile_desktop_sway | sessione desktop sway / SwayFX (Wayland) | +| profile_desktop_hyprland | sessione desktop Hyprland (Wayland) | +| profile_desktop_niri_freebsd | adattamenti FreeBSD per Niri | +| profile_desktop_cinnamon | impostazioni Cinnamon circoscritte | +| profile_desktop_host | override desktop specifici per host | +| profile_personal_workstation | layer stabile per workstation personale | +| profile_lab | layer sperimentale/lab | +| profile_workstation_dev_common | configurazione dev workstation condivisa | | profile_workstation_gnome | configurazione host workstation GNOME | | profile_workstation_dev_wsl | configurazione WSL Ubuntu per sviluppo | | profile_server | configurazione server | @@ -299,29 +299,29 @@ I principali ruoli attualmente presenti sono: # Stato attuale del playbook principale -Il playbook `ansible/site.yml` e attualmente composto da blocchi per asse: - -```text -all -> dotfiles_common -platform_void -> packages_void + services_runit -platform_void & graphical_desktop -> profile_desktop_common + profile_desktop_sway + profile_desktop_hyprland + profile_desktop_kde + profile_desktop_xfce + profile_desktop_host -platform_mint -> packages_mint + services_systemd -platform_mint & role_personal_workstation -> profile_personal_workstation -platform_mint & desktop_cinnamon -> profile_desktop_cinnamon -platform_freebsd -> packages_freebsd + services_freebsd -platform_freebsd & role_lab -> profile_lab -platform_freebsd & desktop_niri -> profile_desktop_niri_freebsd -workstation_dev_fedora -> packages_fedora + services_systemd + profile_workstation_dev_common -workstation_host_linux -> profile_workstation_gnome -workstation_dev_wsl -> packages_ubuntu + services_systemd + profile_workstation_dev_common + profile_workstation_dev_wsl -ubuntu_server -> packages_ubuntu + services_systemd + profile_server +Il playbook `ansible/site.yml` e attualmente composto da blocchi per asse: + +```text +all -> dotfiles_common +platform_void -> packages_void + services_runit +platform_void & graphical_desktop -> profile_desktop_common + profile_desktop_sway + profile_desktop_hyprland + profile_desktop_kde + profile_desktop_xfce + profile_desktop_host +platform_mint -> packages_mint + services_systemd +platform_mint & role_personal_workstation -> profile_personal_workstation +platform_mint & desktop_cinnamon -> profile_desktop_cinnamon +platform_freebsd -> packages_freebsd + services_freebsd +platform_freebsd & role_lab -> profile_lab +platform_freebsd & desktop_niri -> profile_desktop_niri_freebsd +workstation_dev_fedora -> packages_fedora + services_systemd + profile_workstation_dev_common +workstation_host_linux -> profile_workstation_gnome +workstation_dev_wsl -> packages_ubuntu + services_systemd + profile_workstation_dev_common + profile_workstation_dev_wsl +ubuntu_server -> packages_ubuntu + services_systemd + profile_server ``` Questo significa che, allo stato attuale: -- `ikaros` riceve Linux Mint/Cinnamon come target stabile -- `nymph` riceve FreeBSD/Niri come target laptop scrollable-tiling -- il profilo Void resta selezionabile tramite `platform_void + graphical_desktop` per host futuri +- `ikaros` riceve Linux Mint/Cinnamon come target stabile +- `nymph` riceve Void Linux/Niri come target laptop scrollable-tiling +- il profilo Void resta selezionabile tramite `platform_void + graphical_desktop` per host futuri - la workstation Fedora (`deadalus-fedora`) usa il principio di composizione a gruppi con il ramo Fedora dedicato e con `gsettings` host-specifici dichiarati in inventory - il ramo WSL (`deadalus-wsl`) e predisposto con play dev dedicato - il server Ubuntu (`prometheus`) e gestito con pacchetti, servizi, dotfiles server e firewall @@ -392,27 +392,27 @@ Eseguire il playbook principale: ansible-playbook ansible/site.yml ``` -Allo stato attuale questo comando: - -- distribuisce i dotfiles comuni a tutti gli host -- per `platform_void` applica pacchetti Void e servizi runit -- per `platform_void + graphical_desktop` applica bootstrap desktop condiviso, sessioni sway/Hyprland e override specifici per host -- per `platform_mint` e `platform_freebsd` applica solo host presenti esplicitamente in quei gruppi; nell'inventory principale iniziale questi gruppi sono vuoti -- per `workstation_dev_fedora` applica pacchetti Fedora, servizi systemd e profilo dev comune +Allo stato attuale questo comando: + +- distribuisce i dotfiles comuni a tutti gli host +- per `platform_void` applica pacchetti Void e servizi runit +- per `platform_void + graphical_desktop` applica bootstrap desktop condiviso, sessioni sway/Hyprland e override specifici per host +- per `platform_mint` e `platform_freebsd` applica solo host presenti esplicitamente in quei gruppi; nell'inventory principale iniziale questi gruppi sono vuoti +- per `workstation_dev_fedora` applica pacchetti Fedora, servizi systemd e profilo dev comune - per `workstation_host_linux` applica il layer host Linux GNOME - per `workstation_dev_wsl` applica pacchetti Ubuntu, servizi systemd, profilo dev comune e tweak WSL dedicati - per gli host `ubuntu_server` applica pacchetti Ubuntu, servizi systemd, profilo server, UFW, dotfiles e template dedicati -- non riavvia automaticamente il display manager; i passaggi tra `emptty`, LightDM e SDDM vanno applicati da SSH o da una TTY separata +- non riavvia automaticamente il display manager; i passaggi tra `emptty`, LightDM e SDDM vanno applicati da SSH o da una TTY separata - carica `secrets/vault.yml` solo se presente - carica `secrets/vault.local.yml` solo se presente, dopo `vault.yml`, cosi gli override locali hanno precedenza -Per validare prima di applicare: - -```bash -ansible-playbook ansible/site.yml --syntax-check -ansible-playbook ansible/site.yml --limit ikaros,nymph --check --diff -ansible-playbook ansible/site.yml --limit ikaros --check --diff -ansible-playbook ansible/site.yml --limit nymph --check --diff +Per validare prima di applicare: + +```bash +ansible-playbook ansible/site.yml --syntax-check +ansible-playbook ansible/site.yml --limit ikaros,nymph --check --diff +ansible-playbook ansible/site.yml --limit ikaros --check --diff +ansible-playbook ansible/site.yml --limit nymph --check --diff ansible-playbook ansible/site.yml --limit deadalus-fedora --check --diff ansible-playbook ansible/site.yml --limit deadalus-wsl --check --diff ansible-playbook ansible/site.yml --limit prometheus --check --diff @@ -445,14 +445,14 @@ Per vedere l'elenco reale aggiornato dei tag disponibili: ansible-playbook ansible/site.yml --list-tags ``` -Per attivare XFCE o KDE su un host, impostare rispettivamente `desktop_environment: xfce` o `desktop_environment: kde` nei relativi `host_vars` ed eseguire prima un dry run. Il primo play configura il profilo ma, se un altro display manager e ancora attivo, rinvia il cambio. Da una TTY o sessione SSH separata, con la sessione grafica chiusa, applicare quindi il passaggio esplicito: - -```bash -ansible-playbook ansible/site.yml --limit -e desktop_allow_display_manager_switch=true -``` - -La stessa procedura vale per ogni passaggio tra `minimal`, `xfce` e `kde`. Gli XML XFCE sono autorevoli: applicare i relativi aggiornamenti mentre XFCE e disconnesso evita che `xfconfd` ripristini lo stato in memoria. - +Per attivare XFCE o KDE su un host, impostare rispettivamente `desktop_environment: xfce` o `desktop_environment: kde` nei relativi `host_vars` ed eseguire prima un dry run. Il primo play configura il profilo ma, se un altro display manager e ancora attivo, rinvia il cambio. Da una TTY o sessione SSH separata, con la sessione grafica chiusa, applicare quindi il passaggio esplicito: + +```bash +ansible-playbook ansible/site.yml --limit -e desktop_allow_display_manager_switch=true +``` + +La stessa procedura vale per ogni passaggio tra `minimal`, `xfce` e `kde`. Gli XML XFCE sono autorevoli: applicare i relativi aggiornamenti mentre XFCE e disconnesso evita che `xfconfd` ripristini lo stato in memoria. + Allo stato attuale `ansible/site.yml` espone questi tag: | Tag | Scopo | Ambito principale | @@ -465,15 +465,15 @@ Allo stato attuale `ansible/site.yml` espone questi tag: | `dotfiles:server` | dotfiles dedicati al profilo server | server | | `dotfiles:workstation` | dotfiles dedicati alle workstation | workstation Linux, WSL | | `emptty` | gestione display manager `emptty` | desktop Void | -| `display-manager` | selezione protetta tra `emptty`, LightDM e SDDM | desktop Void | -| `kde` | profilo KDE Plasma e relativa pulizia | desktop Void | -| `xfce` | profilo XFCE, LightDM e relativa pulizia | desktop Void | -| `cinnamon` | impostazioni Cinnamon circoscritte | Linux Mint desktop | -| `gnome` | configurazione host GNOME | workstation host Linux, parte desktop | -| `sway` | sessione/configurazione sway / SwayFX (Wayland) | desktop Void | -| `hyprland` | sessione/configurazione Hyprland (Wayland) | desktop Void | -| `niri` | sessione/configurazione Niri (Wayland) | FreeBSD laptop | -| `npm` | installazione pacchetti npm globali | desktop Void, workstation Linux, WSL | +| `display-manager` | selezione protetta tra `emptty`, LightDM e SDDM | desktop Void | +| `kde` | profilo KDE Plasma e relativa pulizia | desktop Void | +| `xfce` | profilo XFCE, LightDM e relativa pulizia | desktop Void | +| `cinnamon` | impostazioni Cinnamon circoscritte | Linux Mint desktop | +| `gnome` | configurazione host GNOME | workstation host Linux, parte desktop | +| `sway` | sessione/configurazione sway / SwayFX (Wayland) | desktop Void | +| `hyprland` | sessione/configurazione Hyprland (Wayland) | desktop Void | +| `niri` | sessione/configurazione Niri (Wayland) | FreeBSD laptop | +| `npm` | installazione pacchetti npm globali | desktop Void, workstation Linux, WSL | | `nvidia` | componenti NVIDIA desktop | desktop Void | | `packages` | installazione e aggiornamento pacchetti | tutti i profili | | `services` | gestione servizi runit/systemd | tutti i profili | @@ -483,9 +483,9 @@ Allo stato attuale `ansible/site.yml` espone questi tag: Esempi pratici: ```bash -ansible-playbook ansible/site.yml --limit nymph --tags dotfiles:desktop,niri --check --diff -ansible-playbook ansible/site.yml --limit ikaros --tags cinnamon --check --diff -ansible-playbook ansible/site.yml --limit deadalus-fedora --tags packages,vscode --check --diff +ansible-playbook ansible/site.yml --limit nymph --tags dotfiles:desktop,niri --check --diff +ansible-playbook ansible/site.yml --limit ikaros --tags cinnamon --check --diff +ansible-playbook ansible/site.yml --limit deadalus-fedora --tags packages,vscode --check --diff ansible-playbook ansible/site.yml --limit prometheus --tags services,dotfiles:server --check --diff ``` @@ -502,25 +502,25 @@ ansible-galaxy collection install -r ansible/collections/requirements.yml ansible-playbook ansible/site.yml ``` -Dopo l'esecuzione del playbook la macchina verra configurata secondo il profilo definito e i ruoli attualmente orchestrati. - -Per aggiungere un nuovo host Void che riusa il profilo desktop preservato: - -1. aggiungere l'host a `platform_void`; -2. aggiungerlo a `graphical_desktop`; -3. scegliere il ruolo, per esempio `role_lab`; -4. scegliere il desktop, per esempio `desktop_hyprland`; -5. lasciare eventuali dettagli hardware in `host_vars/.yml`. - -I gruppi legacy `void` e `desktop` sono parent di compatibilita, quindi un host -in `platform_void` e `graphical_desktop` continua a ricevere anche le variabili -Void e desktop esistenti. - -Per prove in VM sono disponibili gruppi di esempio in -`ansible/inventory/examples/platform-test-hosts.yml`, da passare esplicitamente -con `-i` insieme all'inventory principale. - -Per il flusso mail desktop esiste inoltre uno script dedicato: +Dopo l'esecuzione del playbook la macchina verra configurata secondo il profilo definito e i ruoli attualmente orchestrati. + +Per aggiungere un nuovo host Void che riusa il profilo desktop preservato: + +1. aggiungere l'host a `platform_void`; +2. aggiungerlo a `graphical_desktop`; +3. scegliere il ruolo, per esempio `role_lab`; +4. scegliere il desktop, per esempio `desktop_hyprland`; +5. lasciare eventuali dettagli hardware in `host_vars/.yml`. + +I gruppi legacy `void` e `desktop` sono parent di compatibilita, quindi un host +in `platform_void` e `graphical_desktop` continua a ricevere anche le variabili +Void e desktop esistenti. + +Per prove in VM sono disponibili gruppi di esempio in +`ansible/inventory/examples/platform-test-hosts.yml`, da passare esplicitamente +con `-i` insieme all'inventory principale. + +Per il flusso mail desktop esiste inoltre uno script dedicato: ```bash scripts/bootstrap_mail.sh diff --git a/ansible/inventory/group_vars/desktop_niri.yml b/ansible/inventory/group_vars/desktop_niri.yml index 0eecb94..1f0f279 100644 --- a/ansible/inventory/group_vars/desktop_niri.yml +++ b/ansible/inventory/group_vars/desktop_niri.yml @@ -1,3 +1,5 @@ --- desktop_profile: niri +desktop_sessions_enabled: + - niri desktop_default_session: niri diff --git a/ansible/inventory/group_vars/void.yml b/ansible/inventory/group_vars/void.yml index c6e543b..117495f 100644 --- a/ansible/inventory/group_vars/void.yml +++ b/ansible/inventory/group_vars/void.yml @@ -221,6 +221,28 @@ desktop_hyprland_packages: - xdg-desktop-portal-hyprland - xorg-server-xwayland +desktop_niri_packages: + - cliphist + - dunst + - foot + - foot-terminfo + - gtklock + - grim + - niri + - rofi + - slurp + - SwayOSD + - Waybar + - wl-clipboard + - xdg-desktop-portal-gtk + - xorg-server-xwayland + +void_lab_packages: + - llvm + - podman + - qemu + - smartmontools + profile_packages: - bash-language-server - bluez diff --git a/ansible/inventory/host_vars/nymph.yml b/ansible/inventory/host_vars/nymph.yml index 37bf693..dc2672c 100644 --- a/ansible/inventory/host_vars/nymph.yml +++ b/ansible/inventory/host_vars/nymph.yml @@ -1,7 +1,7 @@ --- hostname: nymph -# FreeBSD/Niri laptop target. Keep host-specific packages empty until hardware +# Void Linux/Niri laptop target. Keep host-specific packages empty until hardware # support is verified on the installed system. host_packages: [] host_enabled_services: [] diff --git a/ansible/inventory/hosts.yml b/ansible/inventory/hosts.yml index 8f63a4d..d9d4ba5 100644 --- a/ansible/inventory/hosts.yml +++ b/ansible/inventory/hosts.yml @@ -2,7 +2,9 @@ all: children: platform_void: - hosts: {} + hosts: + nymph: + ansible_connection: local platform_mint: hosts: @@ -10,9 +12,7 @@ all: ansible_connection: local platform_freebsd: - hosts: - nymph: - ansible_connection: local + hosts: {} void: children: diff --git a/ansible/roles/packages_void/tasks/main.yml b/ansible/roles/packages_void/tasks/main.yml index 8275232..75829ee 100644 --- a/ansible/roles/packages_void/tasks/main.yml +++ b/ansible/roles/packages_void/tasks/main.yml @@ -76,6 +76,14 @@ ) else [] ) + + ( + (desktop_niri_packages | default([])) + if ( + (desktop_environment | default('minimal')) == 'minimal' + and 'niri' in (desktop_sessions_enabled | default([])) + ) + else [] + ) | unique }} @@ -88,6 +96,7 @@ (desktop_minimal_packages | default([])) + (desktop_sway_packages | default([])) + (desktop_hyprland_packages | default([])) + + (desktop_niri_packages | default([])) + (desktop_xfce_packages | default([])) + (desktop_kde_packages | default([])) ) @@ -109,6 +118,7 @@ + (desktop_common_packages | default([])) + ((desktop_emacs_packages | default([])) if (emacs_enabled | default(false) | bool) else []) + (packages_void_selected_desktop_packages | default([])) + + ((void_lab_packages | default([])) if 'role_lab' in group_names else []) + (host_packages | default([])) ) | unique diff --git a/ansible/roles/profile_desktop_common/tasks/main.yml b/ansible/roles/profile_desktop_common/tasks/main.yml index 1270fd1..be83a57 100644 --- a/ansible/roles/profile_desktop_common/tasks/main.yml +++ b/ansible/roles/profile_desktop_common/tasks/main.yml @@ -9,7 +9,7 @@ or (desktop_sessions_enabled | default([]) | length > 0) - >- (desktop_environment | default('minimal')) != 'minimal' - or (desktop_sessions_enabled | default([]) | difference(['sway', 'hyprland']) | length == 0) + or (desktop_sessions_enabled | default([]) | difference(['sway', 'hyprland', 'niri']) | length == 0) - >- (desktop_environment | default('minimal')) != 'minimal' or desktop_default_session in (desktop_sessions_enabled | default([])) diff --git a/ansible/roles/profile_desktop_niri/files/niri-portals.conf b/ansible/roles/profile_desktop_niri/files/niri-portals.conf new file mode 100644 index 0000000..1af058f --- /dev/null +++ b/ansible/roles/profile_desktop_niri/files/niri-portals.conf @@ -0,0 +1,4 @@ +[preferred] +default=gtk +org.freedesktop.impl.portal.Screenshot=gtk +org.freedesktop.impl.portal.ScreenCast=gtk diff --git a/ansible/roles/profile_desktop_niri/files/niri.desktop b/ansible/roles/profile_desktop_niri/files/niri.desktop new file mode 100644 index 0000000..1e53c3f --- /dev/null +++ b/ansible/roles/profile_desktop_niri/files/niri.desktop @@ -0,0 +1,5 @@ +[Desktop Entry] +Name=Niri +Comment=Niri scrollable-tiling (Wayland) +Exec=/usr/local/bin/start-niri +Type=Application diff --git a/ansible/roles/profile_desktop_niri/tasks/main.yml b/ansible/roles/profile_desktop_niri/tasks/main.yml new file mode 100644 index 0000000..502529d --- /dev/null +++ b/ansible/roles/profile_desktop_niri/tasks/main.yml @@ -0,0 +1,81 @@ +--- +- name: Ensure niri config directories exist + tags: [dotfiles, dotfiles:desktop, niri] + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: "{{ username }}" + group: "{{ user_group }}" + mode: "0755" + loop: + - "{{ user_home }}/.config/foot" + - "{{ user_home }}/.config/dunst" + - "{{ user_home }}/.config/rofi" + - "{{ user_home }}/.config/waybar" + - "{{ user_home }}/.config/niri" + when: + - (desktop_environment | default('minimal')) == 'minimal' + - "'niri' in (desktop_sessions_enabled | default([]))" + +- name: Install allowed emptty Wayland sessions + tags: [packages, services, emptty, niri] + ansible.builtin.copy: + src: niri.desktop + dest: /etc/emptty/wayland-sessions/niri.desktop + owner: root + group: root + mode: "0644" + when: + - (desktop_environment | default('minimal')) == 'minimal' + - "'niri' in (desktop_sessions_enabled | default([]))" + +- name: Install Niri session launcher in /usr/local/bin + tags: [packages, services, niri] + ansible.builtin.copy: + src: "{{ playbook_dir }}/../dotfiles/desktop/.local/bin/start-niri" + dest: /usr/local/bin/start-niri + owner: root + group: root + mode: "0755" + when: + - (desktop_environment | default('minimal')) == 'minimal' + - "'niri' in (desktop_sessions_enabled | default([]))" + +- name: Ensure /etc/xdg/xdg-desktop-portal exists + tags: [packages, services, niri, portal] + ansible.builtin.file: + path: /etc/xdg/xdg-desktop-portal + state: directory + owner: root + group: root + mode: "0755" + when: + - (desktop_environment | default('minimal')) == 'minimal' + - "'niri' in (desktop_sessions_enabled | default([]))" + +- name: Configure xdg-desktop-portal backend preferences for niri + tags: [packages, services, niri, portal] + ansible.builtin.copy: + src: niri-portals.conf + dest: /etc/xdg/xdg-desktop-portal/niri-portals.conf + owner: root + group: root + mode: "0644" + when: + - (desktop_environment | default('minimal')) == 'minimal' + - "'niri' in (desktop_sessions_enabled | default([]))" + +- name: Copy niri desktop dotfiles + tags: [dotfiles, dotfiles:desktop, niri] + ansible.builtin.copy: + src: "{{ playbook_dir }}/../dotfiles/desktop/{{ item.src }}" + dest: "{{ user_home }}/{{ item.dest }}" + owner: "{{ username }}" + group: "{{ user_group }}" + mode: "{{ item.mode }}" + loop: "{{ desktop_niri_dotfiles | default([]) }}" + loop_control: + label: "{{ item.dest }}" + when: + - (desktop_environment | default('minimal')) == 'minimal' + - "'niri' in (desktop_sessions_enabled | default([]))" diff --git a/ansible/site.yml b/ansible/site.yml index 0e8c96f..928d77e 100644 --- a/ansible/site.yml +++ b/ansible/site.yml @@ -38,10 +38,18 @@ - profile_desktop_common - profile_desktop_sway - profile_desktop_hyprland + - profile_desktop_niri - profile_desktop_kde - profile_desktop_xfce - profile_desktop_host +- name: Configure lab role on Void + hosts: platform_void:&role_lab + become: true + + roles: + - profile_lab + - name: Configure Linux Mint platform hosts: platform_mint become: true diff --git a/dotfiles/desktop/.local/bin/start-niri b/dotfiles/desktop/.local/bin/start-niri new file mode 100755 index 0000000..e393473 --- /dev/null +++ b/dotfiles/desktop/.local/bin/start-niri @@ -0,0 +1,27 @@ +#!/bin/sh + +[ -r /etc/profile ] && . /etc/profile +[ -r "$HOME/.profile" ] && . "$HOME/.profile" + +export XDG_CURRENT_DESKTOP=niri +export XDG_SESSION_DESKTOP=niri +export XDG_SESSION_TYPE=wayland + +export MOZ_ENABLE_WAYLAND=1 +export QT_QPA_PLATFORM='wayland;xcb' +export _JAVA_AWT_WM_NONREPARENTING=1 +export SDL_VIDEODRIVER=wayland +export GDK_BACKEND='wayland,x11' + +export SSH_AUTH_SOCK="$HOME/.local/state/ssh-agent/socket" + +# Per-host session environment (GPU / Wayland tuning, etc.) +[ -r "$HOME/.config/niri/session-env" ] && . "$HOME/.config/niri/session-env" + +exec dbus-run-session sh -eu -c ' + umask 077 + printf "%s\n" "$DBUS_SESSION_BUS_ADDRESS" > "$HOME/.dbus-session-bus-address" + gpgconf --launch gpg-agent + "$HOME/.local/bin/update-turnstile-env" + exec niri --session +'