Compare commits
17 Commits
8810309515
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| d20cba3e15 | |||
| 27f887b044 | |||
| c70a31b633 | |||
| 80434f1cfa | |||
| 658e35a145 | |||
| 06a4d1b923 | |||
| fe220c231a | |||
| e633da1e7c | |||
| 7823cfb683 | |||
| 0a385259a5 | |||
| cf77532254 | |||
| 7e2a813682 | |||
| 9bd29dcdd2 | |||
| 173c7261b3 | |||
| ee3ea63383 | |||
| d41ea98da0 | |||
| 77a4fdcc16 |
@@ -2,4 +2,5 @@
|
||||
collections_path = collections
|
||||
library = library
|
||||
roles_path = roles
|
||||
result_format = yaml
|
||||
callback_result_format = yaml
|
||||
inject_facts_as_vars = True
|
||||
|
||||
121
library/tuck.py
Normal file
121
library/tuck.py
Normal file
@@ -0,0 +1,121 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
from os import environ
|
||||
from pathlib import Path
|
||||
|
||||
import requests
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
|
||||
DOCUMENTATION = """
|
||||
module: tuck
|
||||
author:
|
||||
- Kenneth Benzie (Benie)
|
||||
short_description: Ansible kmodule for the tuck tool
|
||||
options:
|
||||
name:
|
||||
description:
|
||||
- GitHub project name of the package to manage
|
||||
type: str
|
||||
state:
|
||||
description:
|
||||
- Desired state of the package
|
||||
type: str
|
||||
choices:
|
||||
- "latest"
|
||||
- "absent"
|
||||
"""
|
||||
|
||||
EXAMPLES = """
|
||||
- name: install package
|
||||
tuck:
|
||||
name: kbenzie/tuck
|
||||
state: present
|
||||
|
||||
- name: uninstall package
|
||||
tuck:
|
||||
name: kbenzie/tuck
|
||||
state: absent
|
||||
"""
|
||||
|
||||
|
||||
def installed(tuck) -> list[str]:
|
||||
result = subprocess.run(
|
||||
[tuck, "list", "--quiet"],
|
||||
capture_output=True,
|
||||
check=True,
|
||||
)
|
||||
return result.stdout.decode("utf-8").split("\n")
|
||||
|
||||
|
||||
def present(tuck: Path, package: str) -> dict:
|
||||
if package in installed(tuck):
|
||||
return dict(changed=False)
|
||||
return latest(tuck, package)
|
||||
|
||||
|
||||
def latest(tuck: Path, package: str) -> dict:
|
||||
result = subprocess.run(
|
||||
[tuck, "install", package],
|
||||
capture_output=True,
|
||||
check=True,
|
||||
)
|
||||
return dict(changed=True, stdout=result.stdout)
|
||||
|
||||
|
||||
def absent(tuck: Path, package: str) -> dict:
|
||||
if package not in installed(tuck):
|
||||
return dict(changed=False)
|
||||
result = subprocess.run(
|
||||
[tuck, "remove", package],
|
||||
capture_output=True,
|
||||
check=True,
|
||||
)
|
||||
return dict(changed=True, stdout=result.stdout)
|
||||
|
||||
|
||||
def main():
|
||||
module = AnsibleModule(
|
||||
argument_spec=dict(
|
||||
name=dict(type="str"),
|
||||
state=dict(
|
||||
type="str",
|
||||
choices=[
|
||||
"absent",
|
||||
"latest",
|
||||
"present",
|
||||
],
|
||||
default="present",
|
||||
),
|
||||
),
|
||||
supports_check_mode=False,
|
||||
)
|
||||
|
||||
tuck = Path(environ["HOME"]) / ".local" / "bin" / "tuck"
|
||||
try:
|
||||
if not (tuck.is_file() and os.access(tuck, os.X_OK)):
|
||||
response = requests.get("https://kbenzie.github.io/tuck/get.sh")
|
||||
response.raise_for_status()
|
||||
subprocess.run(
|
||||
["/bin/sh"],
|
||||
input=response.text.encode("utf-8"),
|
||||
check=True,
|
||||
)
|
||||
|
||||
module.exit_json(
|
||||
**{
|
||||
"absent": absent,
|
||||
"present": present,
|
||||
"latest": latest,
|
||||
}[module.params["state"]](tuck, module.params["name"])
|
||||
)
|
||||
|
||||
except requests.RequestException as error:
|
||||
module.fail_json(f"failed to install tuck: {error}")
|
||||
except subprocess.CalledProcessError as error:
|
||||
module.fail_json(f"failed to install tuck: {error.stderr}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -13,3 +13,5 @@
|
||||
when: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP"
|
||||
- role: xremap
|
||||
when: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP"
|
||||
- role: fedora-workstation
|
||||
when: ansible_os_family == 'RedHat' and ansible_distribution == 'Fedora'
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
- vars/environment.yaml
|
||||
roles:
|
||||
- role: gdb
|
||||
- role: nvtop
|
||||
- role: podman
|
||||
- role: system-info
|
||||
when: disable_systemd is not defined
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
- role: ripgrep
|
||||
- role: tidy
|
||||
- role: tree
|
||||
- role: typst
|
||||
- role: watch
|
||||
- role: wget
|
||||
- role: yq
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
- role: jq
|
||||
- role: ripgrep
|
||||
- role: tree
|
||||
- role: typst
|
||||
- role: yq
|
||||
|
||||
- role: llvm
|
||||
|
||||
12
playbooks/macOS-work.yaml
Normal file
12
playbooks/macOS-work.yaml
Normal file
@@ -0,0 +1,12 @@
|
||||
---
|
||||
- import_playbook: UnixCLI.yaml
|
||||
- hosts: localhost
|
||||
vars_files:
|
||||
- vars/environment.yaml
|
||||
roles:
|
||||
- role: system-info
|
||||
- role: fonts
|
||||
- role: iterm
|
||||
- role: kitty
|
||||
- role: neovide
|
||||
- role: macos
|
||||
@@ -16,7 +16,7 @@
|
||||
- role: iterm
|
||||
- role: kitty
|
||||
- role: neovide
|
||||
- role: magnet
|
||||
- role: rectangle
|
||||
- role: windows-app
|
||||
- role: viscosity
|
||||
|
||||
|
||||
16
roles/fedora-workstation/tasks/main.yaml
Normal file
16
roles/fedora-workstation/tasks/main.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
---
|
||||
- assert:
|
||||
that: ansible_os_family == 'RedHat' and ansible_distribution == 'Fedora'
|
||||
|
||||
- name: install non-free gstreamer plugins
|
||||
become: true
|
||||
dnf:
|
||||
state: latest
|
||||
allowerasing: true
|
||||
name:
|
||||
- ffmpeg
|
||||
- gstreamer1-plugins-bad-free
|
||||
- gstreamer1-plugins-bad-freeworld
|
||||
- gstreamer1-plugins-base
|
||||
- gstreamer1-plugins-good
|
||||
- gstreamer1-plugins-ugly
|
||||
14
roles/gemini-cli/tasks/main.yaml
Normal file
14
roles/gemini-cli/tasks/main.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
---
|
||||
- name: install homebrew package
|
||||
when: ansible_os_family == 'Darwin'
|
||||
homebrew:
|
||||
state: latest
|
||||
name: gemini-cli
|
||||
|
||||
- name: install npm package
|
||||
when: ansible_os_family != 'Darwin'
|
||||
become: true
|
||||
community.general.npm:
|
||||
name: '@google/gemini-cli'
|
||||
state: latest
|
||||
global: true
|
||||
@@ -33,6 +33,8 @@
|
||||
key: switch-input-source-backward
|
||||
value: '@as []'
|
||||
|
||||
# TODO: window full screen toggle keybinding
|
||||
|
||||
# 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
|
||||
|
||||
29
roles/hammerspoon/tasks/main.yaml
Normal file
29
roles/hammerspoon/tasks/main.yaml
Normal file
@@ -0,0 +1,29 @@
|
||||
---
|
||||
- set_fact:
|
||||
config_dir: '{{ansible_env.HOME}}/.hammerspoon'
|
||||
|
||||
- name: create config directory
|
||||
file:
|
||||
state: directory
|
||||
path: '{{config_dir}}'
|
||||
|
||||
- name: install config file
|
||||
template:
|
||||
src: init.lua
|
||||
dest: '{{config_dir}}/init.lua'
|
||||
|
||||
- name: install homebrew package
|
||||
homebrew:
|
||||
state: latest
|
||||
name: hammerspoon
|
||||
|
||||
- name: create spoons directory
|
||||
file:
|
||||
state: directory
|
||||
path: '{{config_dir}}/Spoons'
|
||||
|
||||
- name: install SpoonInstall Spoon
|
||||
unarchive:
|
||||
src: https://github.com/Hammerspoon/Spoons/raw/master/Spoons/SpoonInstall.spoon.zip
|
||||
dest: '{{config_dir}}/Spoons'
|
||||
remote_src: yes
|
||||
20
roles/hammerspoon/templates/init.lua
Normal file
20
roles/hammerspoon/templates/init.lua
Normal file
@@ -0,0 +1,20 @@
|
||||
require('hs.ipc')
|
||||
|
||||
hs.loadSpoon("SpoonInstall")
|
||||
spoon.SpoonInstall:andUse("EmmyLua")
|
||||
|
||||
hs.hotkey.bind({'alt', 'cmd'}, 'B', function()
|
||||
hs.application.launchOrFocus('Firefox')
|
||||
end)
|
||||
|
||||
hs.hotkey.bind({'alt', 'cmd'}, 'T', function()
|
||||
hs.application.launchOrFocus('kitty')
|
||||
end)
|
||||
|
||||
hs.hotkey.bind({'alt', 'cmd'}, 'F', function()
|
||||
hs.application.launchOrFocus('Ferdium')
|
||||
end)
|
||||
|
||||
pcall(function()
|
||||
require('local')
|
||||
end)
|
||||
@@ -7,3 +7,5 @@
|
||||
domain: com.apple.desktopservices
|
||||
key: DSDontWriteNetworkStores
|
||||
value: 'true'
|
||||
|
||||
# TODO: ^Space Keyboard Shortcut for switching Input Sources
|
||||
|
||||
@@ -26,4 +26,4 @@
|
||||
state: link
|
||||
src: '~/.local/src/node/node-{{latest.json[0].version}}-linux-x64/bin/{{item}}'
|
||||
dest: '~/.local/bin/{{item}}'
|
||||
with_items: [corepack, node, npm, npx]
|
||||
with_items: [node, npm, npx]
|
||||
|
||||
40
roles/nvtop/tasks/install-appimage.yaml
Normal file
40
roles/nvtop/tasks/install-appimage.yaml
Normal file
@@ -0,0 +1,40 @@
|
||||
---
|
||||
- name: get latest github release
|
||||
uri:
|
||||
url: https://api.github.com/repos/Syllo/nvtop/releases/latest
|
||||
headers: '{{github_auth_headers}}'
|
||||
register: latest
|
||||
|
||||
- set_fact:
|
||||
asset_query: '[?contains(name, `x86_64.AppImage`)] | [0]'
|
||||
assets: '{{latest.json.assets}}'
|
||||
latest_version: '{{latest.json.tag_name}}'
|
||||
nvtop_exe: '/usr/local/bin/nvtop'
|
||||
|
||||
- name: check if already installed
|
||||
stat:
|
||||
path: '{{nvtop_exe}}'
|
||||
register: nvtop_stat
|
||||
|
||||
- name: get installed version
|
||||
when: nvtop_stat.stat.exists == True
|
||||
command: '{{nvtop_exe}} --version'
|
||||
register: nvtop_version_output
|
||||
changed_when: false
|
||||
|
||||
- when: nvtop_stat.stat.exists == True
|
||||
set_fact:
|
||||
installed_version:
|
||||
'{{nvtop_version_output.stdout.strip() | regex_replace("^.*(\d+\.\d+\.\d+).*$", "\1")}}'
|
||||
|
||||
- set_fact:
|
||||
asset: '{{assets | to_json | from_json | json_query(asset_query)}}'
|
||||
|
||||
- name: download executable
|
||||
when: installed_version is not defined or installed_version != latest_version
|
||||
become: true
|
||||
get_url:
|
||||
url: '{{asset.browser_download_url}}'
|
||||
dest: '{{nvtop_exe}}'
|
||||
mode: +x
|
||||
environment: '{{proxy_environment}}'
|
||||
10
roles/nvtop/tasks/main.yaml
Normal file
10
roles/nvtop/tasks/main.yaml
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
- name: install dnf package
|
||||
when: ansible_os_family == 'RedHat'
|
||||
become: true
|
||||
dnf:
|
||||
state: latest
|
||||
name: nvtop
|
||||
|
||||
- when: ansible_os_family != 'RedHat'
|
||||
include_tasks: install-appimage.yaml
|
||||
@@ -2,7 +2,7 @@
|
||||
- assert:
|
||||
that: ansible_os_family == 'Darwin'
|
||||
|
||||
- name: install app store package
|
||||
mas:
|
||||
id: 441258766
|
||||
- name: install homebrew package
|
||||
homebrew_cask:
|
||||
name: rectangle
|
||||
state: latest
|
||||
@@ -1,14 +1,34 @@
|
||||
---
|
||||
- name: install gawk package
|
||||
homebrew:
|
||||
name: gawk
|
||||
state: latest
|
||||
|
||||
- name: install iSMC package
|
||||
tuck:
|
||||
name: dkorunic/iSMC
|
||||
state: latest
|
||||
|
||||
- name: get list of running launchd services
|
||||
command: launchctl list
|
||||
register: launchd_running_services
|
||||
changed_when: false
|
||||
|
||||
- set_fact:
|
||||
system_info_plist_dir: '{{ansible_env.HOME}}/Library/LaunchAgents'
|
||||
|
||||
- name: create plist directory
|
||||
file:
|
||||
state: directory
|
||||
path: '{{system_info_plist_dir}}'
|
||||
|
||||
- name: determine if system-info is currently running
|
||||
set_fact:
|
||||
system_info_debug: true
|
||||
system_info_plist_path: '{{ansible_env.HOME}}/Library/LaunchAgents/system-info.plist'
|
||||
system_info_running: "{{'system-info' in launchd_running_services.stdout}}"
|
||||
system_info_plist_path:
|
||||
'{{system_info_plist_dir}}/system-info.plist'
|
||||
system_info_running:
|
||||
"{{'system-info' in launchd_running_services.stdout}}"
|
||||
|
||||
- name: install system-info launchd plist
|
||||
template:
|
||||
|
||||
76
roles/typst/tasks/Linux.yaml
Normal file
76
roles/typst/tasks/Linux.yaml
Normal file
@@ -0,0 +1,76 @@
|
||||
---
|
||||
- name: get latest github release
|
||||
uri:
|
||||
url: https://api.github.com/repos/typst/typst/releases/latest
|
||||
headers: '{{github_auth_headers}}'
|
||||
register: latest
|
||||
|
||||
- set_fact:
|
||||
asset_name: >-
|
||||
{{
|
||||
{
|
||||
'amd64': 'typst-x86_64-unknown-linux-musl',
|
||||
'x86_64': 'typst-x86_64-unknown-linux-musl',
|
||||
'arm64': 'typst-aarch64-unknown-linux-musl',
|
||||
}[ansible_architecture]
|
||||
}}
|
||||
|
||||
- set_fact:
|
||||
asset_query: '[?contains(name, `{{asset_name}}.tar.xz`)] | [0]'
|
||||
assets: '{{latest.json.assets}}'
|
||||
asset_archive: '{{asset_name}}.tar.xz'
|
||||
latest_version: '{{latest.json.tag_name}}'
|
||||
exe: '{{ansible_env.HOME}}/.local/bin/typst'
|
||||
|
||||
- name: check if already installed
|
||||
stat:
|
||||
path: '{{exe}}'
|
||||
register: stat_exe
|
||||
|
||||
- name: get installed version
|
||||
when: stat_exe.stat.exists == True
|
||||
command: '{{exe}} --version'
|
||||
register: version_output
|
||||
changed_when: false
|
||||
|
||||
- when: stat_exe.stat.exists == True
|
||||
set_fact:
|
||||
installed_version:
|
||||
'v{{version_output.stdout.strip() | regex_replace("^.*(\d+\.\d+\.\d+).*$", "\1")}}'
|
||||
|
||||
- set_fact:
|
||||
asset: '{{assets | to_json | from_json | json_query(asset_query)}}'
|
||||
|
||||
- name: download archive
|
||||
when: installed_version is not defined or installed_version != latest_version
|
||||
get_url:
|
||||
url: '{{asset.browser_download_url}}'
|
||||
dest: '/tmp/{{asset_archive}}'
|
||||
environment: '{{proxy_environment}}'
|
||||
|
||||
- name: extract archive
|
||||
when: installed_version is not defined or installed_version != latest_version
|
||||
unarchive:
|
||||
src: '/tmp/{{asset_archive}}'
|
||||
dest: '/tmp'
|
||||
|
||||
- name: remove archive
|
||||
when: installed_version is not defined or installed_version != latest_version
|
||||
file:
|
||||
state: absent
|
||||
path: '/tmp/{{asset_archive}}'
|
||||
|
||||
- name: copy executable
|
||||
when: installed_version is not defined or installed_version != latest_version
|
||||
copy:
|
||||
src: '/tmp/{{asset_name}}/typst'
|
||||
dest: '{{exe}}'
|
||||
mode: +x
|
||||
|
||||
- name: remove extraced archive
|
||||
when: installed_version is not defined or installed_version != latest_version
|
||||
file:
|
||||
state: absent
|
||||
path: '/tmp/{{asset_archive}}'
|
||||
|
||||
# TODO: install zsh completions
|
||||
15
roles/typst/tasks/main.yaml
Normal file
15
roles/typst/tasks/main.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
---
|
||||
- name: install homebrew package
|
||||
when: ansible_os_family == 'Darwin'
|
||||
homebrew:
|
||||
state: latest
|
||||
name: typst
|
||||
|
||||
- name: install scoop package
|
||||
when: ansible_os_family == 'Windows'
|
||||
community.windows.win_scoop:
|
||||
state: present
|
||||
name: typst
|
||||
|
||||
- when: ansible_os_family != 'Darwin' and ansible_os_family != 'Windows'
|
||||
include_tasks: Linux.yaml
|
||||
Reference in New Issue
Block a user