427 lines
21 KiB
YAML
427 lines
21 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
|
|
|
|
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
|
|
ProfileFolder: ~/Library/Application Support/BraveSoftware/Brave-Browser/Default
|
|
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
|
|
ProfileFolder: ~/Library/Application Support/BraveSoftware/Brave-Browser/Default
|
|
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
|
|
ProfileFolder: ~/Library/Application Support/Google/Chrome/Default
|
|
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
|
|
ProfileFolder: ~/Library/Application Support/Google/Chrome/Default
|
|
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
|
|
ProfileFolder: ~/Library/Application Support/Microsoft Edge/Default
|
|
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
|
|
ProfileFolder: ~/Library/Application Support/Microsoft Edge/Default
|
|
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
|
|
ProfileFolder: ~/Library/Application Support/Ferdium
|
|
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
|
|
ProfileFolder: ~/Library/Application Support/Ferdium
|
|
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
|
|
ProfileFolder: ~/Library/Application Support/Firefox/Profiles/profile.private
|
|
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
|
|
ProfileFolder: ~/Library/Application Support/Firefox/Profiles/profile.private
|
|
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
|
|
ProfileFolder: ~/Library/Application Support/LibreWolf/Profiles/profile.default
|
|
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
|
|
ProfileFolder: ~/Library/Application Support/LibreWolf/Profiles/profile.default
|
|
RcloneRepository: librewolf
|
|
|
|
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 "$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 "$HOME/.config/age/chezmoi.txt" init
|
|
fi
|
|
restic -r "rclone:$USER-s3:user/{{ .RcloneRepository }}" --password-file "$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 "$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 "$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
|