--- # @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