Compare commits

...

199 Commits

Author SHA1 Message Date
ae689d46b1 Reenable kitty role 2025-07-29 12:45:22 +01:00
6882a9dda3 Add neovide role 2025-07-29 12:39:46 +01:00
4bc647bcad Switch back to Chocolatey for 1password on Windows 2025-07-21 09:32:52 +01:00
928f9b2cfc Loop over old neovim stow directories 2025-07-01 12:56:14 +01:00
b47d77b671 Disable kitty role on macOS until OSC 52 bug is fixed 2025-03-18 10:59:04 +00:00
689f83250f Fixes for macOS
* Replace microsoft-remote-desktop with windows-app
* Remove deprecated tap homebrew/cask-fonts
2025-03-18 10:36:43 +00:00
d8a46b017d Add mouse.ahk to autohotkey role
Enable natural scrolling on Windows without relying on the
`FlipFlopWheel` registry key which doesn't always work and depends on
knowing the device instance path for the mouse HID.
2025-02-06 22:30:19 +00:00
518efca73d Fix neovim install after release package asset name change 2025-01-31 10:02:37 +00:00
002bc54819 Fix win_winget requesting input 2025-01-20 23:59:11 +00:00
6b77328851 Add gnome-shell todos 2025-01-16 21:54:10 +00:00
fbd829218b Fix subshine systemd unit task 2025-01-16 21:36:07 +00:00
df5390c31e Accept winget package agreements 2025-01-06 00:23:26 +00:00
5eb6570617 Fix spelling of remove 2025-01-06 00:11:39 +00:00
79b1cf98eb Fix powershell config git url 2024-12-13 21:00:40 +00:00
5210a451b2 Switch neovim role over to winget 2024-12-10 23:27:42 +00:00
d18a9550c9 Remove unnecessary neovim pip packages 2024-12-10 23:27:16 +00:00
1995bf3bc2 Support lists of packages in win_winget module 2024-12-10 23:19:24 +00:00
a9aa1bdaaf Update apple-music role with for new win_winget module 2024-12-10 00:54:17 +00:00
96cf066d74 Add basic win_winget module 2024-12-10 00:54:01 +00:00
5ed3297984 Remove comment from win_git.py 2024-12-07 16:34:55 +00:00
bb2cf61658 Don't install Cider on Windows
Also add the `apple-music` role, although it currently isn't invoked as
the `win_winget` module does not exist yet.
2024-12-06 21:01:52 +00:00
df330b6a73 Add wezterm role for Windows 2024-11-08 22:07:27 +00:00
c2d03c503a Add todo to windows-terminal 2024-11-08 21:17:04 +00:00
0d102debb9 Fix powershell win_scoop usage 2024-11-08 21:08:47 +00:00
d9ce158a2f Add pwsh scoop package and run install.ps1 script 2024-10-16 22:47:00 +01:00
1ecad1214b Fix glab asset query after package names changed 2024-10-09 20:08:07 +01:00
b6a22a295b Ignore __pycache__ 2024-09-11 19:24:06 +01:00
2874dd3674 Fix ripgrep role on not Windows 2024-08-23 20:46:07 +01:00
3008424a13 Transition yq to scoop 2024-08-10 12:36:03 +01:00
5004779045 Transition ripgrep to scoop 2024-08-10 12:13:49 +01:00
3c55848bc8 Assert that Scoop is installed before use 2024-08-10 12:13:29 +01:00
1447a04ab4 Ensure scoop extras bucket is owned by correct user 2024-08-10 12:11:54 +01:00
a624be3ac0 Transition jq to scoop 2024-08-09 21:33:39 +01:00
282d38579c Transition glab to scoop 2024-08-09 21:32:29 +01:00
3cdaa8abd6 Transition gh to scoop 2024-08-09 21:25:01 +01:00
323796eb24 Transition fzf to scoop 2024-08-09 21:19:04 +01:00
d9f7d0513a Transition fd to scoop 2024-08-09 21:17:34 +01:00
d3e4a81b48 Transition curl to scoop 2024-08-09 21:15:59 +01:00
45b0780f48 Transition bat to scoop 2024-08-09 21:06:59 +01:00
f9a090c798 Transition ag to scoop 2024-08-09 21:05:17 +01:00
6089961e36 Split out CLI from Windows in to WindowsCLI playbook 2024-08-09 21:04:55 +01:00
471a358321 Add scoop role 2024-08-09 20:52:10 +01:00
567ed28def Update win_git to update remote URL if different 2024-08-09 16:07:55 +01:00
5f9de82ca3 Create ~/.config/autostart in 1password role 2024-07-26 22:18:44 +01:00
6e9890fe5d Switch from code.infektor.net to git.infektor.net 2024-07-13 20:57:08 +01:00
1b0dbb4727 Respect disable_systemd variable for Linux CLI playbook 2024-07-13 10:45:57 +01:00
dfbfa7c170 Move ulauncher autostart our of gnome-shell role 2024-07-07 12:01:31 +01:00
fc0e933df6 Move 1password autostart our of gnome-shell role 2024-07-07 12:00:42 +01:00
37f9615643 Add ubuntu gnome-shell config 2024-07-07 11:50:36 +01:00
cf9bc807d6 Add configuration of autostart applications 2024-07-07 11:49:36 +01:00
3e9b32b32f Add psutil to list of python role dependencies 2024-07-06 23:09:13 +01:00
1965529cb6 Finally configure gnome custom keybindings 2024-07-06 23:04:04 +01:00
30e2a123c0 Disable activate-window-menu gnome keybinding 2024-07-06 21:24:12 +01:00
8e0743cbba Add gsettings module & use it
Disable switch-input-source & switch-input-source-backward keybindings.
2024-07-06 21:02:42 +01:00
cbe9b40023 Fix ulauncher role on Ubuntu derived distros 2024-07-06 13:04:10 +01:00
18bf23864c Also install gnome-themes-extra for gnome-shell 2024-07-03 21:35:58 +01:00
1363fb8327 Remove guake role use Gnome extension instead 2024-07-03 21:35:58 +01:00
8e3375b160 Add fedora support to sunshine role 2024-06-18 23:06:40 +01:00
32bef2d7f3 Add subshine role, not enabled by default 2024-06-15 13:36:00 +01:00
9fee00b0d8 Also enable xremap for X11 sessions 2024-06-15 12:13:24 +01:00
675a4eab18 Fixup neovim install on Debian based distros 2024-05-25 18:38:19 +01:00
0f0cc67e2c Don't stow kitty's lib directory 2024-05-25 18:26:08 +01:00
1c18b938f1 Also symlink other fzf stuff 2024-05-03 10:48:41 +01:00
8a5d7f48d6 Fix python role for new installs 2024-04-29 21:53:50 +01:00
7de099449d Cleanup neovim role 2024-04-29 21:35:40 +01:00
3e6f3bf7ab Update config repos to use main branch explicitly 2024-04-29 19:11:01 +01:00
267a9b7f3d Uninstall Cmder as its no longer used 2024-04-28 21:02:38 +01:00
94538f3887 Use new flatpak module state:latest support 2024-04-25 00:14:52 +01:00
75012793a8 Fix typo in glab role 2024-04-23 20:41:54 +01:00
dcb0f8c08c Fix kitty role, lacking become 2024-04-22 10:06:37 +01:00
6132cc58a6 Fix glab zsh completion install on Debian 2024-04-20 12:59:38 +01:00
056ae6e169 Update kitty to install from GitHub on Debian
Older version of kitty have terrible font rendering on Linux, e.g. the
one shipped with Ubuntu 22.04, so instead install the latest version
from the provided GitHub packages.
2024-04-19 21:51:58 +01:00
e330c3d072 Fix use of stow to not fold directories 2024-04-19 20:50:23 +01:00
5309683d94 Add support for proxy networks & cleanup playbook vars 2024-04-19 13:17:53 +01:00
a1296840f6 Fix python role, actuall remove old pip.conf 2024-04-15 11:29:58 +01:00
5c78bd1da3 Add system-info macOS user service 2024-04-14 15:55:41 +01:00
7379986378 Run tmux install.sh instead of tasks.yaml 2024-04-13 16:30:30 +01:00
d5fc2c3c13 Move zsh install login into script
Enable installing zsh config repo standalone, i.e. without Ansible,
invoke the `install.zsh` script instead.
2024-04-13 16:12:24 +01:00
dc6b7776ff Update config repo branches for tmux & zsh 2024-04-13 14:36:22 +01:00
3fa17e5517 Fix ulauncher role on Fedora 2024-04-11 23:56:54 +01:00
ace72f755a Add ulauncher role 2024-04-11 21:35:28 +01:00
c4c03aabf4 Make guake package become root 2024-04-09 23:18:43 +01:00
e82bff66ce Don't install pynvim globally on Debian
For PEP 668 reasons.
2024-04-09 19:41:31 +01:00
947a6f1b87 Remove python config repo & use templates instead 2024-04-09 19:27:49 +01:00
9bf8c46bb9 Create pip.conf from a template, handle proxy network 2024-04-09 19:09:40 +01:00
a8f255b715 Add Guake role
Fixes #25
2024-04-08 23:54:45 +01:00
c5c12ab670 Remove set config repo email todos 2024-04-08 21:26:39 +01:00
18a74355c0 Expand launchd todo 2024-04-08 21:25:03 +01:00
f512ec427b Rename gnome-tweaks to gnome-shell
Also start gathering info for starting work on #17.
2024-04-07 23:48:54 +01:00
66efc7b88f Add gitea role for tea cli tool 2024-04-07 16:28:33 +01:00
e711b9f3b2 Add optional GitHub API authentication headers
If the `GITHUB_TOKEN` is defined in the Ansible controller's
environment it is used to set the GitHub REST API authentication header.
This is they passed to all `uri` modules tasks which interact with the
GitHub REST API. If the `GITHUB_TOKEN` is not set, the authentication
header is not used.

Fixes #19
2024-04-06 16:35:01 +01:00
883fee21b3 Add podman role
Fixes #12
2024-04-06 15:03:18 +01:00
035c9a7577 Install latest pynvim on Debian based systems
Fixes #21
2024-04-06 14:37:19 +01:00
8635277d75 Add role for fd 2024-04-06 13:51:40 +01:00
500b27a473 Add ripgrep role 2024-04-06 13:47:04 +01:00
19d0ac491b Replace Firefox Snap with Mozilla repo package
Fixes #20
2024-04-06 12:57:59 +01:00
b57c3f9916 Switch over to neovim specific config repo 2024-04-01 12:26:32 +01:00
5126d06e1e Use latest neovim from GitHub on Debian based distros 2024-03-02 00:42:27 +00:00
b63ff02e0c Update WSL playbook 2024-02-27 22:09:15 +00:00
ebf8cfac42 Make cider role usage more strict 2024-02-27 22:04:25 +00:00
643b4eac8d Add note about first time git install on windows 2023-12-23 23:16:35 +00:00
8cfb03bd4d Fix gnome-tweaks when clause 2023-11-28 23:05:36 +00:00
cf041f9747 Add rpmfusion role on Fedora 2023-11-24 22:48:40 +00:00
66e7d9dc76 Add gnome-tweaks role 2023-11-24 22:17:24 +00:00
c4ac91f163 Set EDITOR in .bashrc 2023-10-28 23:16:18 +01:00
9017be5cf7 Add cider role for Linux and Windows
Cider is a cross-platform Apple Music client. Don't bother installing
Cider on macOS since there is the first party Music app.
2023-10-24 00:07:19 +01:00
b4685b9d1e Create shortcut for Ferdium on Windows 2023-10-21 17:44:40 +01:00
e5cc78f6f4 Add url command to zsh symlinks 2023-10-19 18:06:04 +01:00
9df05dc567 Add macos role for macOS tweaks 2023-10-10 21:36:18 +01:00
37d89c475e Add hiddenbar role for macOS 2023-10-10 21:12:05 +01:00
fa0cf04d8f Fix kitty role on macOS 2023-10-10 21:11:50 +01:00
0d1993ef53 Fix win_git module for hidden folders 2023-10-06 10:51:28 +01:00
9fef9403b3 Fix pynvim on macOS by installing dependency 2023-10-01 23:42:44 +01:00
253cf462b3 Add macOS support to kitty role 2023-10-01 23:42:34 +01:00
54b3c4edfe Flatpak system installs require root 2023-09-25 11:20:52 +01:00
4489c05014 Replace yum with dnf where possible 2023-08-28 22:19:44 +01:00
520462a3f4 Add unsafe tags to zsh and tmux
When used in combination with the `--skip-tags unsafe` flag the
`playbooks/UnixCLI.yaml` can be run while inside a `zsh`/`tmux` session
without it locking up due to system files going missing due to the
upgrade.
2023-08-25 12:29:18 +01:00
aeba9ba7f2 Fix obsidian role when already using flatpak 2023-08-20 21:08:36 +01:00
669dffc2c5 Add ~/.local/bin to PATH in .bashrc 2023-08-18 10:54:30 +01:00
399300c162 Switch to obsidian from flathub 2023-08-17 23:45:34 +01:00
3a4224d200 Fix Fedora/RedHat config 2023-08-17 23:31:59 +01:00
afa680c4d1 Enable xremap on Debian/Ubuntu 2023-08-17 23:24:03 +01:00
cba3f6ce2a Name the chocolatey ferdium task 2023-08-01 21:06:51 +01:00
d37b675187 Override Ubuntu codename for neovim ppa 2023-08-01 20:57:10 +01:00
3364d770e1 Add flatpak role for Debian 2023-08-01 20:56:50 +01:00
9497da521c Fix 1password role on Debian 2023-08-01 19:32:32 +01:00
df00529f86 Use /etc/os-release to ID Ubuntu/Debian
Ansible facts aren't always enough to determine if a distro is derived
from Ubuntu or not, this is available from `/etc/os-release` when it
contains `ID_LIKE="ubuntu debian"`. This patch uses `/etc/os-release` to
correctly handle Ubuntu installations, e.g. PPA's, for all Ubuntu
derived dirtros rather than just Ubuntu itself.
2023-08-01 19:14:32 +01:00
58cd98c817 Always fixup clone win_git repo owner 2023-07-29 12:07:05 +01:00
3b312e6f9a Fix 1password role on Windows
When 1password is already installed and the installer is invoked, it
hangs because it launches the GUI and never returns.
2023-07-29 11:53:22 +01:00
e625f463d7 Add Windows support to fonts role 2023-07-29 11:33:20 +01:00
47d9c4c7e7 Remove broken win_git: module 2023-07-29 10:37:50 +01:00
0f78fe6a69 Fix obsidian desktop file icon 2023-07-27 23:39:57 +01:00
c78ea00ae4 Add ferdium role, prep for removing webcatalog
In the trend of 2023 enshitification webcatalog has decided to stop
shipping a Linux version so I'll be moving to fetdium with a self-hosted
server moving forwards.
2023-07-27 23:38:09 +01:00
bec20420ff Add custom win_git module that actually works 2023-07-27 22:09:45 +01:00
da132c5fb1 Fix become for old 1password keyring removal 2023-07-08 13:53:52 +01:00
ec6cc7013c Don't trust apt_repository: anymore
Still having issues with 1password on Debian based distros due to
mismatching `signed-by` keyring. It appears as if `apt_repository:` is
changing the `signed-by` path even though it was explicitly specified in
the `repo:` setting. Instead switch to using `copy:` for complete
control over the `/etc/apt/sources.list.d/1password.list` file.
2023-07-08 11:43:54 +01:00
31a819e481 Stop using apt_key: module to install keyrings
Fixes #16 by replacing uses of the `apt_key:` module with `get_url:` to
download apt keyrings into `/etc/apt/keyrings`, then used
`signed-by=/etc/path/keyrings/<keyring>` in the appropriate sources.list
file.
2023-06-24 11:25:54 +01:00
026969a32d Add todo to obsidian 2023-06-18 23:59:15 +01:00
65f44a8454 Install webcatalog icon from AppImage 2023-06-18 23:55:01 +01:00
960f853d1f Install obsidian icon from AppImage 2023-06-18 23:54:39 +01:00
5fbc85dade xremap role not currently working on Debian unstable
Only known to work on Fedora 38, service fails to start on Debian
unstable as of today.
2023-06-16 14:11:05 +01:00
befb02bc95 Make RedHat obsidian support work for all Linux 2023-06-16 10:42:13 +01:00
352ef4c8d4 Remove CAD apps because of Autodesk
Autodesk change distribution of Fusion360 to require a login breaking
the Chocolatey package, easier to manage this manually anyway since they
won't be installed on all Windows systems.
2023-06-10 11:18:30 +01:00
878db362cd Add xremap role for macOS bindings on Linux 2023-06-08 23:41:06 +01:00
49b292126e Add kitty role for Linux 2023-06-06 19:39:58 +01:00
67a37e0a56 Actually make LinuxCLI import UnixCLI 2023-06-04 21:39:06 +01:00
1f4c43a4a1 Ignore test playbook 2023-06-03 11:22:25 +01:00
3b31dc06fe Rearrange playbooks, add Linux specific ones 2023-06-03 11:20:41 +01:00
876db8ecfb Add missing CLI roles to UnixCLI.yaml playbook 2023-06-03 09:47:13 +01:00
959f4b2b32 Add RedHat support to wget role 2023-06-03 09:46:16 +01:00
d8c6c6a808 Add RedHat support to gdb role 2023-06-03 09:45:57 +01:00
5420eb9cd5 Add RedHat support for the glab role 2023-06-03 09:34:07 +01:00
3fee590a8f Move some updated GUI roles into generic playbook 2023-06-02 20:03:14 +01:00
0b71c22019 Add RedHat support to the obsidian role 2023-06-02 20:03:14 +01:00
db0b181473 Use Linux system packages for neovim python integration 2023-06-02 20:03:14 +01:00
65d96b2faa Add Linux support to webcatalog role 2023-06-02 20:03:14 +01:00
1749c78364 Add Linux support to fonts role 2023-06-01 23:00:07 +01:00
b560f9c7d9 Add support for Fedora to various roles 2023-06-01 20:06:46 +01:00
8ef426139b Add bashrc template for bash role 2023-05-15 22:25:30 +01:00
d1c3184400 Enable systemd in WSL 2023-05-12 22:31:01 +01:00
910be1641d Make Windows .exe's work with systemd enabled 2023-05-12 22:20:31 +01:00
d4393851b1 Switch system-info to systemd on WSL 2023-05-12 22:20:05 +01:00
8fae111d0e Remove local coc-settings.json 2023-05-02 19:11:50 +01:00
5b62791bf6 Fix glab role on Debian for first install 2023-04-29 19:18:04 +01:00
ad9d1fbe4f Add glab role for macOS, Debiam distros, and Windows 2023-04-29 00:44:36 +01:00
c4d4f5395a Use local ansible.cfg
Since moving playbooks to their own subdirectory they were no longer
able to find the roles. Add a local `ansible.cfg` which configures the
default paths for roles, modules, and collections. Also change the
location of the `win_git` module to the new local directory.
2023-04-27 23:04:44 +01:00
5ac1081f90 Update git role to read tasks.yaml from cloned repo 2023-04-20 12:51:08 +01:00
a80d8e1574 Move playbooks into their own directory 2023-04-15 12:44:10 +01:00
dbd8af4648 Fix various first run issues 2023-04-14 16:49:56 +01:00
23f0fd7f23 Make it so pip install --user still works
Debian has enabled `EXTERNALLY-MANAGED` from PEP 668 which breaks `pip
install --user`. I think this is a terrible decision, understandable to
want to avoid modifications in `/usr/lib/python*/site-packages` but to
have that stop be installing packages in my home directory is a big
mistake in terms of usability. In any case this patch moves the
configuration of `pip.conf` to occur before any other roles are
processed, seting the override flag, even though I'm never actually
touching the real site packages.
2023-03-04 11:33:11 +00:00
bdbb6a3f3b Create zsh completion symlinks for installed commands 2023-02-18 15:06:51 +00:00
7148f492b0 Re-enable apt install of fzf no new Debian 2023-02-17 21:27:28 +00:00
03de2224f8 Use old fzf install method on 22.04 and older 2023-02-14 16:30:41 +00:00
d4d37fb6bc Ensure PrusaSlicer has a Windows start menu shortcut 2023-02-11 20:56:21 +00:00
1608987eef Enable neovim stable backport ppa on Ubuntu 20.04 2023-02-08 13:51:53 +00:00
b4d4bd0664 Don't install osx-cpu-temp anymore
`osx-cpu-temp` doesn't work on Apple Silicon.
2023-02-05 23:03:28 +00:00
39268ae7aa Add Linux Mint support to llvm role 2023-02-04 16:50:34 +00:00
368982b8fa Make 1password role use consistent filenames on Debian 2023-02-04 16:12:36 +00:00
b3cd84e181 Add missing become: true to jq on Debian 2023-02-04 16:04:52 +00:00
b0d2fd212e Remove debug from gh role on Debian 2023-02-04 16:04:28 +00:00
f7ee7af25c Use homebrew_cask for item install
`homebrew:` doesn't handle upgrading casks gracefull, use
`homebrew_cask:` instead.
2023-02-03 18:00:20 +00:00
50a9cc97b6 Install gh zsh completions 2023-01-04 14:23:33 +00:00
e2d1414c3b Add microsoft-remote-desktop role for macOS 2022-12-19 12:40:16 +00:00
576eb2ae41 Add editline role 2022-12-15 20:49:44 +00:00
69bcd75f7b Add webcatalog role for macOS 2022-12-10 23:35:51 +00:00
d32588dbfd Add viscosity role for macOS 2022-12-10 23:31:35 +00:00
4783803a77 Add iterm role for macOS 2022-12-10 23:24:32 +00:00
1ad397771d Fix macOS tmux terminfo issue with htop 2022-12-10 23:22:55 +00:00
6ff50854e0 Add magnet & mas for macOS
The `mas` role installed the command-line tool of the same name to
install Mac App Store package. The `magnet` role then uses `mas` to
install the tiling window manager from the App Store.
2022-12-10 22:44:50 +00:00
5cba48f632 Ensure tmux-256color exists on macOS
As outlined in [this
gist](https://gist.github.com/bbqtd/a4ac060d6f6b9ea6fe3aabe735aa9d95)
the version of `ncurses` shipped with macOS is too old to be aware of
the `tmux-256color` terminal info database which is the default in
`tmux`. This patch downloads the latest `ncurses` terminal info database
and uses that to install the `tmux-256color` entry for the current user
in `~/.terminfo`. This ensures that bold, italic, etc, are working
correctly and `git` does not throw warnings as noted
[here](1e2c00aa32)
2022-12-10 22:18:50 +00:00
7e9166cb48 Add font role for macOS (initially) 2022-12-10 16:27:15 +00:00
747f1a6992 Add watch role for macOS, implicitly installed on Linux 2022-12-10 16:08:20 +00:00
db3d146dc9 Fix playbook imports 2022-12-10 15:45:46 +00:00
91839b927d Fix obsidian role on macOS 2022-12-10 15:45:30 +00:00
c5e2a76d2e Fix jp role on macOS 2022-12-10 15:27:02 +00:00
baa0206937 Make sudo role work on macOS 2022-12-09 15:19:40 +00:00
2abc38f696 Add gh role for macOS, Windows, and Debian 2022-12-08 11:42:15 +00:00
63ff47c3b2 Don't install xclip or xsel in WSL
Newer WSL2 has issues with `xclip`/`xsel` behaviour which cause Windows
GUI's to freeze waiting for input from an already exited process.
Switching to `win32yank.exe` for clipboard integrations.
2022-12-03 18:53:12 +00:00
da4b8858d3 Split out Unix into UnixCLI and UnixGUI 2022-12-02 19:11:22 +00:00
185 changed files with 3293 additions and 501 deletions

2
.gitignore vendored
View File

@ -1 +1,3 @@
external
playbooks/test.yaml
__pycache__

View File

@ -1,12 +0,0 @@
{
"yaml.schemas": {
"https://raw.githubusercontent.com/ansible-community/schemas/main/f/ansible.json#/$defs/playbook": [
"./*.yaml"
],
"https://raw.githubusercontent.com/ansible-community/schemas/main/f/ansible.json#/$defs/tasks": [
"./roles/*/handlers/*.yaml",
"./roles/*/tasks/*.yaml",
"./tasks.yaml"
]
}
}

View File

@ -1,3 +0,0 @@
---
- import_playbook: Unix.yaml
- import_playbook: Windows.yaml

View File

@ -1,35 +0,0 @@
---
- hosts: windows
vars:
install_cad_apps: false
roles:
- role: git
- role: powershell
- role: neovim
- role: system-info
- role: ag
- role: bat
- role: curl
- role: fzf
- role: tree
- role: jq
- role: yq
- role: llvm
- role: nodejs
- role: python
- role: 1password
- role: autohotkey
- role: firefox
- role: obsidian
- role: powertoys
- role: windows-terminal
- role: autodesk-fusion360
when: install_cad_apps
- role: prusaslicer
when: install_cad_apps

5
ansible.cfg Normal file
View File

@ -0,0 +1,5 @@
[defaults]
collections_path = collections
library = library
roles_path = roles
stdout_callback = yaml

146
library/gsettings.py Normal file
View File

@ -0,0 +1,146 @@
# -*- coding: utf-8 -*-
from typing import Tuple
from ansible.module_utils.basic import AnsibleModule
DOCUMENTATION = """
module: gsettings
author:
- Kenneth Benzie (Benie)
short_description: Ansible module for the gsettings configuration tool
options:
schema:
description:
- Schema ID of the settings to configure.
type: str
key:
description:
- Key of an individaul setting to configure.
type: str
value:
description:
- Value to configure the setting with.
- Mutually exclusive with reset.
type: str
reset:
description:
- Flag to reset the setting to the default value.
- Mutually exclusive with value.
type:
default: false
"""
EXAMPLES = """
- name: get gnome color-scheme current value
gsettings:
schema: org.gnome.desktop.interface
key: color-scheme
register: color_scheme
- debug: msg={{color_scheme.value}}
- name: set gnome color-scheme to 'prefer-dark'
gsettings:
schema: org.gnome.desktop.interface
key: color-scheme
value: "'prefer-dark'"
- name: reset gnome color-scheme to default value
gsettings:
schema: org.gnome.desktop.interface
key: color-scheme
reset: true
"""
RETURN = """
value:
description: Value of the setting.
returned: Returned when there is a value.
type: str
sample: "'default'"
stderr:
description: Error output from gsettings.
returned: Returned when there is an error.
type: str
sample: No such key doesnt-exist
"""
class GSettingsError(Exception):
def __init__(self, command, rc, stderr):
self.command = command
self.rc = (rc,)
self.stderr = stderr
def gsettings_get(module: AnsibleModule) -> Tuple[bool, str]:
command = [
"gsettings",
"get",
module.params["schema"],
module.params["key"],
]
rc, stdout, stderr = module.run_command(command)
if rc != 0:
raise GSettingsError(command, rc, stderr)
return False, stdout.rstrip()
def gsettings_set(module: AnsibleModule) -> Tuple[bool, str]:
command = [
"gsettings",
"set",
module.params["schema"],
module.params["key"],
module.params["value"],
]
_, before = gsettings_get(module)
rc, _, stderr = module.run_command(command)
if rc != 0:
raise GSettingsError(command, rc, stderr)
_, after = gsettings_get(module)
return before != after, after
def gsettings_reset(module: AnsibleModule) -> Tuple[bool, str]:
command = [
"gsettings",
"reset",
module.params["schema"],
module.params["key"],
]
_, before = gsettings_get(module)
rc, stdout, stderr = module.run_command(command)
if rc != 0:
raise GSettingsError(command, rc, stderr)
_, after = gsettings_get(module)
return before != after, after
def main() -> None:
module = AnsibleModule(
argument_spec=dict(
schema=dict(type="str"),
key=dict(type="str"),
value=dict(type="str"),
reset=dict(type="bool", default=False),
),
mutually_exclusive=[["value", "reset"]],
required_together=[["schema", "key"]],
)
try:
if module.params["value"]:
changed, value = gsettings_set(module)
elif module.params["reset"]:
changed, value = gsettings_reset(module)
else:
changed, value = gsettings_get(module)
module.exit_json(changed=changed, value=value)
except GSettingsError as error:
module.fail_json(
f"{error.command} failed ({error.rc}): {error.stderr}", stderr=error.stderr
)
if __name__ == "__main__":
main()

259
library/win_git.ps1 Normal file
View File

@ -0,0 +1,259 @@
#!powershell
#AnsibleRequires -CSharpUtil Ansible.Basic
#AnsibleRequires -PowerShell Ansible.ModuleUtils.CommandUtil
$module = [Ansible.Basic.AnsibleModule]::Create($args, @{
options = @{
dest = @{type = 'path'}
repo = @{required = $true; aliases = @('name')}
version = @{default = 'HEAD'; aliases = @('branch')}
remote = @{default = 'origin'}
recursive = @{default = $true; type = 'bool'}
executable = @{default = $null; type = 'path'}
}
supports_check_mode = $false
})
$dest = $module.Params.dest
$repo = $module.Params.repo
$version = $module.Params.version
$remote = $module.Params.remote
$git = $module.Params.executable
if (!$git) {
$git = Get-ExecutablePath 'git'
}
# ================================= Utilities ==================================
function Get-AbsolutePath {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)] [String] $path
)
try {
$result = Resolve-Path $path
} catch {
return $_[0].TargetObject
}
return $result
}
function Get-GitDir {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)] [String] $path
)
$git_dir = Join-Path $path '.git'
# Check if this .git is a file.
if ([System.IO.File]::Exists($git_dir)) {
# Extract the gitdir: path from the .git file.
$groups = Get-Content "$git_dir" | `
Select-String '(gitdir:) (.*)' | `
ForEach { $_.Matches[0].Groups[1..2] }
$ref_prefix = $groups[0]
$gitdir = $groups[1]
if ($ref_prefix -ne 'gitdir:') {
$module.FailJson('The .git file has invalid gitdir reference format.')
}
# Check if the repo path is absolute.
if ([System.IO.Path]::IsPathRooted($gitdir)) {
$git_dir = $gitdir
} else {
# Join with the input path to construct an absolute path.
$git_dir = Join-Path $path $gitdir
}
if (![System.IO.Directory]::Exists($git_dir)) {
throw "$git_dir is not a directory."
}
}
return $git_dir
}
function Test-GitLocalChanges {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)] [String] $dest
)
$command = "`"$git`" status --porcelain"
$result = Run-Command -command $command -working_directory $dest
$changes = $result.stdout.Split([System.Environment]::NewLine, `
[System.StringSplitOptions]::RemoveEmptyEntries) | `
Where-Object { -not $_.StartsWith('??') } | Measure-Object -Line
return $changes.Lines -gt 0
}
function Get-GitRemoteHeadBranch {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true)] [String] $dest,
[Parameter(Mandatory = $true)] [String] $remote
)
$command = "`"$git`" symbolic-ref --short refs/remotes/$remote/HEAD"
$result = Run-Command -command $command -working_directory $dest
if ($result.rc -ne 0) {
$module.FailJson("Could not determine the default HEAD branch of remote: $remote" ` +
"$result.stdout $result.stderr")
}
return $result.stdout.Trim().Replace("$remote/", '')
}
function Get-GitCurrentSha {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true)] [String] $dest
)
$command = "`"$git`" rev-parse HEAD"
$result = Run-Command -command $command -working_directory $dest
return $result.stdout.Trim()
}
function Get-GitRemoteUrl {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true)] [String] $dest,
[Parameter(Mandatory = $true)] [String] $remote
)
$result = Run-Command -command "`"$git`" remote get-url $remote" -working_directory $dest
return $result.stdout.Trim()
}
function Invoke-GitClone {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true)] [String] $repo,
[Parameter(Mandatory = $true)] [String] $remote,
[Parameter(Mandatory = $true)] [String] $dest
)
$dest_parent = Split-Path -Path $dest -Parent
if (!(Test-Path $dest_parent)) {
New-Item -Path $dest_parent -ItemType Directory
}
$command = "`"$git`" clone --recursive --origin $remote $repo $dest"
if ($version -ne "HEAD") {
$command += " --branch $version"
}
$result = Run-Command -command $command -working_directory $cwd
if ($result.rc -ne 0) {
$module.FailJson($result.stderr)
}
}
function Invoke-GitCheckout {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true)] [String] $dest,
[Parameter(Mandatory = $true)] [String] $remote,
[Parameter(Mandatory = $true)] [String] $version
)
if ($version -eq "HEAD") {
$branch = Get-GitRemoteHeadBranch $dest $remote
} else {
$branch = $version
}
$result = Run-Command -command "`"$git`" checkout $branch" -working_directory $dest
if ($result.rc -ne 0) {
$module.FailJson("Failed to checkout version '$version'`n" + $result.stderr)
}
}
function Invoke-GitFetch {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true)] [String] $dest,
[Parameter(Mandatory = $true)] [String] $remote,
[Parameter(Mandatory = $true)] [String] $version
)
$command = "`"$git`" fetch --tags $remote"
$result = Run-Command -command $command -working_directory $dest
if ($result.rc -ne 0) {
$module.FailJson("Failed to download remote objects and refs:`n" + `
$result.stderr)
}
}
function Invoke-GitPull {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true)] [String] $dest,
[Parameter(Mandatory = $true)] [String] $remote,
[Parameter(Mandatory = $true)] [String] $version
)
$result = Run-Command -command "`"$git`" pull $remote $version" -working_directory $dest
if ($result.rc -ne 0) {
$module.FailJson("Failed to pull version '$version' from remote '$origin':`n" + `
$result.stderr)
}
}
function Invoke-GitSubmoduleUpdate {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true)] [String] $dest
)
$result = Run-Command -command "`"$git`" submodule update --init" -working_directory $dest
if ($result.rc -ne 0) {
$module.FailJson("Failed to initialized/update submodules:`n" + $result.stderr)
}
}
function Invoke-GitRemoteSetUrl {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true)] [String] $dest,
[Parameter(Mandatory = $true)] [String] $remote,
[Parameter(Mandatory = $true)] [String] $url
)
$result = Run-Command -command "`"$git`" remote set-url $remote `"$url`"" -working_directory $dest
if ($result.rc -ne 0) {
$module.FailJson("Failed to set remote URL:`n" + $result.stderr)
}
}
# ================================ Start logic =================================
if (!$dest) {
$module.FailJson('The destination directory must be specified.')
}
$dest = Get-AbsolutePath $dest
$git_dir = Get-GitDir $dest
$gitconfig = Join-Path $git_dir 'config'
$module.Result.before = $null
if (($dest -and ![System.IO.File]::Exists($gitconfig))) {
Invoke-GitClone $repo $remote $dest
Invoke-GitCheckout $dest $remote $version
$module.Result.changed = $true
} else {
$module.Result.before = Get-GitCurrentSha $dest
if (Test-GitLocalChanges $dest) {
$module.FailJson('Local modifications exist in repository.')
}
$url = Get-GitRemoteUrl $dest $remote
if ($url -ne $repo) {
Invoke-GitRemoteSetUrl $dest $remote $repo
}
Invoke-GitFetch $dest $remote $version
Invoke-GitCheckout $dest $remote $version
Invoke-GitPull $dest $remote $version
$module.Result.after = Get-GitCurrentSha $dest
if ($module.Result.before -ne $module.Result.after) {
$module.Result.changed = $true
}
}
if ($recursive) {
Invoke-GitSubmoduleUpdate $dest
}
# Ensure the repository has the correct owner
$userName = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$idRef = [System.Security.Principal.NTAccount]::new($userName)
Get-Item -Force $dest | foreach { `
$_ ; $_ | Get-ChildItem -Force -Recurse `
} | foreach { `
$acl = $_ | Get-Acl; $acl.SetOwner($idRef); $_ | Set-Acl -AclObject $acl `
}
$module.ExitJson()

43
library/win_git.py Normal file
View File

@ -0,0 +1,43 @@
# -*- coding: utf-8 -*-
# TODO: copyright
DOCUMENTATION = '''
---
module: win_git
author:
- "Kenneth Benzie (Benie)"
short_description: Deploy software (or files) from git checkouts on Windows
description:
- Manage git checkouts of repositories to deploy files or software on Windows.
options:
data:
description:
- Alternate data to return instead of 'pong'.
- If this parameter is set to C(crash), the module will cause an
exception.
type: str
default: pong
seealso:
- module: ansible.builtin.git
'''
EXAMPLES = r'''
# Test connectivity to a windows host
# ansible winserver -m ansible.windows.win_ping
- name: Example from an Ansible Playbook
ansible.windows.win_ping:
- name: Induce an exception to see what happens
ansible.windows.win_ping:
data: crash
'''
RETURN = r'''
ping:
description: Value provided with the data parameter.
returned: success
type: str
sample: pong
'''

99
library/win_winget.ps1 Normal file
View File

@ -0,0 +1,99 @@
#!powershell
#AnsibleRequires -CSharpUtil Ansible.Basic
#AnsibleRequires -PowerShell Ansible.ModuleUtils.CommandUtil
$module = [Ansible.Basic.AnsibleModule]::Create($args, @{
options = @{
name = @{
type = "list"
elements = "str"
required = $true
}
state = @{
type = "str"
default = "present"
choices = ("absent", "latest", "present")
}
}
supports_check_mode = $false
})
$names = $module.Params.name
$state = $module.Params.state
$winget = Get-ExecutablePath "winget"
$noPackageString = "No installed package found matching input criteria."
if ($name -and $id) {
$module.FailJson("name `"$name`" and id `"$id`" must not both be provided")
}
function Test-Installed {
$command = "`"$winget`" list `"$name`""
$result = Run-Command -command $command
if ($result.rc -eq 0) {
return $true
}
return $false
}
function Test-UpgradeAvailable {
if (!(Test-Installed)) {
return $true
}
$command = "`"$winget`" list --upgrade-available `"$name`""
$result = Run-Command -command $command
if ($result.stdout.Contains($noPackageString)) {
return $false
}
return $true
}
foreach ($name in $names) {
switch ($state) {
"absent" {
if (Test-Installed) {
$command = "`"$winget`" uninstall `"$name`""
$result = Run-Command -command $command
if ($result.rc -ne 0) {
$module.Result.rc = $result.rc
$module.Result.stdout = $result.stdout
$module.FailJson("Failed to uninstall package `"$name`"")
}
$module.Result.stdout = $result.stdout
$module.Result.changed = $true
}
}
"latest" {
if (Test-UpgradeAvailable) {
$command = "`"$winget`" install --accept-package-agreements --accept-source-agreements `"$name`""
$result = Run-Command -command $command
if ($result.rc -ne 0) {
$module.Result.rc = $result.rc
$module.Result.stdout = $result.stdout
$module.FailJson("Failed to install package `"$name`"")
}
$module.Result.stdout = $result.stdout
$module.Result.changed = $true
}
}
"present" {
if (!(Test-Installed)) {
$command = "`"$winget`" install --accept-package-agreements --accept-source-agreements `"$name`""
$result = Run-Command -command $command
if ($result.rc -ne 0) {
$module.Result.rc = $result.rc
$module.Result.stdout = $result.stdout
$module.FailJson("Failed to install package `"$name`"")
}
$module.Result.stdout = $result.stdout
$module.Result.changed = $true
}
}
}
}
$module.Result.rc = 0
$module.ExitJson()

47
library/win_winget.py Normal file
View File

@ -0,0 +1,47 @@
# -*- coding: utf-8 -*-
DOCUMENTATION = '''
module: win_winget
author:
- "Kenneth Benzie (Benie)"
short_desription: Manages packages with WinGet
description:
- Magage packages using WinGet.
options:
name:
description:
- Name of the package to manage.
type: list[str]
state:
description:
- Indicates the desired package state. V(latest) ensures that the latest
version is installed.
type: str
choices: [ absent, present, latest ]
default: present
'''
EXAMPLES = '''
- name: Install Apple Music
win_winget:
name: Apple Music
state: present
- name: Install latest version of Neovim Qt
win_winget:
name: neovim-qt
state: latest
- name: Uninstall Microsoft OneDrive
win_winget:
id: Microsoft.OneDrive
state: absent
'''
RETURN = '''
stdout:
description: Output from WinGet.
returned: Success, when needed.
type: str
sample: ''
'''

View File

@ -1,7 +0,0 @@
---
- import_playbook: Unix.yaml
- hosts: localhost
roles:
- role: obsidian

6
playbooks/1password.yaml Normal file
View File

@ -0,0 +1,6 @@
---
- hosts: localhost
vars_files:
- vars/environment.yaml
roles:
- 1password

15
playbooks/Linux.yaml Normal file
View File

@ -0,0 +1,15 @@
---
- import_playbook: LinuxCLI.yaml
- import_playbook: UnixGUI.yaml
- hosts: localhost
vars_files:
- vars/environment.yaml
roles:
- role: firefox
- role: kitty
- role: cider
- role: ulauncher
- role: gnome-shell
when: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP"
- role: xremap
when: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP"

16
playbooks/LinuxCLI.yaml Normal file
View File

@ -0,0 +1,16 @@
---
- hosts: localhost
vars_files:
- vars/environment.yaml
roles:
- role: rpmfusion
when: ansible_os_family == 'RedHat' and ansible_distribution == 'Fedora'
- import_playbook: UnixCLI.yaml
- hosts: localhost
vars_files:
- vars/environment.yaml
roles:
- role: gdb
- role: podman
- role: system-info
when: disable_systemd is not defined

View File

@ -1,34 +1,38 @@
---
- hosts: localhost
vars_files:
- vars/environment.yaml
roles:
- role: sudo
when: ansible_user_id != "root"
- role: python
- role: zsh
tags: unsafe
- role: neovim
- role: tmux
- role: system-info
when: '"WSL" not in ansible_kernel'
tags: unsafe
- role: ag
- role: bash
- role: bat
- role: curl
- role: editline
- role: fd
- role: fzf
- role: gh
- role: git
- role: glab
- role: htop
- role: jp
- role: jq
- role: readline
- role: ripgrep
- role: tidy
- role: tree
- role: watch
- role: wget
- role: yq
- role: llvm
- role: nodejs
- role: python
- role: 1password
- role: wsl
when: '"WSL" in ansible_kernel'

12
playbooks/UnixGUI.yaml Normal file
View File

@ -0,0 +1,12 @@
---
- hosts: localhost
vars_files:
- vars/environment.yaml
roles:
- role: flatpak
when: ansible_os_family != "Darwin"
- role: 1password
- role: ferdium
- role: fonts
- role: obsidian

7
playbooks/WSL.yaml Normal file
View File

@ -0,0 +1,7 @@
---
- import_playbook: LinuxCLI.yaml
- hosts: localhost
vars_files:
- vars/environment.yaml
roles:
- role: wsl

17
playbooks/Windows.yaml Normal file
View File

@ -0,0 +1,17 @@
---
- import_playbook: WindowsCLI.yaml
- hosts: windows
vars_files:
- vars/environment.yaml
roles:
- role: 1password
- role: autohotkey
- role: apple-music
- role: ferdium
- role: firefox
- role: fonts
- role: obsidian
- role: powertoys
- role: windows-terminal
- role: wezterm
- role: neovide

26
playbooks/WindowsCLI.yaml Normal file
View File

@ -0,0 +1,26 @@
---
- hosts: windows
vars_files:
- vars/environment.yaml
roles:
- role: scoop
- role: python
- role: git
- role: powershell
- role: neovim
- role: system-info
- role: ag
- role: bat
- role: curl
- role: fd
- role: fzf
- role: gh
- role: glab
- role: jq
- role: ripgrep
- role: tree
- role: yq
- role: llvm
- role: nodejs

23
playbooks/macOS.yaml Normal file
View File

@ -0,0 +1,23 @@
---
- import_playbook: UnixCLI.yaml
- hosts: localhost
vars_files:
- vars/environment.yaml
roles:
- role: system-info
- import_playbook: UnixGUI.yaml
- hosts: localhost
vars_files:
- vars/environment.yaml
roles:
- role: mas
- role: hiddenbar
- role: iterm
- role: kitty
- role: neovide
- role: magnet
- role: windows-app
- role: viscosity
- role: macos

View File

@ -0,0 +1,15 @@
---
# GitHub may rate limit unauthenticated API requests, this is more likely when
# behind a network proxy. Set the GITHUB_TOKEN environment variable to
# authenticate any GitHub API requests executed while playing roles.
github_auth_headers: >-
{{ { 'Authorization': 'Bearer ' + lookup('env', 'GITHUB_TOKEN') }
if lookup('env', 'GITHUB_TOKEN') else {} }}
# When working behind a network proxy, set the http_proxy and https_proxy
# environment variables. These will be passed through to uses of the `get_url`
# module when playing roles.
proxy_environment: >-
{{ { 'http_proxy': lookup('env', 'http_proxy'),
'https_proxy': lookup('env', 'https_proxy') }
if lookup('env', 'http_proxy') and lookup('env', 'https_proxy') else {} }}

View File

@ -1,13 +1,25 @@
---
- name: set keyring path
set_fact:
keyring: /etc/apt/keyrings/1password.asc
old_keyring: /etc/apt/trusted.gpg.d/1password-archive-keyring.gpg
- name: remove old keyring
become: true
file:
path: '{{old_keyring}}'
state: absent
- name: add apt signing key
when: '"WSL" not in ansible_kernel'
become: true
apt_key:
get_url:
url: https://downloads.1password.com/linux/keys/1password.asc
keyring: /etc/apt/trusted.gpg.d/1password-archive-keyring.gpg
state: present
dest: '{{keyring}}'
environment: '{{proxy_environment}}'
- when: ansible_machine == 'x86_64'
- name: set compatible architecture
when: ansible_machine == 'x86_64'
set_fact:
arch: amd64
@ -18,11 +30,16 @@
- name: add apt repository
when: '"WSL" not in ansible_kernel'
become: true
apt_repository:
repo: >-
deb [arch={{arch}}
signed-by=/etc/apt/trusted.gpg.d/1password-archive-keyring.gpg]
copy:
content: >-
deb [arch={{arch}} signed-by={{keyring}}]
https://downloads.1password.com/linux/debian/{{arch}} stable main
dest: /etc/apt/sources.list.d/1password.list
- name: apt update
become: true
apt:
update_cache: true
- name: install gui package
when: '"WSL" not in ansible_kernel'
@ -45,4 +62,5 @@
src: /mnt/c/Users/Benie/AppData/Local/1Password/cli/op.exe
dest: ~/.local/bin/op
- include_tasks: linux-autostart.yaml
- include_tasks: zsh-completion.yaml

View File

@ -0,0 +1,24 @@
---
- name: add dnf repository key
become: true
rpm_key:
key: https://downloads.1password.com/linux/keys/1password.asc
- name: add dnf repository
become: true
yum_repository:
name: 1password
description: 1Password Stable Channel
baseurl: https://downloads.1password.com/linux/rpm/stable/$basearch
enabled: true
gpgcheck: true
repo_gpgcheck: true
gpgkey: ['https://downloads.1password.com/linux/keys/1password.asc']
- name: install dnf package
become: true
dnf:
name: 1password
state: latest
- include_tasks: linux-autostart.yaml

View File

@ -6,40 +6,10 @@
app_exe: '{{ansible_env.LOCALAPPDATA}}/1Password/app/8/1Password.exe'
installer_exe: '{{ansible_env.TEMP}}/1PasswordSetup-latest.exe'
- name: check if already installed
win_stat:
path: '{{app_exe}}'
register: app_stat
- name: get installed version
when: app_stat.stat.exists == True
win_command: '{{app_exe}} --version'
register: app_version
changed_when: false
- when: app_stat.stat.exists == True
set_fact:
installed_version: '{{app_version.stdout.strip()}}'
- name: download latest installer
win_get_url:
url: https://downloads.1password.com/win/1PasswordSetup-latest.exe
dest: '{{installer_exe}}'
- name: get installer version
win_shell: |
(Get-ItemProperty {{installer_exe}}).VersionInfo.ProductVersion
register: installer_product_version
changed_when: false
# FIXME: The [5:] is to account for a mystery "\e[6 q" prefix, not sure if this
# is consistent across machines or some other oddity.
- set_fact:
installer_version: '{{installer_product_version.stdout.strip()[5:]}}'
- name: run installer
when: installed_version is not defined or installed_version != installer_version
win_command: '{{installer_exe}}'
- name: install chocolatey package
win_chocolatey:
state: latest
name: 1password
- name: create start menu shortcut
win_shortcut:
@ -83,6 +53,7 @@
win_get_url:
url: '{{latest.downloads.Windows.amd64}}'
dest: '{{cli_zip}}'
environment: '{{proxy_environment}}'
- name: unzip op zip archive
when: cli_installed_version is not defined or cli_installed_version != latest.version

View File

@ -0,0 +1,20 @@
---
- name: create ~/.config/autostart directory
file:
state: directory
path: ~/.config/autostart
- name: create autostart desktop file
copy:
dest: '{{ansible_env.HOME}}/.config/autostart/1password.desktop'
content: |
[Desktop Entry]
Name=1Password
Exec=/opt/1Password/1password %U
Terminal=false
Type=Application
Icon=1password
StartupWMClass=1Password
Comment=Password manager and secure wallet
MimeType=x-scheme-handler/onepassword;x-scheme-handler/onepassword8;
Categories=Office;

View File

@ -4,6 +4,11 @@
register: zsh_completion_script
changed_when: false
- name: create local zsh site functions directory
file:
state: directory
path: ~/.local/share/zsh/site-functions
- name: create op zsh completion file
copy:
content: '{{zsh_completion_script.stdout}}'

View File

@ -0,0 +1,6 @@
---
- name: install dnf package
become: true
dnf:
name: the_silver_searcher
state: latest

View File

@ -1,5 +1,10 @@
---
- name: install chocolatey package
- name: remove chocolatey package
win_chocolatey:
name: ag
state: latest
state: absent
- name: install scoop package
community.windows.win_scoop:
name: ag
state: present

View File

@ -0,0 +1,10 @@
---
- name: install Apple Music from Microsoft Store
win_winget:
name: Apple Music
state: latest
- name: remove Cider from Chocolatey
win_chocolatey:
name: Cider
state: absent

View File

@ -1,8 +0,0 @@
---
- assert:
that: ansible_os_family == "Windows"
- name: install chocolatey package
win_chocolatey:
name: autodesk-fusion360
state: latest

View File

@ -6,13 +6,9 @@
- name: clone config repo
win_git:
repo: git@code.infektor.net:config/AutoHotKey.git
repo: git@git.infektor.net:config/AutoHotKey.git
dest: '{{autohotkey_repo_dir}}'
branch: master
- win_owner:
path: '{{autohotkey_repo_dir}}'
user: Benie
recurse: true
branch: main
- name: create scheduled task
win_scheduled_task:
@ -35,3 +31,25 @@
run_level: highest
start_when_available: true
wake_to_run: false
- name: create scheduled task
win_scheduled_task:
path: Benie
name: mouse.ahk
state: present
enable: true
triggers:
- type: logon
enabled: true
- type: registration
enabled: true
actions:
- path: '{{autohotkey_repo_dir}}/mouse.ahk'
disallow_start_if_on_batteries: false
stop_if_going_on_batteries: false
execution_time_limit: PT0S
logon_type: interactive_token
multiple_instances: 3
run_level: highest
start_when_available: true
wake_to_run: false

View File

@ -0,0 +1,5 @@
---
- name: create ~/.bashrc file
template:
src: templates/bashrc
dest: ~/.bashrc

122
roles/bash/templates/bashrc Normal file
View File

@ -0,0 +1,122 @@
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth
# append to the history file, don't overwrite it
shopt -s histappend
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize
# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
alias dir='dir --color=auto'
alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
# Enable vi mode
set -o vi
function _prompt_first_line {
local exit_code=$?
if [ "$exit_code" = "0" ]; then
exit_code=
else
# If the last command failed, display its error code at the right
case $exit_code in
129) exit_code="SIGHUP" ;; # 128 + 1
130) exit_code="SIGINT" ;; # 128 + 2
131) exit_code="SIGQUIT" ;; # 128 + 3
132) exit_code="SIGILL" ;; # 128 + 4
133) exit_code="SIGTRAP" ;; # 128 + 5
134) exit_code="SIGABRT" ;; # 128 + 6
134) exit_code="SIGIOT" ;; # 128 + 6
135) exit_code="SIGBUS" ;; # 128 + 7
136) exit_code="SIGFPE" ;; # 128 + 8
137) exit_code="SIGKILL" ;; # 128 + 9
138) exit_code="SIGUSR1" ;; # 128 + 10
139) exit_code="SIGSEGV" ;; # 128 + 11
140) exit_code="SIGUSR2" ;; # 128 + 12
141) exit_code="SIGPIPE" ;; # 128 + 13
142) exit_code="SIGALRM" ;; # 128 + 14
143) exit_code="SIGTERM" ;; # 128 + 15
144) exit_code="SIGSTKFLT" ;; # 128 + 16
145) exit_code="SIGCHLD" ;; # 128 + 17
146) exit_code="SIGCONT" ;; # 128 + 18
147) exit_code="SIGSTOP" ;; # 128 + 19
148) exit_code="SIGTSTP" ;; # 128 + 20
149) exit_code="SIGTTIN" ;; # 128 + 21
150) exit_code="SIGTTOU" ;; # 128 + 22
151) exit_code="SIGURG" ;; # 128 + 23
152) exit_code="SIGXCPU" ;; # 128 + 24
153) exit_code="SIGXFSZ" ;; # 128 + 25
154) exit_code="SIGVTALRM" ;; # 128 + 26
155) exit_code="SIGPROF" ;; # 128 + 27
156) exit_code="SIGWINCH" ;; # 128 + 28
157) exit_code="SIGIO" ;; # 128 + 29
158) exit_code="SIGPWR" ;; # 128 + 30
159) exit_code="SIGSYS" ;; # 128 + 31
esac
exit_code=" \e[1m\e[31m$exit_code\e[0m"
fi
local time=$(date +%H:%M:%S)
local dir=$PWD
[[ "$dir" =~ ^"$HOME"(/|$) ]] && dir="~${dir#$HOME}"
# TODO: virtualenv
local grey="\e[38;5;244m"
local reset="\e[0m"
local blue="\e[38;5;37m"
echo -e "$grey$time$reset $blue$dir$reset$exit_code"
}
PROMPT_COMMAND=_prompt_first_line
yellow="\001\e[38;5;3m\002"
grey="\001\e[38;5;244m\002"
reset="\001\e[0m\002"
PS1="$yellow\u$reset@$grey\h$reset "
# Setup environment variables
export PATH=$HOME/.local/bin:$PATH
if command -v nvim > /dev/null; then
export EDITOR=nvim
elif command -v vim > /dev/null; then
export EDITOR=vim
elif command -v vi > /dev/null; then
export EDITOR=vi
fi

View File

@ -4,7 +4,6 @@
ansible_distribution == "Ubuntu" and
ansible_distribution_version == "18.04"
}}'
- debug: msg={{use_github}}
- when: use_github
include_tasks: deb.yaml

View File

@ -0,0 +1,6 @@
---
- name: install dnf package
become: true
dnf:
name: bat
state: latest

View File

@ -1,5 +1,10 @@
---
- name: install chocolatey package
- name: remove chocolatey package
win_chocolatey:
name: Bat
state: latest
state: absent
- name: install scoop package
community.windows.win_scoop:
name: bat
state: present

View File

@ -2,6 +2,7 @@
- name: get latest github release
uri:
url: https://api.github.com/repos/sharkdp/bat/releases/latest
headers: '{{github_auth_headers}}'
register: latest
- set_fact:
@ -50,6 +51,7 @@
get_url:
url: '{{asset.browser_download_url}}'
dest: '{{bat_deb}}'
environment: '{{proxy_environment}}'
- name: install .deb file
when: installed_version is not defined or installed_version != latest_version

View File

@ -0,0 +1,16 @@
---
- assert:
that: ansible_os_family != 'Darwin'
- name: install chocolatey package
when: ansible_os_family == 'Windows'
win_chocolatey:
name: Cider
state: latest
- name: install flatpak package
when: ansible_os_family != 'Windows'
become: true
flatpak:
name: sh.cider.Cider
state: latest

View File

@ -0,0 +1,6 @@
---
- name: install dnf package
become: true
dnf:
name: curl
state: latest

View File

@ -1,5 +1,10 @@
---
- name: install chocolatey package
- name: remove chocolatey package
win_chocolatey:
name: curl
state: latest
state: absent
- name: install scoop package
community.windows.win_scoop:
name: curl
state: present

View File

@ -0,0 +1,5 @@
---
- name: create .editrc config file
template:
src: editrc
dest: '{{ansible_env.HOME}}/.editrc'

View File

@ -0,0 +1,3 @@
# Enable vi mode
lldb:bind -v
lldb:bind ^I lldb_complete

32
roles/fd/tasks/main.yaml Normal file
View File

@ -0,0 +1,32 @@
---
- name: install apt package
when: ansible_os_family == 'Debian'
become: true
apt:
name: fd-find
state: latest
- name: install dnf package
when: ansible_os_family == 'RedHat'
become: true
dnf:
name: fd-find
state: latest
- name: install Homebrew package
when: ansible_os_family == 'Darwin'
homebrew:
name: fd
state: latest
- name: remove chocolatey package
when: ansible_os_family == 'Windows'
win_chocolatey:
name: fd
state: absent
- name: install scoop package
when: ansible_os_family == 'Windows'
community.windows.win_scoop:
name: fd
state: present

View File

@ -0,0 +1,14 @@
---
- name: install chocolatey package
win_chocolatey:
name: ferdium
state: latest
- set_fact:
ferdium_exe: 'C:/Program Files/Ferdium/Ferdium.exe'
- name: create start menu shortcut
win_shortcut:
src: '{{ferdium_exe}}'
dest: '{{ansible_env.ProgramData}}/Microsoft/Windows/Start Menu/Programs/Ferdium.lnk'
icon: '{{ferdium_exe}},0'

View File

@ -0,0 +1,17 @@
---
- name: install homebrew package
when: ansible_os_family == 'Darwin'
homebrew_cask:
name: ferdium
state: latest
- when: ansible_os_family == 'Windows'
include_tasks: Windows.yaml
- name: install flatpak package
when: ansible_os_family != 'Windows' and
ansible_os_family != 'Darwin'
become: true
flatpak:
name: org.ferdium.Ferdium
state: latest

View File

@ -0,0 +1,52 @@
---
- name: remove snap package
become: true
snap:
name: firefox
state: absent
- name: create keyrings directory
become: true
file:
path: /etc/apt/keyrings
mode: '755'
state: directory
- name: install mozilla repo keyring
become: true
get_url:
url: https://packages.mozilla.org/apt/repo-signing-key.gpg
dest: /etc/apt/keyrings/packages.mozilla.org.asc
environment: '{{proxy_environment}}'
- name: add mozilla apt repo
become: true
copy:
content: >-
deb [signed-by=/etc/apt/keyrings/packages.mozilla.org.asc]
https://packages.mozilla.org/apt mozilla main
dest: /etc/apt/sources.list.d/mozilla.list
- name: pin mozilla package
become: true
copy:
content: |
Package: *
Pin: origin packages.mozilla.org
Pin-Priority: 1000
dest: /etc/apt/preferences.d/mozilla
- name: install mozilla package
become: true
apt:
name: firefox
state: latest
allow_downgrade: true
update_cache: true
- name: install gnome shell integration
when: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP"
become: true
apt:
name: chrome-gnome-shell
state: latest

View File

@ -1,2 +1,5 @@
---
- include_tasks: '{{ansible_os_family}}.yaml'
- include_tasks: Windows.yaml
when: ansible_os_family == 'Windows'
- include_tasks: Ubuntu.yaml
when: ansible_distribution == 'Ubuntu'

View File

@ -0,0 +1,6 @@
---
- name: install apt package
become: true
apt:
name: flatpak
state: latest

View File

@ -0,0 +1,6 @@
---
- name: install dnf package
become: true
dnf:
name: flatpak
state: latest

View File

@ -0,0 +1,9 @@
---
- include_tasks: '{{ansible_os_family}}.yaml'
- name: add flathub repository remote
become: true
flatpak_remote:
name: flathub
state: present
flatpakrepo_url: https://dl.flathub.org/repo/flathub.flatpakrepo

View File

@ -0,0 +1,3 @@
---
- name: refresh font cache
command: fc-cache

View File

@ -0,0 +1,5 @@
---
- name: install Caskaydia Cove Nerd Font
homebrew_cask:
name: font-caskaydia-cove-nerd-font
state: latest

View File

@ -0,0 +1,58 @@
---
- name: stat version file
stat:
path: '{{ansible_env.HOME}}/.local/share/fonts/CaskaydiaCove.version'
register: version_file
- name: slurp version
when: version_file.stat.exists
slurp:
path: '{{ansible_env.HOME}}/.local/share/fonts/CaskaydiaCove.version'
register: version_slurp
- when: version_file.stat.exists
set_fact:
version: '{{version_slurp.content | b64decode}}'
- name: get latest release
uri:
url: https://api.github.com/repos/ryanoasis/nerd-fonts/releases/latest
headers: '{{github_auth_headers}}'
register: latest
- set_fact:
needs_installed:
'{{ not version_file.stat.exists or version.strip() != latest.json.tag_name }}'
asset: '{{ latest.json.assets | to_json | from_json |
json_query("[?contains(name, `CascadiaCode.zip`)] | [0]") }}'
- name: create user fonts directory
when: needs_installed
file:
path: '{{ansible_env.HOME}}/.local/share/fonts'
state: directory
- name: download Caskaydia Cove Nerd Font archive
when: needs_installed
get_url:
url: '{{asset.browser_download_url}}'
dest: '{{ansible_env.HOME}}/.local/share/fonts/tmp.zip'
environment: '{{proxy_environment}}'
- name: install Caskaydia Cove Nerd Font
when: needs_installed
unarchive:
src: '{{ansible_env.HOME}}/.local/share/fonts/tmp.zip'
dest: '{{ansible_env.HOME}}/.local/share/fonts'
notify: refresh font cache
- name: write version file
copy:
content: '{{latest.json.tag_name}}'
dest: '{{ansible_env.HOME}}/.local/share/fonts/CaskaydiaCove.version'
- name: remove Caskaydia Cove Nerd Font archive
when: needs_installed
file:
path: '{{ansible_env.HOME}}/.local/share/fonts/tmp.zip'
state: absent

View File

@ -1,8 +1,5 @@
---
- assert:
that: ansible_os_family == "Windows"
- name: install chocolatey package
win_chocolatey:
name: prusaslicer
name: nerd-fonts-CascadiaCode
state: latest

View File

@ -0,0 +1,7 @@
---
- when: ansible_os_family == 'Darwin'
include_tasks: 'Darwin.yaml'
- when: ansible_os_family == 'Windows'
include_tasks: 'Windows.yaml'
- when: ansible_os_family != 'Darwin' and ansible_os_family != 'Windows'
include_tasks: 'Linux.yaml'

View File

@ -0,0 +1,6 @@
---
- name: install apt package
become: true
apt:
name: fzf
state: latest

View File

@ -9,5 +9,16 @@
- name: create symbolic links
file:
state: link
src: ~/.local/src/fzf/bin/fzf
dest: ~/.local/bin/fzf
src: '{{ item.src }}'
dest: '{{ item.dest }}'
with_items:
- src: ~/.local/src/fzf/bin/fzf
dest: ~/.local/bin/fzf
- src: ~/.local/src/fzf/bin/fzf-tmux
dest: ~/.local/bin/fzf-tmux
- src: ~/.local/src/fzf/bin/fzf-preview.sh
dest: ~/.local/bin/fzf-preview.sh
- src: ~/.local/src/fzf/man/man1/fzf.1
dest: ~/.local/share/man/man1/fzf.1
- src: ~/.local/src/fzf/man/man1/fzf-tmux.1
dest: ~/.local/share/man/man1/fzf-tmux.1

View File

@ -1,6 +1,8 @@
---
- name: install apt package
become: true
apt:
name: fzf
state: latest
- when: ansible_distribution == 'Ubuntu' and
ansible_distribution_version is version('22.04', '<=')
include_tasks: Debian-old.yaml
- when: not (ansible_distribution == 'Ubuntu' and
ansible_distribution_version is version('22.04', '<='))
include_tasks: Debian-apt.yaml

View File

@ -0,0 +1,6 @@
---
- name: install dnf package
become: true
dnf:
name: fzf
state: latest

View File

@ -1,5 +1,10 @@
---
- name: install chocolatey package
- name: remove chocolatey package
win_chocolatey:
name: fzf
state: latest
state: absent
- name: install scoop package
community.windows.win_scoop:
name: fzf
state: present

6
roles/gdb/RedHat.yaml Normal file
View File

@ -0,0 +1,6 @@
---
- name: install dnf package
become: true
dnf:
name: gdb
state: latest

View File

@ -0,0 +1,5 @@
---
- name: install homebrew package
homebrew:
name: gh
state: latest

View File

@ -0,0 +1,38 @@
---
- set_fact:
arch_map:
aarch64: arm64
armv6l: armhf
armv7l: armhf
i386: i386
x86_64: amd64
- set_fact:
arch: '{{ [ansible_architecture] | map("extract", arch_map) | first }}'
- name: download apt repository key
become: true
get_url:
url: https://cli.github.com/packages/githubcli-archive-keyring.gpg
dest: /usr/share/keyrings/githubcli-archive-keyring.gpg
mode: 0644
environment: '{{proxy_environment}}'
- name: add apt repository list
become: true
apt_repository:
filename: github-cli
repo: 'deb [arch={{arch}} signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main'
state: present
- name: install apt package
become: true
apt:
name: gh
state: latest
update_cache: true
register: gh_apt
- name: install zsh completions
when: gh_apt.changed
become: true
shell: gh completion -s zsh > /usr/local/share/zsh/site-functions/_gh

View File

@ -0,0 +1,13 @@
---
- name: add dnf repository
become: true
get_url:
url: https://cli.github.com/packages/rpm/gh-cli.repo
dest: /etc/yum.repos.d/gh-cli.repo
environment: '{{proxy_environment}}'
- name: install dnf package
become: true
dnf:
name: gh
state: latest

View File

@ -0,0 +1,10 @@
---
- name: remove chocolatey package
win_chocolatey:
name: gh
state: absent
- name: install scoop package
community.windows.win_scoop:
name: gh
state: present

2
roles/gh/tasks/main.yaml Normal file
View File

@ -0,0 +1,2 @@
---
- include_tasks: '{{ansible_os_family}}.yaml'

View File

@ -2,6 +2,7 @@
- name: get json containing all releases
win_uri:
url: 'https://api.github.com/repos/git-for-windows/git/releases/tags/v{{git_version}}.windows.1'
headers: '{{github_auth_headers}}'
return_content: true
register: git_release
@ -18,6 +19,7 @@
win_get_url:
url: '{{git_asset.browser_download_url}}'
dest: '{{git_installer_path}}'
environment: '{{proxy_environment}}'
- name: run installer command
win_command:

View File

@ -31,16 +31,12 @@
- include_tasks: Windows-installer.yaml
when: git_run_installer
# NOTE: If this is failing on first install of git, restart the sshd service.
- name: clone config repos
win_git:
repo: '{{item.repo}}'
dest: '{{ansible_env.USERPROFILE}}/.config/{{item.name}}'
version: master
with_items: '{{git_config_repos}}'
- win_owner:
path: '{{ansible_env.USERPROFILE}}/.config/{{item.name}}'
user: Benie
recurse: true
version: main
with_items: '{{git_config_repos}}'
# - TODO: install pip packages

View File

@ -3,7 +3,7 @@
git:
repo: '{{item.repo}}'
dest: '~/.config/{{item.name}}'
version: master
version: main
with_items: '{{git_config_repos}}'
- name: install homebrew packages
@ -18,8 +18,4 @@
extra_args: --user
state: latest
- name: create symbolic links
file:
state: link
src: ~/.config/git/_git-changes
dest: ~/.local/share/zsh/site-functions/_git-changes
- include_tasks: ~/.config/git/tasks.yaml

View File

@ -1,8 +1,8 @@
---
git_config_repos:
- repo: git@code.infektor.net:config/git.git
- repo: git@git.infektor.net:config/git.git
name: git
- repo: git@code.infektor.net:benie/config.git
- repo: git@git.infektor.net:benie/config.git
name: private
git_pip_packages:
- git+https://github.com/kbenzie/git-issue.git

View File

@ -0,0 +1,50 @@
---
- name: stat tea executable
stat:
path: '{{tea_package_exe}}'
register: tea
- name: get installed version
when: tea.stat.exists
command: '{{tea_package_exe}} --version'
register: tea_version_string
- name: extract version number
when: tea.stat.exists
set_fact:
installed_version: "{{tea_version_string.stdout |
regex_search('^.*(\\d+\\.\\d+\\.\\d+).*golang.*$', '\\1') }}"
- name: get latest release json
uri:
url: https://gitea.com/api/v1/repos/gitea/tea//releases/latest
register: latest
- name: check installed version
set_fact:
install_required: >
{{not tea.stat.exists or latest.json.name != 'v' + installed_version[0]}}
asset: '{{latest.json.assets | json_query(tea_asset_query)}}'
- name: create package directory
when: install_required
become: true
file:
state: directory
path: '{{tea_package_dir}}/bin'
- name: download package
when: install_required
become: true
get_url:
url: '{{asset.browser_download_url}}'
dest: '{{tea_package_exe}}'
mode: '0755'
environment: '{{proxy_environment}}'
- name: install package
when: install_required
become: true
command:
cmd: 'stow --no-folding --target /usr/local .'
chdir: '{{tea_package_dir}}'

View File

@ -0,0 +1,12 @@
---
- when: ansible_os_family != 'Darwin' and ansible_os_family != 'Windows'
include_tasks: Linux.yaml
- when: ansible_os_family == 'Windows'
include_tasks: Windows.yaml
- name: install homebrew package
when: ansible_os_family == 'Darwin'
homebrew:
name: tea
state: latest

View File

@ -0,0 +1,4 @@
---
tea_package_dir: /usr/local/stow/tea
tea_package_exe: '{{tea_package_dir}}/bin/tea'
tea_asset_query: '[?contains(name, `tea-`)] | [?contains(name, `linux-amd64`)] | [0]'

View File

@ -0,0 +1,5 @@
---
- name: install homebrew package
homebrew:
name: glab
state: latest

View File

@ -0,0 +1,75 @@
---
- set_fact:
glab: /usr/bin/glab
- name: stat the executable
stat:
path: '{{glab}}'
register: stat_glab
- name: get install version
when: stat_glab.stat.exists
command: '{{glab}} --version'
register: glab_version_output
changed_when: false
- when: stat_glab.stat.exists
set_fact:
glab_version: '{{glab_version_output.stdout | replace("glab version ", "v")}}'
- set_fact:
gitlab_api: 'https://gitlab.com/api/v4'
project_id: 'gitlab-org%2Fcli'
- name: get list of gitlab releases
uri:
url:
'{{gitlab_api}}/projects/{{project_id}}/releases'
register: releases
- set_fact:
latest: '{{releases.json[0]}}'
latest_version: '{{releases.json[0].tag_name}}'
query: >
[?contains(name, `glab`)] |
[?contains(name, `linux`)] |
[?contains(name, `{{
{'x86_64': 'amd64', 'arm64': 'arm64'}[ansible_machine]}}.deb`)] | [0]
- set_fact:
asset: '{{latest.assets.links|json_query(query)}}'
- name: create download directory
when: glab_version is not defined or glab_version != latest_version
tempfile:
state: directory
suffix: glab
register: tempdir
- name: download .deb file
when: glab_version is not defined or glab_version != latest_version
get_url:
url: '{{asset.url}}'
dest: '{{tempdir.path}}/glab.deb'
environment: '{{proxy_environment}}'
- name: install .deb file
when: glab_version is not defined or glab_version != latest_version
become: true
apt:
deb: '{{tempdir.path}}/glab.deb'
- name: remove download directory
when: glab_version is not defined or glab_version != latest_version
file:
state: absent
path: '{{tempdir.path}}'
- name: get zsh completions source
command: glab completion -s zsh
register: glab_zsh_completions
changed_when: false
- name: install zsh completions
become: true
copy:
content: '{{glab_zsh_completions.stdout}}'
dest: /usr/local/share/zsh/site-functions/_glab

View File

@ -0,0 +1,6 @@
---
- name: install dnf package
become: true
dnf:
name: glab
state: latest

View File

@ -0,0 +1,12 @@
---
- name: remove chocolatey package
win_chocolatey:
name:
- glab
- glab.portable
state: absent
- name: install scoop package
community.windows.win_scoop:
name: glab
state: present

View File

@ -0,0 +1,2 @@
---
- include_tasks: '{{ansible_os_family}}.yaml'

View File

@ -0,0 +1,18 @@
---
- name: ubuntu dock disable dock-fixed
gsettings:
schema: org.gnome.shell.extensions.dash-to-dock
key: dock-fixed
value: 'false'
- name: ubuntu dock set dock-position to bottom
gsettings:
schema: org.gnome.shell.extensions.dash-to-dock
key: dock-position
value: "'BOTTOM'"
- name: ubuntu dock disable extend-height
gsettings:
schema: org.gnome.shell.extensions.dash-to-dock
key: extend-height
value: 'false'

View File

@ -0,0 +1,71 @@
---
- assert:
that: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP"
- name: install packages
become: true
package:
name:
- gnome-tweaks
- gnome-themes-extra
state: latest
- name: prefer dark mode
gsettings:
schema: org.gnome.desktop.interface
key: color-scheme
value: "'prefer-dark'"
- name: disable activate-window-menu keybinding
gsettings:
schema: org.gnome.desktop.wm.keybindings
key: activate-window-menu
value: '@as []'
- name: disable switch-input-source keybinding
gsettings:
schema: org.gnome.desktop.wm.keybindings
key: switch-input-source
value: '@as []'
- name: disable switch-input-source-backward keybinding
gsettings:
schema: org.gnome.desktop.wm.keybindings
key: switch-input-source-backward
value: '@as []'
# NOTE: Use this command to see default keybindings
# gsettings list-recursively | grep -i -E 'media-keys|keybindings'
# NOTE: Use this command to inspect the current state of the custom keybindings
# dconf dump / | sed -n '/\[org.gnome.settings-daemon.plugins.media-keys/,/^$/p'
- name: 1password quick access custom keybinding
dconf:
state: present
key: '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/{{item.key}}'
value: '{{item.value}}'
with_items:
- {key: 'binding', value: "'<Shift><Alt>space'"}
- {key: 'command', value: "'1password --quick-access'"}
- {key: 'name', value: "'1Password Quick Access'"}
- name: ulauncher toggle custom keybinding
dconf:
state: present
key: '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/{{item.key}}'
value: '{{item.value}}'
with_items:
- {key: 'binding', value: "'<Alt>space'"}
- {key: 'command', value: "'ulauncher-toggle'"}
- {key: 'name', value: "'Ulauncher Toggle'"}
- name: list of entries defining custom-keybindings
dconf:
state: present
key: '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings'
value: "['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/']"
- when: ansible_distribution == 'Ubuntu'
include_tasks: Ubuntu.yaml
# TODO: install gnome extensions
# TODO: /org/gnome/shell/extensions/quake-terminal/terminal-shortcut = ['<Super>space']

View File

@ -0,0 +1,8 @@
---
- assert:
that: ansible_os_family == 'Darwin'
- name: install homebrew package
homebrew_cask:
name: hiddenbar
state: latest

View File

@ -0,0 +1,6 @@
---
- name: install dnf package
become: true
dnf:
name: htop
state: latest

View File

@ -0,0 +1,10 @@
---
- assert:
that: ansible_os_family == "Darwin"
- name: install homebrew package
homebrew_cask:
name: iterm2
state: latest
# TODO: Configure stuff, somehow?

View File

@ -2,11 +2,15 @@
- name: get latest github release
uri:
url: https://api.github.com/repos/jmespath/jp/releases/latest
headers: '{{github_auth_headers}}'
register: latest
# TODO: Support arm64
- set_fact:
asset_query: '[?contains(name, `jp-darwin-amd64`)] | [0]'
arch: '{{ [ansible_architecture] |
map("extract", { "arm64": "arm64", "x86_64": "amd64" }) | first }}'
- set_fact:
asset_query: '[?contains(name, `jp-darwin-{{arch}}`)] | [0]'
assets: '{{latest.json.assets}}'
latest_version: '{{latest.json.tag_name}}'
jp_exe: '{{ansible_env.HOME}}/.local/bin/jp'
@ -14,7 +18,7 @@
- name: check if already installed
stat:
path: '{{jp_exe}}'
register: jp_exe
register: jp_stat
- name: get installed version
when: jp_stat.stat.exists == True
@ -36,3 +40,4 @@
url: '{{asset.browser_download_url}}'
dest: '{{jp_exe}}'
mode: +x
environment: '{{proxy_environment}}'

View File

@ -0,0 +1,53 @@
---
- name: stat executable
stat:
path: '{{ansible_env.HOME}}/.local/bin/jp'
register: jp_stat
- name: get installed version
when: jp_stat.stat.exists
command: jp --version
changed_when: false
register: jp_version
- name: extract installed version
when: jp_stat.stat.exists
set_fact:
jp_installed_version:
'{{jp_version.stdout.strip() | regex_replace("^.*(\d+\.\d+\.\d+).*$", "\1")}}'
- name: get latest release
uri:
url: 'https://api.github.com/repos/jmespath/jp/releases/latest'
headers: '{{github_auth_headers}}'
register: latest
- name: determine if jp needs installed
set_fact:
jp_needs_installed:
'{{not jp_stat.stat.exists or jp_installed_version != latest.json.tag_name}}'
arch_dict: {x86_64: amd64, arm64: arm64}
- name: select asset name
when: jp_needs_installed
set_fact:
asset_query:
'[?contains(name, `jp-linux-{{arch_dict[ansible_architecture]}}`)] | [0]'
- name: select asset
when: jp_needs_installed
set_fact:
asset: '{{latest.json.assets | to_json | from_json | json_query(asset_query)}}'
- name: create directory
when: jp_needs_installed
file:
path: '{{ansible_env.HOME}}/.local/bin'
state: directory
- name: install executable
when: jp_needs_installed
get_url:
url: '{{asset.browser_download_url}}'
dest: '{{ansible_env.HOME}}/.local/bin/jp'
mode: '0755'
environment: '{{proxy_environment}}'

View File

@ -1,5 +1,6 @@
---
- name: install apt package
become: true
apt:
name: jq
state: latest

View File

@ -0,0 +1,6 @@
---
- name: install dnf package
become: true
dnf:
name: jq
state: latest

View File

@ -1,5 +1,10 @@
---
- name: install chocolatey package
- name: remove chocolatey package
win_chocolatey:
name: jq
state: latest
state: absent
- name: install scoop package
community.windows.win_scoop:
name: jq
state: present

View File

@ -0,0 +1,5 @@
---
- name: install homebrew package
homebrew_cask:
name: kitty
state: latest

View File

@ -0,0 +1,108 @@
---
- name: remove apt package
become: true
apt:
name: kitty
state: absent
- name: get latest version
uri:
url: https://api.github.com/repos/kovidgoyal/kitty/releases/latest
headers: '{{github_auth_headers}}'
register: latest
- set_fact:
kitty_latest_version: '{{latest.json.tag_name[1:]}}'
kitty_exe: /usr/local/bin/kitty
kitty_package_dir: /usr/local/stow/kitty
- name: check if already installed
stat:
path: '{{kitty_exe}}'
register: kitty
- name: get installed version
when: kitty.stat.exists
command: '{{kitty_exe}} --version'
register: kitty_version
changed_when: false
- when: kitty.stat.exists
set_fact:
kitty_install_version:
'{{kitty_version.stdout | regex_replace("^.*(\d+\.\d+\.\d+).*$", "\1")}}'
- set_fact:
kitty_asset_query: >
[? contains(name,
`kitty-{{kitty_latest_version}}-{{ansible_architecture}}.txz`)] | [0]
- set_fact:
kitty_install_required: >
{{ kitty_install_version is not defined or
kitty_latest_version != kitty_install_version }}
kitty_asset: "{{ latest.json.assets | json_query(kitty_asset_query) }}"
- name: uninstall package
when: kitty_install_required and kitty.stat.exists
become: true
command:
cmd: 'stow --delete --target /usr/local .'
chdir: '{{kitty_package_dir}}'
- name: remove outdated package
when: kitty_install_required and kitty.stat.exists
become: true
file:
state: absent
path: '{{kitty_package_dir}}'
- set_fact:
kitty_package_archive: '{{kitty_package_dir}}/{{kitty_asset.name}}'
- name: create package directory
become: true
file:
state: directory
path: '{{kitty_package_dir}}'
- name: download package
when: kitty_install_required
become: true
get_url:
url: '{{kitty_asset.browser_download_url}}'
dest: '{{kitty_package_archive}}'
environment: '{{proxy_environment}}'
- name: decompress package
when: kitty_install_required
become: true
unarchive:
src: '{{kitty_package_archive}}'
dest: '{{kitty_package_dir}}'
owner: root
group: staff
- name: remove package archive
when: kitty_install_required
become: true
file:
state: absent
path: '{{kitty_package_archive}}'
# FIXME: This is bound to break something somewhere but on Ubuntu 22.04 this
# file breaks a bunch of other stuff when the kitty package in installed in
# /usr/local with stow so we delete it before stowing.
- name: remove conflicting library
when: kitty_install_required
become: true
file:
state: absent
path: '{{kitty_package_dir}}/lib/libglib-2.0.so.0'
- name: install package
when: kitty_install_required
become: true
command:
cmd: "stow --no-folding --target /usr/local --ignore='lib/.*$' ."
chdir: '{{kitty_package_dir}}'

View File

@ -0,0 +1,6 @@
---
- name: install dnf package
become: true
dnf:
name: kitty
state: latest

View File

@ -0,0 +1,8 @@
---
- include_tasks: '{{ansible_os_family}}.yaml'
- name: clone config repo
git:
repo: git@git.infektor.net:config/kitty.git
dest: ~/.config/kitty
version: main

View File

@ -1,5 +1,17 @@
---
- name: slurp /etc/os-release
slurp:
src: /etc/os-release
register: os_release_slurp
- set_fact:
os_release: "{{ os_release_slurp.content |
b64decode | trim() | replace('=', ': ') | from_yaml }}"
- include_tasks: Ubuntu.yaml
when: "'ID_LIKE' in os_release and os_release.ID_LIKE == 'ubuntu debian'"
- name: install apt packages
when: "'ID_LIKE' not in os_release"
become: true
apt:
name:

View File

@ -0,0 +1,10 @@
---
- name: install dnf packages
become: true
dnf:
name:
- clang
- clang-tools-extra
- git-clang-format
- llvm
state: latest

View File

@ -2,21 +2,69 @@
- name: get latest stable github release
uri:
url: https://api.github.com/repos/llvm/llvm-project/releases/latest
headers: '{{github_auth_headers}}'
register: llvm_latest
- name: read /etc/os-release
slurp:
src: /etc/os-release
register: os_release_b64
- name: extract UBUNTU_CODENAME=<name> to support dirivitive distros
set_fact:
ubuntu_codename: >-
{{
os_release_b64.content | b64decode |
regex_search('UBUNTU_CODENAME=.*') |
replace('UBUNTU_CODENAME=', '')
}}
- set_fact:
llvm_major_version:
'{{llvm_latest.json.tag_name[8:llvm_latest.json.tag_name.find(".")]}}'
- set_fact:
llvm_apt_repo_url:
'http://apt.llvm.org/{{ansible_distribution_release}}/'
'http://apt.llvm.org/{{ubuntu_codename}}/'
llvm_apt_category:
'llvm-toolchain-{{ansible_distribution_release}}-{{llvm_major_version}}'
'llvm-toolchain-{{ubuntu_codename}}-{{llvm_major_version}}'
keyring: '/etc/apt/keyrings/llvm.asc'
- name: remove old keyring
when: '"WSL" not in ansible_kernel'
become: true
apt_key:
url: https://apt.llvm.org/llvm-snapshot.gpg.key
id: 6084F3CF814B57C1CF12EFD515CF4D18AF4F7421
state: absent
- name: remove old upstream deb repository
become: true
apt_repository:
repo: 'deb {{llvm_apt_repo_url}} {{llvm_apt_category}} main'
state: absent
filename: llvm
update_cache: false
- name: remove old upstream deb-src repository
become: true
apt_repository:
repo: 'deb-src {{llvm_apt_repo_url}} {{llvm_apt_category}} main'
state: absent
filename: llvm
update_cache: false
- name: add apt repository key
become: true
get_url:
url: https://apt.llvm.org/llvm-snapshot.gpg.key
dest: '{{keyring}}'
environment: '{{proxy_environment}}'
- name: add upstream deb repository
become: true
apt_repository:
repo: 'deb {{llvm_apt_repo_url}} {{llvm_apt_category}} main'
repo: >
deb [signed-by={{keyring}}]
{{llvm_apt_repo_url}} {{llvm_apt_category}} main
state: present
filename: llvm
update_cache: false
@ -24,18 +72,13 @@
- name: add upstream deb-src repository
become: true
apt_repository:
repo: 'deb-src {{llvm_apt_repo_url}} {{llvm_apt_category}} main'
repo: >
deb-src [signed-by={{keyring}}]
{{llvm_apt_repo_url}} {{llvm_apt_category}} main
state: present
filename: llvm
update_cache: false
- name: add apt repository key
become: true
apt_key:
url: https://apt.llvm.org/llvm-snapshot.gpg.key
id: 6084F3CF814B57C1CF12EFD515CF4D18AF4F7421
state: present
- name: update apt cache
become: true
apt:

View File

@ -1,5 +1,2 @@
---
- include_tasks: '{{ansible_os_family}}.yaml'
when: ansible_os_family in ['Darwin', 'Windows']
- include_tasks: '{{ansible_distribution}}.yaml'
when: ansible_os_family not in ['Darwin', 'Windows']

View File

@ -0,0 +1,9 @@
---
- assert:
that: ansible_os_family == 'Darwin'
- name: disable creation of .DS_Store in directories
osx_defaults:
domain: com.apple.desktopservices
key: DSDontWriteNetworkStores
value: 'true'

View File

@ -0,0 +1,8 @@
---
- assert:
that: ansible_os_family == 'Darwin'
- name: install app store package
mas:
id: 441258766
state: latest

View File

@ -0,0 +1,8 @@
---
- assert:
that: ansible_os_family == 'Darwin'
- name: install homebrew package
homebrew:
name: mas
state: latest

View File

@ -0,0 +1,14 @@
---
- name: install homebrew package
when: ansible_os_family == 'Darwin'
homebrew_cask:
name: neovide-app
state: latest
- name: install winget package
when: ansible_os_family == 'Winodws'
win_winget:
name: Neovide.Neovide
state: latest
# TODO: install linux package

Some files were not shown because too many files have changed in this diff Show More