Compare commits
3 Commits
0fb8f23ae2
...
ae8a6161cd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ae8a6161cd | ||
|
|
01840c82e0 | ||
|
|
a135edaa3f |
24
AGENTS.md
@@ -1,6 +1,6 @@
|
|||||||
# 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 desktops, Linux workstations, WSL, and an Ubuntu server.
|
||||||
|
|
||||||
## Source Of Truth
|
## Source Of Truth
|
||||||
- Main orchestration: `ansible/site.yml`
|
- Main orchestration: `ansible/site.yml`
|
||||||
@@ -12,8 +12,8 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux workstation
|
|||||||
|
|
||||||
## Topology
|
## Topology
|
||||||
- Void desktops: `ikaros`, `nymph`
|
- Void desktops: `ikaros`, `nymph`
|
||||||
- Native Linux workstations: `deadalus-ubuntu`, `deadalus-fedora`
|
- Native Linux workstation: `deadalus-fedora`
|
||||||
- Windows host + WSL dev: `deadalus-win`, `deadalus-wsl`
|
- WSL dev: `deadalus-wsl`
|
||||||
- Ubuntu server: `prometheus`
|
- Ubuntu server: `prometheus`
|
||||||
- Hosts intentionally belong to multiple groups; trust `ansible/site.yml` over hostname assumptions.
|
- Hosts intentionally belong to multiple groups; trust `ansible/site.yml` over hostname assumptions.
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux workstation
|
|||||||
- Preserve layering `all -> OS -> profile -> host`.
|
- Preserve layering `all -> OS -> profile -> host`.
|
||||||
- Keep `ansible/site.yml` small; orchestration belongs there, implementation belongs in roles.
|
- Keep `ansible/site.yml` small; orchestration belongs there, implementation belongs in roles.
|
||||||
- Prefer minimal, targeted edits. Preserve idempotency and existing ordering.
|
- Prefer minimal, targeted edits. Preserve idempotency and existing ordering.
|
||||||
- Most hosts use `ansible_connection: local`; Windows host is the exception.
|
- All hosts use `ansible_connection: local`.
|
||||||
- Treat `secrets/` as sensitive. Never print secret values.
|
- Treat `secrets/` as sensitive. Never print secret values.
|
||||||
- Tmux plugins are bootstrapped by TPM on the host; the repo only keeps tmux config and custom helper scripts.
|
- Tmux plugins are bootstrapped by TPM on the host; the repo only keeps tmux config and custom helper scripts.
|
||||||
- Read the relevant role tasks, templates, vars, and deployed dotfiles before editing.
|
- Read the relevant role tasks, templates, vars, and deployed dotfiles before editing.
|
||||||
@@ -35,14 +35,12 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux workstation
|
|||||||
- `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` or `--limit nymph --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`
|
||||||
- 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)"`
|
|
||||||
- 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`
|
||||||
|
|
||||||
## Conventions
|
## Conventions
|
||||||
@@ -54,32 +52,28 @@ Ansible-driven personal infrastructure repo for Void desktops, Linux workstation
|
|||||||
- Use `no_log: true` for secret-bearing task inputs or outputs.
|
- Use `no_log: true` for secret-bearing task inputs or outputs.
|
||||||
|
|
||||||
## Desktop Notes
|
## Desktop Notes
|
||||||
- `profile_desktop_common` owns the shared desktop bootstrap; `profile_desktop_i3` (X11), `profile_desktop_sway` (Wayland/SwayFX), and `profile_desktop_hyprland` (Wayland) install their respective sessions in parallel and are wired into the `void` play in `ansible/site.yml`. `desktop_sessions_enabled` and `desktop_default_session` in host vars decide which sessions are exposed in `emptty` and which is preselected.
|
- `profile_desktop_common` owns the shared desktop bootstrap; `profile_desktop_sway` (Wayland/SwayFX) and `profile_desktop_hyprland` (Wayland) install their respective sessions in parallel and are wired into the `void` play in `ansible/site.yml`. `desktop_sessions_enabled` and `desktop_default_session` in host vars decide which sessions are exposed in `emptty` and which is preselected.
|
||||||
- `.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`.
|
||||||
- NTFS filesystem support is provided by `ntfs-3g` in `ansible/inventory/group_vars/void.yml`.
|
- NTFS filesystem support is provided by `ntfs-3g` in `ansible/inventory/group_vars/void.yml`.
|
||||||
- Void user services are managed by `turnstile` and live under `dotfiles/desktop/.config/service/`.
|
- Void user services are managed by `turnstile` and live under `dotfiles/desktop/.config/service/`.
|
||||||
- `ssh-agent` keeps the stable socket `~/.local/state/ssh-agent/socket`.
|
- `ssh-agent` keeps the stable socket `~/.local/state/ssh-agent/socket`.
|
||||||
- Critical session entrypoints:
|
- Critical session entrypoints:
|
||||||
- `dotfiles/desktop/.xinitrc` (i3 / X11)
|
|
||||||
- `dotfiles/desktop/.config/sway/config` plus `host.conf` and `session-env` deployed via `host_sway_dotfiles` (sway / Wayland)
|
- `dotfiles/desktop/.config/sway/config` plus `host.conf` and `session-env` deployed via `host_sway_dotfiles` (sway / Wayland)
|
||||||
- `dotfiles/desktop/.config/hypr/hyprland.conf` plus `host.conf` and `session-env` deployed via `host_hyprland_dotfiles` (Hyprland / Wayland)
|
- `dotfiles/desktop/.config/hypr/hyprland.conf` plus `host.conf` and `session-env` deployed via `host_hyprland_dotfiles` (Hyprland / Wayland)
|
||||||
- Do not auto-restart `emptty` during playbook runs on active Void 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.
|
||||||
- `nymph` is a Void laptop with NVIDIA Optimus, running sway (Wayland) and Hyprland (Wayland); host-specific tasks in `profile_desktop_host/tasks/nymph.yml` handle GRUB NVIDIA cmdline params, `prime-run` wrapper, and the WirePlumber camera priority config. Multi-monitor on X11 is driven by `autorandr`; on sway it is driven by `kanshi` (config deployed via `host_sway_dotfiles`), and on Hyprland by host-specific Hyprland monitor/workspace rules.
|
- `nymph` is a Void laptop with NVIDIA Optimus, running sway (Wayland) and Hyprland (Wayland); host-specific tasks in `profile_desktop_host/tasks/nymph.yml` handle GRUB NVIDIA cmdline params, `prime-run` wrapper, and the WirePlumber camera priority config. Multi-monitor on sway is driven by `kanshi` (config deployed via `host_sway_dotfiles`), and on Hyprland by host-specific Hyprland monitor/workspace rules.
|
||||||
|
|
||||||
## Void Package And Dotfile Bucket Rules
|
## Void Package And Dotfile Bucket Rules
|
||||||
The four Void desktop package lists in `ansible/inventory/group_vars/void.yml` are kept disjoint by role:
|
The four Void desktop package lists in `ansible/inventory/group_vars/void.yml` are kept disjoint by role:
|
||||||
- `void_packages_base` — system runtime only (init/services, kernel, audio core, networking, filesystem, firewall, hardware daemons, runit logging).
|
- `void_packages_base` — system runtime only (init/services, kernel, audio core, networking, filesystem, firewall, hardware daemons, runit logging).
|
||||||
- `desktop_common_packages` — WM-agnostic GUI infra (GTK theme, polkit, keyring, NM-applet, blueman, audio GUI, file manager backend + GVFS, portal, flatpak, printing/scanning).
|
- `desktop_common_packages` — WM-agnostic GUI infra (GTK theme, polkit, keyring, NM-applet, blueman, audio GUI, file manager backend + GVFS, portal, flatpak, printing/scanning).
|
||||||
- `desktop_i3_packages` / `desktop_sway_packages` / `desktop_hyprland_packages` — binaries specific to each session. Cross-WM packages used by both (`dunst`, `rofi`, `alacritty`) are intentionally duplicated in the two lists.
|
- `desktop_sway_packages` / `desktop_hyprland_packages` — binaries specific to each session. Cross-WM packages used by both (`dunst`, `rofi`, `alacritty`) are intentionally duplicated in the two lists.
|
||||||
`profile_packages` in the same file is cross-distro and is overridden by `group_vars/server.yml` and the workstation group vars; do not move desktop-specific Void entries through it.
|
`profile_packages` in the same file is cross-distro and is overridden by `group_vars/server.yml` and the workstation group vars; do not move desktop-specific Void entries through it.
|
||||||
The dotfile vars follow the same split: `desktop_common_dotfiles` (in `group_vars/desktop.yml`) carries WM-agnostic GUI config and user scripts (Thunar, mimeapps, GTK theme setup, Udiskie, fontconfig, WirePlumber, mpv, …); `desktop_void_dotfiles` (in `group_vars/void.yml`) is reserved for files that need Void runtime (turnstile services, bash runit/dbus/ssh-agent fragments, `update-turnstile-env`).
|
The dotfile vars follow the same split: `desktop_common_dotfiles` (in `group_vars/desktop.yml`) carries WM-agnostic GUI config and user scripts (Thunar, mimeapps, GTK theme setup, Udiskie, fontconfig, WirePlumber, mpv, …); `desktop_void_dotfiles` (in `group_vars/void.yml`) is reserved for files that need Void runtime (turnstile services, bash runit/dbus/ssh-agent fragments, `update-turnstile-env`).
|
||||||
|
|
||||||
## Workstation / Windows Notes
|
## Workstation Notes
|
||||||
- Native Linux workstation hosts can combine `workstation_host_linux` with an OS-specific dev group.
|
- Native Linux workstation hosts can combine `workstation_host_linux` with an OS-specific dev group.
|
||||||
- `deadalus-fedora` keeps GNOME managed settings in `ansible/inventory/host_vars/deadalus-fedora.yml`.
|
- `deadalus-fedora` keeps GNOME managed settings in `ansible/inventory/host_vars/deadalus-fedora.yml`.
|
||||||
- Ubuntu workstation follow-up work is still open around YubiKey/GPG/SSH-FIDO2 package verification, GPG signing setup on the YubiKey, and evaluating `ed25519-sk` SSH key generation.
|
|
||||||
- `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.
|
|
||||||
|
|
||||||
## Coding Agent Notes
|
## Coding Agent Notes
|
||||||
- Shared agent packages live in `ai_agents_npm_packages` in `ansible/inventory/group_vars/all.yml`.
|
- Shared agent packages live in `ai_agents_npm_packages` in `ansible/inventory/group_vars/all.yml`.
|
||||||
@@ -92,7 +86,7 @@ The dotfile vars follow the same split: `desktop_common_dotfiles` (in `group_var
|
|||||||
- 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`
|
||||||
- `ansible-galaxy collection install -r ansible/collections/requirements.yml`
|
- `ansible-galaxy collection install -r ansible/collections/requirements.yml`
|
||||||
- Required collections currently include `ansible.posix`, `ansible.windows`, `community.general`, and `community.windows`.
|
- Required collections currently include `ansible.posix` and `community.general`.
|
||||||
- `.yamllint` treats `line-length` as a warning at 120 chars and disables `document-start` and `comments-indentation`.
|
- `.yamllint` treats `line-length` as a warning at 120 chars and disables `document-start` and `comments-indentation`.
|
||||||
|
|
||||||
## When Updating Docs
|
## When Updating Docs
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|||||||
|
|
||||||
## What this repo is
|
## What this repo is
|
||||||
|
|
||||||
Ansible-driven personal infrastructure as code for Void Linux desktops (`ikaros`, `nymph`), Linux/Windows workstations (`deadalus-*`), and an Ubuntu server (`prometheus`). See `AGENTS.md` for topology and `README.md` for full profile descriptions.
|
Ansible-driven personal infrastructure as code for Void Linux desktops (`ikaros`, `nymph`), Linux workstations (`deadalus-fedora`, `deadalus-wsl`), and an Ubuntu server (`prometheus`). See `AGENTS.md` for topology and `README.md` for full profile descriptions.
|
||||||
|
|
||||||
## Validation commands
|
## Validation commands
|
||||||
|
|
||||||
@@ -15,7 +15,6 @@ ansible-playbook ansible/site.yml --syntax-check
|
|||||||
# Dry-run per host
|
# Dry-run per host
|
||||||
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-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
|
||||||
@@ -34,7 +33,7 @@ sh -n scripts/bootstrap_mail.sh && shellcheck scripts/bootstrap_mail.sh
|
|||||||
|
|
||||||
## Architecture
|
## Architecture
|
||||||
|
|
||||||
Configuration is composed in layers: `all → OS → profile → host`. Most hosts use `ansible_connection: local`; `deadalus-win` is the PSRP/Windows exception.
|
Configuration is composed in layers: `all → OS → profile → host`. All hosts use `ansible_connection: local`.
|
||||||
|
|
||||||
`ansible/site.yml` is the sole orchestration entry point — keep it thin. Implementation belongs in roles under `ansible/roles/`.
|
`ansible/site.yml` is the sole orchestration entry point — keep it thin. Implementation belongs in roles under `ansible/roles/`.
|
||||||
|
|
||||||
@@ -56,7 +55,7 @@ Dotfiles under `dotfiles/` mirror the same layer split: `common/`, `desktop/`, `
|
|||||||
|
|
||||||
- `void_packages_base` — system runtime (init, kernel, audio core, networking, firewall, hw daemons)
|
- `void_packages_base` — system runtime (init, kernel, audio core, networking, firewall, hw daemons)
|
||||||
- `desktop_common_packages` — WM-agnostic GUI infra (GTK theme, polkit, keyring, portals, flatpak, printing)
|
- `desktop_common_packages` — WM-agnostic GUI infra (GTK theme, polkit, keyring, portals, flatpak, printing)
|
||||||
- `desktop_i3_packages` / `desktop_sway_packages` — session-specific binaries; cross-WM packages used by both (`dunst`, `rofi`, `alacritty`) are intentionally duplicated
|
- `desktop_sway_packages` / `desktop_hyprland_packages` — session-specific binaries; cross-WM packages used by both (`dunst`, `rofi`, `alacritty`) are intentionally duplicated
|
||||||
- `profile_packages` — cross-distro; do not move desktop-only Void entries into it
|
- `profile_packages` — cross-distro; do not move desktop-only Void entries into it
|
||||||
|
|
||||||
Dotfile var split follows the same logic: `desktop_common_dotfiles` (WM-agnostic), `desktop_void_dotfiles` (Void runtime — turnstile services, bash fragments).
|
Dotfile var split follows the same logic: `desktop_common_dotfiles` (WM-agnostic), `desktop_void_dotfiles` (Void runtime — turnstile services, bash fragments).
|
||||||
|
|||||||
93
README.md
@@ -55,13 +55,13 @@ 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, con i filoni workstation Linux nativa e 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_dev_wsl` per il modello dev in WSL
|
||||||
- `ansible/site.yml` applica anche il profilo `ubuntu_server` con baseline apt, systemd, dotfiles server e firewall UFW
|
- `ansible/site.yml` applica anche il profilo `ubuntu_server` con baseline apt, systemd, dotfiles server e firewall UFW
|
||||||
|
|
||||||
## Desktop
|
## Desktop
|
||||||
@@ -90,7 +90,7 @@ Lo stato attuale del profilo desktop include, tra le altre cose:
|
|||||||
- pacchetti Void Linux e servizi runit; le liste pacchetti Void desktop sono separate per criterio:
|
- pacchetti Void Linux e servizi runit; le liste pacchetti Void desktop sono separate per criterio:
|
||||||
- `void_packages_base` per il runtime sistema (init, kernel, audio core, networking, firewall, hw daemons)
|
- `void_packages_base` per il runtime sistema (init, kernel, audio core, networking, firewall, hw daemons)
|
||||||
- `desktop_common_packages` per l'infrastruttura GUI WM-agnostic (tema, polkit, keyring, NM-applet, blueman, audio GUI, file manager backend, portal, flatpak, printing/scanning)
|
- `desktop_common_packages` per l'infrastruttura GUI WM-agnostic (tema, polkit, keyring, NM-applet, blueman, audio GUI, file manager backend, portal, flatpak, printing/scanning)
|
||||||
- `desktop_i3_packages`, `desktop_sway_packages` e `desktop_hyprland_packages` per i binari specifici di ciascuna sessione
|
- `desktop_sway_packages` e `desktop_hyprland_packages` per i binari specifici di ciascuna sessione
|
||||||
- `turnstile` per i servizi utente, inclusi `emacs` e `ssh-agent`
|
- `turnstile` per i servizi utente, inclusi `emacs` e `ssh-agent`
|
||||||
- `ssh-agent` con socket stabile condiviso tra shell, SSH ed Emacs in `~/.local/state/ssh-agent/socket`
|
- `ssh-agent` con socket stabile condiviso tra shell, SSH ed Emacs in `~/.local/state/ssh-agent/socket`
|
||||||
- `.emacs.d` distribuito da un task dedicato Ansible con tag `emacs`
|
- `.emacs.d` distribuito da un task dedicato Ansible con tag `emacs`
|
||||||
@@ -98,7 +98,7 @@ Lo stato attuale del profilo desktop include, tra le altre cose:
|
|||||||
- 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
|
||||||
- `udiskie` come backend per automount/LUKS
|
- `udiskie` come backend per automount/LUKS
|
||||||
- `autorandr` per profili monitor X11 host-specifici (`nymph` ha profili `dual` e `solo`); sotto sway il multi-monitor è gestito da `kanshi` (config host-specifica in `host_sway_dotfiles` su `nymph`); sotto Hyprland gli override monitor vivono in `host_hyprland_dotfiles`
|
- multi-monitor: sotto sway è gestito da `kanshi` (config host-specifica in `host_sway_dotfiles` su `nymph`); sotto Hyprland gli override monitor vivono in `host_hyprland_dotfiles`
|
||||||
- override NVIDIA Optimus su `nymph`: parametri kernel GRUB iniettati in modo idempotente in `GRUB_CMDLINE_LINUX`, wrapper `prime-run` e config WirePlumber per priorità telecamera
|
- override NVIDIA Optimus su `nymph`: parametri kernel GRUB iniettati in modo idempotente in `GRUB_CMDLINE_LINUX`, wrapper `prime-run` e config WirePlumber per priorità telecamera
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -107,9 +107,8 @@ Lo stato attuale del profilo desktop include, tra le altre cose:
|
|||||||
|
|
||||||
Sistemi operativi supportati:
|
Sistemi operativi supportati:
|
||||||
|
|
||||||
- Ubuntu LTS nativa
|
|
||||||
- Fedora Workstation nativa
|
- Fedora Workstation nativa
|
||||||
- Windows 11 host + Ubuntu WSL
|
- Ubuntu WSL
|
||||||
|
|
||||||
Desktop environment host Linux:
|
Desktop environment host Linux:
|
||||||
|
|
||||||
@@ -117,9 +116,8 @@ Desktop environment host Linux:
|
|||||||
|
|
||||||
Macchine attuali:
|
Macchine attuali:
|
||||||
|
|
||||||
- `deadalus-ubuntu` come workstation Ubuntu nativa
|
|
||||||
- `deadalus-fedora` come workstation Fedora nativa
|
- `deadalus-fedora` come workstation Fedora nativa
|
||||||
- supporto attivo per host Windows 11 + WSL tramite `deadalus-win` e `deadalus-wsl`
|
- `deadalus-wsl` come ambiente dev Ubuntu in WSL
|
||||||
|
|
||||||
Questo profilo è pensato per sviluppo e lavoro, con separazione tra layer host e layer dev.
|
Questo profilo è pensato per sviluppo e lavoro, con separazione tra layer host e layer dev.
|
||||||
|
|
||||||
@@ -127,13 +125,12 @@ Nel modello Ansible usato qui, un singolo inventory host puo appartenere intenzi
|
|||||||
|
|
||||||
Il profilo workstation e agganciato al playbook principale e ora distingue:
|
Il profilo workstation e agganciato al playbook principale e ora distingue:
|
||||||
|
|
||||||
- layer dev Ubuntu condiviso tra workstation Linux nativa e Ubuntu in WSL
|
- layer dev Ubuntu condiviso tra WSL e server
|
||||||
- layer dev Fedora nativo parallelo a Ubuntu
|
- layer dev Fedora nativo
|
||||||
- layer host Linux GNOME
|
- 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
|
|
||||||
- layer WSL dedicato per sviluppo con `systemd`
|
- layer WSL dedicato per sviluppo con `systemd`
|
||||||
|
|
||||||
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.
|
Per esempio, lo stesso host Linux puo stare in `workstation_host_linux` e in `workstation_dev_fedora`, a seconda del layering che vuoi comporre.
|
||||||
|
|
||||||
Lo stato attuale del profilo workstation include:
|
Lo stato attuale del profilo workstation include:
|
||||||
|
|
||||||
@@ -141,42 +138,18 @@ Lo stato attuale del profilo workstation include:
|
|||||||
- installazione pacchetti base Fedora via dnf per il ramo workstation nativo
|
- installazione pacchetti base Fedora via dnf per il ramo workstation nativo
|
||||||
- installazione e configurazione di Docker dal repository ufficiale
|
- installazione e configurazione di Docker dal repository ufficiale
|
||||||
- gestione dei dotfiles workstation e rendering dei template dev condivisi
|
- 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 di Google Chrome su 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 di applicazioni workstation su Ubuntu nativa via Snap, oltre alle estensioni GNOME sul solo host Linux nativo
|
- 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`
|
|
||||||
- preparazione del ramo WSL Ubuntu con `systemd` per il toolchain di sviluppo
|
- preparazione del ramo WSL Ubuntu con `systemd` per il toolchain di sviluppo
|
||||||
- attivazione del firewall UFW su Ubuntu nativa e `firewalld` su Fedora nativa
|
- attivazione del firewall `firewalld` su Fedora nativa
|
||||||
- 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
|
- 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
|
||||||
|
|
||||||
Workflow Windows + WSL previsto:
|
Workflow WSL previsto:
|
||||||
|
|
||||||
Prima di eseguire il bootstrap Windows, apri PowerShell come amministratore e verifica la policy di esecuzione:
|
1. avviare Ubuntu WSL almeno una volta e completare la creazione dell'utente Linux
|
||||||
|
2. installare Ansible dentro WSL Ubuntu
|
||||||
```powershell
|
3. lanciare il playbook da WSL su `deadalus-wsl` per configurare l'ambiente dev locale
|
||||||
Get-ExecutionPolicy -List
|
4. usare VS Code con le estensioni Remote (`WSL`, `SSH`, `Dev Containers`) dal lato Windows
|
||||||
```
|
|
||||||
|
|
||||||
Se necessario, abilita l'esecuzione degli script per l'utente corrente:
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
|
|
||||||
```
|
|
||||||
|
|
||||||
Se Windows ha bloccato il file di bootstrap, sbloccalo esplicitamente:
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
Unblock-File .\scripts\bootstrap_windows_workstation.ps1
|
|
||||||
```
|
|
||||||
|
|
||||||
1. eseguire `scripts/bootstrap_windows_workstation.ps1` su Windows come amministratore
|
|
||||||
2. riavviare Windows se richiesto dalle feature WSL
|
|
||||||
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
|
|
||||||
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`.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -274,14 +247,12 @@ I principali ruoli attualmente presenti sono:
|
|||||||
| 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 (X11) |
|
|
||||||
| profile_desktop_sway | sessione desktop sway / SwayFX (Wayland) |
|
| profile_desktop_sway | sessione desktop sway / SwayFX (Wayland) |
|
||||||
| profile_desktop_hyprland | sessione desktop Hyprland (Wayland) |
|
| profile_desktop_hyprland | sessione desktop Hyprland (Wayland) |
|
||||||
| 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_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 |
|
||||||
@@ -290,25 +261,22 @@ I principali ruoli attualmente presenti sono:
|
|||||||
|
|
||||||
# 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 sei blocchi:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
all:!workstation_host_windows -> dotfiles_common
|
all -> dotfiles_common
|
||||||
void -> packages_void + services_runit + profile_desktop_common + profile_desktop_i3 + profile_desktop_sway + profile_desktop_hyprland + profile_desktop_host
|
void -> packages_void + services_runit + profile_desktop_common + profile_desktop_sway + profile_desktop_hyprland + profile_desktop_host
|
||||||
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
|
|
||||||
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 Fedora (`deadalus-fedora`) usa il 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 WSL (`deadalus-wsl`) e predisposto con play dev dedicato
|
||||||
- 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`
|
||||||
|
|
||||||
@@ -366,7 +334,6 @@ Gestione segreti:
|
|||||||
- `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`
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -381,12 +348,10 @@ 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, sessione i3 e override specifici per host
|
- per gli host Void applica bootstrap desktop condiviso, sessioni sway/Hyprland e override specifici per host
|
||||||
- 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 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
|
||||||
@@ -398,7 +363,6 @@ Per validare prima di applicare:
|
|||||||
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-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
|
||||||
@@ -435,7 +399,7 @@ 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 |
|
||||||
| `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 |
|
||||||
@@ -444,20 +408,19 @@ Allo stato attuale `ansible/site.yml` espone questi tag:
|
|||||||
| `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 (X11) | desktop Void |
|
|
||||||
| `sway` | sessione/configurazione sway / SwayFX (Wayland) | desktop Void |
|
| `sway` | sessione/configurazione sway / SwayFX (Wayland) | desktop Void |
|
||||||
| `hyprland` | sessione/configurazione Hyprland (Wayland) | desktop Void |
|
| `hyprland` | sessione/configurazione Hyprland (Wayland) | desktop Void |
|
||||||
| `npm` | installazione pacchetti npm globali | desktop Void, workstation Linux, WSL |
|
| `npm` | installazione pacchetti npm globali | desktop Void, workstation Linux, WSL |
|
||||||
| `nvidia` | componenti NVIDIA desktop | desktop Void |
|
| `nvidia` | componenti NVIDIA desktop | desktop Void |
|
||||||
| `packages` | installazione e aggiornamento pacchetti | tutti i profili |
|
| `packages` | installazione e aggiornamento pacchetti | tutti i profili |
|
||||||
| `services` | gestione servizi runit/systemd/Windows | tutti i profili |
|
| `services` | gestione servizi runit/systemd | tutti i profili |
|
||||||
| `vscode` | installazione/configurazione VS Code | Fedora, host Linux, Windows |
|
| `vscode` | installazione/configurazione VS Code | Fedora, host Linux |
|
||||||
| `wsl` | bootstrap e configurazione WSL | WSL, Windows |
|
| `wsl` | bootstrap e configurazione WSL | WSL |
|
||||||
|
|
||||||
Esempi pratici:
|
Esempi pratici:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ansible-playbook ansible/site.yml --limit nymph --tags dotfiles:desktop,i3 --check --diff
|
ansible-playbook ansible/site.yml --limit nymph --tags dotfiles:desktop,sway --check --diff
|
||||||
ansible-playbook ansible/site.yml --limit ikaros --tags sway,portal --check --diff
|
ansible-playbook ansible/site.yml --limit ikaros --tags sway,portal --check --diff
|
||||||
ansible-playbook ansible/site.yml --limit ikaros --tags hyprland,portal --check --diff
|
ansible-playbook ansible/site.yml --limit ikaros --tags hyprland,portal --check --diff
|
||||||
ansible-playbook ansible/site.yml --limit deadalus-fedora --tags packages,vscode --check --diff
|
ansible-playbook ansible/site.yml --limit deadalus-fedora --tags packages,vscode --check --diff
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
---
|
---
|
||||||
collections:
|
collections:
|
||||||
- name: ansible.posix
|
- name: ansible.posix
|
||||||
- name: ansible.windows
|
|
||||||
- name: community.general
|
- name: community.general
|
||||||
- name: community.windows
|
|
||||||
|
|||||||
@@ -140,44 +140,6 @@ desktop_emacs_dotfiles:
|
|||||||
dest: .emacs.d/
|
dest: .emacs.d/
|
||||||
mode: preserve
|
mode: preserve
|
||||||
|
|
||||||
desktop_i3_dotfiles:
|
|
||||||
- name: i3 config
|
|
||||||
src: .config/i3/
|
|
||||||
dest: .config/i3/
|
|
||||||
mode: preserve
|
|
||||||
- name: dunst config
|
|
||||||
src: .config/dunst/
|
|
||||||
dest: .config/dunst/
|
|
||||||
mode: preserve
|
|
||||||
- name: i3blocks config
|
|
||||||
src: .config/i3blocks/
|
|
||||||
dest: .config/i3blocks/
|
|
||||||
mode: preserve
|
|
||||||
- name: rofi config
|
|
||||||
src: .config/rofi/
|
|
||||||
dest: .config/rofi/
|
|
||||||
mode: preserve
|
|
||||||
- name: picom config
|
|
||||||
src: .config/picom/picom.conf
|
|
||||||
dest: .config/picom/picom.conf
|
|
||||||
mode: "0644"
|
|
||||||
- name: polybar config
|
|
||||||
src: .config/polybar/config.ini
|
|
||||||
dest: .config/polybar/config.ini
|
|
||||||
mode: "0644"
|
|
||||||
- name: polybar launcher
|
|
||||||
src: .config/polybar/launch.sh
|
|
||||||
dest: .config/polybar/launch.sh
|
|
||||||
mode: "0755"
|
|
||||||
- name: alacritty config
|
|
||||||
src: .config/alacritty/
|
|
||||||
dest: .config/alacritty/
|
|
||||||
mode: preserve
|
|
||||||
- name: .xinitrc
|
|
||||||
src: .xinitrc
|
|
||||||
dest: .xinitrc
|
|
||||||
mode: "0644"
|
|
||||||
|
|
||||||
desktop_sway_dotfiles:
|
desktop_sway_dotfiles:
|
||||||
- name: alacritty config
|
- name: alacritty config
|
||||||
src: .config/alacritty/
|
src: .config/alacritty/
|
||||||
|
|||||||
@@ -3,13 +3,6 @@ void_xbps_repositories:
|
|||||||
- name: hyprland-void
|
- name: hyprland-void
|
||||||
url: https://raw.githubusercontent.com/sofijacom/hyprland-void/repository-x86_64-glibc
|
url: https://raw.githubusercontent.com/sofijacom/hyprland-void/repository-x86_64-glibc
|
||||||
|
|
||||||
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
|
||||||
@@ -133,31 +126,6 @@ desktop_common_packages:
|
|||||||
- xdg-user-dirs
|
- xdg-user-dirs
|
||||||
- xfce-polkit
|
- xfce-polkit
|
||||||
|
|
||||||
desktop_i3_packages:
|
|
||||||
- arandr
|
|
||||||
- autorandr
|
|
||||||
- feh
|
|
||||||
- i3
|
|
||||||
- i3blocks
|
|
||||||
- i3blocks-blocklets
|
|
||||||
- i3lock-color
|
|
||||||
- i3status
|
|
||||||
- dunst
|
|
||||||
- picom
|
|
||||||
- polybar
|
|
||||||
- rofi
|
|
||||||
- scrot
|
|
||||||
- setxkbmap
|
|
||||||
- volumeicon
|
|
||||||
- xclip
|
|
||||||
- xfce4-clipman-plugin
|
|
||||||
- xfce4-screenshooter
|
|
||||||
- xkbutils
|
|
||||||
- xorg-fonts
|
|
||||||
- xorg-minimal
|
|
||||||
- xss-lock
|
|
||||||
- xdotool
|
|
||||||
|
|
||||||
desktop_sway_packages:
|
desktop_sway_packages:
|
||||||
- cliphist
|
- cliphist
|
||||||
- dunst
|
- dunst
|
||||||
|
|||||||
@@ -19,9 +19,7 @@ workstation_removed_snap_packages: []
|
|||||||
workstation_snap_packages:
|
workstation_snap_packages:
|
||||||
- name: glab
|
- name: glab
|
||||||
classic: true
|
classic: true
|
||||||
workstation_dev_wsl_python_packages:
|
workstation_dev_wsl_python_packages: []
|
||||||
- pypsrp
|
|
||||||
- pyspnego
|
|
||||||
workstation_wsl_systemd_enabled: true
|
workstation_wsl_systemd_enabled: true
|
||||||
workstation_dev_wsl_dotfiles:
|
workstation_dev_wsl_dotfiles:
|
||||||
- src: .gnupg/gpg-agent.conf
|
- src: .gnupg/gpg-agent.conf
|
||||||
|
|||||||
@@ -1,71 +0,0 @@
|
|||||||
---
|
|
||||||
ansible_connection: psrp
|
|
||||||
ansible_psrp_auth: negotiate
|
|
||||||
ansible_psrp_cert_validation: ignore
|
|
||||||
ansible_psrp_protocol: https
|
|
||||||
ansible_port: 5986
|
|
||||||
ansible_shell_type: powershell
|
|
||||||
|
|
||||||
windows_enable_dark_theme: true
|
|
||||||
windows_hide_taskbar_search: true
|
|
||||||
windows_hide_taskbar_widgets: true
|
|
||||||
windows_terminal_default_profile_name: Ubuntu
|
|
||||||
windows_taskbar_layout_directory: 'C:\ProgramData\Infra\Windows'
|
|
||||||
windows_taskbar_layout_path: '{{ windows_taskbar_layout_directory }}\taskbar-layout.xml'
|
|
||||||
windows_taskbar_reapply_every_logon: false
|
|
||||||
|
|
||||||
windows_taskbar_pins:
|
|
||||||
- type: desktop_application_id
|
|
||||||
id: Chrome
|
|
||||||
- type: desktop_application_id
|
|
||||||
id: Microsoft.Windows.Explorer
|
|
||||||
- type: app_user_model_id
|
|
||||||
id: Microsoft.OutlookForWindows_8wekyb3d8bbwe!Microsoft.OutlookforWindows
|
|
||||||
- type: app_user_model_id
|
|
||||||
id: MSTeams_8wekyb3d8bbwe!MSTeams
|
|
||||||
- type: app_user_model_id
|
|
||||||
id: 5319275A.WhatsAppDesktop_cv1g1gvanyjgm!App
|
|
||||||
- type: desktop_application_id
|
|
||||||
id: Telegram.TelegramDesktop
|
|
||||||
- type: desktop_application_id
|
|
||||||
id: Microsoft.VisualStudioCode
|
|
||||||
- type: desktop_application_link_path
|
|
||||||
path: '%APPDATA%\Microsoft\Windows\Start Menu\Programs\JetBrains Toolbox\IntelliJ IDEA Ultimate.lnk'
|
|
||||||
- type: desktop_application_id
|
|
||||||
id: com.squirrel.Postman.Postman
|
|
||||||
- type: app_user_model_id
|
|
||||||
id: Microsoft.WindowsTerminal_8wekyb3d8bbwe!App
|
|
||||||
- type: desktop_application_link_path
|
|
||||||
path: '%APPDATA%\Microsoft\Windows\Start Menu\Programs\DBeaver Community\DBeaver.lnk'
|
|
||||||
|
|
||||||
windows_winget_packages:
|
|
||||||
- id: 7zip.7zip
|
|
||||||
name: 7-Zip
|
|
||||||
- id: Adobe.Acrobat.Reader.64-bit
|
|
||||||
name: Adobe Acrobat Reader
|
|
||||||
- id: DBeaver.DBeaver.Community
|
|
||||||
name: DBeaver Community
|
|
||||||
- id: Google.Chrome
|
|
||||||
name: Google Chrome
|
|
||||||
- id: JetBrains.IntelliJIDEA.Ultimate
|
|
||||||
name: IntelliJ IDEA Ultimate
|
|
||||||
- id: Logitech.OptionsPlus
|
|
||||||
name: Logitech Options+
|
|
||||||
- id: Microsoft.VisualStudioCode
|
|
||||||
name: Visual Studio Code
|
|
||||||
- id: Microsoft.WindowsTerminal
|
|
||||||
name: Windows Terminal
|
|
||||||
- id: Postman.Postman
|
|
||||||
name: Postman
|
|
||||||
- id: Telegram.TelegramDesktop
|
|
||||||
name: Telegram Desktop
|
|
||||||
- id: 9NKSQGP7F2NH
|
|
||||||
name: WhatsApp
|
|
||||||
source: msstore
|
|
||||||
|
|
||||||
windows_vscode_extensions:
|
|
||||||
- ms-vscode-remote.remote-containers
|
|
||||||
- ms-vscode-remote.remote-ssh
|
|
||||||
- ms-vscode-remote.remote-wsl
|
|
||||||
|
|
||||||
windows_wsl_distribution_name: Ubuntu
|
|
||||||
@@ -1,319 +0,0 @@
|
|||||||
---
|
|
||||||
hostname: deadalus-ubuntu
|
|
||||||
|
|
||||||
host_packages: []
|
|
||||||
host_enabled_services: []
|
|
||||||
|
|
||||||
workstation_host_vscode_extensions:
|
|
||||||
- ms-vscode-remote.remote-containers
|
|
||||||
- ms-vscode-remote.remote-ssh
|
|
||||||
- ms-azuretools.vscode-docker
|
|
||||||
- redhat.vscode-yaml
|
|
||||||
- redhat.ansible
|
|
||||||
|
|
||||||
workstation_gnome_managed_settings:
|
|
||||||
- schema: org.gnome.shell
|
|
||||||
key: favorite-apps
|
|
||||||
value: "['google-chrome.desktop', 'org.gnome.Nautilus.desktop', 'spotify_spotify.desktop', 'thunderbird_thunderbird.desktop', 'telegram-desktop_telegram-desktop.desktop', 'code_code.desktop', 'intellij-idea-ultimate_intellij-idea-ultimate.desktop', 'dbeaver-ce_dbeaver-ce.desktop', 'postman_postman.desktop', 'org.gnome.Ptyxis.desktop']"
|
|
||||||
- schema: org.gnome.shell
|
|
||||||
key: app-picker-layout
|
|
||||||
value: "[{'Utilities': <{'position': <0>}>, 'System': <{'position': <1>}>, 'a3b499f3-e2cc-40ac-9145-7db9c827dff2': <{'position': <2>}>, 'org.gnome.Calculator.desktop': <{'position': <3>}>, 'com.mattjakeman.ExtensionManager.desktop': <{'position': <4>}>, 'org.gnome.clocks.desktop': <{'position': <5>}>, 'htop.desktop': <{'position': <6>}>, 'org.gnome.Characters.desktop': <{'position': <7>}>, 'gnome-language-selector.desktop': <{'position': <8>}>, 'org.gnome.Meld.desktop': <{'position': <9>}>, 'net.nokyan.Resources.desktop': <{'position': <10>}>, 'org.gnome.TextEditor.desktop': <{'position': <11>}>, 'org.gnome.tweaks.desktop': <{'position': <12>}>, 'vim.desktop': <{'position': <13>}>, 'snap-store_snap-store.desktop': <{'position': <14>}>, 'org.gnome.Yelp.desktop': <{'position': <15>}>}]"
|
|
||||||
- schema: org.gnome.desktop.app-folders
|
|
||||||
key: folder-children
|
|
||||||
value: "['System', 'Utilities', 'YaST', 'Pardus', 'a3b499f3-e2cc-40ac-9145-7db9c827dff2']"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/System/
|
|
||||||
key: name
|
|
||||||
value: "'X-GNOME-Shell-System.directory'"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/System/
|
|
||||||
key: translate
|
|
||||||
value: "true"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/System/
|
|
||||||
key: categories
|
|
||||||
value: "@as []"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/System/
|
|
||||||
key: apps
|
|
||||||
value: "['nm-connection-editor.desktop', 'org.gnome.baobab.desktop', 'org.gnome.DiskUtility.desktop', 'im-config.desktop', 'org.gnome.Logs.desktop', 'org.gnome.Sysprof.desktop', 'gufw.desktop', 'firmware-updater_firmware-updater.desktop', 'org.gnome.Settings.desktop', 'update-manager.desktop', 'desktop-security-center_desktop-security-center.desktop']"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/Utilities/
|
|
||||||
key: name
|
|
||||||
value: "'X-GNOME-Shell-Utilities.directory'"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/Utilities/
|
|
||||||
key: translate
|
|
||||||
value: "true"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/Utilities/
|
|
||||||
key: categories
|
|
||||||
value: "@as []"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/Utilities/
|
|
||||||
key: apps
|
|
||||||
value: "['org.gnome.Papers.desktop', 'org.gnome.font-viewer.desktop', 'org.gnome.Loupe.desktop', 'org.gnome.seahorse.Application.desktop']"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/YaST/
|
|
||||||
key: name
|
|
||||||
value: "'suse-yast.directory'"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/YaST/
|
|
||||||
key: translate
|
|
||||||
value: "true"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/YaST/
|
|
||||||
key: categories
|
|
||||||
value: "['X-SuSE-YaST']"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/YaST/
|
|
||||||
key: apps
|
|
||||||
value: "@as []"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/Pardus/
|
|
||||||
key: name
|
|
||||||
value: "'X-Pardus-Apps.directory'"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/Pardus/
|
|
||||||
key: translate
|
|
||||||
value: "true"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/Pardus/
|
|
||||||
key: categories
|
|
||||||
value: "['X-Pardus-Apps']"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/Pardus/
|
|
||||||
key: apps
|
|
||||||
value: "@as []"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/a3b499f3-e2cc-40ac-9145-7db9c827dff2/
|
|
||||||
key: name
|
|
||||||
value: "'Office'"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/a3b499f3-e2cc-40ac-9145-7db9c827dff2/
|
|
||||||
key: translate
|
|
||||||
value: "false"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/a3b499f3-e2cc-40ac-9145-7db9c827dff2/
|
|
||||||
key: categories
|
|
||||||
value: "@as []"
|
|
||||||
- schema: org.gnome.desktop.app-folders.folder
|
|
||||||
path: /org/gnome/desktop/app-folders/folders/a3b499f3-e2cc-40ac-9145-7db9c827dff2/
|
|
||||||
key: apps
|
|
||||||
value: "['libreoffice-calc.desktop', 'libreoffice-base.desktop', 'libreoffice-draw.desktop', 'libreoffice-impress.desktop', 'libreoffice-math.desktop', 'libreoffice-writer.desktop', 'xournalpp_xournalpp.desktop', 'libreoffice-startcenter.desktop', 'pdfarranger_pdfarranger.desktop']"
|
|
||||||
- schema: org.gnome.desktop.input-sources
|
|
||||||
key: sources
|
|
||||||
value: "[('xkb', 'us')]"
|
|
||||||
- schema: org.gnome.desktop.interface
|
|
||||||
key: accent-color
|
|
||||||
value: "'orange'"
|
|
||||||
- schema: org.gnome.desktop.interface
|
|
||||||
key: clock-format
|
|
||||||
value: "'24h'"
|
|
||||||
- schema: org.gnome.desktop.interface
|
|
||||||
key: clock-show-date
|
|
||||||
value: "true"
|
|
||||||
- schema: org.gnome.desktop.interface
|
|
||||||
key: color-scheme
|
|
||||||
value: "'prefer-dark'"
|
|
||||||
- schema: org.gnome.desktop.interface
|
|
||||||
key: cursor-theme
|
|
||||||
value: "'Adwaita'"
|
|
||||||
- schema: org.gnome.desktop.interface
|
|
||||||
key: document-font-name
|
|
||||||
value: "'Adwaita Sans 12'"
|
|
||||||
- schema: org.gnome.desktop.interface
|
|
||||||
key: font-name
|
|
||||||
value: "'Adwaita Sans 11'"
|
|
||||||
- schema: org.gnome.desktop.interface
|
|
||||||
key: gtk-theme
|
|
||||||
value: "'Yaru-dark'"
|
|
||||||
- schema: org.gnome.desktop.interface
|
|
||||||
key: icon-theme
|
|
||||||
value: "'Yaru-dark'"
|
|
||||||
- schema: org.gnome.desktop.interface
|
|
||||||
key: monospace-font-name
|
|
||||||
value: "'Ubuntu Sans Mono 11'"
|
|
||||||
- schema: org.gnome.desktop.interface
|
|
||||||
key: show-battery-percentage
|
|
||||||
value: "false"
|
|
||||||
- schema: org.gnome.desktop.interface
|
|
||||||
key: text-scaling-factor
|
|
||||||
value: "1.0"
|
|
||||||
- schema: org.gnome.desktop.privacy
|
|
||||||
key: report-technical-problems
|
|
||||||
value: "false"
|
|
||||||
- schema: org.gnome.desktop.wm.preferences
|
|
||||||
key: button-layout
|
|
||||||
value: "'appmenu:close'"
|
|
||||||
- schema: org.gnome.desktop.wm.preferences
|
|
||||||
key: focus-mode
|
|
||||||
value: "'click'"
|
|
||||||
- schema: org.gnome.desktop.wm.preferences
|
|
||||||
key: focus-new-windows
|
|
||||||
value: "'smart'"
|
|
||||||
- schema: org.gnome.desktop.wm.preferences
|
|
||||||
key: num-workspaces
|
|
||||||
value: "4"
|
|
||||||
- schema: org.gnome.nautilus.preferences
|
|
||||||
key: click-policy
|
|
||||||
value: "'double'"
|
|
||||||
- schema: org.gnome.nautilus.preferences
|
|
||||||
key: date-time-format
|
|
||||||
value: "'simple'"
|
|
||||||
- schema: org.gnome.nautilus.preferences
|
|
||||||
key: default-folder-viewer
|
|
||||||
value: "'icon-view'"
|
|
||||||
- schema: org.gnome.nautilus.preferences
|
|
||||||
key: default-sort-order
|
|
||||||
value: "'name'"
|
|
||||||
- schema: org.gnome.nautilus.preferences
|
|
||||||
key: recursive-search
|
|
||||||
value: "'local-only'"
|
|
||||||
- schema: org.gnome.nautilus.preferences
|
|
||||||
key: show-create-link
|
|
||||||
value: "true"
|
|
||||||
- schema: org.gnome.nautilus.preferences
|
|
||||||
key: show-delete-permanently
|
|
||||||
value: "true"
|
|
||||||
- schema: org.gnome.nautilus.preferences
|
|
||||||
key: show-directory-item-counts
|
|
||||||
value: "'local-only'"
|
|
||||||
- schema: org.gnome.nautilus.preferences
|
|
||||||
key: show-hidden-files
|
|
||||||
value: "false"
|
|
||||||
- schema: org.gnome.nautilus.preferences
|
|
||||||
key: show-image-thumbnails
|
|
||||||
value: "'local-only'"
|
|
||||||
- schema: org.gnome.nautilus.preferences
|
|
||||||
key: thumbnail-limit
|
|
||||||
value: "uint64 50"
|
|
||||||
- schema: org.gnome.nautilus.icon-view
|
|
||||||
key: captions
|
|
||||||
value: "['none', 'none', 'none']"
|
|
||||||
- schema: org.gnome.nautilus.icon-view
|
|
||||||
key: default-zoom-level
|
|
||||||
value: "'medium'"
|
|
||||||
- schema: org.gtk.gtk4.Settings.FileChooser
|
|
||||||
key: clock-format
|
|
||||||
value: "'24h'"
|
|
||||||
- schema: org.gtk.gtk4.Settings.FileChooser
|
|
||||||
key: date-format
|
|
||||||
value: "'regular'"
|
|
||||||
- schema: org.gtk.gtk4.Settings.FileChooser
|
|
||||||
key: location-mode
|
|
||||||
value: "'path-bar'"
|
|
||||||
- schema: org.gtk.gtk4.Settings.FileChooser
|
|
||||||
key: show-hidden
|
|
||||||
value: "false"
|
|
||||||
- schema: org.gtk.gtk4.Settings.FileChooser
|
|
||||||
key: show-size-column
|
|
||||||
value: "true"
|
|
||||||
- schema: org.gtk.gtk4.Settings.FileChooser
|
|
||||||
key: show-type-column
|
|
||||||
value: "true"
|
|
||||||
- schema: org.gtk.gtk4.Settings.FileChooser
|
|
||||||
key: sort-column
|
|
||||||
value: "'name'"
|
|
||||||
- schema: org.gtk.gtk4.Settings.FileChooser
|
|
||||||
key: sort-directories-first
|
|
||||||
value: "true"
|
|
||||||
- schema: org.gtk.gtk4.Settings.FileChooser
|
|
||||||
key: sort-order
|
|
||||||
value: "'ascending'"
|
|
||||||
- schema: org.gtk.gtk4.Settings.FileChooser
|
|
||||||
key: startup-mode
|
|
||||||
value: "'recent'"
|
|
||||||
- schema: org.gtk.gtk4.Settings.FileChooser
|
|
||||||
key: type-format
|
|
||||||
value: "'category'"
|
|
||||||
- schema: org.gtk.gtk4.Settings.FileChooser
|
|
||||||
key: view-type
|
|
||||||
value: "'list'"
|
|
||||||
- schema: org.gnome.settings-daemon.plugins.color
|
|
||||||
key: night-light-schedule-automatic
|
|
||||||
value: "false"
|
|
||||||
- schema: org.gnome.settings-daemon.plugins.power
|
|
||||||
key: sleep-inactive-ac-timeout
|
|
||||||
value: "3600"
|
|
||||||
- schema: org.gnome.settings-daemon.plugins.power
|
|
||||||
key: sleep-inactive-ac-type
|
|
||||||
value: "'nothing'"
|
|
||||||
- schema: org.gnome.system.location
|
|
||||||
key: enabled
|
|
||||||
value: "false"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: auto-indent
|
|
||||||
value: "true"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: auto-save-delay
|
|
||||||
value: "uint32 3"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: custom-font
|
|
||||||
value: "'Monospace 11'"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: discover-settings
|
|
||||||
value: "true"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: draw-spaces
|
|
||||||
value: "@as []"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: enable-snippets
|
|
||||||
value: "false"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: highlight-current-line
|
|
||||||
value: "false"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: highlight-matching-brackets
|
|
||||||
value: "true"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: indent-style
|
|
||||||
value: "'tab'"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: indent-width
|
|
||||||
value: "-1"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: keybindings
|
|
||||||
value: "'default'"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: line-height
|
|
||||||
value: "1.2"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: recolor-window
|
|
||||||
value: "true"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: restore-session
|
|
||||||
value: "true"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: right-margin-position
|
|
||||||
value: "uint32 80"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: show-grid
|
|
||||||
value: "false"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: show-line-numbers
|
|
||||||
value: "false"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: show-map
|
|
||||||
value: "false"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: show-right-margin
|
|
||||||
value: "false"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: spellcheck
|
|
||||||
value: "true"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: style-scheme
|
|
||||||
value: "'Adwaita'"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: style-variant
|
|
||||||
value: "'follow'"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: tab-width
|
|
||||||
value: "uint32 8"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: use-system-font
|
|
||||||
value: "true"
|
|
||||||
- schema: org.gnome.TextEditor
|
|
||||||
key: wrap-text
|
|
||||||
value: "true"
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
---
|
|
||||||
hostname: deadalus-win
|
|
||||||
@@ -33,10 +33,5 @@ host_sshd_allow_users:
|
|||||||
|
|
||||||
host_authorized_ssh_keys: "{{ vault_ikaros_authorized_ssh_keys | default([]) }}"
|
host_authorized_ssh_keys: "{{ vault_ikaros_authorized_ssh_keys | default([]) }}"
|
||||||
|
|
||||||
host_i3_dotfiles:
|
|
||||||
- src: .config/autorandr/
|
|
||||||
dest: .config/autorandr/
|
|
||||||
mode: preserve
|
|
||||||
|
|
||||||
host_enabled_services:
|
host_enabled_services:
|
||||||
- sshd
|
- sshd
|
||||||
|
|||||||
@@ -24,14 +24,6 @@ host_packages:
|
|||||||
host_enabled_services:
|
host_enabled_services:
|
||||||
- tlp
|
- tlp
|
||||||
|
|
||||||
host_i3_dotfiles:
|
|
||||||
- src: .config/autorandr/
|
|
||||||
dest: .config/autorandr/
|
|
||||||
mode: preserve
|
|
||||||
- src: .config/wireplumber/wireplumber.conf.d/60-camera-priority.conf
|
|
||||||
dest: .config/wireplumber/wireplumber.conf.d/60-camera-priority.conf
|
|
||||||
mode: "0644"
|
|
||||||
|
|
||||||
host_sway_dotfiles:
|
host_sway_dotfiles:
|
||||||
- src: .config/sway/host.conf
|
- src: .config/sway/host.conf
|
||||||
dest: .config/sway/host.conf
|
dest: .config/sway/host.conf
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ all:
|
|||||||
|
|
||||||
ubuntu:
|
ubuntu:
|
||||||
children:
|
children:
|
||||||
ubuntu_workstation:
|
|
||||||
workstation_dev_wsl:
|
workstation_dev_wsl:
|
||||||
ubuntu_server:
|
ubuntu_server:
|
||||||
|
|
||||||
@@ -33,11 +32,9 @@ all:
|
|||||||
workstation_host:
|
workstation_host:
|
||||||
children:
|
children:
|
||||||
workstation_host_linux:
|
workstation_host_linux:
|
||||||
workstation_host_windows:
|
|
||||||
|
|
||||||
workstation_dev:
|
workstation_dev:
|
||||||
children:
|
children:
|
||||||
workstation_dev_ubuntu:
|
|
||||||
workstation_dev_fedora:
|
workstation_dev_fedora:
|
||||||
workstation_dev_wsl:
|
workstation_dev_wsl:
|
||||||
|
|
||||||
@@ -45,11 +42,6 @@ all:
|
|||||||
children:
|
children:
|
||||||
ubuntu_server:
|
ubuntu_server:
|
||||||
|
|
||||||
ubuntu_workstation:
|
|
||||||
hosts:
|
|
||||||
deadalus-ubuntu:
|
|
||||||
ansible_connection: local
|
|
||||||
|
|
||||||
fedora_workstation:
|
fedora_workstation:
|
||||||
hosts:
|
hosts:
|
||||||
deadalus-fedora:
|
deadalus-fedora:
|
||||||
@@ -57,25 +49,14 @@ all:
|
|||||||
|
|
||||||
workstation_host_linux:
|
workstation_host_linux:
|
||||||
hosts:
|
hosts:
|
||||||
deadalus-ubuntu:
|
|
||||||
ansible_connection: local
|
|
||||||
deadalus-fedora:
|
deadalus-fedora:
|
||||||
ansible_connection: local
|
ansible_connection: local
|
||||||
|
|
||||||
workstation_dev_ubuntu:
|
|
||||||
hosts:
|
|
||||||
deadalus-ubuntu:
|
|
||||||
ansible_connection: local
|
|
||||||
|
|
||||||
workstation_dev_fedora:
|
workstation_dev_fedora:
|
||||||
hosts:
|
hosts:
|
||||||
deadalus-fedora:
|
deadalus-fedora:
|
||||||
ansible_connection: local
|
ansible_connection: local
|
||||||
|
|
||||||
workstation_host_windows:
|
|
||||||
hosts:
|
|
||||||
deadalus-win:
|
|
||||||
|
|
||||||
workstation_dev_wsl:
|
workstation_dev_wsl:
|
||||||
hosts:
|
hosts:
|
||||||
deadalus-wsl:
|
deadalus-wsl:
|
||||||
|
|||||||
@@ -115,11 +115,6 @@
|
|||||||
else []
|
else []
|
||||||
)
|
)
|
||||||
+ (desktop_common_packages | default([]))
|
+ (desktop_common_packages | default([]))
|
||||||
+ (
|
|
||||||
(desktop_i3_packages | default([]))
|
|
||||||
if 'i3' in (desktop_sessions_enabled | default([]))
|
|
||||||
else []
|
|
||||||
)
|
|
||||||
+ (host_packages | default([]))
|
+ (host_packages | default([]))
|
||||||
)
|
)
|
||||||
| difference(
|
| difference(
|
||||||
|
|||||||
@@ -56,11 +56,6 @@
|
|||||||
+ (void_packages_base | default([]))
|
+ (void_packages_base | default([]))
|
||||||
+ (profile_packages | default([]))
|
+ (profile_packages | default([]))
|
||||||
+ (desktop_common_packages | default([]))
|
+ (desktop_common_packages | default([]))
|
||||||
+ (
|
|
||||||
(desktop_i3_packages | default([]))
|
|
||||||
if 'i3' in (desktop_sessions_enabled | default([]))
|
|
||||||
else []
|
|
||||||
)
|
|
||||||
+ (
|
+ (
|
||||||
(desktop_sway_packages | default([]))
|
(desktop_sway_packages | default([]))
|
||||||
if 'sway' in (desktop_sessions_enabled | default([]))
|
if 'sway' in (desktop_sessions_enabled | default([]))
|
||||||
@@ -83,4 +78,4 @@
|
|||||||
community.general.xbps:
|
community.general.xbps:
|
||||||
name: "{{ host_packages_absent | default([]) }}"
|
name: "{{ host_packages_absent | default([]) }}"
|
||||||
state: absent
|
state: absent
|
||||||
when: (host_packages_absent | default([])) | length > 0
|
when: (host_packages_absent | default([])) | length > 0
|
||||||
|
|||||||
@@ -4,21 +4,6 @@
|
|||||||
ansible.builtin.include_tasks: nymph.yml
|
ansible.builtin.include_tasks: nymph.yml
|
||||||
when: hostname == 'nymph'
|
when: hostname == 'nymph'
|
||||||
|
|
||||||
- name: Copy host-specific i3 dotfiles
|
|
||||||
tags: [dotfiles, dotfiles:desktop, dotfiles:host, i3]
|
|
||||||
ansible.builtin.copy:
|
|
||||||
src: "{{ playbook_dir }}/../dotfiles/{{ hostname }}/{{ item.src }}"
|
|
||||||
dest: "{{ user_home }}/{{ item.dest }}"
|
|
||||||
owner: "{{ username }}"
|
|
||||||
group: "{{ user_group }}"
|
|
||||||
mode: "{{ item.mode }}"
|
|
||||||
loop: "{{ host_i3_dotfiles | default([]) }}"
|
|
||||||
loop_control:
|
|
||||||
label: "{{ item.dest }}"
|
|
||||||
when:
|
|
||||||
- "'i3' in (desktop_sessions_enabled | default([]))"
|
|
||||||
- (host_i3_dotfiles | default([])) | length > 0
|
|
||||||
|
|
||||||
- name: Copy host-specific sway dotfiles
|
- name: Copy host-specific sway dotfiles
|
||||||
tags: [dotfiles, dotfiles:desktop, dotfiles:host, sway]
|
tags: [dotfiles, dotfiles:desktop, dotfiles:host, sway]
|
||||||
ansible.builtin.copy:
|
ansible.builtin.copy:
|
||||||
|
|||||||
@@ -53,11 +53,3 @@
|
|||||||
group: "{{ user_group }}"
|
group: "{{ user_group }}"
|
||||||
mode: "0755"
|
mode: "0755"
|
||||||
force: false
|
force: false
|
||||||
|
|
||||||
- name: Wrap alacritty with prime-run for NVIDIA PRIME offload
|
|
||||||
tags: [nvidia, dotfiles, dotfiles:desktop, dotfiles:host]
|
|
||||||
ansible.builtin.lineinfile:
|
|
||||||
path: "{{ user_home }}/.config/i3/config"
|
|
||||||
regexp: '^bindsym \$mod\+Return exec --no-startup-id /usr/bin/alacritty'
|
|
||||||
line: 'bindsym $mod+Return exec --no-startup-id ~/.local/bin/prime-run /usr/bin/alacritty'
|
|
||||||
when: "'i3' in (desktop_sessions_enabled | default([]))"
|
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Name=i3
|
|
||||||
Comment=improved dynamic tiling window manager
|
|
||||||
Exec=i3
|
|
||||||
TryExec=i3
|
|
||||||
Type=Application
|
|
||||||
DesktopNames=i3
|
|
||||||
Keywords=tiling;wm;windowmanager;window;manager;
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Ensure i3 config directories exist
|
|
||||||
tags: [dotfiles, dotfiles:desktop, i3]
|
|
||||||
ansible.builtin.file:
|
|
||||||
path: "{{ item }}"
|
|
||||||
state: directory
|
|
||||||
owner: "{{ username }}"
|
|
||||||
group: "{{ user_group }}"
|
|
||||||
mode: "0755"
|
|
||||||
loop:
|
|
||||||
- "{{ user_home }}/.config/alacritty"
|
|
||||||
- "{{ user_home }}/.config/dunst"
|
|
||||||
- "{{ user_home }}/.config/i3"
|
|
||||||
- "{{ user_home }}/.config/i3blocks"
|
|
||||||
- "{{ user_home }}/.config/picom"
|
|
||||||
- "{{ user_home }}/.config/polybar"
|
|
||||||
- "{{ user_home }}/.config/rofi"
|
|
||||||
when: "'i3' in (desktop_sessions_enabled | default([]))"
|
|
||||||
|
|
||||||
- name: Install allowed emptty X11 sessions
|
|
||||||
tags: [packages, services, emptty, i3]
|
|
||||||
ansible.builtin.copy:
|
|
||||||
src: i3.desktop
|
|
||||||
dest: /etc/emptty/xsessions/i3.desktop
|
|
||||||
owner: root
|
|
||||||
group: root
|
|
||||||
mode: "0644"
|
|
||||||
when: "'i3' in (desktop_sessions_enabled | default([]))"
|
|
||||||
|
|
||||||
- name: Copy i3 desktop dotfiles
|
|
||||||
tags: [dotfiles, dotfiles:desktop, i3]
|
|
||||||
ansible.builtin.copy:
|
|
||||||
src: "{{ playbook_dir }}/../dotfiles/desktop/{{ item.src }}"
|
|
||||||
dest: "{{ user_home }}/{{ item.dest }}"
|
|
||||||
owner: "{{ username }}"
|
|
||||||
group: "{{ user_group }}"
|
|
||||||
mode: "{{ item.mode }}"
|
|
||||||
loop: "{{ desktop_i3_dotfiles | default([]) }}"
|
|
||||||
loop_control:
|
|
||||||
label: "{{ item.dest }}"
|
|
||||||
when: "'i3' in (desktop_sessions_enabled | default([]))"
|
|
||||||
@@ -1,411 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Enable required Windows features for WSL
|
|
||||||
tags: [packages, services, wsl]
|
|
||||||
ansible.windows.win_optional_feature:
|
|
||||||
name:
|
|
||||||
- Microsoft-Windows-Subsystem-Linux
|
|
||||||
- VirtualMachinePlatform
|
|
||||||
state: present
|
|
||||||
include_parent: true
|
|
||||||
|
|
||||||
- name: Gather Windows host version details
|
|
||||||
tags: [packages]
|
|
||||||
ansible.windows.win_powershell:
|
|
||||||
script: |
|
|
||||||
$os = Get-ComputerInfo
|
|
||||||
$buildNumber = [int]$os.OsBuildNumber
|
|
||||||
$Ansible.Result = @{
|
|
||||||
product_name = $os.WindowsProductName
|
|
||||||
build_number = $buildNumber
|
|
||||||
is_windows_11 = $buildNumber -ge 22000
|
|
||||||
}
|
|
||||||
$Ansible.Changed = $false
|
|
||||||
register: windows_host_version_state
|
|
||||||
|
|
||||||
- name: Fail when Windows host is not Windows 11
|
|
||||||
tags: [packages]
|
|
||||||
ansible.builtin.fail:
|
|
||||||
msg: >-
|
|
||||||
workstation_host_windows is supported only on Windows 11. Detected {{ windows_host_version_state.result.product_name }}
|
|
||||||
build {{ windows_host_version_state.result.build_number }}.
|
|
||||||
when: not (windows_host_version_state.result.is_windows_11 | default(false))
|
|
||||||
|
|
||||||
- name: Enable dark mode for Windows apps
|
|
||||||
tags: [packages]
|
|
||||||
ansible.windows.win_regedit:
|
|
||||||
path: HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize
|
|
||||||
name: AppsUseLightTheme
|
|
||||||
data: 0
|
|
||||||
type: dword
|
|
||||||
register: windows_apps_dark_mode_state
|
|
||||||
when: windows_enable_dark_theme | default(false)
|
|
||||||
|
|
||||||
- name: Enable dark mode for Windows system surfaces
|
|
||||||
tags: [packages]
|
|
||||||
ansible.windows.win_regedit:
|
|
||||||
path: HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize
|
|
||||||
name: SystemUsesLightTheme
|
|
||||||
data: 0
|
|
||||||
type: dword
|
|
||||||
register: windows_system_dark_mode_state
|
|
||||||
when: windows_enable_dark_theme | default(false)
|
|
||||||
|
|
||||||
- name: Hide Windows taskbar search box
|
|
||||||
tags: [packages]
|
|
||||||
ansible.windows.win_regedit:
|
|
||||||
path: HKCU:\Software\Microsoft\Windows\CurrentVersion\Search
|
|
||||||
name: SearchboxTaskbarMode
|
|
||||||
data: 0
|
|
||||||
type: dword
|
|
||||||
register: windows_taskbar_search_state
|
|
||||||
when: windows_hide_taskbar_search | default(false)
|
|
||||||
|
|
||||||
- name: Hide Windows 11 taskbar widgets
|
|
||||||
tags: [packages]
|
|
||||||
ansible.windows.win_regedit:
|
|
||||||
path: HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
|
|
||||||
name: TaskbarDa
|
|
||||||
data: 0
|
|
||||||
type: dword
|
|
||||||
register: windows_11_widgets_state
|
|
||||||
when: windows_hide_taskbar_widgets | default(false)
|
|
||||||
|
|
||||||
- name: Disable Windows 11 widgets via policy
|
|
||||||
tags: [packages]
|
|
||||||
ansible.windows.win_regedit:
|
|
||||||
path: HKLM:\SOFTWARE\Policies\Microsoft\Dsh
|
|
||||||
name: AllowNewsAndInterests
|
|
||||||
data: 0
|
|
||||||
type: dword
|
|
||||||
register: windows_11_widgets_policy_state
|
|
||||||
when: windows_hide_taskbar_widgets | default(false)
|
|
||||||
|
|
||||||
- name: Note when Windows shell settings may require sign out
|
|
||||||
tags: [packages]
|
|
||||||
ansible.builtin.debug:
|
|
||||||
msg: >-
|
|
||||||
Windows shell appearance settings changed. Sign out and back in, or restart explorer.exe,
|
|
||||||
if taskbar or theme updates do not appear immediately. Windows 11 widget policy changes can require
|
|
||||||
signing out before the widget button disappears from the taskbar.
|
|
||||||
changed_when: false
|
|
||||||
when: >-
|
|
||||||
(windows_apps_dark_mode_state is changed)
|
|
||||||
or (windows_system_dark_mode_state is changed)
|
|
||||||
or (windows_taskbar_search_state is changed)
|
|
||||||
or (windows_11_widgets_state is changed)
|
|
||||||
or (windows_11_widgets_policy_state is changed)
|
|
||||||
|
|
||||||
- name: Ensure winget is executable on Windows host through PSRP
|
|
||||||
tags: [packages]
|
|
||||||
when: windows_package_backend == 'winget_psrp'
|
|
||||||
ansible.windows.win_powershell:
|
|
||||||
script: |
|
|
||||||
$winget = Get-Command winget.exe -ErrorAction SilentlyContinue
|
|
||||||
if ($null -eq $winget) {
|
|
||||||
throw 'winget.exe is not available on the Windows host. Install App Installer or rerun the bootstrap script.'
|
|
||||||
}
|
|
||||||
|
|
||||||
& $winget.Source --info *> $null
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
throw 'winget.exe is not executable through the current PSRP session. Set windows_package_backend to winget_wsl_local on WSL-managed hosts.'
|
|
||||||
}
|
|
||||||
|
|
||||||
$Ansible.Changed = $false
|
|
||||||
|
|
||||||
- name: Ensure winget is executable through local Windows PowerShell from WSL
|
|
||||||
tags: [packages]
|
|
||||||
when: windows_package_backend == 'winget_wsl_local'
|
|
||||||
block:
|
|
||||||
- name: Ensure winget_wsl_local backend is running inside WSL
|
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
|
||||||
- lookup('ansible.builtin.env', 'WSL_DISTRO_NAME') | length > 0
|
|
||||||
fail_msg: >-
|
|
||||||
winget_wsl_local requires running the playbook from inside the
|
|
||||||
target machine's WSL environment.
|
|
||||||
|
|
||||||
- name: Get local Windows host name through WSL interop
|
|
||||||
ansible.builtin.shell: |
|
|
||||||
powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command '$env:COMPUTERNAME'
|
|
||||||
args:
|
|
||||||
executable: /bin/bash
|
|
||||||
delegate_to: localhost
|
|
||||||
register: local_windows_host_name_state
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Get local Windows host IP addresses through WSL interop
|
|
||||||
ansible.builtin.shell: |
|
|
||||||
powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command '
|
|
||||||
Get-NetIPAddress -AddressFamily IPv4, IPv6 -ErrorAction SilentlyContinue |
|
|
||||||
Where-Object {
|
|
||||||
$_.IPAddress -notin @("127.0.0.1", "::1") -and
|
|
||||||
$_.IPAddress -notlike "169.254.*" -and
|
|
||||||
$_.IPAddress -notlike "fe80:*"
|
|
||||||
} |
|
|
||||||
Select-Object -ExpandProperty IPAddress
|
|
||||||
'
|
|
||||||
args:
|
|
||||||
executable: /bin/bash
|
|
||||||
delegate_to: localhost
|
|
||||||
register: local_windows_host_ip_state
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Ensure winget_wsl_local backend targets the local Windows host
|
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
|
||||||
- >-
|
|
||||||
(ansible_host | lower) in ['localhost', '127.0.0.1', '::1']
|
|
||||||
or (local_windows_host_name_state.stdout | trim | upper)
|
|
||||||
== ((ansible_host | regex_replace('\\..*$', '')) | upper)
|
|
||||||
or (ansible_host | lower)
|
|
||||||
in (local_windows_host_ip_state.stdout_lines | map('trim') | map('lower') | list)
|
|
||||||
fail_msg: >-
|
|
||||||
winget_wsl_local can only target the local Windows host reached
|
|
||||||
through WSL interop. Local Windows host '{{ local_windows_host_name_state.stdout | trim }}'
|
|
||||||
with addresses {{ local_windows_host_ip_state.stdout_lines | map('trim') | list }}
|
|
||||||
does not match ansible_host '{{ ansible_host }}'.
|
|
||||||
|
|
||||||
- name: Ensure winget is executable through local Windows PowerShell
|
|
||||||
ansible.builtin.shell: |
|
|
||||||
powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command '
|
|
||||||
$ErrorActionPreference = "Stop"
|
|
||||||
$winget = Get-Command winget.exe -ErrorAction SilentlyContinue
|
|
||||||
if ($null -eq $winget) {
|
|
||||||
throw "winget.exe is not available on the local Windows host. Install App Installer or rerun the bootstrap script."
|
|
||||||
}
|
|
||||||
|
|
||||||
& $winget.Source --info *> $null
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
throw "winget.exe is not executable through local Windows PowerShell interop."
|
|
||||||
}
|
|
||||||
'
|
|
||||||
args:
|
|
||||||
executable: /bin/bash
|
|
||||||
delegate_to: localhost
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Ensure WSL 2 is the default backend
|
|
||||||
tags: [packages, services, wsl]
|
|
||||||
ansible.windows.win_powershell:
|
|
||||||
script: |
|
|
||||||
$status = & wsl --status 2>$null
|
|
||||||
if ($LASTEXITCODE -eq 0 -and $status -match 'Default Version:\s*2') {
|
|
||||||
$Ansible.Changed = $false
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
& wsl --set-default-version 2
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
throw 'Failed to set WSL default version to 2.'
|
|
||||||
}
|
|
||||||
|
|
||||||
$Ansible.Changed = $true
|
|
||||||
|
|
||||||
- name: Install Windows workstation applications with winget through PSRP
|
|
||||||
tags: [packages]
|
|
||||||
when: windows_package_backend == 'winget_psrp'
|
|
||||||
ansible.windows.win_powershell:
|
|
||||||
script: |
|
|
||||||
$packageId = '{{ item.id }}'
|
|
||||||
$packageName = '{{ item.name | default(item.id) }}'
|
|
||||||
$packageSource = '{{ item.source | default('') }}'
|
|
||||||
$listArgs = @(
|
|
||||||
'list'
|
|
||||||
'--id', $packageId
|
|
||||||
'--exact'
|
|
||||||
'--accept-source-agreements'
|
|
||||||
'--disable-interactivity'
|
|
||||||
)
|
|
||||||
$installArgs = @(
|
|
||||||
'install'
|
|
||||||
'--id', $packageId
|
|
||||||
'--exact'
|
|
||||||
'--silent'
|
|
||||||
'--accept-package-agreements'
|
|
||||||
'--accept-source-agreements'
|
|
||||||
'--disable-interactivity'
|
|
||||||
)
|
|
||||||
|
|
||||||
if (-not [string]::IsNullOrWhiteSpace($packageSource)) {
|
|
||||||
$listArgs += @('--source', $packageSource)
|
|
||||||
$installArgs += @('--source', $packageSource)
|
|
||||||
}
|
|
||||||
|
|
||||||
$installed = & winget @listArgs 2>$null
|
|
||||||
if ($LASTEXITCODE -eq 0 -and $installed -match [regex]::Escape($packageId)) {
|
|
||||||
$Ansible.Changed = $false
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
& winget @installArgs
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
throw "Failed to install $packageName with winget"
|
|
||||||
}
|
|
||||||
|
|
||||||
$Ansible.Changed = $true
|
|
||||||
loop: "{{ windows_winget_packages | default([]) }}"
|
|
||||||
loop_control:
|
|
||||||
label: "{{ item.id }}"
|
|
||||||
|
|
||||||
- name: Install Windows workstation applications with winget through WSL local backend
|
|
||||||
tags: [packages]
|
|
||||||
when: windows_package_backend == 'winget_wsl_local'
|
|
||||||
ansible.builtin.shell: |
|
|
||||||
powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command '
|
|
||||||
$ErrorActionPreference = "Stop"
|
|
||||||
$packageId = "{{ item.id }}"
|
|
||||||
$packageName = "{{ item.name | default(item.id) }}"
|
|
||||||
$packageSource = "{{ item.source | default('') }}"
|
|
||||||
$winget = Get-Command winget.exe -ErrorAction Stop
|
|
||||||
$listArgs = @(
|
|
||||||
"list"
|
|
||||||
"--id", $packageId
|
|
||||||
"--exact"
|
|
||||||
"--accept-source-agreements"
|
|
||||||
"--disable-interactivity"
|
|
||||||
)
|
|
||||||
$installArgs = @(
|
|
||||||
"install"
|
|
||||||
"--id", $packageId
|
|
||||||
"--exact"
|
|
||||||
"--silent"
|
|
||||||
"--accept-package-agreements"
|
|
||||||
"--accept-source-agreements"
|
|
||||||
"--disable-interactivity"
|
|
||||||
)
|
|
||||||
|
|
||||||
if (-not [string]::IsNullOrWhiteSpace($packageSource)) {
|
|
||||||
$listArgs += @("--source", $packageSource)
|
|
||||||
$installArgs += @("--source", $packageSource)
|
|
||||||
}
|
|
||||||
|
|
||||||
$installed = & $winget.Source @listArgs 2>$null
|
|
||||||
if ($LASTEXITCODE -eq 0 -and $installed -match [regex]::Escape($packageId)) {
|
|
||||||
[Console]::Out.WriteLine("changed=false")
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
& $winget.Source @installArgs
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
throw "Failed to install $packageName with winget"
|
|
||||||
}
|
|
||||||
|
|
||||||
[Console]::Out.WriteLine("changed=true")
|
|
||||||
'
|
|
||||||
args:
|
|
||||||
executable: /bin/bash
|
|
||||||
delegate_to: localhost
|
|
||||||
register: windows_wsl_local_winget_install_state
|
|
||||||
changed_when: "'changed=true' in windows_wsl_local_winget_install_state.stdout"
|
|
||||||
loop: "{{ windows_winget_packages | default([]) }}"
|
|
||||||
loop_control:
|
|
||||||
label: "{{ item.id }}"
|
|
||||||
|
|
||||||
- name: Configure Windows taskbar pin layout
|
|
||||||
tags: [packages]
|
|
||||||
when: (windows_taskbar_pins | default([])) | length > 0
|
|
||||||
block:
|
|
||||||
- name: Ensure Windows taskbar layout directory exists
|
|
||||||
ansible.windows.win_file:
|
|
||||||
path: "{{ windows_taskbar_layout_directory }}"
|
|
||||||
state: directory
|
|
||||||
|
|
||||||
- name: Render Windows taskbar layout policy file
|
|
||||||
ansible.windows.win_template:
|
|
||||||
src: taskbar-layout.xml.j2
|
|
||||||
dest: "{{ windows_taskbar_layout_path }}"
|
|
||||||
register: windows_taskbar_layout_file_state
|
|
||||||
|
|
||||||
- name: Enable Windows taskbar layout policy
|
|
||||||
ansible.windows.win_regedit:
|
|
||||||
path: HKCU:\Software\Policies\Microsoft\Windows\Explorer
|
|
||||||
name: LockedStartLayout
|
|
||||||
data: 1
|
|
||||||
type: dword
|
|
||||||
register: windows_taskbar_layout_policy_state
|
|
||||||
|
|
||||||
- name: Set Windows taskbar layout policy file path
|
|
||||||
ansible.windows.win_regedit:
|
|
||||||
path: HKCU:\Software\Policies\Microsoft\Windows\Explorer
|
|
||||||
name: StartLayoutFile
|
|
||||||
data: "{{ windows_taskbar_layout_path }}"
|
|
||||||
type: expandstring
|
|
||||||
register: windows_taskbar_layout_policy_path_state
|
|
||||||
|
|
||||||
- name: Set Windows taskbar layout policy refresh behavior
|
|
||||||
ansible.windows.win_regedit:
|
|
||||||
path: HKCU:\Software\Policies\Microsoft\Windows\Explorer
|
|
||||||
name: ReapplyStartLayoutEveryLogon
|
|
||||||
data: "{{ (windows_taskbar_reapply_every_logon | default(false)) | ternary(1, 0) }}"
|
|
||||||
type: dword
|
|
||||||
register: windows_taskbar_layout_policy_reapply_state
|
|
||||||
|
|
||||||
- name: Note when Windows taskbar pin layout may require sign out
|
|
||||||
ansible.builtin.debug:
|
|
||||||
msg: >-
|
|
||||||
Windows taskbar pin policy changed. Sign out and back in if the updated pin order does not appear immediately.
|
|
||||||
changed_when: false
|
|
||||||
when: >-
|
|
||||||
(windows_taskbar_layout_file_state is changed)
|
|
||||||
or (windows_taskbar_layout_policy_state is changed)
|
|
||||||
or (windows_taskbar_layout_policy_path_state is changed)
|
|
||||||
or (windows_taskbar_layout_policy_reapply_state is changed)
|
|
||||||
|
|
||||||
- name: Install VS Code WSL extensions on Windows host
|
|
||||||
tags: [packages, vscode]
|
|
||||||
ansible.windows.win_powershell:
|
|
||||||
script: |
|
|
||||||
$extensionId = '{{ item }}'
|
|
||||||
$code = Get-Command code.cmd -ErrorAction SilentlyContinue
|
|
||||||
if ($null -eq $code) {
|
|
||||||
throw 'code.cmd is not available. Ensure Visual Studio Code is installed before managing extensions.'
|
|
||||||
}
|
|
||||||
|
|
||||||
$installedExtensions = & $code.Source --list-extensions
|
|
||||||
if ($installedExtensions -contains $extensionId) {
|
|
||||||
$Ansible.Changed = $false
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
& $code.Source --install-extension $extensionId --force
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
throw "Failed to install VS Code extension $extensionId"
|
|
||||||
}
|
|
||||||
|
|
||||||
$Ansible.Changed = $true
|
|
||||||
loop: "{{ windows_vscode_extensions | default([]) }}"
|
|
||||||
loop_control:
|
|
||||||
label: "{{ item }}"
|
|
||||||
|
|
||||||
- name: Set Windows Terminal default profile to Ubuntu
|
|
||||||
tags: [packages, wsl]
|
|
||||||
ansible.windows.win_powershell:
|
|
||||||
script: |
|
|
||||||
$terminalSettingsPath = Join-Path $env:LOCALAPPDATA 'Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json'
|
|
||||||
if (-not (Test-Path $terminalSettingsPath)) {
|
|
||||||
throw 'Windows Terminal settings.json was not found. Launch Windows Terminal once before applying the default profile configuration.'
|
|
||||||
}
|
|
||||||
|
|
||||||
$settings = Get-Content -Path $terminalSettingsPath -Raw | ConvertFrom-Json
|
|
||||||
if ($null -eq $settings.profiles -or $null -eq $settings.profiles.list) {
|
|
||||||
throw 'Windows Terminal settings.json does not contain a profiles.list section.'
|
|
||||||
}
|
|
||||||
|
|
||||||
$targetProfile = $settings.profiles.list |
|
|
||||||
Where-Object {
|
|
||||||
$_.name -eq '{{ windows_terminal_default_profile_name }}' -and -not ($_.PSObject.Properties.Name -contains 'hidden' -and $_.hidden)
|
|
||||||
} |
|
|
||||||
Select-Object -First 1
|
|
||||||
|
|
||||||
if ($null -eq $targetProfile) {
|
|
||||||
throw "Windows Terminal visible profile '{{ windows_terminal_default_profile_name }}' was not found. Ensure the Ubuntu WSL profile exists and is not hidden in Windows Terminal first."
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($settings.defaultProfile -eq $targetProfile.guid) {
|
|
||||||
$Ansible.Changed = $false
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
$settings.defaultProfile = $targetProfile.guid
|
|
||||||
$settings | ConvertTo-Json -Depth 100 | Set-Content -Path $terminalSettingsPath -Encoding utf8
|
|
||||||
$Ansible.Changed = $true
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LayoutModificationTemplate
|
|
||||||
xmlns="http://schemas.microsoft.com/Start/2014/LayoutModification"
|
|
||||||
xmlns:defaultlayout="http://schemas.microsoft.com/Start/2014/FullDefaultLayout"
|
|
||||||
xmlns:start="http://schemas.microsoft.com/Start/2014/StartLayout"
|
|
||||||
xmlns:taskbar="http://schemas.microsoft.com/Start/2014/TaskbarLayout"
|
|
||||||
Version="1">
|
|
||||||
<CustomTaskbarLayoutCollection PinListPlacement="Replace">
|
|
||||||
<defaultlayout:TaskbarLayout>
|
|
||||||
<taskbar:TaskbarPinList>
|
|
||||||
{% for pin in windows_taskbar_pins %}
|
|
||||||
{% if pin.type == 'desktop_application_id' %}
|
|
||||||
<taskbar:DesktopApp DesktopApplicationID="{{ pin.id }}" />
|
|
||||||
{% elif pin.type == 'desktop_application_link_path' %}
|
|
||||||
<taskbar:DesktopApp DesktopApplicationLinkPath="{{ pin.path }}" />
|
|
||||||
{% elif pin.type == 'app_user_model_id' %}
|
|
||||||
<taskbar:UWA AppUserModelID="{{ pin.id }}" />
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
</taskbar:TaskbarPinList>
|
|
||||||
</defaultlayout:TaskbarLayout>
|
|
||||||
</CustomTaskbarLayoutCollection>
|
|
||||||
</LayoutModificationTemplate>
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
- hosts: all:!workstation_host_windows
|
- hosts: all
|
||||||
become: true
|
become: true
|
||||||
pre_tasks:
|
pre_tasks:
|
||||||
- name: Load local vault variables when available
|
- name: Load local vault variables when available
|
||||||
@@ -24,19 +24,10 @@
|
|||||||
- packages_void
|
- packages_void
|
||||||
- services_runit
|
- services_runit
|
||||||
- profile_desktop_common
|
- profile_desktop_common
|
||||||
- profile_desktop_i3
|
|
||||||
- profile_desktop_sway
|
- profile_desktop_sway
|
||||||
- profile_desktop_hyprland
|
- profile_desktop_hyprland
|
||||||
- profile_desktop_host
|
- profile_desktop_host
|
||||||
|
|
||||||
- hosts: workstation_dev_ubuntu
|
|
||||||
become: true
|
|
||||||
|
|
||||||
roles:
|
|
||||||
- packages_ubuntu
|
|
||||||
- services_systemd
|
|
||||||
- profile_workstation_dev_common
|
|
||||||
|
|
||||||
- hosts: workstation_dev_fedora
|
- hosts: workstation_dev_fedora
|
||||||
become: true
|
become: true
|
||||||
|
|
||||||
@@ -60,53 +51,6 @@
|
|||||||
- profile_workstation_dev_common
|
- profile_workstation_dev_common
|
||||||
- profile_workstation_dev_wsl
|
- profile_workstation_dev_wsl
|
||||||
|
|
||||||
- hosts: workstation_host_windows
|
|
||||||
gather_facts: false
|
|
||||||
|
|
||||||
pre_tasks:
|
|
||||||
- name: Load local vault variables when available
|
|
||||||
tags: [always]
|
|
||||||
ansible.builtin.include_vars:
|
|
||||||
file: "{{ playbook_dir }}/../secrets/vault.yml"
|
|
||||||
when: lookup('ansible.builtin.fileglob', playbook_dir + '/../secrets/vault.yml', errors='ignore', wantlist=True) | length > 0
|
|
||||||
|
|
||||||
- name: Load machine-local vault variables when available
|
|
||||||
tags: [always]
|
|
||||||
ansible.builtin.include_vars:
|
|
||||||
file: "{{ playbook_dir }}/../secrets/vault.local.yml"
|
|
||||||
when: lookup('ansible.builtin.fileglob', playbook_dir + '/../secrets/vault.local.yml', errors='ignore', wantlist=True) | length > 0
|
|
||||||
|
|
||||||
- name: Resolve Windows PSRP connection settings
|
|
||||||
tags: [always]
|
|
||||||
ansible.builtin.set_fact:
|
|
||||||
ansible_host: "{{ windows_psrp_host | default(vault_windows_psrp_host | default('')) }}"
|
|
||||||
ansible_user: "{{ windows_psrp_user | default(vault_windows_psrp_user | default('')) }}"
|
|
||||||
ansible_password: "{{ windows_psrp_password | default(vault_windows_psrp_password | default('')) }}"
|
|
||||||
windows_package_backend: "{{ windows_package_backend | default(vault_windows_package_backend | default('winget_psrp')) }}"
|
|
||||||
|
|
||||||
- name: Ensure Windows PSRP connection settings are defined
|
|
||||||
tags: [always]
|
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
|
||||||
- (ansible_host | default('') | length) > 0
|
|
||||||
- (ansible_user | default('') | length) > 0
|
|
||||||
fail_msg: >-
|
|
||||||
Define windows_psrp_host and windows_psrp_user via extra vars, secrets/vault.yml,
|
|
||||||
or secrets/vault.local.yml
|
|
||||||
before running the workstation_host_windows play.
|
|
||||||
|
|
||||||
- name: Ensure Windows package backend is supported
|
|
||||||
tags: [always]
|
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
|
||||||
- windows_package_backend in ['winget_psrp', 'winget_wsl_local']
|
|
||||||
fail_msg: >-
|
|
||||||
Unsupported windows_package_backend '{{ windows_package_backend }}'.
|
|
||||||
Supported values are winget_psrp and winget_wsl_local.
|
|
||||||
|
|
||||||
roles:
|
|
||||||
- profile_workstation_host_windows
|
|
||||||
|
|
||||||
- hosts: ubuntu_server
|
- hosts: ubuntu_server
|
||||||
become: true
|
become: true
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Desktop
|
# Desktop
|
||||||
|
|
||||||
- i3 primary
|
- Wayland only: sway (SwayFX) and Hyprland
|
||||||
- XFCE components selectively
|
- Hyprland is the default session
|
||||||
|
|||||||
@@ -1,249 +0,0 @@
|
|||||||
# i3 config for nymph
|
|
||||||
|
|
||||||
set $mod Mod4
|
|
||||||
set $refresh_i3status killall -SIGUSR1 i3status
|
|
||||||
|
|
||||||
font pango:LiterationMono Nerd Font 10
|
|
||||||
|
|
||||||
# Start XDG autostart entries (.desktop), useful on Void for pipewire/wireplumber/etc.
|
|
||||||
exec --no-startup-id dex --autostart --environment i3
|
|
||||||
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 feh --bg-center ~/.config/i3/wallpapers/wallpaper-161664.jpg
|
|
||||||
exec_always --no-startup-id ~/.config/i3/scripts/setup-gtk-theme.sh
|
|
||||||
exec --no-startup-id /usr/libexec/xdg-desktop-portal
|
|
||||||
|
|
||||||
# Audio
|
|
||||||
exec --no-startup-id pipewire
|
|
||||||
exec --no-startup-id pipewire-pulse
|
|
||||||
exec --no-startup-id wireplumber
|
|
||||||
|
|
||||||
# Compositor
|
|
||||||
exec_always --no-startup-id picom -b
|
|
||||||
|
|
||||||
# Status bar
|
|
||||||
exec_always --no-startup-id ~/.config/polybar/launch.sh
|
|
||||||
|
|
||||||
# Monitor configuration
|
|
||||||
exec --no-startup-id autorandr --persistent --change
|
|
||||||
|
|
||||||
# Tray services
|
|
||||||
exec --no-startup-id dunst
|
|
||||||
exec --no-startup-id /usr/libexec/xfce-polkit
|
|
||||||
exec --no-startup-id nm-applet
|
|
||||||
exec --no-startup-id blueman-applet
|
|
||||||
exec --no-startup-id udiskie
|
|
||||||
exec --no-startup-id volumeicon
|
|
||||||
exec --no-startup-id xfce4-clipman
|
|
||||||
|
|
||||||
# Lock screen on suspend (handled by elogind)
|
|
||||||
exec --no-startup-id xss-lock -- ~/.config/i3/scripts/lockscreen
|
|
||||||
|
|
||||||
# General behavior
|
|
||||||
focus_follows_mouse no
|
|
||||||
mouse_warping none
|
|
||||||
floating_modifier $mod
|
|
||||||
tiling_drag modifier titlebar
|
|
||||||
|
|
||||||
# Borders
|
|
||||||
default_border pixel 2
|
|
||||||
default_floating_border pixel 2
|
|
||||||
new_window pixel 2
|
|
||||||
new_float pixel 2
|
|
||||||
hide_edge_borders none
|
|
||||||
|
|
||||||
# Gaps (i3 >= 4.22)
|
|
||||||
gaps inner 10
|
|
||||||
gaps outer 4
|
|
||||||
smart_gaps on
|
|
||||||
smart_borders on
|
|
||||||
|
|
||||||
# vim-like directions
|
|
||||||
set $left h
|
|
||||||
set $down j
|
|
||||||
set $up k
|
|
||||||
set $right l
|
|
||||||
|
|
||||||
# Terminal
|
|
||||||
bindsym $mod+Return exec --no-startup-id /usr/bin/alacritty
|
|
||||||
|
|
||||||
# Emergency terminal fallback
|
|
||||||
bindsym $mod+Shift+Return exec --no-startup-id st
|
|
||||||
|
|
||||||
# Emacs client
|
|
||||||
bindsym $mod+Shift+e exec --no-startup-id emacsclient -c -n
|
|
||||||
|
|
||||||
# Launcher
|
|
||||||
#bindsym $mod+d exec --no-startup-id "rofi -modi drun,run -show drun"
|
|
||||||
bindsym $mod+d exec --no-startup-id "rofi -show drun -theme ~/.config/rofi/config.rasi"
|
|
||||||
|
|
||||||
# Audio panel control
|
|
||||||
bindsym $mod+Shift+v exec --no-startup-id pavucontrol
|
|
||||||
|
|
||||||
# File manager
|
|
||||||
bindsym $mod+Shift+f exec thunar
|
|
||||||
|
|
||||||
# Manual lock screen
|
|
||||||
bindsym $mod+Shift+x exec ~/.config/i3/scripts/lockscreen
|
|
||||||
|
|
||||||
# Kill focused window
|
|
||||||
bindsym $mod+Shift+q kill
|
|
||||||
|
|
||||||
# Screenshot
|
|
||||||
bindsym Print exec xfce4-screenshooter
|
|
||||||
bindsym Shift+Print exec xfce4-screenshooter -r
|
|
||||||
bindsym Alt+Print exec xfce4-screenshooter -w
|
|
||||||
|
|
||||||
# Focus
|
|
||||||
bindsym $mod+$left focus left
|
|
||||||
bindsym $mod+$down focus down
|
|
||||||
bindsym $mod+$up focus up
|
|
||||||
bindsym $mod+$right focus right
|
|
||||||
|
|
||||||
bindsym $mod+Left focus left
|
|
||||||
bindsym $mod+Down focus down
|
|
||||||
bindsym $mod+Up focus up
|
|
||||||
bindsym $mod+Right focus right
|
|
||||||
|
|
||||||
# Move windows
|
|
||||||
bindsym $mod+Shift+$left move left
|
|
||||||
bindsym $mod+Shift+$down move down
|
|
||||||
bindsym $mod+Shift+$up move up
|
|
||||||
bindsym $mod+Shift+$right move right
|
|
||||||
|
|
||||||
bindsym $mod+Shift+Left move left
|
|
||||||
bindsym $mod+Shift+Down move down
|
|
||||||
bindsym $mod+Shift+Up move up
|
|
||||||
bindsym $mod+Shift+Right move right
|
|
||||||
|
|
||||||
# Split
|
|
||||||
bindsym $mod+b split h
|
|
||||||
bindsym $mod+v split v
|
|
||||||
|
|
||||||
# Layouts
|
|
||||||
bindsym $mod+f fullscreen toggle
|
|
||||||
bindsym $mod+s layout stacking
|
|
||||||
bindsym $mod+w layout tabbed
|
|
||||||
bindsym $mod+e layout toggle split
|
|
||||||
|
|
||||||
# Floating / focus mode
|
|
||||||
bindsym $mod+Shift+space floating toggle
|
|
||||||
bindsym $mod+space focus mode_toggle
|
|
||||||
bindsym $mod+a focus parent
|
|
||||||
|
|
||||||
# Scratchpad
|
|
||||||
bindsym $mod+Shift+minus move scratchpad
|
|
||||||
bindsym $mod+minus scratchpad show
|
|
||||||
|
|
||||||
# Volume (PipeWire / PulseAudio compatibility)
|
|
||||||
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +5% && $refresh_i3status
|
|
||||||
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -5% && $refresh_i3status
|
|
||||||
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
|
|
||||||
bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle
|
|
||||||
|
|
||||||
# Brightness
|
|
||||||
bindsym XF86MonBrightnessUp exec --no-startup-id brightnessctl set +10% && pkill -RTMIN+5 i3blocks
|
|
||||||
bindsym XF86MonBrightnessDown exec --no-startup-id brightnessctl set 10%- && pkill -RTMIN+5 i3blocks
|
|
||||||
|
|
||||||
# Media keys
|
|
||||||
bindsym XF86AudioPlay exec --no-startup-id playerctl play-pause
|
|
||||||
bindsym XF86AudioNext exec --no-startup-id playerctl next
|
|
||||||
bindsym XF86AudioPrev exec --no-startup-id playerctl previous
|
|
||||||
|
|
||||||
# Workspaces
|
|
||||||
set $ws1 "1"
|
|
||||||
set $ws2 "2"
|
|
||||||
set $ws3 "3"
|
|
||||||
set $ws4 "4"
|
|
||||||
set $ws5 "5"
|
|
||||||
set $ws6 "6"
|
|
||||||
set $ws7 "7"
|
|
||||||
set $ws8 "8"
|
|
||||||
set $ws9 "9"
|
|
||||||
set $ws10 "10"
|
|
||||||
|
|
||||||
workspace $ws1 output primary
|
|
||||||
workspace $ws2 output primary
|
|
||||||
workspace $ws3 output primary
|
|
||||||
workspace $ws4 output primary
|
|
||||||
workspace $ws5 output primary
|
|
||||||
workspace $ws6 output primary
|
|
||||||
workspace $ws7 output primary
|
|
||||||
workspace $ws8 output primary
|
|
||||||
workspace $ws9 output primary
|
|
||||||
workspace $ws10 output primary
|
|
||||||
|
|
||||||
bindsym $mod+1 workspace number $ws1
|
|
||||||
bindsym $mod+2 workspace number $ws2
|
|
||||||
bindsym $mod+3 workspace number $ws3
|
|
||||||
bindsym $mod+4 workspace number $ws4
|
|
||||||
bindsym $mod+5 workspace number $ws5
|
|
||||||
bindsym $mod+6 workspace number $ws6
|
|
||||||
bindsym $mod+7 workspace number $ws7
|
|
||||||
bindsym $mod+8 workspace number $ws8
|
|
||||||
bindsym $mod+9 workspace number $ws9
|
|
||||||
bindsym $mod+0 workspace number $ws10
|
|
||||||
bindsym $mod+comma workspace prev
|
|
||||||
bindsym $mod+period workspace next
|
|
||||||
|
|
||||||
bindsym $mod+Shift+1 move container to workspace number $ws1
|
|
||||||
bindsym $mod+Shift+2 move container to workspace number $ws2
|
|
||||||
bindsym $mod+Shift+3 move container to workspace number $ws3
|
|
||||||
bindsym $mod+Shift+4 move container to workspace number $ws4
|
|
||||||
bindsym $mod+Shift+5 move container to workspace number $ws5
|
|
||||||
bindsym $mod+Shift+6 move container to workspace number $ws6
|
|
||||||
bindsym $mod+Shift+7 move container to workspace number $ws7
|
|
||||||
bindsym $mod+Shift+8 move container to workspace number $ws8
|
|
||||||
bindsym $mod+Shift+9 move container to workspace number $ws9
|
|
||||||
bindsym $mod+Shift+0 move container to workspace number $ws10
|
|
||||||
|
|
||||||
# Reload / restart / exit
|
|
||||||
bindsym $mod+Shift+c reload
|
|
||||||
bindsym $mod+Shift+r restart
|
|
||||||
bindsym $mod+Shift+BackSpace exec --no-startup-id i3-msg exit
|
|
||||||
bindsym $mod+Shift+Escape exec --no-startup-id ~/.config/i3/scripts/powermenu.sh
|
|
||||||
|
|
||||||
# Resize mode
|
|
||||||
mode "resize" {
|
|
||||||
bindsym $left resize shrink width 10 px or 10 ppt
|
|
||||||
bindsym $down resize grow height 10 px or 10 ppt
|
|
||||||
bindsym $up resize shrink height 10 px or 10 ppt
|
|
||||||
bindsym $right resize grow width 10 px or 10 ppt
|
|
||||||
|
|
||||||
bindsym Left resize shrink width 10 px or 10 ppt
|
|
||||||
bindsym Down resize grow height 10 px or 10 ppt
|
|
||||||
bindsym Up resize shrink height 10 px or 10 ppt
|
|
||||||
bindsym Right resize grow width 10 px or 10 ppt
|
|
||||||
|
|
||||||
bindsym Return mode "default"
|
|
||||||
bindsym Escape mode "default"
|
|
||||||
bindsym $mod+r mode "default"
|
|
||||||
}
|
|
||||||
|
|
||||||
bindsym $mod+r mode "resize"
|
|
||||||
|
|
||||||
# i3bar + i3status (disabilitato: ora gestito da polybar)
|
|
||||||
# bar {
|
|
||||||
# status_command i3blocks
|
|
||||||
# position bottom
|
|
||||||
# tray_output primary
|
|
||||||
# font pango:Liberation Mono 10
|
|
||||||
#
|
|
||||||
# colors {
|
|
||||||
# background #1f1f28
|
|
||||||
# statusline #d0d0d0
|
|
||||||
# separator #3a3a46
|
|
||||||
#
|
|
||||||
# focused_workspace #4a90d9 #4a90d9 #ffffff
|
|
||||||
# active_workspace #3a3a46 #2b2b36 #d0d0d0
|
|
||||||
# inactive_workspace #1f1f28 #1f1f28 #9a9a9a
|
|
||||||
# urgent_workspace #c7162b #c7162b #ffffff
|
|
||||||
# }
|
|
||||||
# }
|
|
||||||
|
|
||||||
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
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
battery_json() {
|
|
||||||
local total_now=0
|
|
||||||
local total_full=0
|
|
||||||
local overall_status=""
|
|
||||||
local now full status bat capacity icon color
|
|
||||||
|
|
||||||
shopt -s nullglob
|
|
||||||
|
|
||||||
for bat in /sys/class/power_supply/BAT*; do
|
|
||||||
[[ -d "$bat" ]] || continue
|
|
||||||
|
|
||||||
if [[ -r "$bat/energy_now" && -r "$bat/energy_full" ]]; then
|
|
||||||
now=$(<"$bat/energy_now")
|
|
||||||
full=$(<"$bat/energy_full")
|
|
||||||
elif [[ -r "$bat/charge_now" && -r "$bat/charge_full" ]]; then
|
|
||||||
now=$(<"$bat/charge_now")
|
|
||||||
full=$(<"$bat/charge_full")
|
|
||||||
else
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
status=$(<"$bat/status")
|
|
||||||
|
|
||||||
(( total_now += now ))
|
|
||||||
(( total_full += full ))
|
|
||||||
|
|
||||||
case "$status" in
|
|
||||||
Charging)
|
|
||||||
overall_status="Charging"
|
|
||||||
;;
|
|
||||||
Discharging)
|
|
||||||
[[ "$overall_status" != "Charging" ]] && overall_status="Discharging"
|
|
||||||
;;
|
|
||||||
Full)
|
|
||||||
[[ -z "$overall_status" ]] && overall_status="Full"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
[[ -z "$overall_status" ]] && overall_status="$status"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
(( total_full > 0 )) || return 1
|
|
||||||
|
|
||||||
capacity=$(( 100 * total_now / total_full ))
|
|
||||||
|
|
||||||
case "$overall_status" in
|
|
||||||
Charging) icon="⚡" ;;
|
|
||||||
Discharging) icon="🔋" ;;
|
|
||||||
Full) icon="✔" ;;
|
|
||||||
*) icon="?" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if (( capacity <= 15 )); then
|
|
||||||
color="#ff5555"
|
|
||||||
elif (( capacity <= 30 )); then
|
|
||||||
color="#f1fa8c"
|
|
||||||
else
|
|
||||||
color="#ffffff"
|
|
||||||
fi
|
|
||||||
|
|
||||||
printf '{"full_text":"%s %s%%","name":"battery","color":"%s"}' \
|
|
||||||
"$icon" "$capacity" "$color"
|
|
||||||
}
|
|
||||||
|
|
||||||
i3status | while IFS= read -r line; do
|
|
||||||
case "$line" in
|
|
||||||
'{"version":'* | '[')
|
|
||||||
printf '%s\n' "$line"
|
|
||||||
;;
|
|
||||||
,*)
|
|
||||||
batt="$(battery_json)"
|
|
||||||
if [[ -n "$batt" ]]; then
|
|
||||||
line="${line#,}"
|
|
||||||
printf ',[%s,%s\n' "$batt" "${line#\[}"
|
|
||||||
else
|
|
||||||
printf '%s\n' "$line"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
\[*)
|
|
||||||
batt="$(battery_json)"
|
|
||||||
if [[ -n "$batt" ]]; then
|
|
||||||
printf '[%s,%s\n' "$batt" "${line#\[}"
|
|
||||||
else
|
|
||||||
printf '%s\n' "$line"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
printf '%s\n' "$line"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
wallpaper="$HOME/.config/i3/wallpapers/maxresdefault.jpg"
|
|
||||||
cached="$HOME/.cache/i3lock/wallpaper.png"
|
|
||||||
dims_cache="$HOME/.cache/i3lock/dims.txt"
|
|
||||||
dims=$(xdotool getdisplaygeometry | tr ' ' 'x')
|
|
||||||
|
|
||||||
if [ ! -f "$cached" ] || \
|
|
||||||
[ "$(stat -c %Y "$wallpaper")" -gt "$(stat -c %Y "$cached")" ] || \
|
|
||||||
[ "$dims" != "$(cat "$dims_cache" 2>/dev/null)" ]; then
|
|
||||||
mkdir -p "$HOME/.cache/i3lock"
|
|
||||||
convert "$wallpaper" -resize "$dims^" -extent "$dims" PNG:- > "$cached"
|
|
||||||
echo -n "$dims" > "$dims_cache"
|
|
||||||
fi
|
|
||||||
|
|
||||||
i3lock \
|
|
||||||
--image "$cached" \
|
|
||||||
--clock \
|
|
||||||
--indicator \
|
|
||||||
--radius 100 \
|
|
||||||
--ring-width 8 \
|
|
||||||
--color=000000ff \
|
|
||||||
--ring-color=2f4058ff \
|
|
||||||
--inside-color=1f1f28ff \
|
|
||||||
--line-color=00000000 \
|
|
||||||
--separator-color=3a3a46ff \
|
|
||||||
--keyhl-color=6daeeaff \
|
|
||||||
--bshl-color=c7162bff \
|
|
||||||
--ringver-color=4a90d9ff \
|
|
||||||
--insidever-color=1f1f28ff \
|
|
||||||
--ringwrong-color=c7162bff \
|
|
||||||
--insidewrong-color=1f1f28ff \
|
|
||||||
--time-color=d0d0d0ff \
|
|
||||||
--date-color=9a9a9aff \
|
|
||||||
--layout-color=d0d0d0ff \
|
|
||||||
--verif-color=d0d0d0ff \
|
|
||||||
--wrong-color=d0d0d0ff
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
choice="$(printf "⏻ Shutdown\n Reboot\n Logout\n Lock\n⏾ Suspend" \
|
|
||||||
| rofi -dmenu \
|
|
||||||
-i \
|
|
||||||
-p "Power" \
|
|
||||||
-theme ~/.config/rofi/config.rasi \
|
|
||||||
-theme-str 'window { width: 20%; location: center; anchor: center; } listview { columns: 1; spacing: 6px; }')"
|
|
||||||
|
|
||||||
[ -z "$choice" ] && exit 0
|
|
||||||
|
|
||||||
case "$choice" in
|
|
||||||
*Lock)
|
|
||||||
~/.config/i3/scripts/lockscreen
|
|
||||||
;;
|
|
||||||
*Logout)
|
|
||||||
i3-msg exit
|
|
||||||
;;
|
|
||||||
*Suspend)
|
|
||||||
~/.config/i3/scripts/lockscreen
|
|
||||||
loginctl suspend
|
|
||||||
;;
|
|
||||||
*Reboot)
|
|
||||||
loginctl reboot
|
|
||||||
;;
|
|
||||||
*Shutdown)
|
|
||||||
loginctl poweroff
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
THEME="Yaru-blue-dark"
|
|
||||||
ICONS="Yaru-blue-dark"
|
|
||||||
CURSOR="Yaru"
|
|
||||||
|
|
||||||
FONT_UI="Liberation Sans 10"
|
|
||||||
|
|
||||||
mkdir -p "$HOME/.config/gtk-3.0"
|
|
||||||
mkdir -p "$HOME/.config/gtk-4.0"
|
|
||||||
|
|
||||||
cat > "$HOME/.gtkrc-2.0" <<EOF
|
|
||||||
gtk-theme-name="$THEME"
|
|
||||||
gtk-icon-theme-name="$ICONS"
|
|
||||||
gtk-cursor-theme-name="$CURSOR"
|
|
||||||
gtk-font-name="$FONT_UI"
|
|
||||||
gtk-button-images=1
|
|
||||||
gtk-menu-images=1
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat > "$HOME/.config/gtk-3.0/settings.ini" <<EOF
|
|
||||||
[Settings]
|
|
||||||
gtk-theme-name=$THEME
|
|
||||||
gtk-icon-theme-name=$ICONS
|
|
||||||
gtk-cursor-theme-name=$CURSOR
|
|
||||||
gtk-font-name=$FONT_UI
|
|
||||||
gtk-application-prefer-dark-theme=1
|
|
||||||
gtk-xft-antialias=1
|
|
||||||
gtk-xft-hinting=1
|
|
||||||
gtk-xft-hintstyle=hintslight
|
|
||||||
gtk-xft-rgba=rgb
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat > "$HOME/.config/gtk-4.0/settings.ini" <<EOF
|
|
||||||
[Settings]
|
|
||||||
gtk-theme-name=$THEME
|
|
||||||
gtk-icon-theme-name=$ICONS
|
|
||||||
gtk-cursor-theme-name=$CURSOR
|
|
||||||
gtk-font-name=$FONT_UI
|
|
||||||
gtk-application-prefer-dark-theme=1
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# esporta variabili utili
|
|
||||||
export GTK_THEME=$THEME
|
|
||||||
export XCURSOR_THEME=$CURSOR
|
|
||||||
export XCURSOR_SIZE=24
|
|
||||||
|
|
||||||
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 cursor-theme "$CURSOR" >/dev/null 2>&1 || true
|
|
||||||
gsettings set org.gnome.desktop.interface color-scheme prefer-dark >/dev/null 2>&1 || true
|
|
||||||
fi
|
|
||||||
|
Before Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 2.7 MiB |
|
Before Width: | Height: | Size: 553 KiB |
|
Before Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 118 KiB |
@@ -1,31 +0,0 @@
|
|||||||
separator=true
|
|
||||||
separator_block_width=15
|
|
||||||
|
|
||||||
[memory]
|
|
||||||
command=~/.config/i3blocks/scripts/memory
|
|
||||||
interval=10
|
|
||||||
color=#d0d0d0
|
|
||||||
|
|
||||||
[temperature]
|
|
||||||
command=~/.config/i3blocks/scripts/temperature
|
|
||||||
interval=10
|
|
||||||
|
|
||||||
[backlight]
|
|
||||||
command=~/.config/i3blocks/scripts/backlight
|
|
||||||
interval=once
|
|
||||||
signal=5
|
|
||||||
color=#7dcfff
|
|
||||||
|
|
||||||
[essid]
|
|
||||||
command=~/.config/i3blocks/scripts/wifi
|
|
||||||
interval=10
|
|
||||||
color=#4a90d9
|
|
||||||
|
|
||||||
[battery]
|
|
||||||
command=~/.config/i3blocks/scripts/battery
|
|
||||||
interval=30
|
|
||||||
|
|
||||||
[time]
|
|
||||||
command=date '+%Y-%m-%d %H:%M'
|
|
||||||
interval=60
|
|
||||||
color=#d0d0d0
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
cur="$(brightnessctl g 2>/dev/null)"
|
|
||||||
max="$(brightnessctl m 2>/dev/null)"
|
|
||||||
|
|
||||||
[ -n "$cur" ] || exit 0
|
|
||||||
[ -n "$max" ] || exit 0
|
|
||||||
[ "$max" -gt 0 ] || exit 0
|
|
||||||
|
|
||||||
pct=$((100 * cur / max))
|
|
||||||
|
|
||||||
echo "BL ${pct}%"
|
|
||||||
echo "BL ${pct}%"
|
|
||||||
echo "#6daeea"
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
total_now=0
|
|
||||||
total_full=0
|
|
||||||
status=""
|
|
||||||
|
|
||||||
for bat in /sys/class/power_supply/BAT*; do
|
|
||||||
[ -d "$bat" ] || continue
|
|
||||||
|
|
||||||
if [ -r "$bat/energy_now" ] && [ -r "$bat/energy_full" ]; then
|
|
||||||
now=$(cat "$bat/energy_now")
|
|
||||||
full=$(cat "$bat/energy_full")
|
|
||||||
elif [ -r "$bat/charge_now" ] && [ -r "$bat/charge_full" ]; then
|
|
||||||
now=$(cat "$bat/charge_now")
|
|
||||||
full=$(cat "$bat/charge_full")
|
|
||||||
else
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
st=$(cat "$bat/status" 2>/dev/null)
|
|
||||||
|
|
||||||
total_now=$((total_now + now))
|
|
||||||
total_full=$((total_full + full))
|
|
||||||
|
|
||||||
case "$st" in
|
|
||||||
Charging) status="⚡" ;;
|
|
||||||
Discharging) [ -z "$status" ] && status="🔋" ;;
|
|
||||||
Full) [ -z "$status" ] && status="✔" ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
[ "$total_full" -gt 0 ] || exit 0
|
|
||||||
|
|
||||||
pct=$((100 * total_now / total_full))
|
|
||||||
[ -n "$status" ] || status="BAT"
|
|
||||||
|
|
||||||
text="$status $pct%"
|
|
||||||
|
|
||||||
if [ "$pct" -le 15 ]; then
|
|
||||||
color="#ff5555"
|
|
||||||
elif [ "$pct" -le 30 ]; then
|
|
||||||
color="#f1fa8c"
|
|
||||||
else
|
|
||||||
color="#9ece6a"
|
|
||||||
fi
|
|
||||||
|
|
||||||
printf '%s\n%s\n%s\n' "$text" "$text" "$color"
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
state="$(xset q 2>/dev/null)"
|
|
||||||
|
|
||||||
caps="$(printf '%s\n' "$state" | grep 'Caps Lock:' | awk '{print $4}')"
|
|
||||||
num="$(printf '%s\n' "$state" | grep 'Num Lock:' | awk '{print $8}')"
|
|
||||||
|
|
||||||
out=""
|
|
||||||
|
|
||||||
[ "$caps" = "on" ] && out="${out} CAPS"
|
|
||||||
[ "$num" = "on" ] && out="${out} NUM"
|
|
||||||
|
|
||||||
[ -n "$out" ] || exit 0
|
|
||||||
|
|
||||||
echo "$out"
|
|
||||||
echo "$out"
|
|
||||||
echo "#9a9a9a"
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
mem=$(free | awk '/^Mem:/ {print $3/$2 * 100.0}')
|
|
||||||
mem=${mem%.*}
|
|
||||||
|
|
||||||
if [ "$mem" -ge 90 ]; then
|
|
||||||
color="#c7162b"
|
|
||||||
elif [ "$mem" -ge 70 ]; then
|
|
||||||
color="#e95420"
|
|
||||||
else
|
|
||||||
color="#d0d0d0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
used=$(free -h | awk '/^Mem:/ {print $3}')
|
|
||||||
total=$(free -h | awk '/^Mem:/ {print $2}')
|
|
||||||
|
|
||||||
echo "RAM $used/$total"
|
|
||||||
echo "RAM $used/$total"
|
|
||||||
echo "$color"
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
t=$(cat /sys/class/thermal/thermal_zone0/temp 2>/dev/null)
|
|
||||||
[ -n "$t" ] || exit 0
|
|
||||||
|
|
||||||
temp=$((t / 1000))
|
|
||||||
|
|
||||||
if [ "$temp" -ge 85 ]; then
|
|
||||||
color="#c7162b"
|
|
||||||
elif [ "$temp" -ge 70 ]; then
|
|
||||||
color="#e95420"
|
|
||||||
else
|
|
||||||
color="#d0d0d0"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "CPU ${temp}°C"
|
|
||||||
echo "CPU ${temp}°C"
|
|
||||||
echo "$color"
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
mute=$(pactl get-sink-mute @DEFAULT_SINK@ 2>/dev/null | awk '{print $2}')
|
|
||||||
vol=$(pactl get-sink-volume @DEFAULT_SINK@ 2>/dev/null | awk '/Volume:/ {print $5; exit}')
|
|
||||||
|
|
||||||
[ -n "$vol" ] || exit 0
|
|
||||||
|
|
||||||
if [ "$mute" = "yes" ]; then
|
|
||||||
text="VOL mute"
|
|
||||||
color="#7aa2f7"
|
|
||||||
else
|
|
||||||
text="VOL $vol"
|
|
||||||
color="#c0caf5"
|
|
||||||
fi
|
|
||||||
|
|
||||||
printf '%s\n%s\n%s\n' "$text" "$text" "$color"
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
ssid=$(nmcli -t -f active,ssid dev wifi | awk -F: '$1=="yes"{print $2}')
|
|
||||||
|
|
||||||
[ -n "$ssid" ] || exit 0
|
|
||||||
|
|
||||||
echo "WIFI $ssid"
|
|
||||||
echo "WIFI $ssid"
|
|
||||||
echo "#4a90d9"
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
backend = "glx";
|
|
||||||
vsync = true;
|
|
||||||
use-damage = true;
|
|
||||||
detect-rounded-corners = true;
|
|
||||||
detect-client-opacity = true;
|
|
||||||
detect-transient = true;
|
|
||||||
|
|
||||||
corner-radius = 10;
|
|
||||||
rounded-corners-exclude = [
|
|
||||||
"window_type = 'dock'",
|
|
||||||
"window_type = 'desktop'",
|
|
||||||
"class_g = 'i3-frame'"
|
|
||||||
];
|
|
||||||
|
|
||||||
shadow = true;
|
|
||||||
shadow-radius = 18;
|
|
||||||
shadow-opacity = 0.55;
|
|
||||||
shadow-offset-x = -10;
|
|
||||||
shadow-offset-y = -10;
|
|
||||||
shadow-exclude = [
|
|
||||||
"name = 'Notification'",
|
|
||||||
"class_g = 'Conky'",
|
|
||||||
"class_g ?= 'Notify-osd'",
|
|
||||||
"class_g = 'Cairo-clock'",
|
|
||||||
"_GTK_FRAME_EXTENTS@:c",
|
|
||||||
"window_type = 'dock'",
|
|
||||||
"window_type = 'desktop'"
|
|
||||||
];
|
|
||||||
|
|
||||||
fading = true;
|
|
||||||
fade-in-step = 0.05;
|
|
||||||
fade-out-step = 0.05;
|
|
||||||
fade-delta = 6;
|
|
||||||
|
|
||||||
blur-method = "dual_kawase";
|
|
||||||
blur-strength = 5;
|
|
||||||
blur-background = true;
|
|
||||||
blur-background-frame = true;
|
|
||||||
blur-background-fixed = false;
|
|
||||||
blur-background-exclude = [
|
|
||||||
"window_type = 'dock'",
|
|
||||||
"window_type = 'desktop'",
|
|
||||||
"class_g = 'i3-frame'",
|
|
||||||
"class_g = 'Dunst'",
|
|
||||||
"_GTK_FRAME_EXTENTS@:c"
|
|
||||||
];
|
|
||||||
|
|
||||||
opacity-rule = [];
|
|
||||||
|
|
||||||
wintypes:
|
|
||||||
{
|
|
||||||
tooltip = { fade = true; shadow = true; opacity = 0.95; focus = true; };
|
|
||||||
dock = { shadow = false; };
|
|
||||||
dnd = { shadow = false; };
|
|
||||||
popup_menu = { opacity = 0.95; };
|
|
||||||
dropdown_menu = { opacity = 0.95; };
|
|
||||||
};
|
|
||||||
@@ -1,208 +0,0 @@
|
|||||||
[colors]
|
|
||||||
background = #1f1f28
|
|
||||||
background-alt = #2b2b36
|
|
||||||
foreground = #d0d0d0
|
|
||||||
foreground-alt = #9a9a9a
|
|
||||||
primary = #4a90d9
|
|
||||||
secondary = #7dcfff
|
|
||||||
warm = #e0af68
|
|
||||||
success = #9ec07c
|
|
||||||
info = #bb9af7
|
|
||||||
alert = #c7162b
|
|
||||||
disabled = #3a3a46
|
|
||||||
|
|
||||||
[bar/main]
|
|
||||||
monitor = ${env:MONITOR:}
|
|
||||||
bottom = false
|
|
||||||
width = 100%
|
|
||||||
height = 24pt
|
|
||||||
radius = 0
|
|
||||||
background = ${colors.background}
|
|
||||||
foreground = ${colors.foreground}
|
|
||||||
line-size = 2pt
|
|
||||||
border-size = 0
|
|
||||||
padding-left = 1
|
|
||||||
padding-right = 1
|
|
||||||
module-margin = 1
|
|
||||||
|
|
||||||
font-0 = LiterationMono Nerd Font:size=10;2
|
|
||||||
font-1 = Symbols Nerd Font Mono:size=12;2
|
|
||||||
|
|
||||||
modules-left = i3
|
|
||||||
modules-center = date
|
|
||||||
modules-right = cpu memory disk temperature backlight wifi battery
|
|
||||||
|
|
||||||
tray-position = right
|
|
||||||
tray-padding = 2
|
|
||||||
|
|
||||||
cursor-click = pointer
|
|
||||||
|
|
||||||
wm-restack = i3
|
|
||||||
override-redirect = false
|
|
||||||
|
|
||||||
[module/i3]
|
|
||||||
type = internal/i3
|
|
||||||
pin-workspaces = false
|
|
||||||
show-urgent = true
|
|
||||||
strip-wsnumbers = true
|
|
||||||
enable-scroll = false
|
|
||||||
index-sort = true
|
|
||||||
|
|
||||||
ws-icon-0 = 1;I
|
|
||||||
ws-icon-1 = 2;II
|
|
||||||
ws-icon-2 = 3;III
|
|
||||||
ws-icon-3 = 4;IV
|
|
||||||
ws-icon-4 = 5;V
|
|
||||||
ws-icon-5 = 6;VI
|
|
||||||
ws-icon-6 = 7;VII
|
|
||||||
ws-icon-7 = 8;VIII
|
|
||||||
ws-icon-8 = 9;IX
|
|
||||||
ws-icon-9 = 10;X
|
|
||||||
ws-icon-default =
|
|
||||||
|
|
||||||
label-focused = %icon%
|
|
||||||
label-focused-foreground = #ffffff
|
|
||||||
label-focused-background = ${colors.primary}
|
|
||||||
label-focused-padding = 1
|
|
||||||
|
|
||||||
label-unfocused = %icon%
|
|
||||||
label-unfocused-foreground = ${colors.foreground-alt}
|
|
||||||
label-unfocused-padding = 1
|
|
||||||
|
|
||||||
label-visible = %icon%
|
|
||||||
label-visible-foreground = ${colors.foreground}
|
|
||||||
label-visible-background = ${colors.background-alt}
|
|
||||||
label-visible-padding = 1
|
|
||||||
|
|
||||||
label-urgent = %icon%
|
|
||||||
label-urgent-foreground = #ffffff
|
|
||||||
label-urgent-background = ${colors.alert}
|
|
||||||
label-urgent-padding = 1
|
|
||||||
|
|
||||||
[module/date]
|
|
||||||
type = internal/date
|
|
||||||
interval = 60
|
|
||||||
date = %Y-%m-%d
|
|
||||||
time = %H:%M
|
|
||||||
format-prefix = " "
|
|
||||||
format-prefix-foreground = ${colors.foreground-alt}
|
|
||||||
label = %date% %time%
|
|
||||||
label-foreground = ${colors.foreground}
|
|
||||||
|
|
||||||
[module/memory]
|
|
||||||
type = internal/memory
|
|
||||||
interval = 10
|
|
||||||
format = <label>
|
|
||||||
format-prefix = " "
|
|
||||||
format-prefix-foreground = ${colors.secondary}
|
|
||||||
label = %gb_used% / %gb_total%
|
|
||||||
label-foreground = ${colors.secondary}
|
|
||||||
|
|
||||||
[module/temperature]
|
|
||||||
type = internal/temperature
|
|
||||||
interval = 10
|
|
||||||
thermal-zone = 0
|
|
||||||
warn-temperature = 80
|
|
||||||
format = <label>
|
|
||||||
format-prefix = " "
|
|
||||||
format-prefix-foreground = ${colors.warm}
|
|
||||||
format-warn = <label-warn>
|
|
||||||
format-warn-prefix = " "
|
|
||||||
format-warn-prefix-foreground = ${colors.alert}
|
|
||||||
label = %temperature-c%
|
|
||||||
label-foreground = ${colors.warm}
|
|
||||||
label-warn = %temperature-c%
|
|
||||||
label-warn-foreground = ${colors.alert}
|
|
||||||
|
|
||||||
[module/backlight]
|
|
||||||
type = internal/backlight
|
|
||||||
card = intel_backlight
|
|
||||||
use-actual-brightness = true
|
|
||||||
enable-scroll = true
|
|
||||||
format = <label>
|
|
||||||
format-prefix = " "
|
|
||||||
format-prefix-foreground = ${colors.foreground}
|
|
||||||
label = %percentage%%
|
|
||||||
label-foreground = ${colors.foreground}
|
|
||||||
|
|
||||||
[module/wifi]
|
|
||||||
type = internal/network
|
|
||||||
interface-type = wireless
|
|
||||||
interval = 5
|
|
||||||
format-connected = <label-connected>
|
|
||||||
format-connected-prefix = " "
|
|
||||||
format-connected-prefix-foreground = ${colors.primary}
|
|
||||||
format-disconnected = <label-disconnected>
|
|
||||||
format-disconnected-prefix = " "
|
|
||||||
format-disconnected-prefix-foreground = ${colors.disabled}
|
|
||||||
label-connected = %essid% %signal%%
|
|
||||||
label-connected-foreground = ${colors.primary}
|
|
||||||
label-disconnected = offline
|
|
||||||
label-disconnected-foreground = ${colors.disabled}
|
|
||||||
|
|
||||||
[module/battery]
|
|
||||||
type = internal/battery
|
|
||||||
battery = BAT0
|
|
||||||
adapter = AC
|
|
||||||
full-at = 98
|
|
||||||
low-at = 15
|
|
||||||
|
|
||||||
format-charging = <animation-charging> <label-charging>
|
|
||||||
format-discharging = <ramp-capacity> <label-discharging>
|
|
||||||
format-full = <label-full>
|
|
||||||
format-low = <label-low>
|
|
||||||
|
|
||||||
format-full-prefix = " "
|
|
||||||
format-full-prefix-foreground = ${colors.success}
|
|
||||||
|
|
||||||
label-charging = %percentage%%
|
|
||||||
label-charging-foreground = ${colors.success}
|
|
||||||
label-discharging = %percentage%%
|
|
||||||
label-discharging-foreground = ${colors.foreground}
|
|
||||||
label-full = full
|
|
||||||
label-full-foreground = ${colors.success}
|
|
||||||
label-low = %percentage%%
|
|
||||||
label-low-foreground = ${colors.alert}
|
|
||||||
|
|
||||||
ramp-capacity-0 =
|
|
||||||
ramp-capacity-1 =
|
|
||||||
ramp-capacity-2 =
|
|
||||||
ramp-capacity-3 =
|
|
||||||
ramp-capacity-4 =
|
|
||||||
ramp-capacity-foreground = ${colors.foreground}
|
|
||||||
|
|
||||||
animation-charging-0 =
|
|
||||||
animation-charging-1 =
|
|
||||||
animation-charging-2 =
|
|
||||||
animation-charging-3 =
|
|
||||||
animation-charging-4 =
|
|
||||||
animation-charging-foreground = ${colors.success}
|
|
||||||
animation-charging-framerate = 750
|
|
||||||
|
|
||||||
[module/cpu]
|
|
||||||
type = internal/cpu
|
|
||||||
interval = 5
|
|
||||||
format = <label>
|
|
||||||
format-prefix = " "
|
|
||||||
format-prefix-foreground = ${colors.info}
|
|
||||||
label = %percentage%%
|
|
||||||
label-foreground = ${colors.info}
|
|
||||||
|
|
||||||
[module/disk]
|
|
||||||
type = internal/fs
|
|
||||||
mount-0 = /
|
|
||||||
interval = 60
|
|
||||||
format-mounted = <label-mounted>
|
|
||||||
format-mounted-prefix = " "
|
|
||||||
format-mounted-prefix-foreground = ${colors.success}
|
|
||||||
label-mounted = %used% / %total%
|
|
||||||
label-mounted-foreground = ${colors.success}
|
|
||||||
format-unmounted = <label-unmounted>
|
|
||||||
format-unmounted-prefix = " "
|
|
||||||
format-unmounted-prefix-foreground = ${colors.disabled}
|
|
||||||
label-unmounted = %mountpoint% n/a
|
|
||||||
label-unmounted-foreground = ${colors.disabled}
|
|
||||||
|
|
||||||
[settings]
|
|
||||||
screenchange-reload = true
|
|
||||||
pseudo-transparency = false
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Restart polybar on each connected monitor.
|
|
||||||
|
|
||||||
polybar-msg cmd quit >/dev/null 2>&1 || true
|
|
||||||
|
|
||||||
while pgrep -u "$UID" -x polybar >/dev/null; do
|
|
||||||
sleep 0.1
|
|
||||||
done
|
|
||||||
|
|
||||||
if command -v xrandr >/dev/null 2>&1; then
|
|
||||||
monitors=$(xrandr --query | awk '/ connected/ {print $1}')
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "${monitors:-}" ]; then
|
|
||||||
for m in $monitors; do
|
|
||||||
MONITOR="$m" polybar main >/dev/null 2>&1 &
|
|
||||||
done
|
|
||||||
else
|
|
||||||
polybar main >/dev/null 2>&1 &
|
|
||||||
fi
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
[ $# -gt 0 ] || set -- i3
|
|
||||||
|
|
||||||
[ -r /etc/profile ] && . /etc/profile
|
|
||||||
[ -r "$HOME/.profile" ] && . "$HOME/.profile"
|
|
||||||
|
|
||||||
session_name=${1##*/}
|
|
||||||
|
|
||||||
export XDG_CURRENT_DESKTOP="$session_name"
|
|
||||||
export XDG_SESSION_DESKTOP="$session_name"
|
|
||||||
export XDG_SESSION_TYPE=x11
|
|
||||||
export SSH_AUTH_SOCK="$HOME/.local/state/ssh-agent/socket"
|
|
||||||
|
|
||||||
exec dbus-run-session sh -eu -c '
|
|
||||||
umask 077
|
|
||||||
printf "%s\n" "$DBUS_SESSION_BUS_ADDRESS" > "$HOME/.dbus-session-bus-address"
|
|
||||||
gpgconf --launch gpg-agent
|
|
||||||
"$HOME/.local/bin/update-turnstile-env"
|
|
||||||
exec "$@"
|
|
||||||
' sh "$@"
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
output HDMI-A-0
|
|
||||||
off
|
|
||||||
output DisplayPort-0
|
|
||||||
off
|
|
||||||
output DisplayPort-1
|
|
||||||
off
|
|
||||||
output DisplayPort-2
|
|
||||||
off
|
|
||||||
output DisplayPort-3
|
|
||||||
off
|
|
||||||
output DisplayPort-4
|
|
||||||
off
|
|
||||||
output DisplayPort-5
|
|
||||||
off
|
|
||||||
output HDMI-A-1
|
|
||||||
crtc 0
|
|
||||||
mode 3440x1440
|
|
||||||
pos 0x0
|
|
||||||
primary
|
|
||||||
rate 99.99
|
|
||||||
x-prop-colorspace Default
|
|
||||||
x-prop-max_bpc 16
|
|
||||||
x-prop-non_desktop 0
|
|
||||||
x-prop-scaling_mode None
|
|
||||||
x-prop-tearfree auto
|
|
||||||
x-prop-underscan off
|
|
||||||
x-prop-underscan_hborder 0
|
|
||||||
x-prop-underscan_vborder 0
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
HDMI-A-1 00ffffffffffff0061a9443400000000101e0103805021782a64f5ad5049a322135054adcf00714f81c0814081809500a9c0b300d1c0216870a0d0a02950302035001d4e3100001a000000fd0030791eaa3c000a202020202020000000fc004d69204d6f6e69746f720a2020000000ffd03030303030303030303030303001ae020335f14c010203040590111213141f3f23090707830100006a030c001000383c20000067d85dc40178c003681a000001013079ed40d070a0d0a02950584045001d4e3100001ea348b86861a03250304035001d4e3100001ef57c70a0d0a02950302035001d4e3100001a565e00a0a0a02950302035001d4d3100001a000038
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
output HDMI-1
|
|
||||||
off
|
|
||||||
output DP-2
|
|
||||||
off
|
|
||||||
output HDMI-2
|
|
||||||
off
|
|
||||||
output eDP-1
|
|
||||||
crtc 0
|
|
||||||
mode 1920x1080
|
|
||||||
pos 0x0
|
|
||||||
rate 60.01
|
|
||||||
x-prop-broadcast_rgb Automatic
|
|
||||||
x-prop-colorspace Default
|
|
||||||
x-prop-max_bpc 12
|
|
||||||
x-prop-non_desktop 0
|
|
||||||
x-prop-scaling_mode Full aspect
|
|
||||||
output DP-1
|
|
||||||
crtc 1
|
|
||||||
mode 3440x1440
|
|
||||||
pos 1920x0
|
|
||||||
primary
|
|
||||||
rate 100.00
|
|
||||||
x-prop-audio auto
|
|
||||||
x-prop-broadcast_rgb Automatic
|
|
||||||
x-prop-colorspace Default
|
|
||||||
x-prop-max_bpc 12
|
|
||||||
x-prop-non_desktop 0
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
DP-1 00ffffffffffff0061a9443400000000101e0104b55021783b64f5ad5049a322135054adcf00714f81c0814081809500a9c0b300d1c0226870a0d0a02950302035001d4e3100001a20fd70a0d0a03c50302035001d4e3100001e000000fd003090a0a03c010a202020202020000000fc004d69204d6f6e69746f720a202002ac020320f44c010203040590111213141f3f2309070783010000e6060701605d29023a801871382d40582c96001d4e3100001e20ac00a0a0382d40302035001d4e3100001ef0d270a0d0a03c50302035001d4e3100001ea348b86861a03250304035001d4e3100001ef57c70a0d0a02950302035001d4e3100001e00000000006b7012790000030014bf2f01046f0d9f002f001f009f053b000280040007000a0881000804000402100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e190
|
|
||||||
eDP-1 00ffffffffffff0006af3d1000000000001a0104951f117802c32592575a942a22505400000001010101010101010101010101010101143780b2703828403064310035ad100000180000000f0000000000000000000000000020000000fe0041554f0a202020202020202020000000fe004231343048414b30312e30200a00bd
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
output DP-1
|
|
||||||
off
|
|
||||||
output HDMI-1
|
|
||||||
off
|
|
||||||
output DP-2
|
|
||||||
off
|
|
||||||
output HDMI-2
|
|
||||||
off
|
|
||||||
output eDP-1
|
|
||||||
crtc 0
|
|
||||||
mode 1920x1080
|
|
||||||
pos 0x0
|
|
||||||
primary
|
|
||||||
rate 60.01
|
|
||||||
x-prop-broadcast_rgb Automatic
|
|
||||||
x-prop-colorspace Default
|
|
||||||
x-prop-max_bpc 12
|
|
||||||
x-prop-non_desktop 0
|
|
||||||
x-prop-scaling_mode Full aspect
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
eDP-1 00ffffffffffff0006af3d1000000000001a0104951f117802c32592575a942a22505400000001010101010101010101010101010101143780b2703828403064310035ad100000180000000f0000000000000000000000000020000000fe0041554f0a202020202020202020000000fe004231343048414b30312e30200a00bd
|
|
||||||
@@ -1,163 +0,0 @@
|
|||||||
#requires -RunAsAdministrator
|
|
||||||
param(
|
|
||||||
[string]$Distribution = 'Ubuntu',
|
|
||||||
[switch]$SkipUbuntuInstall
|
|
||||||
)
|
|
||||||
|
|
||||||
Set-StrictMode -Version Latest
|
|
||||||
$ErrorActionPreference = 'Stop'
|
|
||||||
|
|
||||||
function Get-OrCreate-WinRMHttpsCertificate {
|
|
||||||
$dnsName = $env:COMPUTERNAME
|
|
||||||
$existingCertificate = Get-ChildItem -Path Cert:\LocalMachine\My |
|
|
||||||
Where-Object { $_.Subject -eq "CN=$dnsName" } |
|
|
||||||
Sort-Object NotAfter -Descending |
|
|
||||||
Select-Object -First 1
|
|
||||||
|
|
||||||
if ($null -ne $existingCertificate) {
|
|
||||||
return $existingCertificate
|
|
||||||
}
|
|
||||||
|
|
||||||
return New-SelfSignedCertificate `
|
|
||||||
-DnsName $dnsName `
|
|
||||||
-CertStoreLocation 'Cert:\LocalMachine\My' `
|
|
||||||
-FriendlyName 'WinRM HTTPS Listener' `
|
|
||||||
-KeyAlgorithm RSA `
|
|
||||||
-KeyLength 2048 `
|
|
||||||
-HashAlgorithm SHA256 `
|
|
||||||
-NotAfter (Get-Date).AddYears(5)
|
|
||||||
}
|
|
||||||
|
|
||||||
function Ensure-WinRMHttpsListener {
|
|
||||||
param(
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[string]$CertificateThumbprint
|
|
||||||
)
|
|
||||||
|
|
||||||
$listener = Get-ChildItem -Path WSMan:\localhost\Listener |
|
|
||||||
Where-Object {
|
|
||||||
$_.Keys -match 'Transport=HTTPS'
|
|
||||||
} |
|
|
||||||
Select-Object -First 1
|
|
||||||
|
|
||||||
if ($null -eq $listener) {
|
|
||||||
try {
|
|
||||||
New-WSManInstance -ResourceURI winrm/config/Listener `
|
|
||||||
-SelectorSet @{ Transport = 'HTTPS'; Address = '*' } `
|
|
||||||
-ValueSet @{ Hostname = $env:COMPUTERNAME; CertificateThumbprint = $CertificateThumbprint } | Out-Null
|
|
||||||
return $true
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
$existingHttpsListener = Get-ChildItem -Path WSMan:\localhost\Listener |
|
|
||||||
Where-Object {
|
|
||||||
$_.Keys -match 'Transport=HTTPS'
|
|
||||||
} |
|
|
||||||
Select-Object -First 1
|
|
||||||
|
|
||||||
if ($null -ne $existingHttpsListener) {
|
|
||||||
return $false
|
|
||||||
}
|
|
||||||
|
|
||||||
throw
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $false
|
|
||||||
}
|
|
||||||
|
|
||||||
function Test-WinRMHttpsListener {
|
|
||||||
$listener = Get-ChildItem -Path WSMan:\localhost\Listener |
|
|
||||||
Where-Object {
|
|
||||||
$_.Keys -match 'Transport=HTTPS'
|
|
||||||
} |
|
|
||||||
Select-Object -First 1
|
|
||||||
|
|
||||||
return $null -ne $listener
|
|
||||||
}
|
|
||||||
|
|
||||||
function Ensure-LocalAccountTokenFilterPolicy {
|
|
||||||
$registryPath = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System'
|
|
||||||
$propertyName = 'LocalAccountTokenFilterPolicy'
|
|
||||||
$currentValue = Get-ItemProperty -Path $registryPath -Name $propertyName -ErrorAction SilentlyContinue | Select-Object -ExpandProperty $propertyName -ErrorAction SilentlyContinue
|
|
||||||
|
|
||||||
if ($currentValue -ne 1) {
|
|
||||||
New-ItemProperty -Path $registryPath -Name $propertyName -Value 1 -PropertyType DWord -Force | Out-Null
|
|
||||||
return $true
|
|
||||||
}
|
|
||||||
|
|
||||||
return $false
|
|
||||||
}
|
|
||||||
|
|
||||||
function Ensure-CurrentUserInRemoteManagementGroup {
|
|
||||||
$groupName = 'Utenti gestione remota'
|
|
||||||
$currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
|
|
||||||
$members = @(Get-LocalGroupMember -Name $groupName -ErrorAction Stop | Select-Object -ExpandProperty Name)
|
|
||||||
|
|
||||||
if ($members -contains $currentUser) {
|
|
||||||
return @{ Changed = $false; User = $currentUser; Group = $groupName }
|
|
||||||
}
|
|
||||||
|
|
||||||
Add-LocalGroupMember -Group $groupName -Member $currentUser -ErrorAction Stop
|
|
||||||
return @{ Changed = $true; User = $currentUser; Group = $groupName }
|
|
||||||
}
|
|
||||||
|
|
||||||
function Enable-FeatureIfNeeded {
|
|
||||||
param(
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[string]$FeatureName
|
|
||||||
)
|
|
||||||
|
|
||||||
$feature = Get-WindowsOptionalFeature -Online -FeatureName $FeatureName
|
|
||||||
if ($feature.State -ne 'Enabled') {
|
|
||||||
Enable-WindowsOptionalFeature -Online -FeatureName $FeatureName -All -NoRestart | Out-Null
|
|
||||||
return $true
|
|
||||||
}
|
|
||||||
|
|
||||||
return $false
|
|
||||||
}
|
|
||||||
|
|
||||||
$rebootRequired = $false
|
|
||||||
$rebootRequired = (Enable-FeatureIfNeeded -FeatureName 'Microsoft-Windows-Subsystem-Linux') -or $rebootRequired
|
|
||||||
$rebootRequired = (Enable-FeatureIfNeeded -FeatureName 'VirtualMachinePlatform') -or $rebootRequired
|
|
||||||
|
|
||||||
wsl --set-default-version 2
|
|
||||||
|
|
||||||
$installedDistributions = @(wsl --list --quiet) | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne '' }
|
|
||||||
$installedUbuntuDistribution = $installedDistributions | Where-Object { $_ -like 'Ubuntu*' } | Select-Object -First 1
|
|
||||||
|
|
||||||
if (-not $SkipUbuntuInstall -and $null -eq $installedUbuntuDistribution) {
|
|
||||||
wsl --install --distribution $Distribution --no-launch
|
|
||||||
$rebootRequired = $true
|
|
||||||
}
|
|
||||||
|
|
||||||
Enable-PSRemoting -SkipNetworkProfileCheck -Force
|
|
||||||
Set-Service -Name WinRM -StartupType Automatic
|
|
||||||
|
|
||||||
$winrmCertificate = Get-OrCreate-WinRMHttpsCertificate
|
|
||||||
$httpsListenerChanged = Ensure-WinRMHttpsListener -CertificateThumbprint $winrmCertificate.Thumbprint
|
|
||||||
$rebootRequired = (Ensure-LocalAccountTokenFilterPolicy) -or $rebootRequired
|
|
||||||
$remoteManagementGroupState = Ensure-CurrentUserInRemoteManagementGroup
|
|
||||||
|
|
||||||
$httpsFirewallRule = Get-NetFirewallRule -DisplayName 'WinRM HTTPS (5986)' -ErrorAction SilentlyContinue
|
|
||||||
if ($null -eq $httpsFirewallRule) {
|
|
||||||
New-NetFirewallRule -DisplayName 'WinRM HTTPS (5986)' -Direction Inbound -Action Allow -Protocol TCP -LocalPort 5986 | Out-Null
|
|
||||||
}
|
|
||||||
|
|
||||||
if (-not (Test-WinRMHttpsListener)) {
|
|
||||||
throw 'WinRM HTTPS listener was not created successfully. Verify certificate creation and WSMan listener configuration.'
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host ''
|
|
||||||
Write-Host 'Bootstrap completato.'
|
|
||||||
Write-Host 'Passi successivi:'
|
|
||||||
Write-Host '1. Riavvia Windows se richiesto dalle feature WSL.'
|
|
||||||
Write-Host '2. Avvia la distro Ubuntu almeno una volta e completa la creazione dell''utente Linux.'
|
|
||||||
Write-Host '3. Installa Ansible dentro WSL Ubuntu e lancia il playbook da li.'
|
|
||||||
Write-Host '4. Le applicazioni Windows saranno installate dal playbook Ansible; il backend predefinito e winget_psrp.'
|
|
||||||
Write-Host ''
|
|
||||||
Write-Host ('WSL distro Ubuntu rilevata: {0}' -f $(if ($null -ne $installedUbuntuDistribution) { $installedUbuntuDistribution } else { 'nessuna, verra installata ' + $Distribution }))
|
|
||||||
Write-Host ('PSRP transport consigliato: https://{0}:5986/wsman' -f $env:COMPUTERNAME)
|
|
||||||
Write-Host ('Certificato WinRM HTTPS: {0}' -f $winrmCertificate.Thumbprint)
|
|
||||||
Write-Host ('Utente aggiunto a Utenti gestione remota: {0}' -f $remoteManagementGroupState.User)
|
|
||||||
Write-Host ('Listener HTTPS creato in questo run: {0}' -f $(if ($httpsListenerChanged) { 'yes' } else { 'no' }))
|
|
||||||
Write-Host ('Riavvio consigliato: {0}' -f $(if ($rebootRequired) { 'yes' } else { 'no' }))
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
# Remove i3 session artifacts: exclusive packages, dotfiles and the emptty
|
|
||||||
# xsessions entry. Shared resources with sway (dunst, rofi, alacritty,
|
|
||||||
# xfce4-screenshooter) are left untouched.
|
|
||||||
|
|
||||||
set -eu
|
|
||||||
|
|
||||||
I3_PACKAGES="
|
|
||||||
arandr
|
|
||||||
autorandr
|
|
||||||
feh
|
|
||||||
i3
|
|
||||||
i3blocks
|
|
||||||
i3blocks-blocklets
|
|
||||||
i3lock-color
|
|
||||||
i3status
|
|
||||||
picom
|
|
||||||
polybar
|
|
||||||
scrot
|
|
||||||
setxkbmap
|
|
||||||
volumeicon
|
|
||||||
xclip
|
|
||||||
xfce4-clipman-plugin
|
|
||||||
xkbutils
|
|
||||||
xorg-fonts
|
|
||||||
xorg-minimal
|
|
||||||
xss-lock
|
|
||||||
xdotool
|
|
||||||
"
|
|
||||||
|
|
||||||
I3_DOTFILES="
|
|
||||||
$HOME/.config/i3
|
|
||||||
$HOME/.config/i3blocks
|
|
||||||
$HOME/.config/picom
|
|
||||||
$HOME/.config/polybar
|
|
||||||
$HOME/.xinitrc
|
|
||||||
"
|
|
||||||
|
|
||||||
EMPTTY_SESSION=/etc/emptty/xsessions/i3.desktop
|
|
||||||
|
|
||||||
confirm() {
|
|
||||||
printf '%s [y/N] ' "$1"
|
|
||||||
read -r answer
|
|
||||||
case "$answer" in
|
|
||||||
y|Y|yes|YES) return 0 ;;
|
|
||||||
*) return 1 ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
filter_installed() {
|
|
||||||
for p in $1; do
|
|
||||||
if xbps-query -p pkgver "$p" >/dev/null 2>&1; then
|
|
||||||
printf '%s\n' "$p"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
if ! command -v xbps-remove >/dev/null 2>&1; then
|
|
||||||
printf 'Error: xbps-remove not found (not a Void host?)\n' >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
installed=$(filter_installed "$I3_PACKAGES" | tr '\n' ' ' | sed 's/ *$//')
|
|
||||||
|
|
||||||
printf '== i3 cleanup ==\n\n'
|
|
||||||
printf 'Packages to remove (installed only):\n'
|
|
||||||
if [ -n "$installed" ]; then
|
|
||||||
printf ' %s\n' $installed
|
|
||||||
else
|
|
||||||
printf ' (none)\n'
|
|
||||||
fi
|
|
||||||
printf '\nDotfiles to remove:\n'
|
|
||||||
for d in $I3_DOTFILES; do
|
|
||||||
if [ -e "$d" ] || [ -L "$d" ]; then
|
|
||||||
printf ' %s\n' "$d"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
printf '\nEmptty session entry:\n'
|
|
||||||
if [ -e "$EMPTTY_SESSION" ]; then
|
|
||||||
printf ' %s\n' "$EMPTTY_SESSION"
|
|
||||||
else
|
|
||||||
printf ' (absent)\n'
|
|
||||||
fi
|
|
||||||
printf '\nShared (NOT removed): dunst, rofi, alacritty, xfce4-screenshooter and their configs.\n\n'
|
|
||||||
|
|
||||||
confirm 'Proceed?' || { printf 'Aborted.\n'; exit 0; }
|
|
||||||
|
|
||||||
if [ -n "$installed" ]; then
|
|
||||||
# shellcheck disable=SC2086
|
|
||||||
sudo xbps-remove -Ry $installed
|
|
||||||
fi
|
|
||||||
|
|
||||||
for d in $I3_DOTFILES; do
|
|
||||||
if [ -e "$d" ] || [ -L "$d" ]; then
|
|
||||||
rm -rf -- "$d"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ -e "$EMPTTY_SESSION" ]; then
|
|
||||||
sudo rm -f -- "$EMPTTY_SESSION"
|
|
||||||
fi
|
|
||||||
|
|
||||||
printf '\nDone.\n'
|
|
||||||
@@ -1,11 +1,13 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# Rimuove i3 e relativi dotfiles dall'host corrente.
|
# Rimuove i3 (sessione X11) e relativi artefatti dall'host Void corrente:
|
||||||
# Eseguire dopo aver verificato che sway funzioni correttamente.
|
# pacchetti i3-only, dotfiles, voce emptty e profili autorandr host-specifici.
|
||||||
|
# Eseguire dopo aver verificato che sway/Hyprland funzionino correttamente.
|
||||||
|
# I pacchetti condivisi con sway/Hyprland (dunst, rofi, alacritty) NON vengono rimossi.
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
HOSTNAME=$(hostname)
|
HOSTNAME=$(hostname)
|
||||||
|
|
||||||
# Pacchetti i3-only (dunst e rofi sono condivisi con sway, non rimossi)
|
# Pacchetti i3-only (X11). dunst/rofi/alacritty sono condivisi e non vengono rimossi.
|
||||||
sudo xbps-remove -R arandr autorandr feh i3 i3blocks i3blocks-blocklets \
|
sudo xbps-remove -R arandr autorandr feh i3 i3blocks i3blocks-blocklets \
|
||||||
i3lock-color i3status picom polybar scrot setxkbmap volumeicon xclip \
|
i3lock-color i3status picom polybar scrot setxkbmap volumeicon xclip \
|
||||||
xfce4-clipman-plugin xfce4-screenshooter xkbutils xorg-fonts xorg-minimal \
|
xfce4-clipman-plugin xfce4-screenshooter xkbutils xorg-fonts xorg-minimal \
|
||||||
@@ -14,15 +16,15 @@ sudo xbps-remove -R arandr autorandr feh i3 i3blocks i3blocks-blocklets \
|
|||||||
# Dotfiles i3-only
|
# Dotfiles i3-only
|
||||||
rm -rf ~/.config/i3 ~/.config/i3blocks
|
rm -rf ~/.config/i3 ~/.config/i3blocks
|
||||||
rm -f ~/.config/picom/picom.conf
|
rm -f ~/.config/picom/picom.conf
|
||||||
rmdir --ignore-fail-on-non-empty ~/.config/picom
|
rmdir --ignore-fail-on-non-empty ~/.config/picom 2>/dev/null || true
|
||||||
rm -f ~/.config/polybar/config.ini ~/.config/polybar/launch.sh
|
rm -f ~/.config/polybar/config.ini ~/.config/polybar/launch.sh
|
||||||
rmdir --ignore-fail-on-non-empty ~/.config/polybar
|
rmdir --ignore-fail-on-non-empty ~/.config/polybar 2>/dev/null || true
|
||||||
rm -f ~/.xinitrc
|
rm -f ~/.xinitrc
|
||||||
|
|
||||||
# Session file emptty
|
# Session file emptty (X11)
|
||||||
sudo rm -f /etc/emptty/xsessions/i3.desktop
|
sudo rm -f /etc/emptty/xsessions/i3.desktop
|
||||||
|
|
||||||
# Dotfiles host-specifici
|
# Dotfiles host-specifici (autorandr = multi-monitor X11)
|
||||||
case "$HOSTNAME" in
|
case "$HOSTNAME" in
|
||||||
ikaros|nymph)
|
ikaros|nymph)
|
||||||
rm -rf ~/.config/autorandr
|
rm -rf ~/.config/autorandr
|
||||||
|
|||||||
@@ -8,10 +8,6 @@ vault_icloud_mail_password: "REPLACE_ME"
|
|||||||
vault_git_work_email: "REPLACE_ME"
|
vault_git_work_email: "REPLACE_ME"
|
||||||
vault_git_work_gpg: "REPLACE_ME"
|
vault_git_work_gpg: "REPLACE_ME"
|
||||||
vault_openai_api_key: "REPLACE_ME"
|
vault_openai_api_key: "REPLACE_ME"
|
||||||
vault_windows_psrp_host: "REPLACE_ME"
|
|
||||||
vault_windows_psrp_user: 'MicrosoftAccount\user@example.com'
|
|
||||||
vault_windows_psrp_password: "REPLACE_ME"
|
|
||||||
vault_windows_package_backend: "winget_psrp"
|
|
||||||
vault_navidrome_db_password: "REPLACE_ME"
|
vault_navidrome_db_password: "REPLACE_ME"
|
||||||
vault_postgres_root_password: "REPLACE_ME"
|
vault_postgres_root_password: "REPLACE_ME"
|
||||||
vault_ikaros_authorized_ssh_keys:
|
vault_ikaros_authorized_ssh_keys:
|
||||||
|
|||||||