install.fairie/home/dot_config/task/Taskfile.yml
Brian Zalewski 066c1f36fb Latest
2024-02-15 05:07:49 +00:00

516 lines
26 KiB
YAML

---
# @file System Taskfile Commands
# @brief Defines commands provided by the Install Doctor CLI system
# @description
# The tasks / commands defined in this `Taskfile.yml` are all accessible by using the `task-menu` command.
# `task-menu` is a custom fork created to make browsing through various post-provisioning commands easier
# after setting up a device with Install Doctor. For each of the command below, you can run `task-menu command-name`
# to directly invoke the task. Alternatively, you can simply run `task-menu` from anywhere on the device to open
# an interactive command menu.
#
# ## Documentation
#
# The documentation for each command is defined in this file under the `summary` key. If a command has a `summary` defined
# then, our documentation system will automatically integrate the documentation into our documentation portal. The
# Install Doctor CLI (which is defined in this file) is available for viewing [here](https://install.doctor/docs/cli).
version: '3'
tasks:
bitwarden:
cmds:
- |
### Command to copy to clipboard
COPY="wl-copy"
### Get list of all logins as json
logins="$(bw list items)"
### Grab the name of every login and pip them into fzf
name="$(echo "$logins" | jq -r '.[].name' | fzf)"
### Find the login with the selected name (as a json)
selected="$(echo "$logins" | jq -r ".[] | select(.name == \"$name\")")"
### Print the name of the selected login
echo "Name: $(echo "$selected" | jq -r '.name')"
echo "> Copying Username"
### Copy the username to the clipboard
printf '%s' "$(echo "$selected" | jq -r '.login.username')" | $COPY
echo "Press any key to copy password..."
### Wait for user input before coping the password
read -r
echo "> Copying Password"
### Copy the password to the clipboard
printf '%s' "$(echo "$selected" | jq -r '.login.password')" | $COPY
build:packer:
desc: Builds Packer boxes using all supported virtualization platform / operating system combinations
summary: |
# {{ .AppName}} Packer Build
build:packer:
desc: Builds Packer boxes using all supported virtualization platform / operating system combinations
summary: |
# {{ .AppName}} Packer Build
This command will use Packer to build all the supported virtualization platform / operating system
combinations. This command can be used to test {{ .AppName }} on all the various systems that are
supported.
## Supported Virtualization Platforms
* KVM
* Hyper-V
* VirtualBox
* Parallels
* VMWare
## Supported Operating Systems
* Archlinux
* CentOS
* Debian
* Fedora
* macOS
* Ubuntu
* Windows
## Qubes Support
Qubes can leverage the assets generated from the VirtualBox builds to power HVMs.
cmds:
- |
cd "${XDG_DATA_HOME:-$HOME/.local/share}/bento"
packer init -upgrade ./packer_templates
logg info 'Building Ubuntu VirtualBox VMs'
packer build -var-file=os_pkrvars/ubuntu/ubuntu-22.04-x86_64.pkrvars.hcl ./packer_templates
brave:profile:backup:
desc: Backs up the user's {{ .AppName }} profile to the user's S3-backed Restic repository
vars:
AppName: Brave Browser
RcloneRepository: brave
summary: |
# {{ .AppName }} Profile Backup
This command backups the {{ .AppName }} user data profile to an S3-backed Restic repository if the profile exists. If the repository
has not been initialized then it will initialize it. After you backup the profile, you can restore it with the
`{{ .RcloneRepository }}:profile:restore` command like so:
```
run {{ .RcloneRepository }}:profile:restore
```
The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
The backup uses Restic so all the functionality that Restic offers is available with backups made by this command.
cmds:
- task: profile:backup
vars:
AppName: Brave Browser
ProfileFolderDarwin: ~/Library/Application Support/BraveSoftware/Brave-Browser/Default
ProfileFolderLinux: ~/.config/BraveSoftware/Brave-Browser/Default
ProfileFolderWindows: '%APPDATA%/Local/BraveSoftware/Brave-Browser/Default'
ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
RcloneRepository: brave
brave:profile:restore:
desc: Restores the user's {{ .AppName }} profile from the user's S3-backed Restic repository
vars:
AppName: Brave Browser
RcloneRepository: brave
summary: |
# {{ .AppName }} Profile Import / Restore
This command imports / restores the {{ .AppName }} profile from the S3 Restic repository, if it exists. In order to use this
command for the first time, you should initialize {{ .AppName }} by opening the application. You should also customize
the application by applying your preferred settings (i.e. customize it how you want it to open in the future). Then, after making
any changes you wish to be saved, you can backup the {{ .AppName }} profile to the user's S3 bucket
by running the `{{ .RcloneRepository }}:profile:backup` task. After this is done, you can restore the application
settings by running this command (i.e. `{{ .RcloneRepository }}:profile:restore`).
The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
Since the backup leverages Restic, you can leverage all the functionality that Restic offers if something goes awry.
cmds:
- task: profile:restore
vars:
AppFolder: /Applications/Brave Browser.app
AppName: Brave Browser
ProfileFolderDarwin: ~/Library/Application Support/BraveSoftware/Brave-Browser/Default
ProfileFolderLinux: ~/.config/BraveSoftware/Brave-Browser/Default
ProfileFolderWindows: '%APPDATA%/Local/BraveSoftware/Brave-Browser/Default'
ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
RcloneRepository: brave
chrome:profile:backup:
desc: Backs up the user's {{ .AppName }} profile to the user's S3-backed Restic repository
vars:
AppName: Google Chrome
RcloneRepository: chrome
summary: |
# {{ .AppName }} Profile Backup
This command backups the {{ .AppName }} user data profile to an S3-backed Restic repository if the profile exists. If the repository
has not been initialized then it will initialize it. After you backup the profile, you can restore it with the
`{{ .RcloneRepository }}:profile:restore` command like so:
```
run {{ .RcloneRepository }}:profile:restore
```
The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
The backup uses Restic so all the functionality that Restic offers is available with backups made by this command.
cmds:
- task: profile:backup
vars:
AppName: Google Chrome
ProfileFolderDarwin: ~/Library/Application Support/Google/Chrome/Default
ProfileFolderLinux: ~/.config/google-chrome/default
ProfileFolderWindows: '%LOCALAPPDATA%/Google/Chrome/User Data/Default'
ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
RcloneRepository: chrome
chrome:profile:restore:
desc: Restores the user's {{ .AppName }} profile from the user's S3-backed Restic repository
vars:
AppName: Google Chrome
RcloneRepository: chrome
summary: |
# {{ .AppName }} Profile Import / Restore
This command imports / restores the {{ .AppName }} profile from the S3 Restic repository, if it exists. In order to use this
command for the first time, you should initialize {{ .AppName }} by opening the application. You should also customize
the application by applying your preferred settings (i.e. customize it how you want it to open in the future). Then, after making
any changes you wish to be saved, you can backup the {{ .AppName }} profile to the user's S3 bucket
by running the `{{ .RcloneRepository }}:profile:backup` task. After this is done, you can restore the application
settings by running this command (i.e. `{{ .RcloneRepository }}:profile:restore`).
The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
Since the backup leverages Restic, you can leverage all the functionality that Restic offers if something goes awry.
cmds:
- task: profile:restore
vars:
AppFolder: /Applications/Google Chrome.app
AppName: Google Chrome
ProfileFolderDarwin: ~/Library/Application Support/Google/Chrome/Default
ProfileFolderLinux: ~/.config/google-chrome/default
ProfileFolderWindows: '%LOCALAPPDATA%/Google/Chrome/User Data/Default'
ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
RcloneRepository: chrome
edge:profile:backup:
desc: Backs up the user's {{ .AppName }} profile to the user's S3-backed Restic repository
vars:
AppName: Microsoft Edge
RcloneRepository: edge
summary: |
# {{ .AppName }} Profile Backup
This command backups the {{ .AppName }} user data profile to an S3-backed Restic repository if the profile exists. If the repository
has not been initialized then it will initialize it. After you backup the profile, you can restore it with the
`{{ .RcloneRepository }}:profile:restore` command like so:
```
run {{ .RcloneRepository }}:profile:restore
```
The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
The backup uses Restic so all the functionality that Restic offers is available with backups made by this command.
cmds:
- task: profile:backup
vars:
AppName: Microsoft Edge
ProfileFolderDarwin: ~/Library/Application Support/Microsoft Edge/Default
ProfileFolderLinux: ~/.config/microsoft-edge/Default
ProfileFolderWindows: '%LOCALAPPDATA%/Microsoft/Edge/User Data/Default'
ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
RcloneRepository: edge
edge:profile:restore:
desc: Restores the user's {{ .AppName }} profile from the user's S3-backed Restic repository
vars:
AppName: Microsoft Edge
RcloneRepository: edge
summary: |
# {{ .AppName }} Profile Import / Restore
This command imports / restores the {{ .AppName }} profile from the S3 Restic repository, if it exists. In order to use this
command for the first time, you should initialize {{ .AppName }} by opening the application. You should also customize
the application by applying your preferred settings (i.e. customize it how you want it to open in the future). Then, after making
any changes you wish to be saved, you can backup the {{ .AppName }} profile to the user's S3 bucket
by running the `{{ .RcloneRepository }}:profile:backup` task. After this is done, you can restore the application
settings by running this command (i.e. `{{ .RcloneRepository }}:profile:restore`).
The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
Since the backup leverages Restic, you can leverage all the functionality that Restic offers if something goes awry.
cmds:
- task: profile:restore
vars:
AppFolder: /Applications/Microsoft Edge.app
AppName: Microsoft Edge
ProfileFolderDarwin: ~/Library/Application Support/Microsoft Edge/Default
ProfileFolderLinux: ~/.config/microsoft-edge/Default
ProfileFolderWindows: '%LOCALAPPDATA%/Microsoft/Edge/User Data/Default'
ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
RcloneRepository: edge
ferdium:profile:backup:
desc: Backs up the user's {{ .AppName }} profile to the user's S3-backed Restic repository
vars:
AppName: Ferdium
RcloneRepository: ferdium
summary: |
# {{ .AppName }} Profile Backup
This command backups the {{ .AppName }} user data profile to an S3-backed Restic repository if the profile exists. If the repository
has not been initialized then it will initialize it. After you backup the profile, you can restore it with the
`{{ .RcloneRepository }}:profile:restore` command like so:
```
run {{ .RcloneRepository }}:profile:restore
```
The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
The backup uses Restic so all the functionality that Restic offers is available with backups made by this command.
cmds:
- task: profile:backup
vars:
AppName: Ferdium
ProfileFolderDarwin: ~/Library/Application Support/Ferdium
ProfileFolderLinux: ~/.config/Ferdium/
ProfileFolderWindows: '%APPDATA%/Ferdium'
ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
RcloneRepository: ferdium
ferdium:profile:restore:
desc: Restores the user's {{ .AppName }} profile from the user's S3-backed Restic repository
vars:
AppName: Ferdium
RcloneRepository: ferdium
summary: |
# {{ .AppName }} Profile Import / Restore
This command imports / restores the {{ .AppName }} profile from the S3 Restic repository, if it exists. In order to use this
command for the first time, you should initialize {{ .AppName }} by opening the application. You should also customize
the application by applying your preferred settings (i.e. customize it how you want it to open in the future). Then, after making
any changes you wish to be saved, you can backup the {{ .AppName }} profile to the user's S3 bucket
by running the `{{ .RcloneRepository }}:profile:backup` task. After this is done, you can restore the application
settings by running this command (i.e. `{{ .RcloneRepository }}:profile:restore`).
The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
Since the backup leverages Restic, you can leverage all the functionality that Restic offers if something goes awry.
cmds:
- task: profile:restore
vars:
AppFolder: /Applications/Ferdium.app
AppName: Ferdium
ProfileFolderDarwin: ~/Library/Application Support/Ferdium
ProfileFolderLinux: ~/.config/Ferdium/
ProfileFolderWindows: '%APPDATA%/Ferdium'
ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
RcloneRepository: ferdium
firefox:profile:backup:
desc: Backs up the user's {{ .AppName }} profile to the user's S3-backed Restic repository
vars:
AppName: Firefox
RcloneRepository: firefox
summary: |
# {{ .AppName }} Profile Backup
This command backups the {{ .AppName }} user data profile to an S3-backed Restic repository if the profile exists. If the repository
has not been initialized then it will initialize it. After you backup the profile, you can restore it with the
`{{ .RcloneRepository }}:profile:restore` command like so:
```
run {{ .RcloneRepository }}:profile:restore
```
The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
The backup uses Restic so all the functionality that Restic offers is available with backups made by this command.
cmds:
- task: profile:backup
vars:
AppName: Firefox
ProfileFolderDarwin: ~/Library/Application Support/Firefox/Profiles/profile.private
ProfileFolderLinux: ~/.mozilla/firefox
ProfileFolderWindows: '%APPDATA%/Mozilla/Firefox/Profiles'
ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
RcloneRepository: firefox
firefox:profile:restore:
desc: Restores the user's {{ .AppName }} profile from the user's S3-backed Restic repository
vars:
AppName: Firefox
RcloneRepository: firefox
summary: |
# {{ .AppName }} Profile Import / Restore
This command imports / restores the {{ .AppName }} profile from the S3 Restic repository, if it exists. In order to use this
command for the first time, you should initialize {{ .AppName }} by opening the application. You should also customize
the application by applying your preferred settings (i.e. customize it how you want it to open in the future). Then, after making
any changes you wish to be saved, you can backup the {{ .AppName }} profile to the user's S3 bucket
by running the `{{ .RcloneRepository }}:profile:backup` task. After this is done, you can restore the application
settings by running this command (i.e. `{{ .RcloneRepository }}:profile:restore`).
The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
Since the backup leverages Restic, you can leverage all the functionality that Restic offers if something goes awry.
cmds:
- task: profile:restore
vars:
AppFolder: /Applications/Firefox.app
AppName: Firefox
ProfileFolderDarwin: ~/Library/Application Support/Firefox/Profiles/profile.private
ProfileFolderLinux: ~/.mozilla/firefox
ProfileFolderWindows: '%APPDATA%/Mozilla/Firefox/Profiles'
ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
RcloneRepository: firefox
font-test:
cmds:
- |
echo -en "Regular"
echo -en "\e[3m Italic \e[0m"
echo -en "\e[1m Bold \e[0m"
echo -en "\e[3m\e[1m Bold-Italic \e[0m"
echo -en " \e[4mUnderline\e[0m "
echo -e " \e[9mStrikethrough\e[0m"
librewolf:profile:backup:
desc: Backs up the user's {{ .AppName }} profile to the user's S3-backed Restic repository
vars:
AppName: LibreWolf
RcloneRepository: librewolf
summary: |
# {{ .AppName }} Profile Backup
This command backups the {{ .AppName }} user data profile to an S3-backed Restic repository if the profile exists. If the repository
has not been initialized then it will initialize it. After you backup the profile, you can restore it with the
`{{ .RcloneRepository }}:profile:restore` command like so:
```
run {{ .RcloneRepository }}:profile:restore
```
The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
The backup uses Restic so all the functionality that Restic offers is available with backups made by this command.
cmds:
- task: profile:backup
vars:
AppName: LibreWolf
ProfileFolderDarwin: ~/Library/Application Support/LibreWolf/Profiles/profile.default
ProfileFolderLinux: ~/.librewolf
ProfileFolderWindows: '%USERPROFILE%/.librewolf'
ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
RcloneRepository: librewolf
librewolf:profile:restore:
desc: Restores the user's {{ .AppName }} profile from the user's S3-backed Restic repository
vars:
AppName: LibreWolf
RcloneRepository: librewolf
summary: |
# {{ .AppName }} Profile Import / Restore
This command imports / restores the {{ .AppName }} profile from the S3 Restic repository, if it exists. In order to use this
command for the first time, you should initialize {{ .AppName }} by opening the application. You should also customize
the application by applying your preferred settings (i.e. customize it how you want it to open in the future). Then, after making
any changes you wish to be saved, you can backup the {{ .AppName }} profile to the user's S3 bucket
by running the `{{ .RcloneRepository }}:profile:backup` task. After this is done, you can restore the application
settings by running this command (i.e. `{{ .RcloneRepository }}:profile:restore`).
The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
Since the backup leverages Restic, you can leverage all the functionality that Restic offers if something goes awry.
cmds:
- task: profile:restore
vars:
AppFolder: /Applications/LibreWolf.app
AppName: LibreWolf
ProfileFolderDarwin: ~/Library/Application Support/LibreWolf/Profiles/profile.default
ProfileFolderLinux: ~/.librewolf
ProfileFolderWindows: '%USERPROFILE%/.librewolf'
ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
RcloneRepository: librewolf
macos:plists:
cmds:
- |
find /usr/local/src/install.doctor/home/Library/Preferences -type f -mindepth 1 -maxdepth 1 | while read PLIST; do
if [[ "$PLIST" == *".plist" ]]; then
PLIST_FILE="$(basename "$PLIST")"
cp -f "$HOME/Library/Preferences/$PLIST_FILE" "/usr/local/src/install.doctor/home/Library/Preferences/$PLIST_FILE"
plutil -convert xml1 "/usr/local/src/install.doctor/home/Library/Preferences/$PLIST_FILE"
fi
done
profile:backup:
cmds:
- |
if [ -d "{{ .ProfileFolder }}" ]; then
if [ -d "$HOME/.local/mnt/s3" ]; then
if command -v rclone > /dev/null && command -v restic > /dev/null; then
logg info '{{ .AppName }} profile folder exists and user S3 mount exists. Backing the profile up to user S3 bucket via Restic.'
if ([ -z "$(restic -r "rclone:$USER-s3:user/{{ .RcloneRepository }}" --password-file "${XDG_CONFIG_HOME:-$HOME/.config}/age/chezmoi.txt" cat config)" ]) 2>/dev/null; then
logg info 'Initializing {{ .AppName }} Restic repository'
restic -r "rclone:$USER-s3:user/{{ .RcloneRepository }}" --password-file "${XDG_CONFIG_HOME:-$HOME/.config}/age/chezmoi.txt" init
fi
restic -r "rclone:$USER-s3:user/{{ .RcloneRepository }}" --password-file "${XDG_CONFIG_HOME:-$HOME/.config}/age/chezmoi.txt" --verbose backup --tag "{{ .ProfileFolder }}" --tag {{ OS }} --tag "$HOST" "{{ .ProfileFolder }}"
else
logg error 'Both rclone and restic must be available' && exit 1
fi
else
logg error 'User S3 bucket mount is unavailable. The presence of this folder is used to detect whether or not the user S3 Rclone configuration is in place.' && exit 1
fi
else
logg warn 'The {{ .ProfileFolder }} folder does not exist. Skipping.'
fi
profile:restore:
cmds:
- |
if [ -d '{{ .AppFolder }}' ]; then
if [ -d "$HOME/.local/mnt/s3" ]; then
if command -v rclone > /dev/null && command -v restic > /dev/null; then
if ([ -z "$(restic -r "rclone:$USER-s3:user/{{ .RcloneRepository }}" --password-file "${XDG_CONFIG_HOME:-$HOME/.config}/age/chezmoi.txt" cat config)" ]) 2>/dev/null; then
logg warn 'The {{ .AppName }} Rclone repository has not been initialized. Skipping.'
else
restic -r "rclone:$USER-s3:user/{{ .RcloneRepository }}" --password-file "${XDG_CONFIG_HOME:-$HOME/.config}/age/chezmoi.txt" restore latest --target '{{ .ProfileFolder }}'
fi
else
logg error 'Both rclone and restic must be available' && exit 1
fi
else
logg error 'User S3 bucket mount is unavailable. The presence of this folder is used to detect whether or not the user S3 Rclone configuration is in place.' && exit 1
fi
else
logg info 'The {{ .AppFolder }} folder that is used to detect the presence of {{ .AppName }} on the system is not present so the profile will not be restored for this type of {{ .AppName }} install.'
fi
squash-symlink:
summary: |
This command, when used in conjunction with the `find` command, will scan through a directory
and convert any symlinks into regular files by copying their source over the initial symlink.
**Example usage:**
```
find . -type l -exec 'run squash-symlink --' {} +
```
## TODO
Test and fix this so it can be accessed by `run squash-symlink -- $PATH`
cmds:
- |
set -e
for link; do
test -h "$link" || continue
dir=$(dirname "$link")
reltarget=$(readlink "$link")
case $reltarget in
/*) abstarget=$reltarget;;
*) abstarget=$dir/$reltarget;;
esac
rm -fv "$link"
cp -afv "$abstarget" "$link" || {
### On failure, restore the symlink
rm -rfv "$link"
ln -sfv "$reltarget" "$link"
}
done