mirror of
https://github.com/fscotto/infra.git
synced 2026-05-30 15:39:58 +00:00
Compare commits
46 Commits
feature/no
...
525fa05352
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
525fa05352 | ||
|
|
d7629d33d6 | ||
|
|
224e9bf1e8 | ||
|
|
238d8ab873 | ||
|
|
b483ef5b7e | ||
|
|
56c0335b40 | ||
|
|
14c24c299d | ||
|
|
013531ad4b | ||
|
|
e772e9650d | ||
|
|
5027b3dd77 | ||
|
|
f0fcc92d6d | ||
|
|
e4d6deb3c5 | ||
|
|
95c7531db4 | ||
|
|
7baa944aee | ||
|
|
3344abb36b | ||
|
|
e83b7f1502 | ||
|
|
72c2f70185 | ||
|
|
3c702a299e | ||
|
|
fb81d1082c | ||
|
|
cd8c775630 | ||
|
|
dab66bda47 | ||
|
|
e0fe207771 | ||
|
|
eaf1a7f182 | ||
|
|
4b5879a67e | ||
|
|
46b6bcd62c | ||
|
|
d48d2db0ba | ||
|
|
18ea0a02ad | ||
|
|
fa6b082381 | ||
|
|
e2a66c623f | ||
|
|
164b11bb73 | ||
|
|
10b0a6225b | ||
|
|
bcd8635d9e | ||
|
|
aa0f787d00 | ||
|
|
949ae2c47f | ||
|
|
16850eba53 | ||
|
|
e0869e72d6 | ||
|
|
e9af0bd1af | ||
|
|
763bbd8b9f | ||
|
|
950cbff85c | ||
|
|
003679f499 | ||
|
|
ab294f4cb7 | ||
|
|
325a405012 | ||
|
|
c9fa536bb5 | ||
|
|
a108957ba4 | ||
|
|
0eba6aa9c8 | ||
|
|
d036eee00a |
7
.claude/settings.local.json
Normal file
7
.claude/settings.local.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"permissions": {
|
||||||
|
"allow": [
|
||||||
|
"Bash(xargs ls -la)"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
39
AGENTS.md
39
AGENTS.md
@@ -1,15 +1,18 @@
|
|||||||
# AGENTS.md
|
# AGENTS.md
|
||||||
|
|
||||||
Ansible-driven personal infrastructure repo for Void desktops, Linux workstations, Windows+WSL, and an Ubuntu server.
|
Ansible-driven personal infrastructure repo for Void/Arch desktops, Linux workstations, Windows+WSL, and an Ubuntu server.
|
||||||
|
|
||||||
## Source Of Truth
|
## Source Of Truth
|
||||||
- Main orchestration: `ansible/site.yml`
|
- Main orchestration: `ansible/site.yml`
|
||||||
- Inventory and layering inputs: `ansible/inventory/hosts.yml`, `ansible/inventory/group_vars/*.yml`, `ansible/inventory/host_vars/*.yml`
|
- Inventory and layering inputs: `ansible/inventory/hosts.yml`, `ansible/inventory/group_vars/*.yml`, `ansible/inventory/host_vars/*.yml`
|
||||||
- Dotfiles live under `dotfiles/`
|
- Dotfiles live under `dotfiles/`
|
||||||
- OpenCode loads global instructions from `dotfiles/desktop/.config/opencode/opencode.json`
|
- AI agent instructions (bootstrap, rules, knowledge) are centralized in `dotfiles/common/.config/ai/` and shared between OpenCode, Codex, and Gemini CLI.
|
||||||
|
- OpenCode loads its entrypoint configuration from `dotfiles/common/.config/opencode/opencode.json`.
|
||||||
|
- Codex config is rendered from `dotfiles/common/.codex/config.toml.j2` so `model_instructions_file` points to the deployed `~/.config/ai/bootstrap.md`.
|
||||||
|
|
||||||
## Topology
|
## Topology
|
||||||
- Void desktops: `ikaros`, `nymph`
|
- Void desktops: `ikaros`
|
||||||
|
- Arch desktops: `nymph`
|
||||||
- Native Linux workstations: `deadalus-ubuntu`, `deadalus-fedora`
|
- Native Linux workstations: `deadalus-ubuntu`, `deadalus-fedora`
|
||||||
- Windows host + WSL dev: `deadalus-win`, `deadalus-wsl`
|
- Windows host + WSL dev: `deadalus-win`, `deadalus-wsl`
|
||||||
- Ubuntu server: `prometheus`
|
- Ubuntu server: `prometheus`
|
||||||
@@ -32,14 +35,15 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux workstation
|
|||||||
- `ansible-lint ansible/roles`
|
- `ansible-lint ansible/roles`
|
||||||
- `yamllint ansible/`
|
- `yamllint ansible/`
|
||||||
- Host-focused dry runs:
|
- Host-focused dry runs:
|
||||||
- Void desktop work: `ansible-playbook ansible/site.yml --limit ikaros --check --diff` or `--limit nymph --check --diff`
|
- Void desktop work: `ansible-playbook ansible/site.yml --limit ikaros --check --diff`
|
||||||
|
- Arch desktop work: `ansible-playbook ansible/site.yml --limit nymph --check --diff`
|
||||||
- Ubuntu workstation: `ansible-playbook ansible/site.yml --limit deadalus-ubuntu --check --diff`
|
- Ubuntu workstation: `ansible-playbook ansible/site.yml --limit deadalus-ubuntu --check --diff`
|
||||||
- Fedora workstation: `ansible-playbook ansible/site.yml --limit deadalus-fedora --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`
|
- WSL dev: `ansible-playbook ansible/site.yml --limit deadalus-wsl --check --diff`
|
||||||
- Server: `ansible-playbook ansible/site.yml --limit prometheus --check --diff`
|
- Server: `ansible-playbook ansible/site.yml --limit prometheus --check --diff`
|
||||||
- Focused checks:
|
- Focused checks:
|
||||||
- Emacs dotfiles only: `ansible-playbook ansible/site.yml --limit ikaros --tags emacs --check --diff` or `--limit nymph --tags emacs --check --diff`
|
- Emacs dotfiles only: `ansible-playbook ansible/site.yml --limit ikaros --tags emacs --check --diff` or `--limit nymph --tags emacs --check --diff`
|
||||||
- Sway/Noctalia bootstrap on nymph: `ansible-playbook ansible/site.yml --limit nymph --tags packages,dotfiles:desktop,sway --check --diff`
|
- Arch GNOME desktop bootstrap on nymph: `ansible-playbook ansible/site.yml --limit nymph --tags packages,services,gnome --check --diff`
|
||||||
- Mail bootstrap: `sh -n scripts/bootstrap_mail.sh` and `shellcheck scripts/bootstrap_mail.sh`
|
- Mail bootstrap: `sh -n scripts/bootstrap_mail.sh` and `shellcheck scripts/bootstrap_mail.sh`
|
||||||
- Windows bootstrap parse: `pwsh -NoProfile -Command "[void][System.Management.Automation.Language.Parser]::ParseFile('scripts/bootstrap_windows_workstation.ps1', [ref]$null, [ref]$null)"`
|
- Windows bootstrap parse: `pwsh -NoProfile -Command "[void][System.Management.Automation.Language.Parser]::ParseFile('scripts/bootstrap_windows_workstation.ps1', [ref]$null, [ref]$null)"`
|
||||||
- Server compose render: `docker compose -f /opt/docker/server/docker-compose.yml config`
|
- Server compose render: `docker compose -f /opt/docker/server/docker-compose.yml config`
|
||||||
@@ -52,17 +56,21 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux workstation
|
|||||||
- Put host-specific overrides in `host_vars`, not shared `group_vars`.
|
- Put host-specific overrides in `host_vars`, not shared `group_vars`.
|
||||||
- Use `no_log: true` for secret-bearing task inputs or outputs.
|
- Use `no_log: true` for secret-bearing task inputs or outputs.
|
||||||
|
|
||||||
## Desktop Void Notes
|
## Desktop Notes
|
||||||
- `profile_desktop_common` owns the shared desktop bootstrap.
|
- `profile_desktop_common` owns the shared desktop bootstrap.
|
||||||
- `.emacs.d` is deployed by a dedicated `profile_desktop_common` task tagged `emacs`.
|
- `.emacs.d` is deployed by a dedicated `profile_desktop_common` task tagged `emacs`.
|
||||||
- User services are managed by `turnstile` and live under `dotfiles/desktop/.config/service/`.
|
- NTFS filesystem support is provided by `ntfs-3g` in `ansible/inventory/group_vars/void.yml`.
|
||||||
- `ssh-agent` runs under `turnstile` with stable socket `~/.local/state/ssh-agent/socket`.
|
- Void user services are managed by `turnstile` and live under `dotfiles/desktop/.config/service/`.
|
||||||
|
- Arch user services are systemd user units under `dotfiles/desktop/.config/systemd/user/`.
|
||||||
|
- `ssh-agent` keeps the stable socket `~/.local/state/ssh-agent/socket`.
|
||||||
- Critical session entrypoints:
|
- Critical session entrypoints:
|
||||||
- `dotfiles/desktop/.xinitrc`
|
- `dotfiles/desktop/.xinitrc`
|
||||||
- `dotfiles/desktop/.local/bin/start-sway-session`
|
- `dotfiles/desktop/.local/bin/start-sway-session`
|
||||||
- Do not auto-restart `emptty` during playbook runs on active desktop hosts; restart it manually from another TTY/SSH session if needed.
|
- Do not auto-restart `emptty` during playbook runs on active Void desktop hosts; restart it manually from another TTY/SSH session if needed.
|
||||||
- `profile_desktop_sway` owns the Sway session, Noctalia config rendering, and official plugin linking.
|
- `nymph` is an Arch GNOME/GDM desktop; do not route it through Void/i3/Sway/emptty tasks.
|
||||||
- Noctalia shared config lives in `dotfiles/desktop/.config/noctalia/`; bar monitors and `screenOverrides` come from inventory (`noctalia_bar_monitors`, `noctalia_screen_overrides`).
|
- `nymph` uses systemd-boot; keep loader entries and kernel cmdline in `ansible/inventory/host_vars/nymph.yml`.
|
||||||
|
- `profile_desktop_sway` owns the Sway session, Noctalia config rendering, and official plugin linking when a Sway desktop is explicitly enabled.
|
||||||
|
- Noctalia shared config lives in `dotfiles/desktop/.config/noctalia/`; bar monitors and `screenOverrides` come from inventory (`noctalia_bar_monitors`, `noctalia_screen_overrides`) on Sway hosts.
|
||||||
- On Sway hosts, `udiskie` is the backend for automount/LUKS but runs without tray; USB device UI is handled by `usb-drive-manager`.
|
- On Sway hosts, `udiskie` is the backend for automount/LUKS but runs without tray; USB device UI is handled by `usb-drive-manager`.
|
||||||
- Do not re-introduce `network-manager-applet` or `blueman` on Sway hosts without an explicit host-specific reason.
|
- Do not re-introduce `network-manager-applet` or `blueman` on Sway hosts without an explicit host-specific reason.
|
||||||
|
|
||||||
@@ -73,6 +81,13 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux workstation
|
|||||||
- `workstation_host_windows` runs with `gather_facts: false` and validates PSRP settings plus `windows_package_backend` before role execution.
|
- `workstation_host_windows` runs with `gather_facts: false` and validates PSRP settings plus `windows_package_backend` before role execution.
|
||||||
- Windows taskbar pins are driven by `windows_taskbar_pins` in `ansible/inventory/group_vars/workstation_host_windows.yml`; validate identifiers from a real Windows session before changing them.
|
- Windows taskbar pins are driven by `windows_taskbar_pins` in `ansible/inventory/group_vars/workstation_host_windows.yml`; validate identifiers from a real Windows session before changing them.
|
||||||
|
|
||||||
|
## Coding Agent Notes
|
||||||
|
- Shared agent packages live in `ai_agents_npm_packages` in `ansible/inventory/group_vars/all.yml`.
|
||||||
|
- Shared agent dotfiles live in `ai_agents_dotfiles`; rendered configs live in `ai_agents_templates`.
|
||||||
|
- Desktop, native workstation, and WSL profiles consume the shared agent package list; do not duplicate package entries in profile-specific vars.
|
||||||
|
- `dotfiles_common` copies common dotfiles plus `ai_agents_dotfiles`, then renders `ai_agents_templates`.
|
||||||
|
- Keep `.config/ai/` as the common instruction source; update agent-specific entrypoints to reference it rather than duplicating instruction text.
|
||||||
|
|
||||||
## Tooling Notes
|
## Tooling Notes
|
||||||
- Install local tooling with:
|
- Install local tooling with:
|
||||||
- `python3 -m pip install ansible ansible-lint yamllint shellcheck-py`
|
- `python3 -m pip install ansible ansible-lint yamllint shellcheck-py`
|
||||||
|
|||||||
691
README.md
691
README.md
@@ -15,26 +15,26 @@ Il repository consente di gestire più sistemi operativi e profili macchina mant
|
|||||||
|
|
||||||
# Architettura del progetto
|
# Architettura del progetto
|
||||||
|
|
||||||
```text
|
```text
|
||||||
infra/
|
infra/
|
||||||
├── ansible/
|
├── ansible/
|
||||||
│ ├── ansible.cfg
|
│ ├── ansible.cfg
|
||||||
│ ├── site.yml
|
│ ├── site.yml
|
||||||
│ ├── inventory/
|
│ ├── inventory/
|
||||||
│ │ ├── hosts.yml
|
│ │ ├── hosts.yml
|
||||||
│ │ ├── group_vars/
|
│ │ ├── group_vars/
|
||||||
│ │ └── host_vars/
|
│ │ └── host_vars/
|
||||||
│ ├── templates/
|
│ ├── templates/
|
||||||
│ └── roles/
|
│ └── roles/
|
||||||
│
|
│
|
||||||
├── dotfiles/
|
├── dotfiles/
|
||||||
│ ├── common/
|
│ ├── common/
|
||||||
│ ├── desktop/
|
│ ├── desktop/
|
||||||
│ ├── fedora/
|
│ ├── fedora/
|
||||||
│ ├── server/
|
│ ├── server/
|
||||||
│ ├── workstation/
|
│ ├── workstation/
|
||||||
│ ├── ikaros/
|
│ ├── ikaros/
|
||||||
│ └── nymph/
|
│ └── nymph/
|
||||||
│
|
│
|
||||||
├── scripts/
|
├── scripts/
|
||||||
├── secrets/
|
├── secrets/
|
||||||
@@ -50,16 +50,16 @@ Il repository è diviso in due componenti principali:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Macchine gestite
|
# Macchine gestite
|
||||||
|
|
||||||
Il repository modella attualmente tre tipologie di profilo e prepara due filoni workstation: Linux nativa e Windows + WSL.
|
Il repository modella attualmente tre tipologie di profilo e prepara due filoni workstation: Linux nativa e Windows + WSL.
|
||||||
|
|
||||||
Nota sullo stato attuale del playbook principale:
|
Nota sullo stato attuale del playbook principale:
|
||||||
|
|
||||||
- `ansible/site.yml` applica oggi in automatico il profilo desktop su host Void Linux
|
- `ansible/site.yml` applica oggi in automatico il profilo desktop su host Void Linux
|
||||||
- `ansible/site.yml` applica la workstation Linux nativa separando il layer dev comune dal layer host GNOME
|
- `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_host_windows` + `workstation_dev_wsl` per il modello Windows 11 + WSL
|
- `ansible/site.yml` applica anche il ramo `workstation_host_windows` + `workstation_dev_wsl` per il modello Windows 11 + WSL
|
||||||
- `ansible/site.yml` applica anche il profilo `ubuntu_server` con baseline apt, systemd, dotfiles server e firewall UFW
|
- `ansible/site.yml` applica anche il profilo `ubuntu_server` con baseline apt, systemd, dotfiles server e firewall UFW
|
||||||
|
|
||||||
## Desktop
|
## Desktop
|
||||||
|
|
||||||
@@ -67,18 +67,18 @@ Sistema operativo:
|
|||||||
|
|
||||||
- Void Linux
|
- Void Linux
|
||||||
|
|
||||||
Sessioni desktop:
|
Sessioni desktop:
|
||||||
|
|
||||||
- `ikaros`: i3
|
- `ikaros`: i3
|
||||||
- `nymph`: SwayFX
|
- `nymph`: SwayFX
|
||||||
|
|
||||||
Macchine:
|
Macchine:
|
||||||
|
|
||||||
- `ikaros`
|
- `ikaros`
|
||||||
- `nymph`
|
- `nymph`
|
||||||
|
|
||||||
Queste macchine condividono la stessa configurazione base desktop e vengono mantenute allineate tramite Ansible.
|
Queste macchine condividono la stessa configurazione base desktop e vengono mantenute allineate tramite Ansible.
|
||||||
|
|
||||||
Lo stato attuale del profilo desktop include, tra le altre cose:
|
Lo stato attuale del profilo desktop include, tra le altre cose:
|
||||||
|
|
||||||
- dotfiles comuni e desktop
|
- dotfiles comuni e desktop
|
||||||
@@ -91,87 +91,87 @@ Lo stato attuale del profilo desktop include, tra le altre cose:
|
|||||||
- `tmux` con plugin gestiti da TPM al bootstrap del profilo desktop
|
- `tmux` con plugin gestiti da TPM al bootstrap del profilo desktop
|
||||||
- Flatpak con remoto Flathub
|
- Flatpak con remoto Flathub
|
||||||
- GNOME Keyring e bootstrap della posta via script dedicato
|
- GNOME Keyring e bootstrap della posta via script dedicato
|
||||||
- shell Noctalia su Sway su `nymph`, con plugin ufficiali per clipboard (`clipper`, `clipboard`), polkit (`polkit-agent`) e gestione USB (`usb-drive-manager`); config condivisa in `dotfiles/desktop/.config/noctalia/` e `settings.json` renderizzato da template Ansible con variabili host-specifiche
|
- shell Noctalia su Sway su `nymph`, con plugin ufficiali per clipboard (`clipper`), polkit (`polkit-agent`), screenshot (`screenshot`) e gestione USB (`usb-drive-manager`); config condivisa in `dotfiles/desktop/.config/noctalia/` e `settings.json` renderizzato da template Ansible con variabili host-specifiche
|
||||||
- `udiskie` come backend per automount/LUKS su Sway, senza tray; la UI dei dispositivi removibili è demandata a `usb-drive-manager`
|
- `udiskie` come backend per automount/LUKS su Sway, senza tray; la UI dei dispositivi removibili è demandata a `usb-drive-manager`
|
||||||
- `kanshi` su `nymph` per il profilo monitor Wayland, con workspace Sway deterministici: in dual monitor `1` resta su `eDP-1` e `2-10` vanno su `DP-1`, mentre in laptop-only tutti tornano su `eDP-1`
|
- `kanshi` su `nymph` per il profilo monitor Wayland, con workspace Sway deterministici: in dual monitor `1` resta su `eDP-1` e `2-10` vanno su `DP-1`, mentre in laptop-only tutti tornano su `eDP-1`
|
||||||
- monitor Noctalia e `screenOverrides` dichiarati in inventory (`noctalia_bar_monitors`, `noctalia_screen_overrides`) per host `nymph`
|
- monitor Noctalia e `screenOverrides` dichiarati in inventory (`noctalia_bar_monitors`, `noctalia_screen_overrides`) per host `nymph`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Workstation
|
## Workstation
|
||||||
|
|
||||||
Sistemi operativi supportati:
|
Sistemi operativi supportati:
|
||||||
|
|
||||||
- Ubuntu LTS nativa
|
|
||||||
- Fedora Workstation nativa
|
|
||||||
- Windows 11 host + Ubuntu WSL
|
|
||||||
|
|
||||||
Desktop environment host Linux:
|
- Ubuntu LTS nativa
|
||||||
|
- Fedora Workstation nativa
|
||||||
- GNOME
|
- Windows 11 host + Ubuntu WSL
|
||||||
|
|
||||||
Macchine attuali:
|
Desktop environment host Linux:
|
||||||
|
|
||||||
- `deadalus-ubuntu` come workstation Ubuntu nativa
|
- GNOME
|
||||||
- `deadalus-fedora` come workstation Fedora nativa
|
|
||||||
- supporto attivo per host Windows 11 + WSL tramite `deadalus-win` e `deadalus-wsl`
|
Macchine attuali:
|
||||||
|
|
||||||
Questo profilo è pensato per sviluppo e lavoro, con separazione tra layer host e layer dev.
|
- `deadalus-ubuntu` come workstation Ubuntu nativa
|
||||||
|
- `deadalus-fedora` come workstation Fedora nativa
|
||||||
Nel modello Ansible usato qui, un singolo inventory host puo appartenere intenzionalmente a piu gruppi e quindi ricevere piu play nello stesso run: l'associazione non e `1 host = 1 play`, ma `host + gruppi = layering finale`.
|
- supporto attivo per host Windows 11 + WSL tramite `deadalus-win` e `deadalus-wsl`
|
||||||
|
|
||||||
Il profilo workstation e agganciato al playbook principale e ora distingue:
|
Questo profilo è pensato per sviluppo e lavoro, con separazione tra layer host e layer dev.
|
||||||
|
|
||||||
- layer dev Ubuntu condiviso tra workstation Linux nativa e Ubuntu in WSL
|
Nel modello Ansible usato qui, un singolo inventory host puo appartenere intenzionalmente a piu gruppi e quindi ricevere piu play nello stesso run: l'associazione non e `1 host = 1 play`, ma `host + gruppi = layering finale`.
|
||||||
- layer dev Fedora nativo parallelo a Ubuntu
|
|
||||||
- layer host Linux GNOME
|
Il profilo workstation e agganciato al playbook principale e ora distingue:
|
||||||
- layer host Windows 11 con bootstrap WSL, remoting `PSRP` su `HTTPS/5986`, gestione app via `winget` con backend configurabile e VS Code lato Windows
|
|
||||||
- layer WSL dedicato per sviluppo con `systemd`
|
- layer dev Ubuntu condiviso tra workstation Linux nativa e Ubuntu in WSL
|
||||||
|
- layer dev Fedora nativo parallelo a Ubuntu
|
||||||
Per esempio, lo stesso host Linux puo stare in `workstation_host_linux` e in `workstation_dev_fedora` oppure `workstation_dev_ubuntu`, a seconda del layering che vuoi comporre.
|
- layer host Linux GNOME
|
||||||
|
- layer host Windows 11 con bootstrap WSL, remoting `PSRP` su `HTTPS/5986`, gestione app via `winget` con backend configurabile e VS Code lato Windows
|
||||||
Lo stato attuale del profilo workstation include:
|
- layer WSL dedicato per sviluppo con `systemd`
|
||||||
|
|
||||||
- installazione pacchetti base Ubuntu via apt
|
Per esempio, lo stesso host Linux puo stare in `workstation_host_linux` e in `workstation_dev_fedora` oppure `workstation_dev_ubuntu`, a seconda del layering che vuoi comporre.
|
||||||
- installazione pacchetti base Fedora via dnf per il ramo workstation nativo
|
|
||||||
- installazione e configurazione di Docker dal repository ufficiale
|
Lo stato attuale del profilo workstation include:
|
||||||
- gestione dei dotfiles workstation e rendering dei template dev condivisi
|
|
||||||
- installazione di Google Chrome su Ubuntu e Fedora, `VS Code` su Fedora via repository RPM Microsoft, `IntelliJ IDEA Ultimate` su Fedora via COPR RPM, e applicazioni workstation residue su Fedora via Flatpak
|
- installazione pacchetti base Ubuntu via apt
|
||||||
- installazione di applicazioni workstation su Ubuntu nativa via Snap, oltre alle estensioni GNOME sul solo host Linux nativo
|
- installazione pacchetti base Fedora via dnf per il ramo workstation nativo
|
||||||
- configurazione del ramo Windows 11 host con app installate dal playbook via `winget`, con backend predefinito `winget_psrp`, tema scuro, pin della taskbar gestiti via policy locale e profilo predefinito di Windows Terminal impostato su `Ubuntu`
|
- installazione e configurazione di Docker dal repository ufficiale
|
||||||
- preparazione del ramo WSL Ubuntu con `systemd` per il toolchain di sviluppo
|
- gestione dei dotfiles workstation e rendering dei template dev condivisi
|
||||||
- attivazione del firewall UFW su Ubuntu nativa e `firewalld` su Fedora nativa
|
- installazione di Google Chrome su Ubuntu e Fedora, `VS Code` su Fedora via repository RPM Microsoft, `IntelliJ IDEA Ultimate` su Fedora via COPR RPM, e applicazioni workstation residue su Fedora via Flatpak
|
||||||
- gestione di `gsettings` GNOME host-specifici su `deadalus-fedora`, inclusi shell, Files/Nautilus, file chooser GTK e GNOME Text Editor, allineati allo stato reale della macchina
|
- installazione di applicazioni workstation su Ubuntu nativa via Snap, oltre alle estensioni GNOME sul solo host Linux nativo
|
||||||
|
- configurazione del ramo Windows 11 host con app installate dal playbook via `winget`, con backend predefinito `winget_psrp`, tema scuro, pin della taskbar gestiti via policy locale e profilo predefinito di Windows Terminal impostato su `Ubuntu`
|
||||||
Workflow Windows + WSL previsto:
|
- preparazione del ramo WSL Ubuntu con `systemd` per il toolchain di sviluppo
|
||||||
|
- attivazione del firewall UFW su Ubuntu nativa e `firewalld` su Fedora nativa
|
||||||
Prima di eseguire il bootstrap Windows, apri PowerShell come amministratore e verifica la policy di esecuzione:
|
- gestione di `gsettings` GNOME host-specifici su `deadalus-fedora`, inclusi shell, Files/Nautilus, file chooser GTK e GNOME Text Editor, allineati allo stato reale della macchina
|
||||||
|
|
||||||
```powershell
|
Workflow Windows + WSL previsto:
|
||||||
Get-ExecutionPolicy -List
|
|
||||||
```
|
Prima di eseguire il bootstrap Windows, apri PowerShell come amministratore e verifica la policy di esecuzione:
|
||||||
|
|
||||||
Se necessario, abilita l'esecuzione degli script per l'utente corrente:
|
```powershell
|
||||||
|
Get-ExecutionPolicy -List
|
||||||
```powershell
|
```
|
||||||
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
|
|
||||||
```
|
Se necessario, abilita l'esecuzione degli script per l'utente corrente:
|
||||||
|
|
||||||
Se Windows ha bloccato il file di bootstrap, sbloccalo esplicitamente:
|
```powershell
|
||||||
|
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
|
||||||
```powershell
|
```
|
||||||
Unblock-File .\scripts\bootstrap_windows_workstation.ps1
|
|
||||||
```
|
Se Windows ha bloccato il file di bootstrap, sbloccalo esplicitamente:
|
||||||
|
|
||||||
1. eseguire `scripts/bootstrap_windows_workstation.ps1` su Windows come amministratore
|
```powershell
|
||||||
2. riavviare Windows se richiesto dalle feature WSL
|
Unblock-File .\scripts\bootstrap_windows_workstation.ps1
|
||||||
3. avviare Ubuntu WSL almeno una volta e completare la creazione dell'utente Linux
|
```
|
||||||
4. installare Ansible dentro WSL Ubuntu
|
|
||||||
5. lanciare il playbook da WSL su `deadalus-wsl` per configurare l'ambiente dev locale
|
1. eseguire `scripts/bootstrap_windows_workstation.ps1` su Windows come amministratore
|
||||||
6. lanciare da WSL anche il playbook su `deadalus-win` via `psrp` per configurare l'host Windows; per default il backend pacchetti Windows e `winget_psrp`
|
2. riavviare Windows se richiesto dalle feature WSL
|
||||||
7. usare VS Code con le estensioni Remote (`WSL`, `SSH`, `Dev Containers`) dal lato Windows
|
3. avviare Ubuntu WSL almeno una volta e completare la creazione dell'utente Linux
|
||||||
|
4. installare Ansible dentro WSL Ubuntu
|
||||||
Per il remoting Windows il repository usa di default `PSRP` con `Negotiate` su `HTTPS/5986`. L'utente di default puo essere un `MicrosoftAccount\...`, con host, utente e password forniti via vault o extra vars. Il backend pacchetti Windows e configurabile con `windows_package_backend` oppure `vault_windows_package_backend`; il default e `winget_psrp`.
|
5. lanciare il playbook da WSL su `deadalus-wsl` per configurare l'ambiente dev locale
|
||||||
|
6. lanciare da WSL anche il playbook su `deadalus-win` via `psrp` per configurare l'host Windows; per default il backend pacchetti Windows e `winget_psrp`
|
||||||
|
7. usare VS Code con le estensioni Remote (`WSL`, `SSH`, `Dev Containers`) dal lato Windows
|
||||||
|
|
||||||
|
Per il remoting Windows il repository usa di default `PSRP` con `Negotiate` su `HTTPS/5986`. L'utente di default puo essere un `MicrosoftAccount\...`, con host, utente e password forniti via vault o extra vars. Il backend pacchetti Windows e configurabile con `windows_package_backend` oppure `vault_windows_package_backend`; il default e `winget_psrp`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -189,43 +189,43 @@ Macchina:
|
|||||||
|
|
||||||
- `prometheus`
|
- `prometheus`
|
||||||
|
|
||||||
Profilo orientato a servizi server e gestione di dotfiles dedicati.
|
Profilo orientato a servizi server e gestione di dotfiles dedicati.
|
||||||
|
|
||||||
Lo stato attuale del profilo server include:
|
Lo stato attuale del profilo server include:
|
||||||
|
|
||||||
- installazione pacchetti base Ubuntu via apt
|
- installazione pacchetti base Ubuntu via apt
|
||||||
- installazione e configurazione di Docker dal repository ufficiale
|
- installazione e configurazione di Docker dal repository ufficiale
|
||||||
- abilitazione dei servizi systemd dichiarati in inventory/group vars
|
- abilitazione dei servizi systemd dichiarati in inventory/group vars
|
||||||
- copia dei dotfiles server e rendering dei template server, incluso il `docker-compose.yml` dello stack servizi
|
- copia dei dotfiles server e rendering dei template server, incluso il `docker-compose.yml` dello stack servizi
|
||||||
- attivazione del firewall UFW con regola SSH esplicita
|
- attivazione del firewall UFW con regola SSH esplicita
|
||||||
- apertura delle porte Syncthing `22000/tcp`, `22000/udp` e `21027/udp`, lasciando la GUI non esposta direttamente su UFW
|
- apertura delle porte Syncthing `22000/tcp`, `22000/udp` e `21027/udp`, lasciando la GUI non esposta direttamente su UFW
|
||||||
|
|
||||||
Utente del profilo server:
|
Utente del profilo server:
|
||||||
|
|
||||||
- il profilo usa `server_username`, `server_user_group` e `server_user_home` definiti in `ansible/inventory/group_vars/server.yml`
|
- il profilo usa `server_username`, `server_user_group` e `server_user_home` definiti in `ansible/inventory/group_vars/server.yml`
|
||||||
- per default `server_username` eredita `username`, ma puo essere sovrascritto per tutti gli host server via inventory oppure a runtime con extra vars
|
- per default `server_username` eredita `username`, ma puo essere sovrascritto per tutti gli host server via inventory oppure a runtime con extra vars
|
||||||
- esempio override da CLI:
|
- esempio override da CLI:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ansible-playbook ansible/site.yml --limit prometheus -e server_username=myuser
|
ansible-playbook ansible/site.yml --limit prometheus -e server_username=myuser
|
||||||
```
|
```
|
||||||
|
|
||||||
- se necessario puoi passare anche:
|
- se necessario puoi passare anche:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ansible-playbook ansible/site.yml --limit prometheus -e server_username=myuser -e server_user_group=mygroup -e server_user_home=/srv/myuser
|
ansible-playbook ansible/site.yml --limit prometheus -e server_username=myuser -e server_user_group=mygroup -e server_user_home=/srv/myuser
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Composizione della configurazione
|
# Composizione della configurazione
|
||||||
|
|
||||||
Deploy mirato della configurazione Emacs sui desktop Void:
|
Deploy mirato della configurazione Emacs sui desktop Void:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ansible-playbook ansible/site.yml --limit ikaros --tags emacs
|
ansible-playbook ansible/site.yml --limit ikaros --tags emacs
|
||||||
ansible-playbook ansible/site.yml --limit nymph --tags emacs
|
ansible-playbook ansible/site.yml --limit nymph --tags emacs
|
||||||
```
|
```
|
||||||
|
|
||||||
La configurazione finale di una macchina è ottenuta combinando più livelli.
|
La configurazione finale di una macchina è ottenuta combinando più livelli.
|
||||||
|
|
||||||
@@ -258,67 +258,67 @@ Questo approccio consente di:
|
|||||||
|
|
||||||
# Ruoli Ansible
|
# Ruoli Ansible
|
||||||
|
|
||||||
I principali ruoli attualmente presenti sono:
|
I principali ruoli attualmente presenti sono:
|
||||||
|
|
||||||
| Role | Descrizione |
|
| Role | Descrizione |
|
||||||
| ------------------------- | ----------------------------------- |
|
| ------------------------- | ----------------------------------- |
|
||||||
| base | configurazione base comune |
|
| base | configurazione base comune |
|
||||||
| packages_void | installazione pacchetti su Void |
|
| packages_void | installazione pacchetti su Void |
|
||||||
| packages_ubuntu | installazione pacchetti su Ubuntu |
|
| packages_ubuntu | installazione pacchetti su Ubuntu |
|
||||||
| packages_fedora | installazione pacchetti su Fedora |
|
| packages_fedora | installazione pacchetti su Fedora |
|
||||||
| services_runit | gestione servizi runit |
|
| services_runit | gestione servizi runit |
|
||||||
| services_systemd | gestione servizi systemd |
|
| services_systemd | gestione servizi systemd |
|
||||||
| profile_desktop_common | bootstrap desktop Void condiviso |
|
| profile_desktop_common | bootstrap desktop Void condiviso |
|
||||||
| profile_desktop_i3 | sessione desktop i3 |
|
| profile_desktop_i3 | sessione desktop i3 |
|
||||||
| profile_desktop_sway | sessione desktop Sway |
|
| profile_desktop_sway | sessione desktop Sway |
|
||||||
| profile_desktop_host | override desktop specifici per host |
|
| profile_desktop_host | override desktop specifici per host |
|
||||||
| profile_workstation_dev_common | configurazione dev workstation condivisa |
|
| profile_workstation_dev_common | configurazione dev workstation condivisa |
|
||||||
| profile_workstation_gnome | configurazione host workstation GNOME |
|
| profile_workstation_gnome | configurazione host workstation GNOME |
|
||||||
| profile_workstation_dev_wsl | configurazione WSL Ubuntu per sviluppo |
|
| profile_workstation_dev_wsl | configurazione WSL Ubuntu per sviluppo |
|
||||||
| profile_workstation_host_windows | configurazione host Windows 11 workstation |
|
| profile_workstation_host_windows | configurazione host Windows 11 workstation |
|
||||||
| profile_server | configurazione server |
|
| profile_server | configurazione server |
|
||||||
| dotfiles_common | distribuzione dotfiles comuni |
|
| dotfiles_common | distribuzione dotfiles comuni |
|
||||||
| dotfiles | distribuzione configurazioni utente |
|
| dotfiles | distribuzione configurazioni utente |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Stato attuale del playbook principale
|
# Stato attuale del playbook principale
|
||||||
|
|
||||||
Il playbook `ansible/site.yml` e attualmente composto da sette blocchi:
|
Il playbook `ansible/site.yml` e attualmente composto da sette blocchi:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
all:!workstation_host_windows -> dotfiles_common
|
all:!workstation_host_windows -> dotfiles_common
|
||||||
void -> packages_void + services_runit + profile_desktop_common + profile_desktop_i3 + profile_desktop_sway + profile_desktop_host
|
void -> packages_void + services_runit + profile_desktop_common + profile_desktop_i3 + profile_desktop_sway + profile_desktop_host
|
||||||
workstation_dev_ubuntu -> packages_ubuntu + services_systemd + profile_workstation_dev_common
|
workstation_dev_ubuntu -> packages_ubuntu + services_systemd + profile_workstation_dev_common
|
||||||
workstation_dev_fedora -> packages_fedora + services_systemd + profile_workstation_dev_common
|
workstation_dev_fedora -> packages_fedora + services_systemd + profile_workstation_dev_common
|
||||||
workstation_host_linux -> profile_workstation_gnome
|
workstation_host_linux -> profile_workstation_gnome
|
||||||
workstation_dev_wsl -> packages_ubuntu + services_systemd + profile_workstation_dev_common + profile_workstation_dev_wsl
|
workstation_dev_wsl -> packages_ubuntu + services_systemd + profile_workstation_dev_common + profile_workstation_dev_wsl
|
||||||
workstation_host_windows -> profile_workstation_host_windows
|
workstation_host_windows -> profile_workstation_host_windows
|
||||||
ubuntu_server -> packages_ubuntu + services_systemd + profile_server
|
ubuntu_server -> packages_ubuntu + services_systemd + profile_server
|
||||||
```
|
```
|
||||||
|
|
||||||
Questo significa che, allo stato attuale:
|
Questo significa che, allo stato attuale:
|
||||||
|
|
||||||
- i desktop Void (`ikaros`, `nymph`) restano il target operativo piu completo
|
- i desktop Void (`ikaros`, `nymph`) restano il target operativo piu completo
|
||||||
- la workstation Ubuntu (`deadalus-ubuntu`) e gestita separando ambiente dev e layer host GNOME
|
- la workstation Ubuntu (`deadalus-ubuntu`) e gestita separando ambiente dev e layer host GNOME
|
||||||
- la workstation Fedora (`deadalus-fedora`) usa lo stesso principio di composizione a gruppi con il ramo Fedora dedicato e con `gsettings` host-specifici dichiarati in inventory
|
- la workstation Fedora (`deadalus-fedora`) usa lo stesso principio di composizione a gruppi con il ramo Fedora dedicato e con `gsettings` host-specifici dichiarati in inventory
|
||||||
- il ramo Windows + WSL e predisposto con bootstrap PowerShell e play Windows/WSL dedicati
|
- il ramo Windows + WSL e predisposto con bootstrap PowerShell e play Windows/WSL dedicati
|
||||||
- il server Ubuntu (`prometheus`) e gestito con pacchetti, servizi, dotfiles server e firewall
|
- il server Ubuntu (`prometheus`) e gestito con pacchetti, servizi, dotfiles server e firewall
|
||||||
- lo stack container server include `navidrome`, `postgres`, `gitea`, `nginx-proxy-manager` e `syncthing`, con GUI Syncthing raggiungibile tramite la rete Docker `web`
|
- lo stack container server include `navidrome`, `postgres`, `gitea`, `nginx-proxy-manager` e `syncthing`, con GUI Syncthing raggiungibile tramite la rete Docker `web`
|
||||||
|
|
||||||
# Dotfiles
|
# Dotfiles
|
||||||
|
|
||||||
La directory `dotfiles/` contiene le configurazioni utente versionate.
|
La directory `dotfiles/` contiene le configurazioni utente versionate.
|
||||||
|
|
||||||
```text
|
```text
|
||||||
dotfiles/
|
dotfiles/
|
||||||
├── common
|
├── common
|
||||||
├── desktop
|
├── desktop
|
||||||
├── server
|
├── server
|
||||||
├── fedora
|
├── fedora
|
||||||
├── workstation
|
├── workstation
|
||||||
├── ikaros
|
├── ikaros
|
||||||
└── nymph
|
└── nymph
|
||||||
```
|
```
|
||||||
|
|
||||||
Le configurazioni sono applicate tramite Ansible e organizzate per livelli:
|
Le configurazioni sono applicate tramite Ansible e organizzate per livelli:
|
||||||
@@ -333,153 +333,154 @@ Le configurazioni sono applicate tramite Ansible e organizzate per livelli:
|
|||||||
|
|
||||||
# Requisiti
|
# Requisiti
|
||||||
|
|
||||||
Per utilizzare il repository sono necessari:
|
Per utilizzare il repository sono necessari:
|
||||||
|
|
||||||
- Python 3
|
- Python 3
|
||||||
- Ansible
|
- Ansible
|
||||||
- `ansible-lint`
|
- `ansible-lint`
|
||||||
- `yamllint`
|
- `yamllint`
|
||||||
- `shellcheck`
|
- `shellcheck`
|
||||||
- collection definite in `ansible/collections/requirements.yml`
|
- collection definite in `ansible/collections/requirements.yml`
|
||||||
- accesso locale o SSH alle macchine target, in base a come e definito l'inventory
|
- accesso locale o SSH alle macchine target, in base a come e definito l'inventory
|
||||||
|
|
||||||
Installazione base:
|
Installazione base:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python3 -m pip install ansible ansible-lint yamllint shellcheck-py
|
python3 -m pip install ansible ansible-lint yamllint shellcheck-py
|
||||||
ansible-galaxy collection install -r ansible/collections/requirements.yml
|
ansible-galaxy collection install -r ansible/collections/requirements.yml
|
||||||
```
|
```
|
||||||
|
|
||||||
Gestione segreti:
|
Gestione segreti:
|
||||||
|
|
||||||
- il repository supporta il caricamento opzionale di `secrets/vault.yml`
|
- il repository supporta il caricamento opzionale di `secrets/vault.yml`
|
||||||
- il repository supporta anche `secrets/vault.local.yml` per override locali non versionati
|
- il repository supporta anche `secrets/vault.local.yml` per override locali non versionati
|
||||||
- `secrets/vault.yml.example` funge da template/esempio
|
- `secrets/vault.yml.example` funge da template/esempio
|
||||||
- se `secrets/vault.yml` non e presente, il playbook continua comunque senza caricare variabili locali opzionali
|
- se `secrets/vault.yml` non e presente, il playbook continua comunque senza caricare variabili locali opzionali
|
||||||
- se `secrets/.vault_pass.gpg` esiste viene usato automaticamente per sbloccare i vault tramite `gpg`; in alternativa resta supportato `secrets/.vault_pass` come fallback legacy locale; se nessuno dei due file esiste Ansible richiede la password in modo interattivo
|
- se `secrets/.vault_pass.gpg` esiste viene usato automaticamente per sbloccare i vault tramite `gpg`; in alternativa resta supportato `secrets/.vault_pass` come fallback legacy locale; se nessuno dei due file esiste Ansible richiede la password in modo interattivo
|
||||||
- per il ramo Windows puoi anche definire `vault_windows_package_backend`, con valori supportati `winget_psrp` e `winget_wsl_local`; il default e `winget_psrp`
|
- per il ramo Windows puoi anche definire `vault_windows_package_backend`, con valori supportati `winget_psrp` e `winget_wsl_local`; il default e `winget_psrp`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# Utilizzo
|
# Utilizzo
|
||||||
|
|
||||||
Eseguire il playbook principale:
|
Eseguire il playbook principale:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ansible-playbook ansible/site.yml
|
ansible-playbook ansible/site.yml
|
||||||
```
|
```
|
||||||
|
|
||||||
Allo stato attuale questo comando:
|
Allo stato attuale questo comando:
|
||||||
|
|
||||||
- distribuisce i dotfiles comuni a tutti gli host
|
- distribuisce i dotfiles comuni a tutti gli host
|
||||||
- per gli host Void applica bootstrap desktop condiviso, sessioni i3/Sway e override specifici per host
|
- per gli host Void applica bootstrap desktop condiviso, sessioni i3/Sway e override specifici per host
|
||||||
- per `workstation_dev_ubuntu` applica pacchetti Ubuntu, servizi systemd e profilo dev comune
|
- per `workstation_dev_ubuntu` applica pacchetti Ubuntu, servizi systemd e profilo dev comune
|
||||||
- per `workstation_dev_fedora` applica pacchetti Fedora, servizi systemd e profilo dev comune
|
- 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_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 `workstation_dev_wsl` applica pacchetti Ubuntu, servizi systemd, profilo dev comune e tweak WSL dedicati
|
||||||
- per `workstation_host_windows` applica il layer host Windows 11 via PSRP, con installazione pacchetti Windows eseguita di default tramite `winget_psrp`
|
- per `workstation_host_windows` applica il layer host Windows 11 via PSRP, con installazione pacchetti Windows eseguita di default tramite `winget_psrp`
|
||||||
- per gli host `ubuntu_server` applica pacchetti Ubuntu, servizi systemd, profilo server, UFW, dotfiles e template dedicati
|
- per gli host `ubuntu_server` applica pacchetti Ubuntu, servizi systemd, profilo server, UFW, dotfiles e template dedicati
|
||||||
- non riavvia automaticamente `emptty`; le modifiche al display manager vanno applicate manualmente da SSH o da una TTY separata
|
- non riavvia automaticamente `emptty`; le modifiche al display manager vanno applicate manualmente da SSH o da una TTY separata
|
||||||
- carica `secrets/vault.yml` solo se presente
|
- carica `secrets/vault.yml` solo se presente
|
||||||
- carica `secrets/vault.local.yml` solo se presente, dopo `vault.yml`, cosi gli override locali hanno precedenza
|
- carica `secrets/vault.local.yml` solo se presente, dopo `vault.yml`, cosi gli override locali hanno precedenza
|
||||||
|
|
||||||
Per validare prima di applicare:
|
Per validare prima di applicare:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ansible-playbook ansible/site.yml --syntax-check
|
ansible-playbook ansible/site.yml --syntax-check
|
||||||
ansible-playbook ansible/site.yml --limit ikaros --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 nymph --check --diff
|
||||||
ansible-playbook ansible/site.yml --limit deadalus-ubuntu --check --diff
|
ansible-playbook ansible/site.yml --limit deadalus-ubuntu --check --diff
|
||||||
ansible-playbook ansible/site.yml --limit deadalus-fedora --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 deadalus-wsl --check --diff
|
||||||
ansible-playbook ansible/site.yml --limit prometheus --check --diff
|
ansible-playbook ansible/site.yml --limit prometheus --check --diff
|
||||||
ansible-lint ansible/site.yml
|
ansible-lint ansible/site.yml
|
||||||
ansible-lint ansible/roles
|
ansible-lint ansible/roles
|
||||||
yamllint ansible/
|
yamllint ansible/
|
||||||
```
|
```
|
||||||
|
|
||||||
Per testare un override dell'utente server senza modificare l'inventory:
|
Per testare un override dell'utente server senza modificare l'inventory:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ansible-playbook ansible/site.yml --limit prometheus --check --diff -e server_username=myuser
|
ansible-playbook ansible/site.yml --limit prometheus --check --diff -e server_username=myuser
|
||||||
```
|
```
|
||||||
|
|
||||||
Per validazioni piu mirate:
|
Per validazioni piu mirate:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ansible-playbook ansible/site.yml --limit <host> --tags <tag1>,<tag2> --check --diff
|
ansible-playbook ansible/site.yml --limit <host> --tags <tag1>,<tag2> --check --diff
|
||||||
ansible-playbook ansible/site.yml --limit <host> --start-at-task "<task name>" --check --diff
|
ansible-playbook ansible/site.yml --limit <host> --start-at-task "<task name>" --check --diff
|
||||||
ansible-lint ansible/roles/<role>
|
ansible-lint ansible/roles/<role>
|
||||||
yamllint ansible/path/to/file.yml
|
yamllint ansible/path/to/file.yml
|
||||||
docker compose -f /opt/docker/server/docker-compose.yml config
|
docker compose -f /opt/docker/server/docker-compose.yml config
|
||||||
```
|
```
|
||||||
|
|
||||||
## Tag supportati dal playbook
|
## Tag supportati dal playbook
|
||||||
|
|
||||||
Per vedere l'elenco reale aggiornato dei tag disponibili:
|
Per vedere l'elenco reale aggiornato dei tag disponibili:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ansible-playbook ansible/site.yml --list-tags
|
ansible-playbook ansible/site.yml --list-tags
|
||||||
```
|
```
|
||||||
|
|
||||||
Allo stato attuale `ansible/site.yml` espone questi tag:
|
Allo stato attuale `ansible/site.yml` espone questi tag:
|
||||||
|
|
||||||
| Tag | Scopo | Ambito principale |
|
| Tag | Scopo | Ambito principale |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `always` | pre-task sempre eseguiti, inclusi caricamento vault e validazioni preliminari | common, Windows |
|
| `always` | pre-task sempre eseguiti, inclusi caricamento vault e validazioni preliminari | common, Windows |
|
||||||
| `dotfiles` | distribuzione/configurazione dotfiles | tutti i profili |
|
| `dotfiles` | distribuzione/configurazione dotfiles | tutti i profili |
|
||||||
| `dotfiles:common` | dotfiles comuni condivisi | common, workstation, server |
|
| `dotfiles:common` | dotfiles comuni condivisi | common, workstation, server |
|
||||||
| `dotfiles:desktop` | dotfiles desktop | desktop Void |
|
| `dotfiles:desktop` | dotfiles desktop | desktop Void |
|
||||||
| `dotfiles:host` | override host-specifici desktop | desktop Void |
|
| `dotfiles:host` | override host-specifici desktop | desktop Void |
|
||||||
| `dotfiles:server` | dotfiles dedicati al profilo server | server |
|
| `dotfiles:server` | dotfiles dedicati al profilo server | server |
|
||||||
| `dotfiles:workstation` | dotfiles dedicati alle workstation | workstation Linux, WSL |
|
| `dotfiles:workstation` | dotfiles dedicati alle workstation | workstation Linux, WSL |
|
||||||
| `emptty` | gestione display manager `emptty` | desktop Void |
|
| `emptty` | gestione display manager `emptty` | desktop Void |
|
||||||
| `gnome` | configurazione host GNOME | workstation host Linux, parte desktop |
|
| `gnome` | configurazione host GNOME | workstation host Linux, parte desktop |
|
||||||
| `i3` | sessione/configurazione i3 | desktop Void |
|
| `i3` | sessione/configurazione i3 | desktop Void |
|
||||||
| `nvidia` | componenti NVIDIA desktop | desktop Void |
|
| `npm` | installazione pacchetti npm globali | desktop Void, workstation Linux, WSL |
|
||||||
| `packages` | installazione e aggiornamento pacchetti | tutti i profili |
|
| `nvidia` | componenti NVIDIA desktop | desktop Void |
|
||||||
| `services` | gestione servizi runit/systemd/Windows | tutti i profili |
|
| `packages` | installazione e aggiornamento pacchetti | tutti i profili |
|
||||||
| `sway` | sessione/configurazione Sway | desktop Void |
|
| `services` | gestione servizi runit/systemd/Windows | tutti i profili |
|
||||||
| `vscode` | installazione/configurazione VS Code | Fedora, host Linux, Windows |
|
| `sway` | sessione/configurazione Sway | desktop Void |
|
||||||
| `wsl` | bootstrap e configurazione WSL | WSL, Windows |
|
| `vscode` | installazione/configurazione VS Code | Fedora, host Linux, Windows |
|
||||||
|
| `wsl` | bootstrap e configurazione WSL | WSL, Windows |
|
||||||
Esempi pratici:
|
|
||||||
|
Esempi pratici:
|
||||||
```bash
|
|
||||||
ansible-playbook ansible/site.yml --limit nymph --tags dotfiles:desktop,sway --check --diff
|
```bash
|
||||||
ansible-playbook ansible/site.yml --limit deadalus-fedora --tags packages,vscode --check --diff
|
ansible-playbook ansible/site.yml --limit nymph --tags dotfiles:desktop,sway --check --diff
|
||||||
ansible-playbook ansible/site.yml --limit prometheus --tags services,dotfiles:server --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
|
||||||
|
```
|
||||||
---
|
|
||||||
|
---
|
||||||
|
|
||||||
# Bootstrap di una nuova macchina
|
# Bootstrap di una nuova macchina
|
||||||
|
|
||||||
Una nuova macchina può essere inizializzata con i seguenti passaggi:
|
Una nuova macchina può essere inizializzata con i seguenti passaggi:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone <repo>
|
git clone <repo>
|
||||||
cd <repo-dir>
|
cd <repo-dir>
|
||||||
ansible-galaxy collection install -r ansible/collections/requirements.yml
|
ansible-galaxy collection install -r ansible/collections/requirements.yml
|
||||||
ansible-playbook ansible/site.yml
|
ansible-playbook ansible/site.yml
|
||||||
```
|
```
|
||||||
|
|
||||||
Dopo l'esecuzione del playbook la macchina verra configurata secondo il profilo definito e i ruoli attualmente orchestrati.
|
Dopo l'esecuzione del playbook la macchina verra configurata secondo il profilo definito e i ruoli attualmente orchestrati.
|
||||||
|
|
||||||
Per il flusso mail desktop esiste inoltre uno script dedicato:
|
Per il flusso mail desktop esiste inoltre uno script dedicato:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
scripts/bootstrap_mail.sh
|
scripts/bootstrap_mail.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
Lo script si occupa del bootstrap dei secret nel keyring, del primo sync con `mbsync` e dell'inizializzazione di `mu` usando la configurazione mail generata dai template.
|
Lo script si occupa del bootstrap dei secret nel keyring, del primo sync con `mbsync` e dell'inizializzazione di `mu` usando la configurazione mail generata dai template.
|
||||||
|
|
||||||
Se modifichi questo script, valida almeno con:
|
Se modifichi questo script, valida almeno con:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sh -n scripts/bootstrap_mail.sh
|
sh -n scripts/bootstrap_mail.sh
|
||||||
shellcheck scripts/bootstrap_mail.sh
|
shellcheck scripts/bootstrap_mail.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -499,13 +500,13 @@ Questo consente di ricreare qualsiasi macchina partendo esclusivamente dal repos
|
|||||||
|
|
||||||
# Roadmap
|
# Roadmap
|
||||||
|
|
||||||
Possibili evoluzioni future:
|
Possibili evoluzioni future:
|
||||||
|
|
||||||
- hardening sicurezza server
|
- hardening sicurezza server
|
||||||
- configurazione backup
|
- configurazione backup
|
||||||
- testing automatico playbook
|
- testing automatico playbook
|
||||||
- integrazione CI
|
- integrazione CI
|
||||||
- supporto ad altre distribuzioni Linux
|
- supporto ad altre distribuzioni Linux
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -50,6 +50,42 @@ common_dotfiles:
|
|||||||
dest: .vimrc
|
dest: .vimrc
|
||||||
mode: "0644"
|
mode: "0644"
|
||||||
- name: bat config
|
- name: bat config
|
||||||
src: .config/bat/.config/bat/
|
src: .config/bat/
|
||||||
dest: .config/bat/
|
dest: .config/bat/
|
||||||
mode: preserve
|
mode: preserve
|
||||||
|
|
||||||
|
ai_agents_npm_packages:
|
||||||
|
- name: "opencode-ai"
|
||||||
|
state: latest
|
||||||
|
- name: "@anthropic-ai/claude-code"
|
||||||
|
state: latest
|
||||||
|
- name: "@openai/codex"
|
||||||
|
state: latest
|
||||||
|
- name: "@google/gemini-cli"
|
||||||
|
state: latest
|
||||||
|
|
||||||
|
ai_agents_enabled: true
|
||||||
|
|
||||||
|
ai_agents_dotfiles:
|
||||||
|
- name: AI common config
|
||||||
|
src: .config/ai/
|
||||||
|
dest: .config/ai/
|
||||||
|
mode: preserve
|
||||||
|
- name: Gemini CLI config
|
||||||
|
src: .gemini/
|
||||||
|
dest: .gemini/
|
||||||
|
mode: preserve
|
||||||
|
- name: OpenCode config
|
||||||
|
src: .config/opencode/
|
||||||
|
dest: .config/opencode/
|
||||||
|
mode: preserve
|
||||||
|
- name: Claude Code memory
|
||||||
|
src: .claude/
|
||||||
|
dest: .claude/
|
||||||
|
mode: preserve
|
||||||
|
|
||||||
|
ai_agents_templates:
|
||||||
|
- name: Codex config
|
||||||
|
src: .codex/config.toml.j2
|
||||||
|
dest: .codex/config.toml
|
||||||
|
mode: "0644"
|
||||||
|
|||||||
160
ansible/inventory/group_vars/arch.yml
Normal file
160
ansible/inventory/group_vars/arch.yml
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
---
|
||||||
|
arch_packages_base:
|
||||||
|
- 7zip
|
||||||
|
- archlinux-keyring
|
||||||
|
- avahi
|
||||||
|
- base-devel
|
||||||
|
- bluez
|
||||||
|
- clang
|
||||||
|
- cmake
|
||||||
|
- cups
|
||||||
|
- cups-filters
|
||||||
|
- cups-pk-helper
|
||||||
|
- fastfetch
|
||||||
|
- flatpak
|
||||||
|
- fuse3
|
||||||
|
- gcc
|
||||||
|
- gdb
|
||||||
|
- git-delta
|
||||||
|
- github-cli
|
||||||
|
- gnome-keyring
|
||||||
|
- go
|
||||||
|
- gvfs
|
||||||
|
- gvfs-mtp
|
||||||
|
- gvfs-smb
|
||||||
|
- imagemagick
|
||||||
|
- isync
|
||||||
|
- libsecret
|
||||||
|
- libtool
|
||||||
|
- linux
|
||||||
|
- linux-headers
|
||||||
|
- lm_sensors
|
||||||
|
- man-db
|
||||||
|
- man-pages
|
||||||
|
- msmtp
|
||||||
|
- networkmanager
|
||||||
|
- nodejs
|
||||||
|
- npm
|
||||||
|
- pavucontrol
|
||||||
|
- pipewire
|
||||||
|
- pipewire-alsa
|
||||||
|
- pipewire-jack
|
||||||
|
- pipewire-pulse
|
||||||
|
- pkgconf
|
||||||
|
- plocate
|
||||||
|
- podman
|
||||||
|
- podman-compose
|
||||||
|
- rclone
|
||||||
|
- sane
|
||||||
|
- sane-airscan
|
||||||
|
- seahorse
|
||||||
|
- simple-scan
|
||||||
|
- speech-dispatcher
|
||||||
|
- syncthing
|
||||||
|
- tealdeer
|
||||||
|
- tmux
|
||||||
|
- tree-sitter-cli
|
||||||
|
- ufw
|
||||||
|
- wireplumber
|
||||||
|
- xdotool
|
||||||
|
- yt-dlp
|
||||||
|
|
||||||
|
arch_desktop_common_packages:
|
||||||
|
- brightnessctl
|
||||||
|
- dex
|
||||||
|
- pinentry
|
||||||
|
- xdg-desktop-portal
|
||||||
|
- xdg-desktop-portal-gtk
|
||||||
|
- xdg-user-dirs
|
||||||
|
|
||||||
|
arch_desktop_gnome_packages:
|
||||||
|
- baobab
|
||||||
|
- gdm
|
||||||
|
- gnome-backgrounds
|
||||||
|
- gnome-calculator
|
||||||
|
- gnome-calendar
|
||||||
|
- gnome-characters
|
||||||
|
- gnome-clocks
|
||||||
|
- gnome-console
|
||||||
|
- gnome-control-center
|
||||||
|
- gnome-disk-utility
|
||||||
|
- gnome-font-viewer
|
||||||
|
- gnome-session
|
||||||
|
- gnome-settings-daemon
|
||||||
|
- gnome-shell
|
||||||
|
- gnome-shell-extensions
|
||||||
|
- gnome-tweaks
|
||||||
|
- gvfs-afc
|
||||||
|
- gvfs-dnssd
|
||||||
|
- gvfs-goa
|
||||||
|
- gvfs-gphoto2
|
||||||
|
- gvfs-nfs
|
||||||
|
- gvfs-onedrive
|
||||||
|
- gvfs-wsdd
|
||||||
|
- loupe
|
||||||
|
- mutter
|
||||||
|
- nautilus
|
||||||
|
- papers
|
||||||
|
- rygel
|
||||||
|
- showtime
|
||||||
|
- snapshot
|
||||||
|
- sushi
|
||||||
|
- xdg-desktop-portal-gnome
|
||||||
|
- xdg-user-dirs-gtk
|
||||||
|
|
||||||
|
arch_profile_packages:
|
||||||
|
- deluge
|
||||||
|
- dnsmasq
|
||||||
|
- edk2-ovmf
|
||||||
|
- emacs-wayland
|
||||||
|
- ffmpegthumbnailer
|
||||||
|
- firefox
|
||||||
|
- fontconfig
|
||||||
|
- freetype2
|
||||||
|
- gufw
|
||||||
|
- iproute2
|
||||||
|
- libvterm
|
||||||
|
- libx11
|
||||||
|
- libxft
|
||||||
|
- libvirt
|
||||||
|
- libreoffice-fresh
|
||||||
|
- meld
|
||||||
|
- mpv
|
||||||
|
- noto-fonts
|
||||||
|
- noto-fonts-emoji
|
||||||
|
- pdfarranger
|
||||||
|
- poppler
|
||||||
|
- poppler-glib
|
||||||
|
- qemu-desktop
|
||||||
|
- remmina
|
||||||
|
- ripgrep
|
||||||
|
- rsync
|
||||||
|
- ruff
|
||||||
|
- rustup
|
||||||
|
- texlive-basic
|
||||||
|
- texlive-binextra
|
||||||
|
- texlive-latex
|
||||||
|
- texlive-latexextra
|
||||||
|
- ttf-hack-nerd
|
||||||
|
- ttf-liberation
|
||||||
|
- ttf-nerd-fonts-symbols
|
||||||
|
- ctags
|
||||||
|
- uv
|
||||||
|
- virt-manager
|
||||||
|
- xournalpp
|
||||||
|
- zstd
|
||||||
|
|
||||||
|
enabled_services:
|
||||||
|
- NetworkManager
|
||||||
|
- avahi-daemon
|
||||||
|
- bluetooth
|
||||||
|
- cups
|
||||||
|
- libvirtd
|
||||||
|
- ufw
|
||||||
|
|
||||||
|
enabled_services_only:
|
||||||
|
- gdm
|
||||||
|
|
||||||
|
desktop_systemd_user_services:
|
||||||
|
- syncthing.service
|
||||||
|
- rclone-pcloud.service
|
||||||
@@ -6,147 +6,13 @@ desktop_sessions_enabled:
|
|||||||
|
|
||||||
desktop_default_session: i3
|
desktop_default_session: i3
|
||||||
desktop_default_session_env: xorg
|
desktop_default_session_env: xorg
|
||||||
desktop_restart_emptty_automatically: false
|
|
||||||
desktop_emptty_session_error_logging: disabled
|
|
||||||
|
|
||||||
desktop_ui_font_family: Noto Sans
|
|
||||||
desktop_ui_font_size: 10
|
|
||||||
desktop_fixed_font_family: Hack Nerd Font
|
|
||||||
desktop_sway_font_size: 10
|
|
||||||
desktop_alacritty_font_size: 12
|
|
||||||
desktop_emacs_font_size: 14
|
|
||||||
desktop_cursor_theme: Yaru
|
|
||||||
desktop_cursor_size: 24
|
|
||||||
desktop_icon_theme: Yaru-orange-dark
|
|
||||||
|
|
||||||
desktop_common_packages:
|
|
||||||
- brightnessctl
|
|
||||||
- dex
|
|
||||||
- emptty
|
|
||||||
- pinentry-emacs
|
|
||||||
- pinentry-gtk
|
|
||||||
- turnstile
|
|
||||||
- udiskie
|
|
||||||
- xdg-desktop-portal
|
|
||||||
- xdg-desktop-portal-gtk
|
|
||||||
- xdg-user-dirs
|
|
||||||
|
|
||||||
desktop_i3_packages:
|
|
||||||
- arandr
|
|
||||||
- autorandr
|
|
||||||
- feh
|
|
||||||
- i3
|
|
||||||
- i3blocks
|
|
||||||
- i3blocks-blocklets
|
|
||||||
- i3lock-color
|
|
||||||
- i3status
|
|
||||||
- dunst
|
|
||||||
- network-manager-applet
|
|
||||||
- rofi
|
|
||||||
- scrot
|
|
||||||
- setxkbmap
|
|
||||||
- blueman
|
|
||||||
- volumeicon
|
|
||||||
- xclip
|
|
||||||
- xfce-polkit
|
|
||||||
- xfce4-clipman-plugin
|
|
||||||
- xfce4-screenshooter
|
|
||||||
- xkbutils
|
|
||||||
- xorg-fonts
|
|
||||||
- xorg-minimal
|
|
||||||
- xss-lock
|
|
||||||
|
|
||||||
desktop_sway_packages:
|
|
||||||
- adw-gtk-theme
|
|
||||||
- flameshot
|
|
||||||
- grim
|
|
||||||
- kanshi
|
|
||||||
- qt5ct
|
|
||||||
- qt6ct
|
|
||||||
- slurp
|
|
||||||
- swayfx
|
|
||||||
- wl-clipboard
|
|
||||||
- xhost
|
|
||||||
- xdg-desktop-portal-wlr
|
|
||||||
- xorg-server-xwayland
|
|
||||||
|
|
||||||
profile_packages:
|
|
||||||
- alacritty
|
|
||||||
- bluez
|
|
||||||
- bridge-utils
|
|
||||||
- ctags
|
|
||||||
- firefox
|
|
||||||
- deluge-gtk
|
|
||||||
- dnsmasq
|
|
||||||
- emacs-gtk3
|
|
||||||
- poppler-glib
|
|
||||||
- poppler-utils
|
|
||||||
- exo
|
|
||||||
- fontconfig-devel
|
|
||||||
- freetype-devel
|
|
||||||
- gvfs-cdda
|
|
||||||
- gvfs-mtp
|
|
||||||
- gvfs-smb
|
|
||||||
- gufw
|
|
||||||
- libvirt
|
|
||||||
- libspa-bluetooth
|
|
||||||
- libreoffice
|
|
||||||
- liberation-fonts-ttf
|
|
||||||
- libvterm-devel
|
|
||||||
- libX11-devel
|
|
||||||
- libXft-devel
|
|
||||||
- meld
|
|
||||||
- mpv
|
|
||||||
- nerd-fonts-ttf
|
|
||||||
- nerd-fonts-symbols-ttf
|
|
||||||
- pdfarranger
|
|
||||||
- playerctl
|
|
||||||
- qemu
|
|
||||||
- qemu-firmware
|
|
||||||
- qemu-img
|
|
||||||
- qemu-tools
|
|
||||||
- remmina
|
|
||||||
- ripgrep
|
|
||||||
- rustup
|
|
||||||
- ristretto
|
|
||||||
- rsync
|
|
||||||
- shotwell
|
|
||||||
- ruff
|
|
||||||
- terminus-font
|
|
||||||
- texlive
|
|
||||||
- ty
|
|
||||||
- tumbler
|
|
||||||
- uv
|
|
||||||
- Thunar
|
|
||||||
- thunar-archive-plugin
|
|
||||||
- thunar-volman
|
|
||||||
- ffmpegthumbnailer
|
|
||||||
- virt-manager
|
|
||||||
- virt-manager-tools
|
|
||||||
- wireplumber
|
|
||||||
- xarchiver
|
|
||||||
- xournalpp
|
|
||||||
- yaru
|
|
||||||
- yaru-plus
|
|
||||||
- zstd
|
|
||||||
|
|
||||||
desktop_source_tools:
|
desktop_source_tools:
|
||||||
- name: st
|
|
||||||
repo: https://codeberg.org/fscotto/st
|
|
||||||
build_cmd: make
|
|
||||||
binary_name: st
|
|
||||||
install_name: st
|
|
||||||
- name: gf
|
- name: gf
|
||||||
repo: https://github.com/nakst/gf.git
|
repo: https://github.com/nakst/gf.git
|
||||||
build_cmd: ./build.sh
|
build_cmd: ./build.sh
|
||||||
binary_name: gf2
|
binary_name: gf2
|
||||||
install_name: gf
|
install_name: gf
|
||||||
- name: bookokrat
|
|
||||||
repo: https://github.com/bugzmanov/bookokrat
|
|
||||||
build_cmd: cargo build --release
|
|
||||||
binary_name: bookokrat
|
|
||||||
install_name: bookokrat
|
|
||||||
build_output_path: target/release/bookokrat
|
|
||||||
- name: llmfit
|
- name: llmfit
|
||||||
repo: https://github.com/AlexsJones/llmfit
|
repo: https://github.com/AlexsJones/llmfit
|
||||||
build_cmd: cargo build --release
|
build_cmd: cargo build --release
|
||||||
@@ -162,27 +28,13 @@ desktop_source_tools:
|
|||||||
|
|
||||||
desktop_binary_tools: []
|
desktop_binary_tools: []
|
||||||
|
|
||||||
desktop_npm_packages:
|
desktop_npm_packages: "{{ ai_agents_npm_packages + [] }}"
|
||||||
- name: "opencode-ai"
|
|
||||||
state: latest
|
|
||||||
|
|
||||||
desktop_common_dotfiles:
|
desktop_common_dotfiles:
|
||||||
- name: XDG autostart entries
|
- name: XDG autostart entries
|
||||||
src: .config/autostart/
|
src: .config/autostart/
|
||||||
dest: .config/autostart/
|
dest: .config/autostart/
|
||||||
mode: preserve
|
mode: preserve
|
||||||
- name: alacritty config
|
|
||||||
src: .config/alacritty/
|
|
||||||
dest: .config/alacritty/
|
|
||||||
mode: preserve
|
|
||||||
- name: Thunar config
|
|
||||||
src: .config/Thunar/
|
|
||||||
dest: .config/Thunar/
|
|
||||||
mode: preserve
|
|
||||||
- name: MIME application defaults
|
|
||||||
src: .config/mimeapps.list
|
|
||||||
dest: .config/mimeapps.list
|
|
||||||
mode: "0644"
|
|
||||||
- name: fastfetch config
|
- name: fastfetch config
|
||||||
src: .config/fastfetch/
|
src: .config/fastfetch/
|
||||||
dest: .config/fastfetch/
|
dest: .config/fastfetch/
|
||||||
@@ -199,26 +51,38 @@ desktop_common_dotfiles:
|
|||||||
src: .config/yt-dlp/
|
src: .config/yt-dlp/
|
||||||
dest: .config/yt-dlp/
|
dest: .config/yt-dlp/
|
||||||
mode: preserve
|
mode: preserve
|
||||||
- name: OpenCode config
|
|
||||||
src: .config/opencode/
|
|
||||||
dest: .config/opencode/
|
|
||||||
mode: preserve
|
|
||||||
- name: MPV config
|
- name: MPV config
|
||||||
src: .config/mpv/
|
src: .config/mpv/
|
||||||
dest: .config/mpv/
|
dest: .config/mpv/
|
||||||
mode: preserve
|
mode: preserve
|
||||||
- name: Udiskie config
|
- name: Bash cargo env fragment
|
||||||
src: .config/udiskie/
|
src: .bashrc.d/08-cargo-env.sh
|
||||||
dest: .config/udiskie/
|
dest: .bashrc.d/08-cargo-env.sh
|
||||||
mode: preserve
|
mode: "0644"
|
||||||
- name: Turnstile user services
|
- name: Bash GPG TTY fragment
|
||||||
src: .config/service/
|
src: .bashrc.d/10-gpg-tty.sh
|
||||||
dest: .config/service/
|
dest: .bashrc.d/10-gpg-tty.sh
|
||||||
mode: preserve
|
mode: "0644"
|
||||||
- name: Bash profile fragments
|
- name: Bash man page colors fragment
|
||||||
src: .bashrc.d/
|
src: .bashrc.d/12-manpages.sh
|
||||||
dest: .bashrc.d/
|
dest: .bashrc.d/12-manpages.sh
|
||||||
mode: preserve
|
mode: "0644"
|
||||||
|
- name: Bash editor fragment
|
||||||
|
src: .bashrc.d/20-editor-desktop.sh
|
||||||
|
dest: .bashrc.d/20-editor-desktop.sh
|
||||||
|
mode: "0644"
|
||||||
|
- name: Bash Emacs client fragment
|
||||||
|
src: .bashrc.d/25-emacs-client-desktop.sh
|
||||||
|
dest: .bashrc.d/25-emacs-client-desktop.sh
|
||||||
|
mode: "0644"
|
||||||
|
- name: Bash VM helper fragment
|
||||||
|
src: .bashrc.d/30-runvm.sh
|
||||||
|
dest: .bashrc.d/30-runvm.sh
|
||||||
|
mode: "0644"
|
||||||
|
- name: Bash Ansible playbook helper fragment
|
||||||
|
src: .bashrc.d/50-ap.sh
|
||||||
|
dest: .bashrc.d/50-ap.sh
|
||||||
|
mode: "0644"
|
||||||
- name: .gitignore_global
|
- name: .gitignore_global
|
||||||
src: .gitignore_global
|
src: .gitignore_global
|
||||||
dest: .gitignore_global
|
dest: .gitignore_global
|
||||||
@@ -239,31 +103,29 @@ desktop_common_dotfiles:
|
|||||||
src: .authinfo.gpg
|
src: .authinfo.gpg
|
||||||
dest: .authinfo.gpg
|
dest: .authinfo.gpg
|
||||||
mode: "0600"
|
mode: "0600"
|
||||||
- name: GTK theme setup script
|
- name: Calibre database Flatpak wrapper
|
||||||
src: .local/bin/setup-gtk-theme
|
src: .local/bin/calibredb
|
||||||
dest: .local/bin/setup-gtk-theme
|
dest: .local/bin/calibredb
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
- name: Turnstile environment update script
|
|
||||||
src: .local/bin/update-turnstile-env
|
|
||||||
dest: .local/bin/update-turnstile-env
|
|
||||||
mode: "0755"
|
|
||||||
- name: Gufw Sway wrapper
|
|
||||||
src: .local/bin/run-gufw
|
|
||||||
dest: .local/bin/run-gufw
|
|
||||||
mode: "0755"
|
|
||||||
- name: Udiskie password helper
|
|
||||||
src: .local/bin/udiskie-password
|
|
||||||
dest: .local/bin/udiskie-password
|
|
||||||
mode: "0755"
|
|
||||||
- name: Desktop application overrides
|
|
||||||
src: .local/share/applications/
|
|
||||||
dest: .local/share/applications/
|
|
||||||
mode: preserve
|
|
||||||
- name: SSH config
|
- name: SSH config
|
||||||
src: .ssh/config
|
src: .ssh/config
|
||||||
dest: .ssh/config
|
dest: .ssh/config
|
||||||
mode: "0600"
|
mode: "0600"
|
||||||
|
|
||||||
|
desktop_arch_dotfiles:
|
||||||
|
- name: rclone pcloud systemd user service
|
||||||
|
src: .config/systemd/user/rclone-pcloud.service
|
||||||
|
dest: .config/systemd/user/rclone-pcloud.service
|
||||||
|
mode: "0644"
|
||||||
|
- name: syncthing systemd user service
|
||||||
|
src: .config/systemd/user/syncthing.service
|
||||||
|
dest: .config/systemd/user/syncthing.service
|
||||||
|
mode: "0644"
|
||||||
|
- name: MIME application defaults
|
||||||
|
src: .config/mimeapps.arch.list
|
||||||
|
dest: .config/mimeapps.list
|
||||||
|
mode: "0644"
|
||||||
|
|
||||||
desktop_emacs_dotfiles:
|
desktop_emacs_dotfiles:
|
||||||
- name: Emacs config
|
- name: Emacs config
|
||||||
src: .emacs.d/
|
src: .emacs.d/
|
||||||
@@ -301,10 +163,6 @@ desktop_sway_dotfiles:
|
|||||||
src: .config/i3/wallpapers/
|
src: .config/i3/wallpapers/
|
||||||
dest: .config/sway/wallpapers/
|
dest: .config/sway/wallpapers/
|
||||||
mode: preserve
|
mode: preserve
|
||||||
- name: Noctalia wallpaper library
|
|
||||||
src: Pictures/Wallpapers/
|
|
||||||
dest: Pictures/Wallpapers/
|
|
||||||
mode: preserve
|
|
||||||
- name: Sway session wrapper
|
- name: Sway session wrapper
|
||||||
src: .local/bin/start-sway-session
|
src: .local/bin/start-sway-session
|
||||||
dest: .local/bin/start-sway-session
|
dest: .local/bin/start-sway-session
|
||||||
@@ -327,8 +185,6 @@ noctalia_bar_monitors:
|
|||||||
|
|
||||||
noctalia_screen_overrides: []
|
noctalia_screen_overrides: []
|
||||||
|
|
||||||
noctalia_wallpaper: "{{ user_home }}/Pictures/Wallpapers/star-wars-trio.jpg"
|
|
||||||
|
|
||||||
desktop_flatpak_packages:
|
desktop_flatpak_packages:
|
||||||
- be.alexandervanhee.gradia
|
- be.alexandervanhee.gradia
|
||||||
- ch.protonmail.protonmail-bridge
|
- ch.protonmail.protonmail-bridge
|
||||||
@@ -340,14 +196,4 @@ desktop_flatpak_packages:
|
|||||||
- org.telegram.desktop
|
- org.telegram.desktop
|
||||||
|
|
||||||
desktop_flatpak_extensions:
|
desktop_flatpak_extensions:
|
||||||
- org.gtk.Gtk3theme.Yaru-Orange-dark//3.22
|
- org.gtk.Gtk3theme.Yaru-Blue-dark//stable
|
||||||
|
|
||||||
desktop_flatpak_global_filesystems:
|
|
||||||
- xdg-config/gtk-3.0:ro
|
|
||||||
- xdg-config/gtk-4.0:ro
|
|
||||||
- xdg-config/qt5ct:ro
|
|
||||||
- xdg-config/qt6ct:ro
|
|
||||||
|
|
||||||
desktop_flatpak_global_env:
|
|
||||||
- QT_QPA_PLATFORM=wayland
|
|
||||||
- QT_QPA_PLATFORMTHEME=qt6ct
|
|
||||||
|
|||||||
@@ -50,6 +50,9 @@ workstation_host_linux_packages_fedora:
|
|||||||
- code
|
- code
|
||||||
- firewall-config
|
- firewall-config
|
||||||
- gnome-extensions-app
|
- gnome-extensions-app
|
||||||
|
- gnome-shell-extension-appindicator
|
||||||
|
- gnome-shell-extension-just-perfection
|
||||||
|
- gnome-shell-extension-no-overview
|
||||||
- gnome-tweaks
|
- gnome-tweaks
|
||||||
- libreoffice
|
- libreoffice
|
||||||
- meld
|
- meld
|
||||||
@@ -58,6 +61,7 @@ workstation_host_linux_packages_fedora:
|
|||||||
- pinentry-gnome3
|
- pinentry-gnome3
|
||||||
- podman
|
- podman
|
||||||
- podman-compose
|
- podman-compose
|
||||||
|
- rclone
|
||||||
- yubikey-manager
|
- yubikey-manager
|
||||||
|
|
||||||
workstation_flatpak_remote_name: flathub
|
workstation_flatpak_remote_name: flathub
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ effective_username: "{{ server_username }}"
|
|||||||
effective_user_group: "{{ server_user_group }}"
|
effective_user_group: "{{ server_user_group }}"
|
||||||
effective_user_home: "{{ server_user_home }}"
|
effective_user_home: "{{ server_user_home }}"
|
||||||
server_container_stack_dir: /opt/docker/server
|
server_container_stack_dir: /opt/docker/server
|
||||||
|
ai_agents_enabled: false
|
||||||
|
|
||||||
profile_packages:
|
profile_packages:
|
||||||
- avahi-daemon
|
- avahi-daemon
|
||||||
@@ -92,6 +93,14 @@ server_directories:
|
|||||||
owner: "1000"
|
owner: "1000"
|
||||||
group: "1000"
|
group: "1000"
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
|
- path: /srv/nextcloud
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: "0755"
|
||||||
|
- path: /srv/nextcloud/data
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
server_ufw_rules:
|
server_ufw_rules:
|
||||||
- rule: allow
|
- rule: allow
|
||||||
|
|||||||
@@ -1,4 +1,11 @@
|
|||||||
---
|
---
|
||||||
|
desktop_void_source_tools:
|
||||||
|
- name: st
|
||||||
|
repo: https://codeberg.org/fscotto/st
|
||||||
|
build_cmd: make
|
||||||
|
binary_name: st
|
||||||
|
install_name: st
|
||||||
|
|
||||||
void_packages_base:
|
void_packages_base:
|
||||||
- 7zip
|
- 7zip
|
||||||
- NetworkManager
|
- NetworkManager
|
||||||
@@ -18,18 +25,25 @@ void_packages_base:
|
|||||||
- fuse3
|
- fuse3
|
||||||
- gcc
|
- gcc
|
||||||
- gdb
|
- gdb
|
||||||
|
- gist
|
||||||
|
- github-cli
|
||||||
- gnome-keyring
|
- gnome-keyring
|
||||||
- go
|
- go
|
||||||
- gvfs
|
- gvfs
|
||||||
|
- hugo
|
||||||
- ImageMagick
|
- ImageMagick
|
||||||
- isync
|
- isync
|
||||||
- libsecret
|
- libsecret
|
||||||
- libtool
|
- libtool
|
||||||
|
- linux-mainline
|
||||||
- lm_sensors
|
- lm_sensors
|
||||||
|
- man-pages-devel
|
||||||
|
- man-pages-posix
|
||||||
- msmtp
|
- msmtp
|
||||||
- mu4e
|
- mu4e
|
||||||
- network-manager-applet
|
- network-manager-applet
|
||||||
- nodejs
|
- nodejs
|
||||||
|
- ntfs-3g
|
||||||
- pavucontrol
|
- pavucontrol
|
||||||
- pipewire
|
- pipewire
|
||||||
- pkg-config
|
- pkg-config
|
||||||
@@ -42,6 +56,7 @@ void_packages_base:
|
|||||||
- simple-scan
|
- simple-scan
|
||||||
- socklog
|
- socklog
|
||||||
- socklog-void
|
- socklog-void
|
||||||
|
- speech-dispatcher
|
||||||
- syncthing
|
- syncthing
|
||||||
- system-config-printer
|
- system-config-printer
|
||||||
- tmux
|
- tmux
|
||||||
@@ -71,3 +86,157 @@ enabled_services:
|
|||||||
- ufw
|
- ufw
|
||||||
- virtlockd
|
- virtlockd
|
||||||
- virtlogd
|
- virtlogd
|
||||||
|
|
||||||
|
desktop_restart_emptty_automatically: false
|
||||||
|
desktop_emptty_session_error_logging: disabled
|
||||||
|
|
||||||
|
desktop_void_dotfiles:
|
||||||
|
- name: Turnstile user services
|
||||||
|
src: .config/service/
|
||||||
|
dest: .config/service/
|
||||||
|
mode: preserve
|
||||||
|
- name: Thunar config
|
||||||
|
src: .config/Thunar/
|
||||||
|
dest: .config/Thunar/
|
||||||
|
mode: preserve
|
||||||
|
- name: MIME application defaults
|
||||||
|
src: .config/mimeapps.list
|
||||||
|
dest: .config/mimeapps.list
|
||||||
|
mode: "0644"
|
||||||
|
- name: Bash DBus session fragment
|
||||||
|
src: .bashrc.d/14-dbus-session.sh
|
||||||
|
dest: .bashrc.d/14-dbus-session.sh
|
||||||
|
mode: "0644"
|
||||||
|
- name: Bash SSH agent socket fragment
|
||||||
|
src: .bashrc.d/16-ssh-agent-socket.sh
|
||||||
|
dest: .bashrc.d/16-ssh-agent-socket.sh
|
||||||
|
mode: "0644"
|
||||||
|
- name: Bash runit desktop fragment
|
||||||
|
src: .bashrc.d/15-runit-desktop.sh
|
||||||
|
dest: .bashrc.d/15-runit-desktop.sh
|
||||||
|
mode: "0644"
|
||||||
|
- name: alacritty config
|
||||||
|
src: .config/alacritty/
|
||||||
|
dest: .config/alacritty/
|
||||||
|
mode: preserve
|
||||||
|
- name: GTK theme setup script
|
||||||
|
src: .local/bin/setup-gtk-theme
|
||||||
|
dest: .local/bin/setup-gtk-theme
|
||||||
|
mode: "0755"
|
||||||
|
- name: Udiskie password helper
|
||||||
|
src: .local/bin/udiskie-password
|
||||||
|
dest: .local/bin/udiskie-password
|
||||||
|
mode: "0755"
|
||||||
|
- name: Udiskie config
|
||||||
|
src: .config/udiskie/
|
||||||
|
dest: .config/udiskie/
|
||||||
|
mode: preserve
|
||||||
|
- name: Turnstile environment update script
|
||||||
|
src: .local/bin/update-turnstile-env
|
||||||
|
dest: .local/bin/update-turnstile-env
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
desktop_common_packages:
|
||||||
|
- brightnessctl
|
||||||
|
- dex
|
||||||
|
- emptty
|
||||||
|
- pinentry-emacs
|
||||||
|
- pinentry-gtk
|
||||||
|
- turnstile
|
||||||
|
- udiskie
|
||||||
|
- xdg-desktop-portal
|
||||||
|
- xdg-desktop-portal-gtk
|
||||||
|
- xdg-user-dirs
|
||||||
|
|
||||||
|
desktop_i3_packages:
|
||||||
|
- arandr
|
||||||
|
- autorandr
|
||||||
|
- feh
|
||||||
|
- i3
|
||||||
|
- i3blocks
|
||||||
|
- i3blocks-blocklets
|
||||||
|
- i3lock-color
|
||||||
|
- i3status
|
||||||
|
- dunst
|
||||||
|
- network-manager-applet
|
||||||
|
- rofi
|
||||||
|
- scrot
|
||||||
|
- setxkbmap
|
||||||
|
- blueman
|
||||||
|
- volumeicon
|
||||||
|
- xclip
|
||||||
|
- xfce-polkit
|
||||||
|
- xfce4-clipman-plugin
|
||||||
|
- xfce4-screenshooter
|
||||||
|
- xkbutils
|
||||||
|
- xorg-fonts
|
||||||
|
- xorg-minimal
|
||||||
|
- xss-lock
|
||||||
|
|
||||||
|
desktop_sway_packages:
|
||||||
|
- grim
|
||||||
|
- kanshi
|
||||||
|
- slurp
|
||||||
|
- swayfx
|
||||||
|
- wl-clipboard
|
||||||
|
- xdg-desktop-portal-wlr
|
||||||
|
|
||||||
|
profile_packages:
|
||||||
|
- alacritty
|
||||||
|
- bluez
|
||||||
|
- bridge-utils
|
||||||
|
- ctags
|
||||||
|
- firefox
|
||||||
|
- deluge-gtk
|
||||||
|
- dnsmasq
|
||||||
|
- emacs-gtk3
|
||||||
|
- poppler-glib
|
||||||
|
- poppler-utils
|
||||||
|
- exo
|
||||||
|
- fontconfig-devel
|
||||||
|
- freetype-devel
|
||||||
|
- gvfs-cdda
|
||||||
|
- gvfs-mtp
|
||||||
|
- gvfs-smb
|
||||||
|
- gufw
|
||||||
|
- libvirt
|
||||||
|
- libspa-bluetooth
|
||||||
|
- libreoffice
|
||||||
|
- liberation-fonts-ttf
|
||||||
|
- libvterm-devel
|
||||||
|
- libX11-devel
|
||||||
|
- libXft-devel
|
||||||
|
- meld
|
||||||
|
- mpv
|
||||||
|
- nerd-fonts-ttf
|
||||||
|
- nerd-fonts-symbols-ttf
|
||||||
|
- pdfarranger
|
||||||
|
- playerctl
|
||||||
|
- qemu
|
||||||
|
- qemu-firmware
|
||||||
|
- qemu-img
|
||||||
|
- qemu-tools
|
||||||
|
- remmina
|
||||||
|
- ripgrep
|
||||||
|
- rustup
|
||||||
|
- ristretto
|
||||||
|
- rsync
|
||||||
|
- shotwell
|
||||||
|
- ruff
|
||||||
|
- terminus-font
|
||||||
|
- texlive
|
||||||
|
- ty
|
||||||
|
- tumbler
|
||||||
|
- uv
|
||||||
|
- Thunar
|
||||||
|
- thunar-archive-plugin
|
||||||
|
- thunar-volman
|
||||||
|
- ffmpegthumbnailer
|
||||||
|
- virt-manager
|
||||||
|
- virt-manager-tools
|
||||||
|
- wireplumber
|
||||||
|
- xarchiver
|
||||||
|
- xournalpp
|
||||||
|
- yaru
|
||||||
|
- yaru-plus
|
||||||
|
- zstd
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
---
|
---
|
||||||
workstation_manage_opencode: true
|
workstation_manage_opencode: true
|
||||||
|
|
||||||
workstation_npm_packages:
|
workstation_npm_packages: "{{ ai_agents_npm_packages + [] }}"
|
||||||
- name: "opencode-ai"
|
|
||||||
state: latest
|
|
||||||
|
|||||||
@@ -148,3 +148,29 @@ workstation_gnome_managed_settings:
|
|||||||
- schema: org.gnome.TextEditor
|
- schema: org.gnome.TextEditor
|
||||||
key: wrap-text
|
key: wrap-text
|
||||||
value: "true"
|
value: "true"
|
||||||
|
- schema: org.gnome.desktop.background
|
||||||
|
key: picture-uri
|
||||||
|
value: "'file:///usr/share/backgrounds/gnome/lcd-rainbow-l.jxl'"
|
||||||
|
- schema: org.gnome.desktop.background
|
||||||
|
key: picture-uri-dark
|
||||||
|
value: "'file:///usr/share/backgrounds/gnome/lcd-rainbow-d.jxl'"
|
||||||
|
|
||||||
|
workstation_gnome_extension_dconf_settings:
|
||||||
|
- path: /org/gnome/shell/extensions/paperwm/
|
||||||
|
key: selection-border-radius-bottom
|
||||||
|
value: "15"
|
||||||
|
- path: /org/gnome/shell/extensions/paperwm/
|
||||||
|
key: selection-border-radius-top
|
||||||
|
value: "15"
|
||||||
|
- path: /org/gnome/shell/extensions/paperwm/
|
||||||
|
key: selection-border-size
|
||||||
|
value: "5"
|
||||||
|
- path: /org/gnome/shell/extensions/paperwm/
|
||||||
|
key: show-window-position-bar
|
||||||
|
value: "false"
|
||||||
|
- path: /org/gnome/shell/extensions/paperwm/
|
||||||
|
key: show-workspace-indicator
|
||||||
|
value: "false"
|
||||||
|
- path: /org/gnome/shell/extensions/paperwm/
|
||||||
|
key: window-gap
|
||||||
|
value: "10"
|
||||||
|
|||||||
@@ -2,54 +2,48 @@
|
|||||||
hostname: nymph
|
hostname: nymph
|
||||||
|
|
||||||
desktop_sessions_enabled:
|
desktop_sessions_enabled:
|
||||||
- sway
|
- gnome
|
||||||
|
|
||||||
desktop_default_session: sway
|
desktop_default_session: gnome
|
||||||
desktop_default_session_env: wayland
|
desktop_default_session_env: wayland
|
||||||
desktop_emptty_session_error_logging: rotate
|
|
||||||
|
|
||||||
host_xbps_repositories:
|
host_kernel_cmdline: >-
|
||||||
- name: noctalia
|
rd.luks.uuid=1e15d159-5d05-4a1f-9639-ac200dff9f9c rootflags=subvol=@
|
||||||
url: https://universalrepo.r1xelelo.workers.dev/void
|
apparmor=1 security=apparmor nouveau.modeset=0 nvidia-drm.modeset=1
|
||||||
|
|
||||||
|
host_systemd_boot_esp_path: /boot
|
||||||
|
host_systemd_boot_default: arch.conf
|
||||||
|
host_systemd_boot_timeout: 3
|
||||||
|
host_systemd_boot_console_mode: max
|
||||||
|
host_systemd_boot_editor: false
|
||||||
|
host_systemd_boot_entries:
|
||||||
|
- filename: arch.conf
|
||||||
|
title: Arch Linux
|
||||||
|
linux: /vmlinuz-linux
|
||||||
|
initrds:
|
||||||
|
- /intel-ucode.img
|
||||||
|
- /initramfs-linux.img
|
||||||
|
options: "{{ host_kernel_cmdline }}"
|
||||||
|
- filename: arch-fallback.conf
|
||||||
|
title: Arch Linux fallback
|
||||||
|
linux: /vmlinuz-linux
|
||||||
|
initrds:
|
||||||
|
- /intel-ucode.img
|
||||||
|
- /initramfs-linux-fallback.img
|
||||||
|
options: "{{ host_kernel_cmdline }}"
|
||||||
|
|
||||||
host_packages:
|
host_packages:
|
||||||
- cliphist
|
- intel-ucode
|
||||||
- grimshot
|
- intel-media-driver
|
||||||
- nvidia
|
- libva-intel-driver
|
||||||
- noctalia-shell
|
- mesa
|
||||||
|
- nvidia-open
|
||||||
|
- nvidia-settings
|
||||||
|
- nvidia-utils
|
||||||
- power-profiles-daemon
|
- power-profiles-daemon
|
||||||
- mesa-dri
|
|
||||||
- vulkan-loader
|
|
||||||
- mesa-vulkan-intel
|
|
||||||
- intel-video-accel
|
|
||||||
- tlp
|
|
||||||
- tlp-rdw
|
|
||||||
- upower
|
- upower
|
||||||
|
- vulkan-icd-loader
|
||||||
|
- vulkan-intel
|
||||||
|
|
||||||
host_enabled_services:
|
host_enabled_services:
|
||||||
- tlp
|
- power-profiles-daemon
|
||||||
|
|
||||||
host_sway_dotfiles:
|
|
||||||
- src: .config/sway/host.conf
|
|
||||||
dest: .config/sway/host.conf
|
|
||||||
mode: "0644"
|
|
||||||
- src: .config/sway/session-env
|
|
||||||
dest: .config/sway/session-env
|
|
||||||
mode: "0644"
|
|
||||||
- src: .config/kanshi/config
|
|
||||||
dest: .config/kanshi/config
|
|
||||||
mode: "0644"
|
|
||||||
|
|
||||||
noctalia_bar_monitors:
|
|
||||||
- DP-1
|
|
||||||
- eDP-1
|
|
||||||
|
|
||||||
noctalia_screen_overrides:
|
|
||||||
- name: DP-1
|
|
||||||
enabled: false
|
|
||||||
- name: eDP-1
|
|
||||||
enabled: false
|
|
||||||
|
|
||||||
host_packages_absent:
|
|
||||||
- network-manager-applet
|
|
||||||
- blueman
|
|
||||||
|
|||||||
@@ -5,8 +5,10 @@ all:
|
|||||||
hosts:
|
hosts:
|
||||||
ikaros:
|
ikaros:
|
||||||
ansible_connection: local
|
ansible_connection: local
|
||||||
nymph:
|
|
||||||
ansible_connection: local
|
arch:
|
||||||
|
children:
|
||||||
|
arch_desktop:
|
||||||
|
|
||||||
desktop:
|
desktop:
|
||||||
hosts:
|
hosts:
|
||||||
@@ -55,6 +57,11 @@ all:
|
|||||||
deadalus-fedora:
|
deadalus-fedora:
|
||||||
ansible_connection: local
|
ansible_connection: local
|
||||||
|
|
||||||
|
arch_desktop:
|
||||||
|
hosts:
|
||||||
|
nymph:
|
||||||
|
ansible_connection: local
|
||||||
|
|
||||||
workstation_host_linux:
|
workstation_host_linux:
|
||||||
hosts:
|
hosts:
|
||||||
deadalus-ubuntu:
|
deadalus-ubuntu:
|
||||||
|
|||||||
@@ -14,7 +14,16 @@
|
|||||||
group: "{{ effective_user_group }}"
|
group: "{{ effective_user_group }}"
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
loop: "{{ xdg_user_directories | default([]) }}"
|
loop: "{{ xdg_user_directories | default([]) }}"
|
||||||
when: "'void' in group_names"
|
when: "'desktop' in group_names"
|
||||||
|
|
||||||
|
- name: Extract templates kit to Templates directory
|
||||||
|
tags: [dotfiles, dotfiles:common]
|
||||||
|
ansible.builtin.unarchive:
|
||||||
|
src: "{{ playbook_dir }}/../dotfiles/common/templates_kit.zip"
|
||||||
|
dest: "{{ effective_user_home }}/Templates"
|
||||||
|
owner: "{{ effective_username }}"
|
||||||
|
group: "{{ effective_user_group }}"
|
||||||
|
when: "'desktop' in group_names"
|
||||||
|
|
||||||
- name: Ensure SSH socket directory exists
|
- name: Ensure SSH socket directory exists
|
||||||
tags: [dotfiles, dotfiles:common]
|
tags: [dotfiles, dotfiles:common]
|
||||||
@@ -33,10 +42,41 @@
|
|||||||
owner: "{{ effective_username }}"
|
owner: "{{ effective_username }}"
|
||||||
group: "{{ effective_user_group }}"
|
group: "{{ effective_user_group }}"
|
||||||
mode: "{{ item.mode }}"
|
mode: "{{ item.mode }}"
|
||||||
loop: "{{ common_dotfiles | default([]) }}"
|
loop: >-
|
||||||
|
{{
|
||||||
|
(common_dotfiles | default([]))
|
||||||
|
+ ((ai_agents_dotfiles | default([])) if (ai_agents_enabled | default(false)) else [])
|
||||||
|
}}
|
||||||
loop_control:
|
loop_control:
|
||||||
label: "{{ item.dest }}"
|
label: "{{ item.dest }}"
|
||||||
|
|
||||||
|
- name: Ensure AI config directories exist
|
||||||
|
tags: [dotfiles, dotfiles:common]
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ effective_user_home }}/{{ item }}"
|
||||||
|
state: directory
|
||||||
|
owner: "{{ effective_username }}"
|
||||||
|
group: "{{ effective_user_group }}"
|
||||||
|
mode: "0755"
|
||||||
|
loop:
|
||||||
|
- .codex
|
||||||
|
when:
|
||||||
|
- ai_agents_enabled | default(false)
|
||||||
|
- (ai_agents_templates | default([])) | length > 0
|
||||||
|
|
||||||
|
- name: Render AI agent templates
|
||||||
|
tags: [dotfiles, dotfiles:common]
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: "{{ playbook_dir }}/../dotfiles/common/{{ item.src }}"
|
||||||
|
dest: "{{ effective_user_home }}/{{ item.dest }}"
|
||||||
|
owner: "{{ effective_username }}"
|
||||||
|
group: "{{ effective_user_group }}"
|
||||||
|
mode: "{{ item.mode }}"
|
||||||
|
loop: "{{ ai_agents_templates | default([]) }}"
|
||||||
|
loop_control:
|
||||||
|
label: "{{ item.dest }}"
|
||||||
|
when: ai_agents_enabled | default(false)
|
||||||
|
|
||||||
- name: Refresh bat cache
|
- name: Refresh bat cache
|
||||||
tags: [dotfiles, dotfiles:common]
|
tags: [dotfiles, dotfiles:common]
|
||||||
ansible.builtin.command:
|
ansible.builtin.command:
|
||||||
|
|||||||
27
ansible/roles/packages_arch/tasks/main.yml
Normal file
27
ansible/roles/packages_arch/tasks/main.yml
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
- name: Synchronize and upgrade Arch Linux packages
|
||||||
|
tags: [packages]
|
||||||
|
community.general.pacman:
|
||||||
|
update_cache: true
|
||||||
|
upgrade: true
|
||||||
|
|
||||||
|
- name: Install packages on Arch Linux
|
||||||
|
tags: [packages]
|
||||||
|
community.general.pacman:
|
||||||
|
name: >-
|
||||||
|
{{
|
||||||
|
(
|
||||||
|
(common_packages | default([]))
|
||||||
|
+ (arch_packages_base | default([]))
|
||||||
|
+ (arch_desktop_common_packages | default([]))
|
||||||
|
+ (
|
||||||
|
(arch_desktop_gnome_packages | default([]))
|
||||||
|
if 'gnome' in (desktop_sessions_enabled | default([]))
|
||||||
|
else []
|
||||||
|
)
|
||||||
|
+ (arch_profile_packages | default([]))
|
||||||
|
+ (host_packages | default([]))
|
||||||
|
)
|
||||||
|
| unique
|
||||||
|
}}
|
||||||
|
state: present
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
changed_when: true
|
changed_when: true
|
||||||
when:
|
when:
|
||||||
- not ansible_check_mode
|
- not ansible_check_mode
|
||||||
|
- "'void' in group_names"
|
||||||
- desktop_restart_emptty_automatically | default(false)
|
- desktop_restart_emptty_automatically | default(false)
|
||||||
|
|
||||||
- name: Report manual emptty restart requirement
|
- name: Report manual emptty restart requirement
|
||||||
@@ -16,10 +17,22 @@
|
|||||||
to avoid dropping the active graphical session.
|
to avoid dropping the active graphical session.
|
||||||
when:
|
when:
|
||||||
- not ansible_check_mode
|
- not ansible_check_mode
|
||||||
|
- "'void' in group_names"
|
||||||
- not (desktop_restart_emptty_automatically | default(false))
|
- not (desktop_restart_emptty_automatically | default(false))
|
||||||
|
|
||||||
- name: Reload SSH service
|
- name: Reload SSH service with runit
|
||||||
listen: Reload SSH service
|
listen: Reload SSH service
|
||||||
ansible.builtin.command: sv reload sshd
|
ansible.builtin.command: sv reload sshd
|
||||||
changed_when: true
|
changed_when: true
|
||||||
when: not ansible_check_mode
|
when:
|
||||||
|
- not ansible_check_mode
|
||||||
|
- "'void' in group_names"
|
||||||
|
|
||||||
|
- name: Reload SSH service with systemd
|
||||||
|
listen: Reload SSH service
|
||||||
|
ansible.builtin.systemd:
|
||||||
|
name: "{{ desktop_ssh_service_name | default('sshd') }}"
|
||||||
|
state: reloaded
|
||||||
|
when:
|
||||||
|
- not ansible_check_mode
|
||||||
|
- "'arch' in group_names"
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
regexp: '^#?HandleLidSwitch='
|
regexp: '^#?HandleLidSwitch='
|
||||||
line: 'HandleLidSwitch=suspend'
|
line: 'HandleLidSwitch=suspend'
|
||||||
state: present
|
state: present
|
||||||
|
when: "'void' in group_names"
|
||||||
|
|
||||||
- name: Ensure common config directories exist
|
- name: Ensure common config directories exist
|
||||||
tags: [dotfiles, dotfiles:desktop]
|
tags: [dotfiles, dotfiles:desktop]
|
||||||
@@ -18,10 +19,9 @@
|
|||||||
loop:
|
loop:
|
||||||
- "{{ user_home }}/.config"
|
- "{{ user_home }}/.config"
|
||||||
- "{{ user_home }}/.config/autostart"
|
- "{{ user_home }}/.config/autostart"
|
||||||
- "{{ user_home }}/.config/alacritty"
|
- "{{ user_home }}/.config/systemd"
|
||||||
- "{{ user_home }}/.config/Thunar"
|
- "{{ user_home }}/.config/systemd/user"
|
||||||
- "{{ user_home }}/.local/share"
|
- "{{ user_home }}/.bashrc.d"
|
||||||
- "{{ user_home }}/.local/share/applications"
|
|
||||||
- "{{ user_home }}/.tmux"
|
- "{{ user_home }}/.tmux"
|
||||||
- "{{ user_home }}/.tmux/bin"
|
- "{{ user_home }}/.tmux/bin"
|
||||||
- "{{ user_home }}/.tmux/plugins"
|
- "{{ user_home }}/.tmux/plugins"
|
||||||
@@ -42,6 +42,7 @@
|
|||||||
insertafter: '^auth\s+include\s+system-local-login$'
|
insertafter: '^auth\s+include\s+system-local-login$'
|
||||||
line: "auth optional pam_gnome_keyring.so"
|
line: "auth optional pam_gnome_keyring.so"
|
||||||
state: present
|
state: present
|
||||||
|
when: "'void' in group_names"
|
||||||
|
|
||||||
- name: Enable gnome-keyring PAM session hook
|
- name: Enable gnome-keyring PAM session hook
|
||||||
tags: [packages, gnome]
|
tags: [packages, gnome]
|
||||||
@@ -50,6 +51,7 @@
|
|||||||
insertafter: '^session\s+include\s+system-local-login$'
|
insertafter: '^session\s+include\s+system-local-login$'
|
||||||
line: "session optional pam_gnome_keyring.so auto_start"
|
line: "session optional pam_gnome_keyring.so auto_start"
|
||||||
state: present
|
state: present
|
||||||
|
when: "'void' in group_names"
|
||||||
|
|
||||||
- name: Enable gnome-keyring PAM password hook
|
- name: Enable gnome-keyring PAM password hook
|
||||||
tags: [packages, gnome]
|
tags: [packages, gnome]
|
||||||
@@ -58,6 +60,7 @@
|
|||||||
insertafter: '^password\s+include\s+system-local-login$'
|
insertafter: '^password\s+include\s+system-local-login$'
|
||||||
line: "password optional pam_gnome_keyring.so use_authtok"
|
line: "password optional pam_gnome_keyring.so use_authtok"
|
||||||
state: present
|
state: present
|
||||||
|
when: "'void' in group_names"
|
||||||
|
|
||||||
- name: Check whether SSH host ed25519 key exists
|
- name: Check whether SSH host ed25519 key exists
|
||||||
tags: [services]
|
tags: [services]
|
||||||
@@ -181,6 +184,7 @@
|
|||||||
ansible.builtin.stat:
|
ansible.builtin.stat:
|
||||||
path: /etc/sv/libvirtd
|
path: /etc/sv/libvirtd
|
||||||
register: libvirtd_service_dir
|
register: libvirtd_service_dir
|
||||||
|
when: "'void' in group_names"
|
||||||
|
|
||||||
- name: Enable libvirt daemon service
|
- name: Enable libvirt daemon service
|
||||||
tags: [packages, services]
|
tags: [packages, services]
|
||||||
@@ -188,7 +192,9 @@
|
|||||||
src: /etc/sv/libvirtd
|
src: /etc/sv/libvirtd
|
||||||
dest: /var/service/libvirtd
|
dest: /var/service/libvirtd
|
||||||
state: link
|
state: link
|
||||||
when: libvirtd_service_dir.stat.exists
|
when:
|
||||||
|
- "'void' in group_names"
|
||||||
|
- libvirtd_service_dir.stat.exists
|
||||||
|
|
||||||
- name: Check virtualization group availability
|
- name: Check virtualization group availability
|
||||||
tags: [packages]
|
tags: [packages]
|
||||||
@@ -229,6 +235,7 @@
|
|||||||
owner: root
|
owner: root
|
||||||
group: root
|
group: root
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
|
when: "'void' in group_names"
|
||||||
|
|
||||||
- name: Ensure emptty session directories exist
|
- name: Ensure emptty session directories exist
|
||||||
tags: [packages, services, emptty]
|
tags: [packages, services, emptty]
|
||||||
@@ -241,6 +248,7 @@
|
|||||||
loop:
|
loop:
|
||||||
- /etc/emptty/xsessions
|
- /etc/emptty/xsessions
|
||||||
- /etc/emptty/wayland-sessions
|
- /etc/emptty/wayland-sessions
|
||||||
|
when: "'void' in group_names"
|
||||||
|
|
||||||
- name: Configure emptty
|
- name: Configure emptty
|
||||||
tags: [packages, services, emptty]
|
tags: [packages, services, emptty]
|
||||||
@@ -251,6 +259,7 @@
|
|||||||
group: root
|
group: root
|
||||||
mode: "0644"
|
mode: "0644"
|
||||||
notify: Restart emptty
|
notify: Restart emptty
|
||||||
|
when: "'void' in group_names"
|
||||||
|
|
||||||
- name: Copy common desktop dotfiles
|
- name: Copy common desktop dotfiles
|
||||||
tags: [dotfiles, dotfiles:desktop]
|
tags: [dotfiles, dotfiles:desktop]
|
||||||
@@ -260,10 +269,41 @@
|
|||||||
owner: "{{ username }}"
|
owner: "{{ username }}"
|
||||||
group: "{{ user_group }}"
|
group: "{{ user_group }}"
|
||||||
mode: "{{ item.mode }}"
|
mode: "{{ item.mode }}"
|
||||||
loop: "{{ desktop_common_dotfiles | default([]) }}"
|
loop: >-
|
||||||
|
{{
|
||||||
|
(desktop_common_dotfiles | default([]))
|
||||||
|
+ ((desktop_void_dotfiles | default([])) if 'void' in group_names else [])
|
||||||
|
+ ((desktop_arch_dotfiles | default([])) if 'arch' in group_names else [])
|
||||||
|
}}
|
||||||
loop_control:
|
loop_control:
|
||||||
label: "{{ item.dest }}"
|
label: "{{ item.dest }}"
|
||||||
|
|
||||||
|
- name: Ensure systemd user enablement directory exists
|
||||||
|
tags: [services, dotfiles, dotfiles:desktop]
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ user_home }}/.config/systemd/user/default.target.wants"
|
||||||
|
state: directory
|
||||||
|
owner: "{{ username }}"
|
||||||
|
group: "{{ user_group }}"
|
||||||
|
mode: "0755"
|
||||||
|
when:
|
||||||
|
- "'arch' in group_names"
|
||||||
|
- (desktop_systemd_user_services | default([])) | length > 0
|
||||||
|
|
||||||
|
- name: Enable desktop systemd user services
|
||||||
|
tags: [services, dotfiles, dotfiles:desktop]
|
||||||
|
ansible.builtin.file:
|
||||||
|
src: "{{ user_home }}/.config/systemd/user/{{ item }}"
|
||||||
|
dest: "{{ user_home }}/.config/systemd/user/default.target.wants/{{ item }}"
|
||||||
|
state: link
|
||||||
|
owner: "{{ username }}"
|
||||||
|
group: "{{ user_group }}"
|
||||||
|
force: true
|
||||||
|
loop: "{{ desktop_systemd_user_services | default([]) }}"
|
||||||
|
loop_control:
|
||||||
|
label: "{{ item }}"
|
||||||
|
when: "'arch' in group_names"
|
||||||
|
|
||||||
- name: Copy Emacs desktop dotfiles
|
- name: Copy Emacs desktop dotfiles
|
||||||
tags: [dotfiles, dotfiles:desktop, emacs]
|
tags: [dotfiles, dotfiles:desktop, emacs]
|
||||||
ansible.builtin.copy:
|
ansible.builtin.copy:
|
||||||
@@ -460,14 +500,27 @@
|
|||||||
path: "{{ user_home }}/.cargo/bin/rustc"
|
path: "{{ user_home }}/.cargo/bin/rustc"
|
||||||
register: rustup_initialized
|
register: rustup_initialized
|
||||||
|
|
||||||
- name: Run rustup-init with cargo env sourced
|
- name: Run rustup-init with cargo env sourced (Void)
|
||||||
ansible.builtin.shell:
|
ansible.builtin.shell:
|
||||||
cmd: . ~/.cargo/env && rustup-init -y --no-modify-path
|
cmd: . ~/.cargo/env && rustup-init -y --no-modify-path
|
||||||
creates: "{{ user_home }}/.cargo/bin/rustc"
|
creates: "{{ user_home }}/.cargo/bin/rustc"
|
||||||
become_user: "{{ username }}"
|
become_user: "{{ username }}"
|
||||||
environment:
|
environment:
|
||||||
HOME: "{{ user_home }}"
|
HOME: "{{ user_home }}"
|
||||||
when: not rustup_initialized.stat.exists
|
when:
|
||||||
|
- not rustup_initialized.stat.exists
|
||||||
|
- "'void' in group_names"
|
||||||
|
|
||||||
|
- name: Install Rust stable toolchain via rustup (Arch)
|
||||||
|
ansible.builtin.command:
|
||||||
|
cmd: rustup toolchain install stable
|
||||||
|
creates: "{{ user_home }}/.cargo/bin/rustc"
|
||||||
|
become_user: "{{ username }}"
|
||||||
|
environment:
|
||||||
|
HOME: "{{ user_home }}"
|
||||||
|
when:
|
||||||
|
- not rustup_initialized.stat.exists
|
||||||
|
- "'arch' in group_names"
|
||||||
|
|
||||||
- name: Ensure cargo env is sourced in shell profile
|
- name: Ensure cargo env is sourced in shell profile
|
||||||
ansible.builtin.lineinfile:
|
ansible.builtin.lineinfile:
|
||||||
@@ -487,8 +540,8 @@
|
|||||||
file: source_tool.yml
|
file: source_tool.yml
|
||||||
apply:
|
apply:
|
||||||
tags: [packages]
|
tags: [packages]
|
||||||
loop: "{{ desktop_source_tools }}"
|
loop: "{{ desktop_source_tools + (desktop_void_source_tools | default([])) }}"
|
||||||
when: desktop_source_tools | length > 0
|
when: (desktop_source_tools + (desktop_void_source_tools | default([]))) | length > 0
|
||||||
loop_control:
|
loop_control:
|
||||||
loop_var: source_tool
|
loop_var: source_tool
|
||||||
label: "{{ source_tool.name }}"
|
label: "{{ source_tool.name }}"
|
||||||
@@ -518,7 +571,7 @@
|
|||||||
label: "{{ binary_tool.name }}"
|
label: "{{ binary_tool.name }}"
|
||||||
|
|
||||||
- name: Install desktop npm packages
|
- name: Install desktop npm packages
|
||||||
tags: [packages]
|
tags: [packages, npm]
|
||||||
community.general.npm:
|
community.general.npm:
|
||||||
name: "{{ item.name }}"
|
name: "{{ item.name }}"
|
||||||
global: true
|
global: true
|
||||||
|
|||||||
59
ansible/roles/profile_desktop_gnome/tasks/main.yml
Normal file
59
ansible/roles/profile_desktop_gnome/tasks/main.yml
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
---
|
||||||
|
- name: Ensure GNOME desktop session is enabled for this profile
|
||||||
|
tags: [gnome]
|
||||||
|
ansible.builtin.assert:
|
||||||
|
that:
|
||||||
|
- "'gnome' in (desktop_sessions_enabled | default([]))"
|
||||||
|
fail_msg: >-
|
||||||
|
profile_desktop_gnome requires desktop_sessions_enabled to include gnome.
|
||||||
|
|
||||||
|
- name: Ensure systemd boots to the graphical target
|
||||||
|
tags: [services, gnome]
|
||||||
|
ansible.builtin.file:
|
||||||
|
src: /usr/lib/systemd/system/graphical.target
|
||||||
|
dest: /etc/systemd/system/default.target
|
||||||
|
state: link
|
||||||
|
force: true
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
|
||||||
|
- name: Enable emacs user service from package
|
||||||
|
tags: [services, emacs]
|
||||||
|
ansible.builtin.systemd:
|
||||||
|
name: emacs.service
|
||||||
|
enabled: true
|
||||||
|
scope: user
|
||||||
|
become_user: "{{ username }}"
|
||||||
|
|
||||||
|
- name: Deploy gpg-agent.conf for GNOME (pinentry-gnome3, no ssh-support)
|
||||||
|
tags: [dotfiles, dotfiles:desktop, gnome]
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: "{{ playbook_dir }}/../dotfiles/desktop/.gnupg/gpg-agent.arch.conf"
|
||||||
|
dest: "{{ user_home }}/.gnupg/gpg-agent.conf"
|
||||||
|
owner: "{{ username }}"
|
||||||
|
group: "{{ user_group }}"
|
||||||
|
mode: "0600"
|
||||||
|
|
||||||
|
- name: Enable gnome-keyring PAM auth hook for GDM
|
||||||
|
tags: [gnome]
|
||||||
|
ansible.builtin.lineinfile:
|
||||||
|
path: /etc/pam.d/gdm-password
|
||||||
|
insertafter: '^auth\s+include\s+system-local-login$'
|
||||||
|
line: "auth optional pam_gnome_keyring.so"
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Enable gnome-keyring PAM session hook for GDM
|
||||||
|
tags: [gnome]
|
||||||
|
ansible.builtin.lineinfile:
|
||||||
|
path: /etc/pam.d/gdm-password
|
||||||
|
insertafter: '^session\s+include\s+system-local-login$'
|
||||||
|
line: "session optional pam_gnome_keyring.so auto_start"
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Enable gnome-keyring PAM password hook for GDM
|
||||||
|
tags: [gnome]
|
||||||
|
ansible.builtin.lineinfile:
|
||||||
|
path: /etc/pam.d/gdm-password
|
||||||
|
insertafter: '^password\s+include\s+system-local-login$'
|
||||||
|
line: "password optional pam_gnome_keyring.so use_authtok"
|
||||||
|
state: present
|
||||||
@@ -1,16 +1,75 @@
|
|||||||
---
|
---
|
||||||
- name: Configure GRUB kernel parameters for NVIDIA hybrid graphics
|
- name: Ensure systemd-boot loader entries directory exists
|
||||||
tags: [packages, nvidia]
|
tags: [packages, nvidia]
|
||||||
ansible.builtin.lineinfile:
|
ansible.builtin.file:
|
||||||
path: /etc/default/grub
|
path: "{{ host_systemd_boot_esp_path }}/loader/entries"
|
||||||
regexp: '^GRUB_CMDLINE_LINUX='
|
state: directory
|
||||||
line: 'GRUB_CMDLINE_LINUX="rd.luks.uuid=1e15d159-5d05-4a1f-9639-ac200dff9f9c rootflags=subvol=@ apparmor=1 security=apparmor nouveau.modeset=0 nvidia-drm.modeset=1"'
|
owner: root
|
||||||
state: present
|
group: root
|
||||||
|
mode: "0755"
|
||||||
|
when: host_systemd_boot_esp_path is defined
|
||||||
|
|
||||||
- name: Regenerate GRUB configuration
|
- name: Check whether systemd-boot is installed
|
||||||
tags: [packages, nvidia]
|
tags: [packages, nvidia]
|
||||||
ansible.builtin.command: grub-mkconfig -o /boot/grub/grub.cfg
|
ansible.builtin.command:
|
||||||
|
argv:
|
||||||
|
- bootctl
|
||||||
|
- "--esp-path={{ host_systemd_boot_esp_path }}"
|
||||||
|
- is-installed
|
||||||
|
register: nymph_systemd_boot_state
|
||||||
|
changed_when: false
|
||||||
|
failed_when: false
|
||||||
|
when:
|
||||||
|
- host_systemd_boot_esp_path is defined
|
||||||
|
- not ansible_check_mode
|
||||||
|
|
||||||
|
- name: Install systemd-boot
|
||||||
|
tags: [packages, nvidia]
|
||||||
|
ansible.builtin.command:
|
||||||
|
argv:
|
||||||
|
- bootctl
|
||||||
|
- "--esp-path={{ host_systemd_boot_esp_path }}"
|
||||||
|
- install
|
||||||
changed_when: true
|
changed_when: true
|
||||||
|
when:
|
||||||
|
- host_systemd_boot_esp_path is defined
|
||||||
|
- not ansible_check_mode
|
||||||
|
- nymph_systemd_boot_state.rc | default(1) != 0
|
||||||
|
|
||||||
|
- name: Configure systemd-boot loader defaults
|
||||||
|
tags: [packages, nvidia]
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: "{{ host_systemd_boot_esp_path }}/loader/loader.conf"
|
||||||
|
content: |
|
||||||
|
default {{ host_systemd_boot_default }}
|
||||||
|
timeout {{ host_systemd_boot_timeout | default(3) }}
|
||||||
|
console-mode {{ host_systemd_boot_console_mode | default('max') }}
|
||||||
|
editor {{ 'yes' if host_systemd_boot_editor | default(false) else 'no' }}
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: "0644"
|
||||||
|
when:
|
||||||
|
- host_systemd_boot_esp_path is defined
|
||||||
|
- host_systemd_boot_default is defined
|
||||||
|
|
||||||
|
- name: Configure systemd-boot Arch entries
|
||||||
|
tags: [packages, nvidia]
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: "{{ host_systemd_boot_esp_path }}/loader/entries/{{ item.filename }}"
|
||||||
|
content: |-
|
||||||
|
title {{ item.title }}
|
||||||
|
linux {{ item.linux }}
|
||||||
|
{% for initrd in item.initrds | default([]) %}
|
||||||
|
initrd {{ initrd }}
|
||||||
|
{% endfor %}
|
||||||
|
options {{ item.options }}
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: "0644"
|
||||||
|
loop: "{{ host_systemd_boot_entries | default([]) }}"
|
||||||
|
loop_control:
|
||||||
|
label: "{{ item.filename }}"
|
||||||
|
when: host_systemd_boot_esp_path is defined
|
||||||
|
|
||||||
- name: Configure NVIDIA power management for hybrid graphics
|
- name: Configure NVIDIA power management for hybrid graphics
|
||||||
tags: [packages, nvidia]
|
tags: [packages, nvidia]
|
||||||
|
|||||||
@@ -8,8 +8,11 @@
|
|||||||
group: "{{ user_group }}"
|
group: "{{ user_group }}"
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
loop:
|
loop:
|
||||||
|
- "{{ user_home }}/.config/alacritty"
|
||||||
|
- "{{ user_home }}/.config/dunst"
|
||||||
- "{{ user_home }}/.config/i3"
|
- "{{ user_home }}/.config/i3"
|
||||||
- "{{ user_home }}/.config/i3blocks"
|
- "{{ user_home }}/.config/i3blocks"
|
||||||
|
- "{{ user_home }}/.config/rofi"
|
||||||
when: "'i3' in (desktop_sessions_enabled | default([]))"
|
when: "'i3' in (desktop_sessions_enabled | default([]))"
|
||||||
|
|
||||||
- name: Install allowed emptty X11 sessions
|
- name: Install allowed emptty X11 sessions
|
||||||
|
|||||||
@@ -10,10 +10,6 @@
|
|||||||
loop:
|
loop:
|
||||||
- "{{ user_home }}/.config/sway"
|
- "{{ user_home }}/.config/sway"
|
||||||
- "{{ user_home }}/.config/kanshi"
|
- "{{ user_home }}/.config/kanshi"
|
||||||
- "{{ user_home }}/.config/qt5ct"
|
|
||||||
- "{{ user_home }}/.config/qt5ct/colors"
|
|
||||||
- "{{ user_home }}/.config/qt6ct"
|
|
||||||
- "{{ user_home }}/.config/qt6ct/colors"
|
|
||||||
when: "'sway' in (desktop_sessions_enabled | default([]))"
|
when: "'sway' in (desktop_sessions_enabled | default([]))"
|
||||||
|
|
||||||
- name: Ensure Noctalia config directories exist
|
- name: Ensure Noctalia config directories exist
|
||||||
@@ -73,26 +69,6 @@
|
|||||||
mode: "0644"
|
mode: "0644"
|
||||||
when: "'sway' in (desktop_sessions_enabled | default([]))"
|
when: "'sway' in (desktop_sessions_enabled | default([]))"
|
||||||
|
|
||||||
- name: Render qt5ct config
|
|
||||||
tags: [dotfiles, dotfiles:desktop, sway, noctalia]
|
|
||||||
ansible.builtin.template:
|
|
||||||
src: qt5ct.conf.j2
|
|
||||||
dest: "{{ user_home }}/.config/qt5ct/qt5ct.conf"
|
|
||||||
owner: "{{ username }}"
|
|
||||||
group: "{{ user_group }}"
|
|
||||||
mode: "0644"
|
|
||||||
when: "'sway' in (desktop_sessions_enabled | default([]))"
|
|
||||||
|
|
||||||
- name: Render qt6ct config
|
|
||||||
tags: [dotfiles, dotfiles:desktop, sway, noctalia]
|
|
||||||
ansible.builtin.template:
|
|
||||||
src: qt6ct.conf.j2
|
|
||||||
dest: "{{ user_home }}/.config/qt6ct/qt6ct.conf"
|
|
||||||
owner: "{{ username }}"
|
|
||||||
group: "{{ user_group }}"
|
|
||||||
mode: "0644"
|
|
||||||
when: "'sway' in (desktop_sessions_enabled | default([]))"
|
|
||||||
|
|
||||||
- name: Manage Noctalia shell plugins
|
- name: Manage Noctalia shell plugins
|
||||||
tags: [dotfiles, dotfiles:desktop, sway, noctalia]
|
tags: [dotfiles, dotfiles:desktop, sway, noctalia]
|
||||||
ansible.builtin.include_tasks: noctalia.yml
|
ansible.builtin.include_tasks: noctalia.yml
|
||||||
@@ -107,37 +83,3 @@
|
|||||||
group: "{{ user_group }}"
|
group: "{{ user_group }}"
|
||||||
mode: "0644"
|
mode: "0644"
|
||||||
when: "'sway' in (desktop_sessions_enabled | default([]))"
|
when: "'sway' in (desktop_sessions_enabled | default([]))"
|
||||||
|
|
||||||
- name: Allow Flatpak apps to read shared theme configs
|
|
||||||
tags: [packages, dotfiles, dotfiles:desktop, sway, noctalia]
|
|
||||||
ansible.builtin.command:
|
|
||||||
argv:
|
|
||||||
- flatpak
|
|
||||||
- override
|
|
||||||
- --user
|
|
||||||
- "--filesystem={{ item }}"
|
|
||||||
become_user: "{{ username }}"
|
|
||||||
environment:
|
|
||||||
HOME: "{{ user_home }}"
|
|
||||||
changed_when: false
|
|
||||||
loop: "{{ desktop_flatpak_global_filesystems | default([]) }}"
|
|
||||||
when:
|
|
||||||
- "'sway' in (desktop_sessions_enabled | default([]))"
|
|
||||||
- (desktop_flatpak_packages | default([])) | length > 0
|
|
||||||
|
|
||||||
- name: Export global Flatpak environment for theme integration
|
|
||||||
tags: [packages, dotfiles, dotfiles:desktop, sway, noctalia]
|
|
||||||
ansible.builtin.command:
|
|
||||||
argv:
|
|
||||||
- flatpak
|
|
||||||
- override
|
|
||||||
- --user
|
|
||||||
- "--env={{ item }}"
|
|
||||||
become_user: "{{ username }}"
|
|
||||||
environment:
|
|
||||||
HOME: "{{ user_home }}"
|
|
||||||
changed_when: false
|
|
||||||
loop: "{{ desktop_flatpak_global_env | default([]) }}"
|
|
||||||
when:
|
|
||||||
- "'sway' in (desktop_sessions_enabled | default([]))"
|
|
||||||
- (desktop_flatpak_packages | default([])) | length > 0
|
|
||||||
|
|||||||
@@ -137,22 +137,6 @@
|
|||||||
owner: "{{ username }}"
|
owner: "{{ username }}"
|
||||||
group: "{{ user_group }}"
|
group: "{{ user_group }}"
|
||||||
loop:
|
loop:
|
||||||
- clipboard
|
|
||||||
- polkit-agent
|
- polkit-agent
|
||||||
|
- screenshot
|
||||||
- usb-drive-manager
|
- usb-drive-manager
|
||||||
|
|
||||||
- name: Ensure Noctalia cache directory exists
|
|
||||||
ansible.builtin.file:
|
|
||||||
path: "{{ user_home }}/.cache/noctalia"
|
|
||||||
state: directory
|
|
||||||
owner: "{{ username }}"
|
|
||||||
group: "{{ user_group }}"
|
|
||||||
mode: "0755"
|
|
||||||
|
|
||||||
- name: Deploy Noctalia wallpapers cache
|
|
||||||
ansible.builtin.template:
|
|
||||||
src: wallpapers.json.j2
|
|
||||||
dest: "{{ user_home }}/.cache/noctalia/wallpapers.json"
|
|
||||||
owner: "{{ username }}"
|
|
||||||
group: "{{ user_group }}"
|
|
||||||
mode: "0644"
|
|
||||||
|
|||||||
@@ -203,18 +203,6 @@
|
|||||||
"middleClickCommand": "pwvucontrol || pavucontrol",
|
"middleClickCommand": "pwvucontrol || pavucontrol",
|
||||||
"textColor": "none"
|
"textColor": "none"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"displayMode": "onhover",
|
|
||||||
"iconColor": "none",
|
|
||||||
"id": "Network",
|
|
||||||
"textColor": "none"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"displayMode": "onhover",
|
|
||||||
"iconColor": "none",
|
|
||||||
"id": "Bluetooth",
|
|
||||||
"textColor": "none"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"applyToAllMonitors": false,
|
"applyToAllMonitors": false,
|
||||||
"displayMode": "onhover",
|
"displayMode": "onhover",
|
||||||
@@ -573,17 +561,15 @@
|
|||||||
{"enabled": true, "id": "alacritty"},
|
{"enabled": true, "id": "alacritty"},
|
||||||
{"enabled": true, "id": "gtk"},
|
{"enabled": true, "id": "gtk"},
|
||||||
{"enabled": true, "id": "emacs"},
|
{"enabled": true, "id": "emacs"},
|
||||||
{"enabled": true, "id": "telegram"},
|
{"enabled": true, "id": "telegram"}
|
||||||
{"enabled": true, "id": "qt"},
|
|
||||||
{"enabled": true, "id": "sway"}
|
|
||||||
],
|
],
|
||||||
"enableUserTheming": false
|
"enableUserTheming": false
|
||||||
},
|
},
|
||||||
"ui": {
|
"ui": {
|
||||||
"boxBorderEnabled": false,
|
"boxBorderEnabled": false,
|
||||||
"fontDefault": "{{ desktop_ui_font_family | default('Noto Sans') }}",
|
"fontDefault": "Sans Serif",
|
||||||
"fontDefaultScale": 1,
|
"fontDefaultScale": 1,
|
||||||
"fontFixed": "{{ desktop_fixed_font_family | default('Hack Nerd Font') }}",
|
"fontFixed": "monospace",
|
||||||
"fontFixedScale": 1,
|
"fontFixedScale": 1,
|
||||||
"panelBackgroundOpacity": 0.93,
|
"panelBackgroundOpacity": 0.93,
|
||||||
"panelsAttachedToBar": true,
|
"panelsAttachedToBar": true,
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
[Appearance]
|
|
||||||
color_scheme_path={{ user_home }}/.config/qt5ct/colors/noctalia.conf
|
|
||||||
custom_palette=true
|
|
||||||
icon_theme={{ desktop_icon_theme | default('Yaru-orange-dark') }}
|
|
||||||
standard_dialogs=default
|
|
||||||
style=Fusion
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
[Appearance]
|
|
||||||
color_scheme_path={{ user_home }}/.config/qt6ct/colors/noctalia.conf
|
|
||||||
custom_palette=true
|
|
||||||
icon_theme={{ desktop_icon_theme | default('Yaru-orange-dark') }}
|
|
||||||
standard_dialogs=default
|
|
||||||
style=Fusion
|
|
||||||
@@ -2,9 +2,9 @@ set $menu qs -c noctalia-shell ipc call launcher toggle
|
|||||||
set $audio_panel qs -c noctalia-shell ipc call volume openPanel
|
set $audio_panel qs -c noctalia-shell ipc call volume openPanel
|
||||||
set $locker qs -c noctalia-shell ipc call lockScreen lock
|
set $locker qs -c noctalia-shell ipc call lockScreen lock
|
||||||
set $powermenu qs -c noctalia-shell ipc call sessionMenu toggle
|
set $powermenu qs -c noctalia-shell ipc call sessionMenu toggle
|
||||||
set $screenshot_full sh -c 'QT_QPA_PLATFORM=wayland flameshot full --clipboard'
|
set $screenshot_full qs -c noctalia-shell ipc call plugin:screenshot takeScreenshot output
|
||||||
set $screenshot_region sh -c 'QT_QPA_PLATFORM=wayland flameshot gui'
|
set $screenshot_region qs -c noctalia-shell ipc call plugin:screenshot takeScreenshot region
|
||||||
set $screenshot_window sh -c 'QT_QPA_PLATFORM=wayland flameshot gui'
|
set $screenshot_window qs -c noctalia-shell ipc call plugin:screenshot takeScreenshot window
|
||||||
set $audio_raise qs -c noctalia-shell ipc call volume increase
|
set $audio_raise qs -c noctalia-shell ipc call volume increase
|
||||||
set $audio_lower qs -c noctalia-shell ipc call volume decrease
|
set $audio_lower qs -c noctalia-shell ipc call volume decrease
|
||||||
set $audio_mute qs -c noctalia-shell ipc call volume muteOutput
|
set $audio_mute qs -c noctalia-shell ipc call volume muteOutput
|
||||||
@@ -22,11 +22,8 @@ exec pipewire
|
|||||||
exec pipewire-pulse
|
exec pipewire-pulse
|
||||||
exec wireplumber
|
exec wireplumber
|
||||||
exec kanshi
|
exec kanshi
|
||||||
exec flameshot
|
|
||||||
exec udiskie --no-tray
|
exec udiskie --no-tray
|
||||||
exec wl-paste --watch cliphist store
|
exec wl-paste --watch cliphist store
|
||||||
exec qs -c noctalia-shell
|
exec qs -c noctalia-shell
|
||||||
|
|
||||||
bindsym $mod+c exec qs -c noctalia-shell ipc call launcher clipboard
|
bindsym $mod+c exec qs -c noctalia-shell ipc call launcher clipboard
|
||||||
bindsym $mod+Ctrl+v exec qs -c noctalia-shell ipc call plugin:clipboard toggle
|
|
||||||
bindsym $mod+Ctrl+Shift+v exec qs -c noctalia-shell ipc call plugin:clipboard wipe
|
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
{
|
|
||||||
"defaultWallpaper": "/etc/xdg/quickshell/noctalia-shell/Assets/Wallpaper/noctalia.png",
|
|
||||||
"usedRandomWallpapers": {},
|
|
||||||
"wallpapers": {
|
|
||||||
"": {
|
|
||||||
"dark": "{{ noctalia_wallpaper }}",
|
|
||||||
"light": "{{ noctalia_wallpaper }}"
|
|
||||||
},
|
|
||||||
"DP-1": {
|
|
||||||
"dark": "{{ noctalia_wallpaper }}",
|
|
||||||
"light": "{{ noctalia_wallpaper }}"
|
|
||||||
},
|
|
||||||
"eDP-1": {
|
|
||||||
"dark": "{{ noctalia_wallpaper }}",
|
|
||||||
"light": "{{ noctalia_wallpaper }}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
label: "{{ item.dest }}"
|
label: "{{ item.dest }}"
|
||||||
|
|
||||||
- name: Install workstation npm packages
|
- name: Install workstation npm packages
|
||||||
tags: [packages]
|
tags: [packages, npm]
|
||||||
community.general.npm:
|
community.general.npm:
|
||||||
name: "{{ item.name }}"
|
name: "{{ item.name }}"
|
||||||
global: true
|
global: true
|
||||||
|
|||||||
@@ -74,6 +74,20 @@
|
|||||||
changed_when: true
|
changed_when: true
|
||||||
when: item.stdout | trim != item.item.value
|
when: item.stdout | trim != item.item.value
|
||||||
|
|
||||||
|
- name: Apply workstation GNOME extension dconf settings
|
||||||
|
tags: [gnome]
|
||||||
|
ansible.builtin.command:
|
||||||
|
argv:
|
||||||
|
- dconf
|
||||||
|
- write
|
||||||
|
- "{{ item.path }}{{ item.key }}"
|
||||||
|
- "{{ item.value }}"
|
||||||
|
become_user: "{{ username }}"
|
||||||
|
loop: "{{ workstation_gnome_extension_dconf_settings | default([]) }}"
|
||||||
|
loop_control:
|
||||||
|
label: "{{ item.path }}{{ item.key }}"
|
||||||
|
changed_when: true
|
||||||
|
|
||||||
- name: Check whether VS Code CLI is available on workstation host
|
- name: Check whether VS Code CLI is available on workstation host
|
||||||
tags: [packages, vscode]
|
tags: [packages, vscode]
|
||||||
ansible.builtin.command:
|
ansible.builtin.command:
|
||||||
|
|||||||
@@ -18,3 +18,12 @@
|
|||||||
loop: "{{ host_enabled_services | default([]) }}"
|
loop: "{{ host_enabled_services | default([]) }}"
|
||||||
loop_control:
|
loop_control:
|
||||||
label: "{{ item }}"
|
label: "{{ item }}"
|
||||||
|
|
||||||
|
- name: Enable systemd services without starting them
|
||||||
|
tags: [services, packages]
|
||||||
|
ansible.builtin.systemd:
|
||||||
|
name: "{{ item }}"
|
||||||
|
enabled: true
|
||||||
|
loop: "{{ enabled_services_only | default([]) }}"
|
||||||
|
loop_control:
|
||||||
|
label: "{{ item }}"
|
||||||
|
|||||||
@@ -28,6 +28,16 @@
|
|||||||
- profile_desktop_sway
|
- profile_desktop_sway
|
||||||
- profile_desktop_host
|
- profile_desktop_host
|
||||||
|
|
||||||
|
- hosts: arch
|
||||||
|
become: true
|
||||||
|
|
||||||
|
roles:
|
||||||
|
- packages_arch
|
||||||
|
- services_systemd
|
||||||
|
- profile_desktop_common
|
||||||
|
- profile_desktop_gnome
|
||||||
|
- profile_desktop_host
|
||||||
|
|
||||||
- hosts: workstation_dev_ubuntu
|
- hosts: workstation_dev_ubuntu
|
||||||
become: true
|
become: true
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,25 @@ services:
|
|||||||
- web
|
- web
|
||||||
- gitea
|
- gitea
|
||||||
|
|
||||||
|
# Disabled: prometheus does not have enough resources to run Nextcloud AIO.
|
||||||
|
# nextcloud-aio-mastercontainer:
|
||||||
|
# image: ghcr.io/nextcloud-releases/all-in-one:latest
|
||||||
|
# container_name: nextcloud-aio-mastercontainer
|
||||||
|
# init: true
|
||||||
|
# restart: always
|
||||||
|
# ports:
|
||||||
|
# - "127.0.0.1:8080:8080"
|
||||||
|
# environment:
|
||||||
|
# APACHE_PORT: "11000"
|
||||||
|
# APACHE_IP_BINDING: "0.0.0.0"
|
||||||
|
# APACHE_ADDITIONAL_NETWORK: "server_web"
|
||||||
|
# NEXTCLOUD_DATADIR: "/srv/nextcloud/data"
|
||||||
|
# volumes:
|
||||||
|
# - "nextcloud_aio_mastercontainer:/mnt/docker-aio-config"
|
||||||
|
# - "/var/run/docker.sock:/var/run/docker.sock:ro"
|
||||||
|
# networks:
|
||||||
|
# - web
|
||||||
|
|
||||||
navidromedb:
|
navidromedb:
|
||||||
image: postgres:13
|
image: postgres:13
|
||||||
container_name: navidromedb
|
container_name: navidromedb
|
||||||
@@ -87,6 +106,11 @@ services:
|
|||||||
|
|
||||||
networks:
|
networks:
|
||||||
web:
|
web:
|
||||||
|
name: server_web
|
||||||
external: false
|
external: false
|
||||||
gitea:
|
gitea:
|
||||||
external: false
|
external: false
|
||||||
|
|
||||||
|
# volumes:
|
||||||
|
# nextcloud_aio_mastercontainer:
|
||||||
|
# name: nextcloud_aio_mastercontainer
|
||||||
|
|||||||
5
dotfiles/common/.claude/CLAUDE.md
Normal file
5
dotfiles/common/.claude/CLAUDE.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Claude Code Global Context
|
||||||
|
|
||||||
|
Import the shared coding agent bootstrap context:
|
||||||
|
|
||||||
|
@~/.config/ai/bootstrap.md
|
||||||
16
dotfiles/common/.codex/config.toml.j2
Normal file
16
dotfiles/common/.codex/config.toml.j2
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
model = "gpt-5.5"
|
||||||
|
model_reasoning_effort = "medium"
|
||||||
|
|
||||||
|
model_instructions_file = "{{ effective_user_home }}/.config/ai/bootstrap.md"
|
||||||
|
|
||||||
|
[projects."/home/fscotto/AnsiblePlaybook"]
|
||||||
|
trust_level = "trusted"
|
||||||
|
|
||||||
|
[tui]
|
||||||
|
theme = "coldark-dark"
|
||||||
|
|
||||||
|
[tui.model_availability_nux]
|
||||||
|
"gpt-5.5" = 3
|
||||||
|
|
||||||
|
[features]
|
||||||
|
memories = true
|
||||||
7
dotfiles/common/.config/opencode/opencode.json
Normal file
7
dotfiles/common/.config/opencode/opencode.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://opencode.ai/config.json",
|
||||||
|
"instructions": [
|
||||||
|
"~/.config/ai/bootstrap.md",
|
||||||
|
"~/.config/ai/rules/safety.md"
|
||||||
|
]
|
||||||
|
}
|
||||||
14
dotfiles/common/.gemini/settings.json
Normal file
14
dotfiles/common/.gemini/settings.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"security": {
|
||||||
|
"auth": {
|
||||||
|
"selectedType": "oauth-personal"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"context": {
|
||||||
|
"fileName": [
|
||||||
|
"~/.config/ai/bootstrap.md",
|
||||||
|
"~/.config/ai/rules/safety.md",
|
||||||
|
"~/.config/ai/AGENTS.md"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
dotfiles/common/templates_kit.zip
Normal file
BIN
dotfiles/common/templates_kit.zip
Normal file
Binary file not shown.
Binary file not shown.
39
dotfiles/desktop/.bashrc.d/14-dbus-session.sh
Normal file
39
dotfiles/desktop/.bashrc.d/14-dbus-session.sh
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
# Validate DBUS_SESSION_BUS_ADDRESS: a stale value (e.g. inherited from a
|
||||||
|
# dead X session) makes secret-tool, mbsync, msmtp fail with
|
||||||
|
# "Could not connect: No such file or directory".
|
||||||
|
# Fall back to ~/.dbus-session-bus-address (written by .xinitrc) or
|
||||||
|
# /run/user/$UID/bus, mirroring scripts/bootstrap_mail.sh.
|
||||||
|
|
||||||
|
_dbus_addr_socket_path() {
|
||||||
|
printf '%s' "${1#unix:path=}" | sed 's/,.*//'
|
||||||
|
}
|
||||||
|
|
||||||
|
_dbus_addr_is_live() {
|
||||||
|
case "$1" in
|
||||||
|
unix:path=*)
|
||||||
|
[ -S "$(_dbus_addr_socket_path "$1")" ]
|
||||||
|
;;
|
||||||
|
unix:abstract=*)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
if ! _dbus_addr_is_live "${DBUS_SESSION_BUS_ADDRESS:-}"; then
|
||||||
|
unset DBUS_SESSION_BUS_ADDRESS
|
||||||
|
if [ -f "$HOME/.dbus-session-bus-address" ]; then
|
||||||
|
_saved=$(tr -d '\n' <"$HOME/.dbus-session-bus-address" 2>/dev/null)
|
||||||
|
if [ -n "$_saved" ] && _dbus_addr_is_live "$_saved"; then
|
||||||
|
export DBUS_SESSION_BUS_ADDRESS="$_saved"
|
||||||
|
fi
|
||||||
|
unset _saved
|
||||||
|
fi
|
||||||
|
if [ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ] && [ -S "/run/user/$(id -u)/bus" ]; then
|
||||||
|
export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
unset -f _dbus_addr_socket_path _dbus_addr_is_live
|
||||||
@@ -1,2 +1 @@
|
|||||||
export SVDIR="$HOME/.config/service"
|
export SVDIR="$HOME/.config/service"
|
||||||
export SSH_AUTH_SOCK="$HOME/.local/state/ssh-agent/socket"
|
|
||||||
|
|||||||
1
dotfiles/desktop/.bashrc.d/16-ssh-agent-socket.sh
Normal file
1
dotfiles/desktop/.bashrc.d/16-ssh-agent-socket.sh
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export SSH_AUTH_SOCK="$HOME/.local/state/ssh-agent/socket"
|
||||||
@@ -1,14 +1,14 @@
|
|||||||
if command -v emacsclient >/dev/null 2>&1; then
|
if command -v emacsclient >/dev/null 2>&1; then
|
||||||
ec() {
|
ec() {
|
||||||
emacsclient -c -n "$@" || {
|
emacsclient -c -n "$@" || {
|
||||||
printf '%s\n' "Emacs server is not available. Log into a graphical session and ensure the turnstile-managed 'emacs' service is running." >&2
|
printf '%s\n' "Emacs server is not available. Log into a graphical session and ensure the user 'emacs' service is running." >&2
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
et() {
|
et() {
|
||||||
emacsclient -t "$@" || {
|
emacsclient -t "$@" || {
|
||||||
printf '%s\n' "Emacs server is not available. Ensure the turnstile-managed 'emacs' service is running in your graphical session." >&2
|
printf '%s\n' "Emacs server is not available. Ensure the user 'emacs' service is running in your graphical session." >&2
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ ap() {
|
|||||||
cmd+=(--tag "$1")
|
cmd+=(--tag "$1")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
printf '+ %s\n' "${cmd[*]}"
|
printf '\033[0;36m+ %s\033[0m\n' "${cmd[*]}"
|
||||||
"${cmd[@]}"
|
"${cmd[@]}"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
[general]
|
|
||||||
import = ["~/.config/alacritty/themes/noctalia.toml"]
|
|
||||||
|
|
||||||
[window]
|
[window]
|
||||||
padding = { x = 8, y = 8 }
|
padding = { x = 8, y = 8 }
|
||||||
opacity = 1.0
|
opacity = 1.0
|
||||||
@@ -16,8 +13,33 @@ multiplier = 3
|
|||||||
[cursor]
|
[cursor]
|
||||||
style = { shape = "Beam", blinking = "Off" }
|
style = { shape = "Beam", blinking = "Off" }
|
||||||
|
|
||||||
|
[colors.primary]
|
||||||
|
background = "#000000"
|
||||||
|
foreground = "#c8c8c8"
|
||||||
|
|
||||||
|
[colors.normal]
|
||||||
|
black = "#1f1f28"
|
||||||
|
red = "#c7162b"
|
||||||
|
green = "#4caf50"
|
||||||
|
yellow = "#e95420"
|
||||||
|
blue = "#4a90d9"
|
||||||
|
magenta = "#7e57c2"
|
||||||
|
cyan = "#6daeea"
|
||||||
|
white = "#eeeeee"
|
||||||
|
|
||||||
|
[colors.bright]
|
||||||
|
black = "#3a3a46"
|
||||||
|
red = "#ff5c5c"
|
||||||
|
green = "#7ad97a"
|
||||||
|
yellow = "#ff8f40"
|
||||||
|
blue = "#6daeea"
|
||||||
|
magenta = "#9575cd"
|
||||||
|
cyan = "#8bd6ff"
|
||||||
|
white = "#ffffff"
|
||||||
|
|
||||||
[keyboard]
|
[keyboard]
|
||||||
bindings = [
|
bindings = [
|
||||||
{ key = "V", mods = "Control|Shift", action = "Paste" },
|
{ key = "V", mods = "Control|Shift", action = "Paste" },
|
||||||
{ key = "C", mods = "Control|Shift", action = "Copy" }
|
{ key = "C", mods = "Control|Shift", action = "Copy" },
|
||||||
|
{ key = "Return", mods = "Shift", chars = "\u001B\r" }
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ font pango:Liberation Mono 10
|
|||||||
exec --no-startup-id dex --autostart --environment i3
|
exec --no-startup-id dex --autostart --environment i3
|
||||||
exec --no-startup-id gnome-keyring-daemon --start --components=secrets
|
exec --no-startup-id gnome-keyring-daemon --start --components=secrets
|
||||||
exec_always --no-startup-id setxkbmap -layout us -variant intl
|
exec_always --no-startup-id setxkbmap -layout us -variant intl
|
||||||
exec_always --no-startup-id feh --bg-fill ~/.config/i3/wallpapers/void-minimalist2.png
|
exec_always --no-startup-id feh --bg-center ~/.config/i3/wallpapers/wallpaper-161664.jpg
|
||||||
exec_always --no-startup-id ~/.config/i3/scripts/setup-gtk-theme.sh
|
exec_always --no-startup-id ~/.config/i3/scripts/setup-gtk-theme.sh
|
||||||
exec --no-startup-id /usr/libexec/xdg-desktop-portal
|
exec --no-startup-id /usr/libexec/xdg-desktop-portal
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
wallpaper="$HOME/.config/i3/wallpapers/void-minimalist.png"
|
wallpaper="$HOME/.config/i3/wallpapers/maxresdefault.jpg"
|
||||||
cached="$HOME/.cache/i3lock/wallpaper.png"
|
cached="$HOME/.cache/i3lock/wallpaper.png"
|
||||||
dims_cache="$HOME/.cache/i3lock/dims.txt"
|
dims_cache="$HOME/.cache/i3lock/dims.txt"
|
||||||
dims=$(xdotool getdisplaygeometry | tr ' ' 'x')
|
dims=$(xdotool getdisplaygeometry | tr ' ' 'x')
|
||||||
|
|||||||
BIN
dotfiles/desktop/.config/i3/wallpapers/785318-darth-vader.jpg
Executable file
BIN
dotfiles/desktop/.config/i3/wallpapers/785318-darth-vader.jpg
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 82 KiB |
BIN
dotfiles/desktop/.config/i3/wallpapers/maxresdefault.jpg
Executable file
BIN
dotfiles/desktop/.config/i3/wallpapers/maxresdefault.jpg
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 116 KiB |
BIN
dotfiles/desktop/.config/i3/wallpapers/wallpaper-161664.jpg
Executable file
BIN
dotfiles/desktop/.config/i3/wallpapers/wallpaper-161664.jpg
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 118 KiB |
250
dotfiles/desktop/.config/mimeapps.arch.list
Normal file
250
dotfiles/desktop/.config/mimeapps.arch.list
Normal file
@@ -0,0 +1,250 @@
|
|||||||
|
[Default Applications]
|
||||||
|
text/html=userapp-Firefox-91DVN3.desktop
|
||||||
|
x-scheme-handler/http=userapp-Firefox-91DVN3.desktop
|
||||||
|
x-scheme-handler/https=userapp-Firefox-91DVN3.desktop
|
||||||
|
x-scheme-handler/about=firefox.desktop
|
||||||
|
x-scheme-handler/unknown=firefox.desktop
|
||||||
|
application/pdf=com.github.xournalpp.xournalpp.desktop
|
||||||
|
application/json=emacs.desktop
|
||||||
|
application/json5=emacs.desktop
|
||||||
|
application/xml=emacs.desktop
|
||||||
|
application/xml-external-parsed-entity=emacs.desktop
|
||||||
|
application/x-shellscript=emacs.desktop
|
||||||
|
application/yaml=emacs.desktop
|
||||||
|
inode/directory=org.gnome.Nautilus.desktop
|
||||||
|
audio/aac=mpv.desktop
|
||||||
|
audio/flac=mpv.desktop
|
||||||
|
audio/m4a=mpv.desktop
|
||||||
|
audio/mp3=mpv.desktop
|
||||||
|
audio/mpeg=mpv.desktop
|
||||||
|
audio/mp4=mpv.desktop
|
||||||
|
audio/ogg=mpv.desktop
|
||||||
|
audio/opus=mpv.desktop
|
||||||
|
audio/vnd.wave=mpv.desktop
|
||||||
|
audio/wav=mpv.desktop
|
||||||
|
audio/webm=mpv.desktop
|
||||||
|
audio/x-aac=mpv.desktop
|
||||||
|
audio/x-m4a=mpv.desktop
|
||||||
|
audio/x-matroska=mpv.desktop
|
||||||
|
audio/x-mp3=mpv.desktop
|
||||||
|
audio/x-mpegurl=mpv.desktop
|
||||||
|
audio/x-ms-wma=mpv.desktop
|
||||||
|
audio/x-ogg=mpv.desktop
|
||||||
|
audio/x-pn-wav=mpv.desktop
|
||||||
|
audio/x-scpls=mpv.desktop
|
||||||
|
audio/x-wav=mpv.desktop
|
||||||
|
video/3gp=mpv.desktop
|
||||||
|
video/3gpp=mpv.desktop
|
||||||
|
video/3gpp2=mpv.desktop
|
||||||
|
video/avi=mpv.desktop
|
||||||
|
video/mp2t=mpv.desktop
|
||||||
|
video/mp4=mpv.desktop
|
||||||
|
video/mp4v-es=mpv.desktop
|
||||||
|
video/mpeg=mpv.desktop
|
||||||
|
video/ogg=mpv.desktop
|
||||||
|
video/quicktime=mpv.desktop
|
||||||
|
video/vnd.avi=mpv.desktop
|
||||||
|
video/webm=mpv.desktop
|
||||||
|
video/x-avi=mpv.desktop
|
||||||
|
video/x-flc=mpv.desktop
|
||||||
|
video/x-flic=mpv.desktop
|
||||||
|
video/x-flv=mpv.desktop
|
||||||
|
video/x-m4v=mpv.desktop
|
||||||
|
video/x-matroska=mpv.desktop
|
||||||
|
video/x-mpeg2=mpv.desktop
|
||||||
|
video/x-ms-asf=mpv.desktop
|
||||||
|
video/x-ms-wmv=mpv.desktop
|
||||||
|
video/x-msvideo=mpv.desktop
|
||||||
|
video/x-ogm+ogg=mpv.desktop
|
||||||
|
video/x-theora=mpv.desktop
|
||||||
|
video/x-theora+ogg=mpv.desktop
|
||||||
|
application/msword=libreoffice-writer.desktop
|
||||||
|
application/rtf=libreoffice-writer.desktop
|
||||||
|
application/vnd.ms-word=libreoffice-writer.desktop
|
||||||
|
application/vnd.ms-word.document.macroEnabled.12=libreoffice-writer.desktop
|
||||||
|
application/vnd.ms-word.template.macroEnabled.12=libreoffice-writer.desktop
|
||||||
|
application/vnd.oasis.opendocument.text=libreoffice-writer.desktop
|
||||||
|
application/vnd.oasis.opendocument.text-template=libreoffice-writer.desktop
|
||||||
|
application/vnd.openxmlformats-officedocument.wordprocessingml.document=libreoffice-writer.desktop
|
||||||
|
application/vnd.openxmlformats-officedocument.wordprocessingml.template=libreoffice-writer.desktop
|
||||||
|
application/x-doc=libreoffice-writer.desktop
|
||||||
|
text/rtf=libreoffice-writer.desktop
|
||||||
|
application/csv=libreoffice-calc.desktop
|
||||||
|
application/excel=libreoffice-calc.desktop
|
||||||
|
application/msexcel=libreoffice-calc.desktop
|
||||||
|
application/tab-separated-values=libreoffice-calc.desktop
|
||||||
|
application/vnd.ms-excel=libreoffice-calc.desktop
|
||||||
|
application/vnd.ms-excel.sheet.binary.macroEnabled.12=libreoffice-calc.desktop
|
||||||
|
application/vnd.ms-excel.sheet.macroEnabled.12=libreoffice-calc.desktop
|
||||||
|
application/vnd.ms-excel.template.macroEnabled.12=libreoffice-calc.desktop
|
||||||
|
application/vnd.oasis.opendocument.spreadsheet=libreoffice-calc.desktop
|
||||||
|
application/vnd.oasis.opendocument.spreadsheet-template=libreoffice-calc.desktop
|
||||||
|
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet=libreoffice-calc.desktop
|
||||||
|
application/vnd.openxmlformats-officedocument.spreadsheetml.template=libreoffice-calc.desktop
|
||||||
|
application/x-dos_ms_excel=libreoffice-calc.desktop
|
||||||
|
application/x-excel=libreoffice-calc.desktop
|
||||||
|
application/x-ms-excel=libreoffice-calc.desktop
|
||||||
|
application/x-msexcel=libreoffice-calc.desktop
|
||||||
|
text/comma-separated-values=libreoffice-calc.desktop
|
||||||
|
text/csv=libreoffice-calc.desktop
|
||||||
|
text/tab-separated-values=libreoffice-calc.desktop
|
||||||
|
text/x-comma-separated-values=libreoffice-calc.desktop
|
||||||
|
text/x-csv=libreoffice-calc.desktop
|
||||||
|
application/mspowerpoint=libreoffice-impress.desktop
|
||||||
|
application/vnd.ms-powerpoint=libreoffice-impress.desktop
|
||||||
|
application/vnd.ms-powerpoint.presentation.macroEnabled.12=libreoffice-impress.desktop
|
||||||
|
application/vnd.ms-powerpoint.slideshow.macroEnabled.12=libreoffice-impress.desktop
|
||||||
|
application/vnd.ms-powerpoint.template.macroEnabled.12=libreoffice-impress.desktop
|
||||||
|
application/vnd.oasis.opendocument.presentation=libreoffice-impress.desktop
|
||||||
|
application/vnd.oasis.opendocument.presentation-template=libreoffice-impress.desktop
|
||||||
|
application/vnd.openxmlformats-officedocument.presentationml.presentation=libreoffice-impress.desktop
|
||||||
|
application/vnd.openxmlformats-officedocument.presentationml.slide=libreoffice-impress.desktop
|
||||||
|
application/vnd.openxmlformats-officedocument.presentationml.slideshow=libreoffice-impress.desktop
|
||||||
|
application/vnd.openxmlformats-officedocument.presentationml.template=libreoffice-impress.desktop
|
||||||
|
text/markdown=emacs.desktop
|
||||||
|
text/org=emacs.desktop
|
||||||
|
text/plain=emacs.desktop
|
||||||
|
text/rust=emacs.desktop
|
||||||
|
text/x-c++hdr=emacs.desktop
|
||||||
|
text/x-c++src=emacs.desktop
|
||||||
|
text/x-chdr=emacs.desktop
|
||||||
|
text/x-csrc=emacs.desktop
|
||||||
|
text/x-emacs-lisp=emacs.desktop
|
||||||
|
text/x-go=emacs.desktop
|
||||||
|
text/x-java=emacs.desktop
|
||||||
|
text/x-makefile=emacs.desktop
|
||||||
|
text/x-patch=emacs.desktop
|
||||||
|
text/x-python=emacs.desktop
|
||||||
|
text/x-python3=emacs.desktop
|
||||||
|
text/x-readme=emacs.desktop
|
||||||
|
text/x-rst=emacs.desktop
|
||||||
|
text/x-tex=emacs.desktop
|
||||||
|
text/x-texinfo=emacs.desktop
|
||||||
|
x-scheme-handler/chrome=userapp-Firefox-91DVN3.desktop
|
||||||
|
application/x-extension-htm=userapp-Firefox-91DVN3.desktop
|
||||||
|
application/x-extension-html=userapp-Firefox-91DVN3.desktop
|
||||||
|
application/x-extension-shtml=userapp-Firefox-91DVN3.desktop
|
||||||
|
application/xhtml+xml=userapp-Firefox-91DVN3.desktop
|
||||||
|
application/x-extension-xhtml=userapp-Firefox-91DVN3.desktop
|
||||||
|
application/x-extension-xht=userapp-Firefox-91DVN3.desktop
|
||||||
|
|
||||||
|
[Added Associations]
|
||||||
|
application/json=emacs.desktop;
|
||||||
|
application/json5=emacs.desktop;
|
||||||
|
application/pdf=com.github.xournalpp.xournalpp.desktop;
|
||||||
|
application/xml=emacs.desktop;
|
||||||
|
application/xml-external-parsed-entity=emacs.desktop;
|
||||||
|
application/x-shellscript=emacs.desktop;
|
||||||
|
application/yaml=emacs.desktop;
|
||||||
|
text/plain=emacs.desktop;
|
||||||
|
inode/directory=org.gnome.Nautilus.desktop;
|
||||||
|
audio/aac=mpv.desktop;
|
||||||
|
audio/flac=mpv.desktop;
|
||||||
|
audio/m4a=mpv.desktop;
|
||||||
|
audio/mp3=mpv.desktop;
|
||||||
|
audio/mpeg=mpv.desktop;
|
||||||
|
audio/mp4=mpv.desktop;
|
||||||
|
audio/ogg=mpv.desktop;
|
||||||
|
audio/opus=mpv.desktop;
|
||||||
|
audio/vnd.wave=mpv.desktop;
|
||||||
|
audio/wav=mpv.desktop;
|
||||||
|
audio/webm=mpv.desktop;
|
||||||
|
audio/x-aac=mpv.desktop;
|
||||||
|
audio/x-m4a=mpv.desktop;
|
||||||
|
audio/x-matroska=mpv.desktop;
|
||||||
|
audio/x-mp3=mpv.desktop;
|
||||||
|
audio/x-mpegurl=mpv.desktop;
|
||||||
|
audio/x-ms-wma=mpv.desktop;
|
||||||
|
audio/x-ogg=mpv.desktop;
|
||||||
|
audio/x-pn-wav=mpv.desktop;
|
||||||
|
audio/x-scpls=mpv.desktop;
|
||||||
|
audio/x-wav=mpv.desktop;
|
||||||
|
video/3gp=mpv.desktop;
|
||||||
|
video/3gpp=mpv.desktop;
|
||||||
|
video/3gpp2=mpv.desktop;
|
||||||
|
video/avi=mpv.desktop;
|
||||||
|
video/mp2t=mpv.desktop;
|
||||||
|
video/mp4=mpv.desktop;
|
||||||
|
video/mp4v-es=mpv.desktop;
|
||||||
|
video/mpeg=mpv.desktop;
|
||||||
|
video/ogg=mpv.desktop;
|
||||||
|
video/quicktime=mpv.desktop;
|
||||||
|
video/vnd.avi=mpv.desktop;
|
||||||
|
video/webm=mpv.desktop;
|
||||||
|
video/x-avi=mpv.desktop;
|
||||||
|
video/x-flc=mpv.desktop;
|
||||||
|
video/x-flic=mpv.desktop;
|
||||||
|
video/x-flv=mpv.desktop;
|
||||||
|
video/x-m4v=mpv.desktop;
|
||||||
|
video/x-matroska=mpv.desktop;
|
||||||
|
video/x-mpeg2=mpv.desktop;
|
||||||
|
video/x-ms-asf=mpv.desktop;
|
||||||
|
video/x-ms-wmv=mpv.desktop;
|
||||||
|
video/x-msvideo=mpv.desktop;
|
||||||
|
video/x-ogm+ogg=mpv.desktop;
|
||||||
|
video/x-theora=mpv.desktop;
|
||||||
|
video/x-theora+ogg=mpv.desktop;
|
||||||
|
application/msword=libreoffice-writer.desktop;
|
||||||
|
application/rtf=libreoffice-writer.desktop;
|
||||||
|
application/vnd.ms-word=libreoffice-writer.desktop;
|
||||||
|
application/vnd.ms-word.document.macroEnabled.12=libreoffice-writer.desktop;
|
||||||
|
application/vnd.ms-word.template.macroEnabled.12=libreoffice-writer.desktop;
|
||||||
|
application/vnd.oasis.opendocument.text=libreoffice-writer.desktop;
|
||||||
|
application/vnd.oasis.opendocument.text-template=libreoffice-writer.desktop;
|
||||||
|
application/vnd.openxmlformats-officedocument.wordprocessingml.document=libreoffice-writer.desktop;
|
||||||
|
application/vnd.openxmlformats-officedocument.wordprocessingml.template=libreoffice-writer.desktop;
|
||||||
|
application/x-doc=libreoffice-writer.desktop;
|
||||||
|
text/rtf=libreoffice-writer.desktop;
|
||||||
|
application/csv=libreoffice-calc.desktop;
|
||||||
|
application/excel=libreoffice-calc.desktop;
|
||||||
|
application/msexcel=libreoffice-calc.desktop;
|
||||||
|
application/tab-separated-values=libreoffice-calc.desktop;
|
||||||
|
application/vnd.ms-excel=libreoffice-calc.desktop;
|
||||||
|
application/vnd.ms-excel.sheet.binary.macroEnabled.12=libreoffice-calc.desktop;
|
||||||
|
application/vnd.ms-excel.sheet.macroEnabled.12=libreoffice-calc.desktop;
|
||||||
|
application/vnd.ms-excel.template.macroEnabled.12=libreoffice-calc.desktop;
|
||||||
|
application/vnd.oasis.opendocument.spreadsheet=libreoffice-calc.desktop;
|
||||||
|
application/vnd.oasis.opendocument.spreadsheet-template=libreoffice-calc.desktop;
|
||||||
|
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet=libreoffice-calc.desktop;
|
||||||
|
application/vnd.openxmlformats-officedocument.spreadsheetml.template=libreoffice-calc.desktop;
|
||||||
|
application/x-dos_ms_excel=libreoffice-calc.desktop;
|
||||||
|
application/x-excel=libreoffice-calc.desktop;
|
||||||
|
application/x-ms-excel=libreoffice-calc.desktop;
|
||||||
|
application/x-msexcel=libreoffice-calc.desktop;
|
||||||
|
text/comma-separated-values=libreoffice-calc.desktop;
|
||||||
|
text/csv=libreoffice-calc.desktop;
|
||||||
|
text/tab-separated-values=libreoffice-calc.desktop;
|
||||||
|
text/x-comma-separated-values=libreoffice-calc.desktop;
|
||||||
|
text/x-csv=libreoffice-calc.desktop;
|
||||||
|
application/mspowerpoint=libreoffice-impress.desktop;
|
||||||
|
application/vnd.ms-powerpoint=libreoffice-impress.desktop;
|
||||||
|
application/vnd.ms-powerpoint.presentation.macroEnabled.12=libreoffice-impress.desktop;
|
||||||
|
application/vnd.ms-powerpoint.slideshow.macroEnabled.12=libreoffice-impress.desktop;
|
||||||
|
application/vnd.ms-powerpoint.template.macroEnabled.12=libreoffice-impress.desktop;
|
||||||
|
application/vnd.oasis.opendocument.presentation=libreoffice-impress.desktop;
|
||||||
|
application/vnd.oasis.opendocument.presentation-template=libreoffice-impress.desktop;
|
||||||
|
application/vnd.openxmlformats-officedocument.presentationml.presentation=libreoffice-impress.desktop;
|
||||||
|
application/vnd.openxmlformats-officedocument.presentationml.slide=libreoffice-impress.desktop;
|
||||||
|
application/vnd.openxmlformats-officedocument.presentationml.slideshow=libreoffice-impress.desktop;
|
||||||
|
application/vnd.openxmlformats-officedocument.presentationml.template=libreoffice-impress.desktop;
|
||||||
|
text/markdown=emacs.desktop;
|
||||||
|
text/org=emacs.desktop;
|
||||||
|
text/rust=emacs.desktop;
|
||||||
|
text/x-c++hdr=emacs.desktop;
|
||||||
|
text/x-c++src=emacs.desktop;
|
||||||
|
text/x-chdr=emacs.desktop;
|
||||||
|
text/x-csrc=emacs.desktop;
|
||||||
|
text/x-emacs-lisp=emacs.desktop;
|
||||||
|
text/x-go=emacs.desktop;
|
||||||
|
text/x-java=emacs.desktop;
|
||||||
|
text/x-makefile=emacs.desktop;
|
||||||
|
text/x-patch=emacs.desktop;
|
||||||
|
text/x-python=emacs.desktop;
|
||||||
|
text/x-python3=emacs.desktop;
|
||||||
|
text/x-readme=emacs.desktop;
|
||||||
|
text/x-rst=emacs.desktop;
|
||||||
|
text/x-tex=emacs.desktop;
|
||||||
|
text/x-texinfo=emacs.desktop;
|
||||||
|
x-scheme-handler/http=userapp-Firefox-91DVN3.desktop;
|
||||||
|
x-scheme-handler/https=userapp-Firefox-91DVN3.desktop;
|
||||||
|
x-scheme-handler/chrome=userapp-Firefox-91DVN3.desktop;
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
[Default Applications]
|
[Default Applications]
|
||||||
text/html=firefox.desktop
|
text/html=userapp-Firefox-91DVN3.desktop
|
||||||
x-scheme-handler/http=firefox.desktop
|
x-scheme-handler/http=userapp-Firefox-91DVN3.desktop
|
||||||
x-scheme-handler/https=firefox.desktop
|
x-scheme-handler/https=userapp-Firefox-91DVN3.desktop
|
||||||
x-scheme-handler/about=firefox.desktop
|
x-scheme-handler/about=firefox.desktop
|
||||||
x-scheme-handler/unknown=firefox.desktop
|
x-scheme-handler/unknown=firefox.desktop
|
||||||
application/pdf=com.github.xournalpp.xournalpp.desktop
|
application/pdf=com.github.xournalpp.xournalpp.desktop
|
||||||
@@ -164,6 +164,13 @@ text/x-readme=emacs.desktop
|
|||||||
text/x-rst=emacs.desktop
|
text/x-rst=emacs.desktop
|
||||||
text/x-tex=emacs.desktop
|
text/x-tex=emacs.desktop
|
||||||
text/x-texinfo=emacs.desktop
|
text/x-texinfo=emacs.desktop
|
||||||
|
x-scheme-handler/chrome=userapp-Firefox-91DVN3.desktop
|
||||||
|
application/x-extension-htm=userapp-Firefox-91DVN3.desktop
|
||||||
|
application/x-extension-html=userapp-Firefox-91DVN3.desktop
|
||||||
|
application/x-extension-shtml=userapp-Firefox-91DVN3.desktop
|
||||||
|
application/xhtml+xml=userapp-Firefox-91DVN3.desktop
|
||||||
|
application/x-extension-xhtml=userapp-Firefox-91DVN3.desktop
|
||||||
|
application/x-extension-xht=userapp-Firefox-91DVN3.desktop
|
||||||
|
|
||||||
[Added Associations]
|
[Added Associations]
|
||||||
application/json=emacs.desktop;
|
application/json=emacs.desktop;
|
||||||
@@ -326,3 +333,6 @@ text/x-readme=emacs.desktop;
|
|||||||
text/x-rst=emacs.desktop;
|
text/x-rst=emacs.desktop;
|
||||||
text/x-tex=emacs.desktop;
|
text/x-tex=emacs.desktop;
|
||||||
text/x-texinfo=emacs.desktop;
|
text/x-texinfo=emacs.desktop;
|
||||||
|
x-scheme-handler/http=userapp-Firefox-91DVN3.desktop;
|
||||||
|
x-scheme-handler/https=userapp-Firefox-91DVN3.desktop;
|
||||||
|
x-scheme-handler/chrome=userapp-Firefox-91DVN3.desktop;
|
||||||
|
|||||||
@@ -7,10 +7,6 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"states": {
|
"states": {
|
||||||
"clipboard": {
|
|
||||||
"enabled": true,
|
|
||||||
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
|
|
||||||
},
|
|
||||||
"clipper": {
|
"clipper": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
|
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
|
||||||
@@ -19,6 +15,10 @@
|
|||||||
"enabled": true,
|
"enabled": true,
|
||||||
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
|
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
|
||||||
},
|
},
|
||||||
|
"screenshot": {
|
||||||
|
"enabled": true,
|
||||||
|
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
|
||||||
|
},
|
||||||
"usb-drive-manager": {
|
"usb-drive-manager": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
|
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
|
||||||
|
|||||||
@@ -38,7 +38,43 @@
|
|||||||
"fg": "mOnError"
|
"fg": "mOnError"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"customColors": {},
|
"customColors": {
|
||||||
|
"Text": {
|
||||||
|
"bg": "#555555",
|
||||||
|
"separator": "#000000",
|
||||||
|
"fg": "#e9e4f0"
|
||||||
|
},
|
||||||
|
"Image": {
|
||||||
|
"bg": "#e0b7c9",
|
||||||
|
"separator": "#000000",
|
||||||
|
"fg": "#20161f"
|
||||||
|
},
|
||||||
|
"Link": {
|
||||||
|
"bg": "#c7a1d8",
|
||||||
|
"separator": "#000000",
|
||||||
|
"fg": "#1a151f"
|
||||||
|
},
|
||||||
|
"Code": {
|
||||||
|
"bg": "#a984c4",
|
||||||
|
"separator": "#000000",
|
||||||
|
"fg": "#f3edf7"
|
||||||
|
},
|
||||||
|
"Color": {
|
||||||
|
"bg": "#a984c4",
|
||||||
|
"separator": "#000000",
|
||||||
|
"fg": "#f3edf7"
|
||||||
|
},
|
||||||
|
"Emoji": {
|
||||||
|
"bg": "#e0b7c9",
|
||||||
|
"separator": "#000000",
|
||||||
|
"fg": "#20161f"
|
||||||
|
},
|
||||||
|
"File": {
|
||||||
|
"bg": "#e9899d",
|
||||||
|
"separator": "#000000",
|
||||||
|
"fg": "#1e1418"
|
||||||
|
}
|
||||||
|
},
|
||||||
"enableTodoIntegration": true,
|
"enableTodoIntegration": true,
|
||||||
"autoOpenPinnedPanel": false,
|
"autoOpenPinnedPanel": false,
|
||||||
"pincardsEnabled": true,
|
"pincardsEnabled": true,
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "https://opencode.ai/config.json",
|
|
||||||
"instructions": [
|
|
||||||
"~/.config/opencode/bootstrap.md",
|
|
||||||
"~/.config/opencode/rules/safety.md"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -6,7 +6,7 @@ set $fallback_terminal st
|
|||||||
include ~/.config/sway/host.conf
|
include ~/.config/sway/host.conf
|
||||||
include ~/.config/sway/shell.conf
|
include ~/.config/sway/shell.conf
|
||||||
|
|
||||||
font pango:Hack Nerd Font 10
|
font pango:Liberation Mono 10
|
||||||
|
|
||||||
# Input and output defaults
|
# Input and output defaults
|
||||||
seat seat0 xcursor_theme Yaru 24
|
seat seat0 xcursor_theme Yaru 24
|
||||||
@@ -166,4 +166,9 @@ mode "resize" {
|
|||||||
|
|
||||||
bindsym $mod+r mode "resize"
|
bindsym $mod+r mode "resize"
|
||||||
|
|
||||||
include ~/.config/sway/noctalia
|
client.focused #4a90d9 #4a90d9 #ffffff #4a90d9 #4a90d9
|
||||||
|
client.focused_inactive #3a3a46 #2b2b36 #eeeeee #3a3a46 #3a3a46
|
||||||
|
client.unfocused #2b2b36 #1f1f28 #bcbcbc #2b2b36 #2b2b36
|
||||||
|
client.urgent #c7162b #c7162b #ffffff #c7162b #c7162b
|
||||||
|
client.placeholder #1f1f28 #1f1f28 #bcbcbc #1f1f28 #1f1f28
|
||||||
|
client.background #1f1f28
|
||||||
|
|||||||
11
dotfiles/desktop/.config/systemd/user/emacs.service
Normal file
11
dotfiles/desktop/.config/systemd/user/emacs.service
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Emacs daemon
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=%h
|
||||||
|
ExecStart=/usr/bin/emacs --fg-daemon
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=default.target
|
||||||
12
dotfiles/desktop/.config/systemd/user/rclone-pcloud.service
Normal file
12
dotfiles/desktop/.config/systemd/user/rclone-pcloud.service
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Mount pCloud remote with rclone
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/bin/sh -lc 'mkdir -p "$HOME/.cache/rclone/pcloud" "$HOME/Remotes/pCloud"; mountpoint -q "$HOME/Remotes/pCloud" && exit 0; exec /usr/bin/rclone mount pcloud: "$HOME/Remotes/pCloud" --config "$HOME/.config/rclone/rclone.conf" --cache-dir "$HOME/.cache/rclone/pcloud" --vfs-cache-mode writes --dir-cache-time 10m --poll-interval 1m --log-level INFO'
|
||||||
|
ExecStop=/bin/sh -lc 'mountpoint -q "$HOME/Remotes/pCloud" && exec /usr/bin/fusermount3 -u "$HOME/Remotes/pCloud" || exit 0'
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=10
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=default.target
|
||||||
13
dotfiles/desktop/.config/systemd/user/ssh-agent.service
Normal file
13
dotfiles/desktop/.config/systemd/user/ssh-agent.service
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=SSH key agent
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
Environment=SSH_AUTH_SOCK=%h/.local/state/ssh-agent/socket
|
||||||
|
ExecStartPre=/usr/bin/mkdir -p %h/.local/state/ssh-agent
|
||||||
|
ExecStartPre=/usr/bin/rm -f %h/.local/state/ssh-agent/socket
|
||||||
|
ExecStart=/usr/bin/ssh-agent -D -a %h/.local/state/ssh-agent/socket
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=default.target
|
||||||
10
dotfiles/desktop/.config/systemd/user/syncthing.service
Normal file
10
dotfiles/desktop/.config/systemd/user/syncthing.service
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Syncthing file synchronization
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/bin/syncthing serve --no-browser --no-restart --logfile=default
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=default.target
|
||||||
@@ -45,8 +45,7 @@
|
|||||||
'misc/rss
|
'misc/rss
|
||||||
'misc/terminal
|
'misc/terminal
|
||||||
'misc/vcs
|
'misc/vcs
|
||||||
'misc/pdf
|
'misc/documents
|
||||||
'misc/epub
|
|
||||||
'misc/i3-config)
|
'misc/i3-config)
|
||||||
|
|
||||||
(message "...user configuration loaded")
|
(message "...user configuration loaded")
|
||||||
|
|||||||
@@ -105,8 +105,8 @@
|
|||||||
(define-key projectile-command-map (kbd "v") #'fscotto/project-multi-vterm)
|
(define-key projectile-command-map (kbd "v") #'fscotto/project-multi-vterm)
|
||||||
(define-key projectile-command-map (kbd "V") nil)
|
(define-key projectile-command-map (kbd "V") nil)
|
||||||
(define-key projectile-command-map (kbd "x") #'fscotto/project-external-terminal)
|
(define-key projectile-command-map (kbd "x") #'fscotto/project-external-terminal)
|
||||||
(define-key projectile-command-map (kbd "a") #'fscotto/project-opencode-dwim)
|
(define-key projectile-command-map (kbd "a") #'fscotto/project-agent-dwim)
|
||||||
(define-key projectile-command-map (kbd "A") #'fscotto/project-opencode-session)
|
(define-key projectile-command-map (kbd "A") #'fscotto/project-agent-session)
|
||||||
(define-key projectile-command-map (kbd "g") #'fscotto/project-magit-status))
|
(define-key projectile-command-map (kbd "g") #'fscotto/project-magit-status))
|
||||||
|
|
||||||
;;;; LSP
|
;;;; LSP
|
||||||
|
|||||||
@@ -1,14 +1,16 @@
|
|||||||
;;; core-ui.el -*- lexical-binding: t; -*-
|
;;; core-ui.el -*- lexical-binding: t; -*-
|
||||||
|
|
||||||
;; Load generated Noctalia theme.
|
;; Load default theme
|
||||||
(add-to-list 'custom-theme-load-path (expand-file-name "themes" user-emacs-directory))
|
(use-package nordic-night-theme
|
||||||
(load-theme 'noctalia t)
|
:ensure t
|
||||||
|
:config
|
||||||
|
(load-theme 'nordic-night t))
|
||||||
|
|
||||||
;; Setting default font
|
;; Setting default font
|
||||||
(set-frame-font "Hack Nerd Font 14" nil t)
|
(set-frame-font "Liberation Mono 14" nil t)
|
||||||
|
|
||||||
(add-to-list 'default-frame-alist
|
(add-to-list 'default-frame-alist
|
||||||
'(font . "Hack Nerd Font-14"))
|
'(font . "Liberation Mono-14"))
|
||||||
|
|
||||||
;; Remove toolbar
|
;; Remove toolbar
|
||||||
(tool-bar-mode -1)
|
(tool-bar-mode -1)
|
||||||
|
|||||||
@@ -1,6 +1,23 @@
|
|||||||
;;; json.el -*- lexical-binding: t -*-
|
;;; json.el -*- lexical-binding: t -*-
|
||||||
|
|
||||||
|
(defun fscotto/json-maybe-start-lsp ()
|
||||||
|
"Start LSP for JSON buffers when lsp-mode is available."
|
||||||
|
(when (fboundp 'lsp-deferred)
|
||||||
|
(lsp-deferred)))
|
||||||
|
|
||||||
(use-package json-mode
|
(use-package json-mode
|
||||||
:ensure t)
|
:ensure t
|
||||||
|
:mode
|
||||||
|
(("\\.json\\'" . json-mode)
|
||||||
|
("\\.jsonc\\'" . json-mode))
|
||||||
|
:hook
|
||||||
|
(json-mode . fscotto/json-maybe-start-lsp))
|
||||||
|
|
||||||
|
(with-eval-after-load 'json-ts-mode
|
||||||
|
(add-hook 'json-ts-mode-hook #'fscotto/json-maybe-start-lsp))
|
||||||
|
|
||||||
|
(with-eval-after-load 'jsonc-mode
|
||||||
|
(add-hook 'jsonc-mode-hook #'fscotto/json-maybe-start-lsp))
|
||||||
|
|
||||||
(provide 'json)
|
(provide 'json)
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
;;functions to support syncing .elfeed between machines
|
(require 'seq)
|
||||||
|
(require 'subr-x)
|
||||||
;;makes sure elfeed reads index from disk before launching
|
;;makes sure elfeed reads index from disk before launching
|
||||||
(defvar fscotto/elfeed-initial-update-done nil
|
(defvar fscotto/elfeed-initial-update-done nil
|
||||||
"Non-nil once Elfeed has triggered its first automatic update this session.")
|
"Non-nil once Elfeed has triggered its first automatic update this session.")
|
||||||
@@ -128,16 +129,24 @@ Each entry is a cons cell of display string and session id."
|
|||||||
"Return the latest saved OpenCode session id for the current project."
|
"Return the latest saved OpenCode session id for the current project."
|
||||||
(cdr (car (fscotto/opencode-session-candidates (fscotto/project-root)))))
|
(cdr (car (fscotto/opencode-session-candidates (fscotto/project-root)))))
|
||||||
|
|
||||||
(defun fscotto/project-opencode-dwim ()
|
(defun fscotto/project-agent-dwim ()
|
||||||
"Open the most useful OpenCode session for the current project.
|
"Choose an agent for the current project and launch it externally."
|
||||||
|
|
||||||
Resume the latest saved session when available, otherwise create a new one."
|
|
||||||
(interactive)
|
(interactive)
|
||||||
(let ((session-id (fscotto/project-opencode-latest-session-id)))
|
(let ((agent (completing-read "Agent: " '("Claude" "Codex" "Gemini" "OpenCode") nil t)))
|
||||||
(if session-id
|
(pcase agent
|
||||||
(fscotto/launch-external-terminal (list "opencode" "--session" session-id)
|
("Claude"
|
||||||
(fscotto/project-root))
|
(fscotto/launch-external-terminal '("claude" "--continue")))
|
||||||
(fscotto/project-opencode))))
|
("OpenCode"
|
||||||
|
(let ((session-id (fscotto/project-opencode-latest-session-id)))
|
||||||
|
(if session-id
|
||||||
|
(fscotto/launch-external-terminal (list "opencode" "--session" session-id)
|
||||||
|
(fscotto/project-root))
|
||||||
|
(fscotto/project-opencode))))
|
||||||
|
("Codex"
|
||||||
|
(fscotto/launch-external-terminal '("codex" "resume" "--last")))
|
||||||
|
("Gemini"
|
||||||
|
(fscotto/launch-external-terminal '("gemini" "--resume" "latest")
|
||||||
|
(fscotto/project-root))))))
|
||||||
|
|
||||||
(defun fscotto/project-opencode-session ()
|
(defun fscotto/project-opencode-session ()
|
||||||
"Resume a saved OpenCode session for the current project."
|
"Resume a saved OpenCode session for the current project."
|
||||||
@@ -151,6 +160,78 @@ Resume the latest saved session when available, otherwise create a new one."
|
|||||||
(fscotto/launch-external-terminal (list "opencode" "--session" session-id)
|
(fscotto/launch-external-terminal (list "opencode" "--session" session-id)
|
||||||
project-directory))))
|
project-directory))))
|
||||||
|
|
||||||
|
(defun fscotto/gemini-session-candidates (directory)
|
||||||
|
"Return Gemini session candidates for DIRECTORY.
|
||||||
|
|
||||||
|
Each entry is a cons cell of display string and session index.
|
||||||
|
Tries JSON output first, falls back to text parsing if unavailable."
|
||||||
|
(let* ((default-directory (file-name-as-directory directory))
|
||||||
|
(json-output (shell-command-to-string
|
||||||
|
"gemini --list-sessions --output-format json 2>/dev/null")))
|
||||||
|
(cond
|
||||||
|
((string-match "^{" json-output)
|
||||||
|
(ignore-errors
|
||||||
|
(require 'json)
|
||||||
|
(let* ((parsed (json-parse-string json-output))
|
||||||
|
(sessions (gethash "sessions" parsed)))
|
||||||
|
(when (vectorp sessions)
|
||||||
|
(seq-map-indexed
|
||||||
|
(lambda (s idx)
|
||||||
|
(let* ((idx-str (number-to-string (1+ idx)))
|
||||||
|
(msg (if (hash-table-p s)
|
||||||
|
(or (gethash "firstUserMessage" s) "Session")
|
||||||
|
"Session"))
|
||||||
|
(ts (and (hash-table-p s)
|
||||||
|
(ignore-errors (gethash "lastUpdated" s))
|
||||||
|
(when (stringp it) (string-trim it))))
|
||||||
|
(label (if ts (format "%s [%s]" msg ts) msg)))
|
||||||
|
(cons label idx-str)))
|
||||||
|
sessions)))))
|
||||||
|
(t
|
||||||
|
(let* ((output (shell-command-to-string "gemini --list-sessions"))
|
||||||
|
(lines (seq-filter (lambda (s) (string-match "\\S-" s))
|
||||||
|
(split-string output "\n" t)))
|
||||||
|
(data-lines (seq-drop lines 1))
|
||||||
|
(candidates nil))
|
||||||
|
(dolist (line data-lines)
|
||||||
|
(let ((trimmed (string-trim line)))
|
||||||
|
(when (string-match
|
||||||
|
(rx (group (one-or-more digit))
|
||||||
|
(one-or-more whitespace)
|
||||||
|
(group (one-or-more nonl)))
|
||||||
|
trimmed)
|
||||||
|
(push (cons (match-string 2 trimmed)
|
||||||
|
(match-string 1 trimmed))
|
||||||
|
candidates))))
|
||||||
|
(nreverse candidates))))))
|
||||||
|
|
||||||
|
(defun fscotto/project-gemini-session ()
|
||||||
|
"Choose and resume a Gemini session for the current project."
|
||||||
|
(interactive)
|
||||||
|
(let* ((project-directory (fscotto/project-root))
|
||||||
|
(candidates (fscotto/gemini-session-candidates project-directory)))
|
||||||
|
(unless candidates
|
||||||
|
(user-error "No Gemini sessions found for %s" project-directory))
|
||||||
|
(let* ((selection (completing-read "Gemini session: " candidates nil t))
|
||||||
|
(session-idx (cdr (assoc selection candidates))))
|
||||||
|
(fscotto/launch-external-terminal
|
||||||
|
(list "gemini" "--resume" session-idx)
|
||||||
|
project-directory))))
|
||||||
|
|
||||||
|
(defun fscotto/project-agent-session ()
|
||||||
|
"Choose an agent and resume a saved session for the current project."
|
||||||
|
(interactive)
|
||||||
|
(let ((agent (completing-read "Agent session: " '("Claude" "Codex" "Gemini" "OpenCode") nil t)))
|
||||||
|
(pcase agent
|
||||||
|
("Claude"
|
||||||
|
(fscotto/launch-external-terminal '("claude" "--resume")))
|
||||||
|
("OpenCode"
|
||||||
|
(fscotto/project-opencode-session))
|
||||||
|
("Codex"
|
||||||
|
(fscotto/launch-external-terminal '("codex" "resume")))
|
||||||
|
("Gemini"
|
||||||
|
(fscotto/project-gemini-session)))))
|
||||||
|
|
||||||
(defun fscotto/project-external-terminal ()
|
(defun fscotto/project-external-terminal ()
|
||||||
"Open the external terminal in project root."
|
"Open the external terminal in project root."
|
||||||
(interactive)
|
(interactive)
|
||||||
|
|||||||
39
dotfiles/desktop/.emacs.d/lisp/misc/documents.el
Normal file
39
dotfiles/desktop/.emacs.d/lisp/misc/documents.el
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
;;; documents.el -*- lexical-binding: t; -*-
|
||||||
|
|
||||||
|
(use-package pdf-tools
|
||||||
|
:ensure t
|
||||||
|
:config
|
||||||
|
(pdf-tools-install))
|
||||||
|
|
||||||
|
(use-package pdf-view
|
||||||
|
:config
|
||||||
|
(setq-default pdf-view-display-size 'fit-width)
|
||||||
|
(setq pdf-cache-org-imgparams t
|
||||||
|
pdf-view-use-smooth-scrolling t)
|
||||||
|
(setq pdf-annot-default-visible-properties t))
|
||||||
|
|
||||||
|
(with-eval-after-load 'pdf-view
|
||||||
|
(define-key pdf-view-mode-map (kbd "n") 'pdf-view-next-page)
|
||||||
|
(define-key pdf-view-mode-map (kbd "p") 'pdf-view-previous-page)
|
||||||
|
(define-key pdf-view-mode-map (kbd "q") 'pdf-view-close))
|
||||||
|
|
||||||
|
(use-package nov
|
||||||
|
:ensure t
|
||||||
|
:mode ("\\.epub\\'" . nov-mode))
|
||||||
|
|
||||||
|
(use-package calibre
|
||||||
|
:ensure t
|
||||||
|
:commands calibre-library
|
||||||
|
:config
|
||||||
|
(setq calibre-calibredb-executable
|
||||||
|
(or (executable-find "calibredb")
|
||||||
|
(let ((flatpak-wrapper (expand-file-name "~/.local/bin/calibredb")))
|
||||||
|
(when (file-executable-p flatpak-wrapper)
|
||||||
|
flatpak-wrapper))
|
||||||
|
"calibredb")
|
||||||
|
calibre-libraries
|
||||||
|
`(("Library" . ,(expand-file-name "~/Documents/Library")))))
|
||||||
|
|
||||||
|
(provide 'misc/documents)
|
||||||
|
|
||||||
|
;;; documents.el ends here
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
(use-package nov
|
|
||||||
:ensure t
|
|
||||||
:mode ("\\.epub\\'" . nov-mode))
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
;;; pdf.el -*- lexical-binding: t; -*-
|
|
||||||
|
|
||||||
(use-package pdf-tools
|
|
||||||
:ensure t
|
|
||||||
:config
|
|
||||||
(pdf-tools-install))
|
|
||||||
|
|
||||||
(use-package pdf-view
|
|
||||||
:config
|
|
||||||
(setq-default pdf-view-display-size 'fit-width)
|
|
||||||
(setq pdf-cache-org-imgparams t
|
|
||||||
pdf-view-use-smooth-scrolling t)
|
|
||||||
(setq pdf-annot-default-visible-properties t))
|
|
||||||
|
|
||||||
(with-eval-after-load 'pdf-view
|
|
||||||
(define-key pdf-view-mode-map (kbd "n") 'pdf-view-next-page)
|
|
||||||
(define-key pdf-view-mode-map (kbd "p") 'pdf-view-previous-page)
|
|
||||||
(define-key pdf-view-mode-map (kbd "q") 'pdf-view-close))
|
|
||||||
|
|
||||||
(provide 'misc/pdf)
|
|
||||||
|
|
||||||
;;; pdf.el ends here
|
|
||||||
@@ -145,8 +145,8 @@
|
|||||||
"C-c p t" "Test"
|
"C-c p t" "Test"
|
||||||
"C-c p v" "Open multi-vterm in project"
|
"C-c p v" "Open multi-vterm in project"
|
||||||
"C-c p x" "Open external term"
|
"C-c p x" "Open external term"
|
||||||
"C-c p a" "OpenCode (dwim)"
|
"C-c p a" "Choose agent"
|
||||||
"C-c p A" "Choose OpenCode session"
|
"C-c p A" "Choose agent session"
|
||||||
"C-c p e" "Edit project config"
|
"C-c p e" "Edit project config"
|
||||||
"C-c p g" "Project Git status"
|
"C-c p g" "Project Git status"
|
||||||
"C-c p 4" "Other Window"
|
"C-c p 4" "Other Window"
|
||||||
|
|||||||
3
dotfiles/desktop/.gnupg/gpg-agent.arch.conf
Normal file
3
dotfiles/desktop/.gnupg/gpg-agent.arch.conf
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
pinentry-program /usr/bin/pinentry-gnome3
|
||||||
|
default-cache-ttl 600
|
||||||
|
max-cache-ttl 7200
|
||||||
2
dotfiles/desktop/.local/bin/calibredb
Executable file
2
dotfiles/desktop/.local/bin/calibredb
Executable file
@@ -0,0 +1,2 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
exec flatpak run --command=calibredb com.calibre_ebook.calibre "$@"
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
|
|
||||||
set -eu
|
|
||||||
|
|
||||||
if [ -z "${DISPLAY:-}" ]; then
|
|
||||||
printf 'Error: DISPLAY is not set; cannot launch gufw under Xwayland.\n' >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! command -v xhost >/dev/null 2>&1; then
|
|
||||||
printf 'Error: xhost is required to launch gufw from a Wayland session.\n' >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
cleanup() {
|
|
||||||
xhost -si:localuser:root >/dev/null 2>&1 || true
|
|
||||||
}
|
|
||||||
|
|
||||||
trap cleanup EXIT INT TERM HUP
|
|
||||||
|
|
||||||
xhost si:localuser:root >/dev/null
|
|
||||||
exec gufw "$@"
|
|
||||||
@@ -1,13 +1,15 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
ICONS="Yaru-orange-dark"
|
THEME="Yaru-blue-dark"
|
||||||
|
ICONS="Yaru-blue-dark"
|
||||||
CURSOR="Yaru"
|
CURSOR="Yaru"
|
||||||
FONT_UI="Noto Sans 10"
|
FONT_UI="Liberation Sans 10"
|
||||||
|
|
||||||
mkdir -p "$HOME/.config/gtk-3.0"
|
mkdir -p "$HOME/.config/gtk-3.0"
|
||||||
mkdir -p "$HOME/.config/gtk-4.0"
|
mkdir -p "$HOME/.config/gtk-4.0"
|
||||||
|
|
||||||
cat > "$HOME/.gtkrc-2.0" <<EOF
|
cat > "$HOME/.gtkrc-2.0" <<EOF
|
||||||
|
gtk-theme-name="$THEME"
|
||||||
gtk-icon-theme-name="$ICONS"
|
gtk-icon-theme-name="$ICONS"
|
||||||
gtk-cursor-theme-name="$CURSOR"
|
gtk-cursor-theme-name="$CURSOR"
|
||||||
gtk-font-name="$FONT_UI"
|
gtk-font-name="$FONT_UI"
|
||||||
@@ -17,6 +19,7 @@ EOF
|
|||||||
|
|
||||||
cat > "$HOME/.config/gtk-3.0/settings.ini" <<EOF
|
cat > "$HOME/.config/gtk-3.0/settings.ini" <<EOF
|
||||||
[Settings]
|
[Settings]
|
||||||
|
gtk-theme-name=$THEME
|
||||||
gtk-icon-theme-name=$ICONS
|
gtk-icon-theme-name=$ICONS
|
||||||
gtk-cursor-theme-name=$CURSOR
|
gtk-cursor-theme-name=$CURSOR
|
||||||
gtk-font-name=$FONT_UI
|
gtk-font-name=$FONT_UI
|
||||||
@@ -29,6 +32,7 @@ EOF
|
|||||||
|
|
||||||
cat > "$HOME/.config/gtk-4.0/settings.ini" <<EOF
|
cat > "$HOME/.config/gtk-4.0/settings.ini" <<EOF
|
||||||
[Settings]
|
[Settings]
|
||||||
|
gtk-theme-name=$THEME
|
||||||
gtk-icon-theme-name=$ICONS
|
gtk-icon-theme-name=$ICONS
|
||||||
gtk-cursor-theme-name=$CURSOR
|
gtk-cursor-theme-name=$CURSOR
|
||||||
gtk-font-name=$FONT_UI
|
gtk-font-name=$FONT_UI
|
||||||
@@ -36,8 +40,8 @@ gtk-application-prefer-dark-theme=1
|
|||||||
EOF
|
EOF
|
||||||
|
|
||||||
if command -v gsettings >/dev/null 2>&1; then
|
if command -v gsettings >/dev/null 2>&1; then
|
||||||
|
gsettings set org.gnome.desktop.interface gtk-theme "$THEME" >/dev/null 2>&1 || true
|
||||||
gsettings set org.gnome.desktop.interface icon-theme "$ICONS" >/dev/null 2>&1 || true
|
gsettings set org.gnome.desktop.interface icon-theme "$ICONS" >/dev/null 2>&1 || true
|
||||||
gsettings set org.gnome.desktop.interface cursor-theme "$CURSOR" >/dev/null 2>&1 || true
|
gsettings set org.gnome.desktop.interface cursor-theme "$CURSOR" >/dev/null 2>&1 || true
|
||||||
gsettings set org.gnome.desktop.interface font-name "$FONT_UI" >/dev/null 2>&1 || true
|
|
||||||
gsettings set org.gnome.desktop.interface color-scheme prefer-dark >/dev/null 2>&1 || true
|
gsettings set org.gnome.desktop.interface color-scheme prefer-dark >/dev/null 2>&1 || true
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Version=1.0
|
|
||||||
Type=Application
|
|
||||||
Name=Firewall Configuration
|
|
||||||
Comment=An easy way to configure your firewall
|
|
||||||
Keywords=gufw;security;firewall;network;
|
|
||||||
Categories=GNOME;GTK;Settings;Security;X-GNOME-Settings-Panel;X-GNOME-SystemSettings;X-Unity-Settings-Panel;X-XFCE-SettingsDialog;X-XFCE-SystemSettings;
|
|
||||||
Exec=/home/fscotto/.local/bin/run-gufw
|
|
||||||
Icon=gufw
|
|
||||||
Terminal=false
|
|
||||||
X-GNOME-Settings-Panel=gufw
|
|
||||||
X-Unity-Settings-Panel=gufw
|
|
||||||
X-Ubuntu-Gettext-Domain=gufw
|
|
||||||
@@ -1,4 +1,8 @@
|
|||||||
|
Host vps
|
||||||
|
IdentityFile ~/.ssh/id_rsa_vps
|
||||||
|
|
||||||
Host *
|
Host *
|
||||||
|
IdentityFile ~/.ssh/id_ed25519
|
||||||
ControlMaster auto
|
ControlMaster auto
|
||||||
ControlPath ~/.local/state/ssh/sockets/%r@%h-%p
|
ControlPath ~/.local/state/ssh/sockets/%r@%h-%p
|
||||||
ControlPersist 600
|
ControlPersist 600
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 134 KiB |
@@ -1,6 +1,4 @@
|
|||||||
export LIBVA_DRIVER_NAME=iHD
|
export LIBVA_DRIVER_NAME=iHD
|
||||||
export QT_QPA_PLATFORM=wayland
|
|
||||||
export QT_QPA_PLATFORMTHEME=qt6ct
|
|
||||||
export SWAY_UNSUPPORTED_GPU=1
|
export SWAY_UNSUPPORTED_GPU=1
|
||||||
export WLR_DRM_DEVICES=/dev/dri/card0:/dev/dri/card1
|
export WLR_DRM_DEVICES=/dev/dri/card0:/dev/dri/card1
|
||||||
export WLR_NO_HARDWARE_CURSORS=1
|
export WLR_NO_HARDWARE_CURSORS=1
|
||||||
|
|||||||
@@ -198,8 +198,20 @@ parse_secret_lookup_args() {
|
|||||||
|
|
||||||
resolve_dbus_session_bus_address() {
|
resolve_dbus_session_bus_address() {
|
||||||
if [ -n "${DBUS_SESSION_BUS_ADDRESS:-}" ]; then
|
if [ -n "${DBUS_SESSION_BUS_ADDRESS:-}" ]; then
|
||||||
printf '%s\n' "$DBUS_SESSION_BUS_ADDRESS"
|
case "$DBUS_SESSION_BUS_ADDRESS" in
|
||||||
return 0
|
unix:path=*)
|
||||||
|
_path=${DBUS_SESSION_BUS_ADDRESS#unix:path=}
|
||||||
|
_path=${_path%%,*}
|
||||||
|
if [ -S "$_path" ]; then
|
||||||
|
printf '%s\n' "$DBUS_SESSION_BUS_ADDRESS"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
unix:abstract=*)
|
||||||
|
printf '%s\n' "$DBUS_SESSION_BUS_ADDRESS"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -f "$HOME/.dbus-session-bus-address" ]; then
|
if [ -f "$HOME/.dbus-session-bus-address" ]; then
|
||||||
|
|||||||
@@ -1,242 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
|
|
||||||
set -eu
|
|
||||||
|
|
||||||
APPLY=0
|
|
||||||
AGGRESSIVE=0
|
|
||||||
|
|
||||||
SAFE_PACKAGES="
|
|
||||||
arandr
|
|
||||||
autorandr
|
|
||||||
feh
|
|
||||||
i3
|
|
||||||
i3blocks
|
|
||||||
i3blocks-blocklets
|
|
||||||
i3lock-color
|
|
||||||
i3status
|
|
||||||
scrot
|
|
||||||
setxkbmap
|
|
||||||
volumeicon
|
|
||||||
xclip
|
|
||||||
xkbutils
|
|
||||||
xorg-fonts
|
|
||||||
xorg-minimal
|
|
||||||
xss-lock
|
|
||||||
"
|
|
||||||
|
|
||||||
AGGRESSIVE_PACKAGES="
|
|
||||||
dunst
|
|
||||||
rofi
|
|
||||||
blueman
|
|
||||||
network-manager-applet
|
|
||||||
xfce-polkit
|
|
||||||
xfce4-clipman-plugin
|
|
||||||
xfce4-screenshooter
|
|
||||||
"
|
|
||||||
|
|
||||||
SAFE_PATHS="
|
|
||||||
$HOME/.config/i3
|
|
||||||
$HOME/.config/i3blocks
|
|
||||||
$HOME/.config/autorandr
|
|
||||||
$HOME/.xinitrc
|
|
||||||
"
|
|
||||||
|
|
||||||
AGGRESSIVE_PATHS="
|
|
||||||
$HOME/.config/dunst
|
|
||||||
$HOME/.config/rofi
|
|
||||||
"
|
|
||||||
|
|
||||||
usage() {
|
|
||||||
cat <<'EOF'
|
|
||||||
Usage: cleanup_i3_after_sway_migration.sh [--apply] [--aggressive]
|
|
||||||
|
|
||||||
One-shot cleanup for removing i3/X11-only packages and dotfiles after a host
|
|
||||||
has already migrated to SwayFX + Noctalia.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
--apply perform the cleanup for real
|
|
||||||
--aggressive also remove extra desktop apps/configs that were mainly useful
|
|
||||||
in the old i3 setup (dunst, rofi, blueman, etc.)
|
|
||||||
-h, --help show this help
|
|
||||||
|
|
||||||
Default mode is dry-run.
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
have_command() {
|
|
||||||
command -v "$1" >/dev/null 2>&1
|
|
||||||
}
|
|
||||||
|
|
||||||
require_sway_noctalia() {
|
|
||||||
if [ ! -f "$HOME/.config/sway/config" ]; then
|
|
||||||
printf 'Error: Sway config not found at %s\n' "$HOME/.config/sway/config" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f "$HOME/.config/noctalia/settings.json" ]; then
|
|
||||||
printf 'Error: Noctalia settings not found at %s\n' "$HOME/.config/noctalia/settings.json" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
append_lines() {
|
|
||||||
src_lines=$1
|
|
||||||
dst_var=$2
|
|
||||||
|
|
||||||
for line in $src_lines; do
|
|
||||||
line=$(printf '%s' "$line" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
|
|
||||||
[ -n "$line" ] || continue
|
|
||||||
case "$dst_var" in
|
|
||||||
PACKAGES)
|
|
||||||
PACKAGES="$PACKAGES $line"
|
|
||||||
;;
|
|
||||||
PATHS)
|
|
||||||
PATHS="$PATHS $line"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
printf 'Error: unsupported destination list: %s\n' "$dst_var" >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
filter_installed_packages() {
|
|
||||||
packages=$1
|
|
||||||
installed=''
|
|
||||||
|
|
||||||
for pkg in $packages; do
|
|
||||||
pkg=$(printf '%s' "$pkg" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
|
|
||||||
[ -n "$pkg" ] || continue
|
|
||||||
if xbps-query -s "$pkg" >/dev/null 2>&1; then
|
|
||||||
installed="$installed $pkg"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
printf '%s' "$installed"
|
|
||||||
}
|
|
||||||
|
|
||||||
filter_existing_paths() {
|
|
||||||
paths=$1
|
|
||||||
existing=''
|
|
||||||
|
|
||||||
for path in $paths; do
|
|
||||||
path=$(printf '%s' "$path" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
|
|
||||||
[ -n "$path" ] || continue
|
|
||||||
if [ -e "$path" ] || [ -L "$path" ]; then
|
|
||||||
existing="$existing $path"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
printf '%s' "$existing"
|
|
||||||
}
|
|
||||||
|
|
||||||
print_section() {
|
|
||||||
title=$1
|
|
||||||
items=$2
|
|
||||||
|
|
||||||
printf '%s\n' "$title"
|
|
||||||
if [ -z "$items" ]; then
|
|
||||||
printf ' (none)\n'
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
for item in $items; do
|
|
||||||
item=$(printf '%s' "$item" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
|
|
||||||
[ -n "$item" ] || continue
|
|
||||||
printf ' - %s\n' "$item"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
confirm_apply() {
|
|
||||||
printf 'Proceed with i3 cleanup? [y/N] '
|
|
||||||
IFS= read -r answer
|
|
||||||
case "$answer" in
|
|
||||||
y|Y|yes|YES)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
printf 'Aborted.\n'
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
run_remove_packages() {
|
|
||||||
packages=$1
|
|
||||||
[ -n "$packages" ] || return 0
|
|
||||||
|
|
||||||
if [ "$(id -u)" -eq 0 ]; then
|
|
||||||
xbps-remove -R $packages
|
|
||||||
elif have_command sudo; then
|
|
||||||
sudo xbps-remove -R $packages
|
|
||||||
else
|
|
||||||
printf 'Error: package removal requires root and sudo was not found.\n' >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
run_remove_paths() {
|
|
||||||
paths=$1
|
|
||||||
[ -n "$paths" ] || return 0
|
|
||||||
|
|
||||||
for path in $paths; do
|
|
||||||
path=$(printf '%s' "$path" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
|
|
||||||
[ -n "$path" ] || continue
|
|
||||||
rm -rf "$path"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
while [ $# -gt 0 ]; do
|
|
||||||
case "$1" in
|
|
||||||
--apply)
|
|
||||||
APPLY=1
|
|
||||||
;;
|
|
||||||
--aggressive)
|
|
||||||
AGGRESSIVE=1
|
|
||||||
;;
|
|
||||||
-h|--help)
|
|
||||||
usage
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
printf 'Error: unknown argument: %s\n\n' "$1" >&2
|
|
||||||
usage >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
require_sway_noctalia
|
|
||||||
|
|
||||||
PACKAGES=''
|
|
||||||
PATHS=''
|
|
||||||
append_lines "$SAFE_PACKAGES" PACKAGES
|
|
||||||
append_lines "$SAFE_PATHS" PATHS
|
|
||||||
|
|
||||||
if [ "$AGGRESSIVE" -eq 1 ]; then
|
|
||||||
append_lines "$AGGRESSIVE_PACKAGES" PACKAGES
|
|
||||||
append_lines "$AGGRESSIVE_PATHS" PATHS
|
|
||||||
fi
|
|
||||||
|
|
||||||
INSTALLED_PACKAGES=$(filter_installed_packages "$PACKAGES")
|
|
||||||
EXISTING_PATHS=$(filter_existing_paths "$PATHS")
|
|
||||||
|
|
||||||
printf 'Mode: %s\n' "$( [ "$APPLY" -eq 1 ] && printf 'apply' || printf 'dry-run' )"
|
|
||||||
printf 'Aggressive cleanup: %s\n\n' "$( [ "$AGGRESSIVE" -eq 1 ] && printf 'yes' || printf 'no' )"
|
|
||||||
|
|
||||||
print_section 'Packages to remove:' "$INSTALLED_PACKAGES"
|
|
||||||
printf '\n'
|
|
||||||
print_section 'Paths to remove:' "$EXISTING_PATHS"
|
|
||||||
|
|
||||||
if [ "$APPLY" -ne 1 ]; then
|
|
||||||
printf '\nDry-run only. Re-run with --apply to perform the cleanup.\n'
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
confirm_apply
|
|
||||||
|
|
||||||
run_remove_packages "$INSTALLED_PACKAGES"
|
|
||||||
run_remove_paths "$EXISTING_PATHS"
|
|
||||||
|
|
||||||
printf '\nCleanup complete.\n'
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user