9a0f472ea5
- /.local/assets/Betelgeuse.macOS.terminal - /.local/bin/bwc - /.local/bin/fonttest - /.local/bin/install-dotfiles - /.local/bin/install-gnome-extensions - /.local/bin/install-program - /.local/bin/install-terminal-theme - /.local/bin/ksetwallpaper - /.local/bin/load-secrets - /.local/bin/logg - /.local/bin/open - /.local/bin/provision - /.local/bin/ramqube - /.local/bin/run - /.local/bin/slack - /.local/bin/squash-symlink - /.local/delta/themes.gitconfig - /.local/konsole/Default.profile - /.local/scripts/motd.bash - /.local/scripts/p10k.zsh - /.local/theme/Betelgeuse.macOS.terminal - /.local/theme/background.jpg - /.local/vagrant.d/.gitkeep - /.local/share/bash-completion/completions/deno.bash - /.local/share/bash-completion/completions/direnv.bash - /.local/share/bash-completion/completions/fig.bash - /.local/share/bash-completion/completions/fzf-key-bindings.bash - /.local/share/bash-completion/completions/fzf.bash - /.local/share/bash-completion/completions/gcloud.bash - /.local/share/bash-completion/completions/gh.bash - /.local/share/bash-completion/completions/googler.bash - /.local/share/bash-completion/completions/gradle.bash - /.local/share/bash-completion/completions/helm.bash - /.local/share/bash-completion/completions/hyperfine.bash - /.local/share/bash-completion/completions/kubectl.bash - /.local/share/bash-completion/completions/mcfly.bash - /.local/share/bash-completion/completions/nb.bash - /.local/share/bash-completion/completions/nnn.bash - /.local/share/bash-completion/completions/poetry.bash - /.local/share/bash-completion/completions/volta.bash - /.local/share/bash-completion/completions/wp.bash - /.local/share/bash-completion/completions/zoxide.bash - /.local/share/bash-completion/generate.sh - /.local/share/fonts/FontAwesome.ttf - /.local/share/fonts/Hack Bold Italic Nerd Font Complete Mono Windows Compatible.ttf - /.local/share/fonts/Hack Bold Italic Nerd Font Complete Mono.ttf - /.local/share/fonts/Hack Bold Italic Nerd Font Complete Windows Compatible.ttf - /.local/share/fonts/Hack Bold Italic Nerd Font Complete.ttf - /.local/share/fonts/Hack Bold Nerd Font Complete Mono Windows Compatible.ttf - /.local/share/fonts/Hack Bold Nerd Font Complete Mono.ttf - /.local/share/fonts/Hack Bold Nerd Font Complete Windows Compatible.ttf - /.local/share/fonts/Hack Bold Nerd Font Complete.ttf - /.local/share/fonts/Hack Italic Nerd Font Complete Mono Windows Compatible.ttf - /.local/share/fonts/Hack Italic Nerd Font Complete Mono.ttf - /.local/share/fonts/Hack Italic Nerd Font Complete Windows Compatible.ttf - /.local/share/fonts/Hack Italic Nerd Font Complete.ttf - /.local/share/fonts/Hack Regular Nerd Font Complete Mono Windows Compatible.ttf - /.local/share/fonts/Hack Regular Nerd Font Complete Mono.ttf - /.local/share/fonts/Hack Regular Nerd Font Complete Windows Compatible.ttf - /.local/share/fonts/Hack Regular Nerd Font Complete.ttf - /.local/share/fonts/Montserrat-Black.ttf - /.local/share/fonts/Montserrat-BlackItalic.ttf - /.local/share/fonts/Montserrat-Bold.ttf - /.local/share/fonts/Montserrat-BoldItalic.ttf - /.local/share/fonts/Montserrat-ExtraBold.ttf - /.local/share/fonts/Montserrat-ExtraBoldItalic.ttf - /.local/share/fonts/Montserrat-ExtraLight.ttf - /.local/share/fonts/Montserrat-ExtraLightItalic.ttf - /.local/share/fonts/Montserrat-Italic.ttf - /.local/share/fonts/Montserrat-Light.ttf - /.local/share/fonts/Montserrat-LightItalic.ttf - /.local/share/fonts/Montserrat-Medium.ttf - /.local/share/fonts/Montserrat-MediumItalic.ttf - /.local/share/fonts/Montserrat-Regular.ttf - /.local/share/fonts/Montserrat-SemiBold.ttf - /.local/share/fonts/Montserrat-SemiBoldItalic.ttf - /.local/share/fonts/Montserrat-Thin.ttf - /.local/share/fonts/Montserrat-ThinItalic.ttf - /.local/share/fonts/Weather-Icons.ttf - /.local/share/fonts/ZillaSlab-Bold.ttf - /.local/share/fonts/ZillaSlab-BoldItalic.ttf - /.local/share/fonts/ZillaSlab-Italic.ttf - /.local/share/fonts/ZillaSlab-Light.ttf - /.local/share/fonts/ZillaSlab-LightItalic.ttf - /.local/share/fonts/ZillaSlab-Medium.ttf - /.local/share/fonts/ZillaSlab-MediumItalic.ttf - /.local/share/fonts/ZillaSlab-Regular.ttf - /.local/share/fonts/ZillaSlab-SemiBold.ttf - /.local/share/fonts/ZillaSlab-SemiBoldItalic.ttf - /.local/share/git-core/templates/hooks/post-commit - /.local/share/kactivitymanagerd/resources/database - /.local/share/kactivitymanagerd/resources/database-shm - /.local/share/kactivitymanagerd/resources/database-wal - /.gnupg/public/apt.hashicorp.sig - /.gnupg/public/linux.wazuh.sig - /.gnupg/public/qubes.uman.sig - /.gnupg/public/unman.sig - /.gnupg/public/wazuh.sig - /.config/Kvantum/kvantum.config - /.config/age/expect - /.config/age/run_once_before_decrypt-private-key.sh.tmpl - /.config/alacritty/alacritty.yml - /.config/asdf/asdfrc - /.config/asdf/default-cargo-pkgs - /.config/asdf/default-golang-pkgs - /.config/asdf/default-npm-packages - /.config/asdf/default-python-pkgs - /.config/asdf/default-ruby-pkgs - /.config/bashtop/bashtop.cfg - /.config/bat/config - /.config/brew/whalebrew - /.config/crontab/config - /.config/direnv/direnv.toml - /.config/fd/ignore - /.config/firejail/bitwarden.local - /.config/firejail/chromium.local - /.config/firejail/code.local - /.config/firejail/gcloud.local - /.config/firejail/google-chrome-stable.local - /.config/firejail/slack.local - /.config/firejail/thunderbird.local - /.config/fontconfig/fonts.conf - /.config/ghorg/conf.yaml - /.config/git/attributes - /.config/git/commit-template - /.config/git/ignore - /.config/gtk-2.0/gtkrc - /.config/gtk-3.0/settings.ini - /.config/himalaya/config.toml - /.config/k9s/plugin.yml - /.config/kitty/Betelgeuse-dark.conf - /.config/kitty/Betelgeuse-light.conf - /.config/kitty/kitty.conf - /.config/ngrok/ngrok.yml - /.config/npm/npmrc.tmpl.TODO - /.config/oh-my-posh/Betelgeuse-minimal.omp.json - /.config/oh-my-posh/Betelgeuse.omp.json - /.config/pgcli/config - /.config/plasma/plasmoids.yml - /.config/powershell/takuya.omp.json - /.config/powershell/user_profile.ps1 - /.config/rclone/merge_rclone.conf - /.config/readline/inputrc - /.config/ripgrep/config - /.config/shell/.private - /.config/shell/functions - /.config/shell/motd - /.config/shell/profile - /.config/slack-term/config - /.config/tabby/config.yaml - /.config/terminator/config - /.config/wget/wgetrc - /.config/xsettingsd/xsettingsd.conf - /.config/youtube-dl/config - /.config/xfce4/terminal/terminalrc - /.config/misc/.warp/themes/betelgeuse_dark.yaml - /.config/misc/.warp/themes/betelgeuse_light.yaml - /.config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml - /.config/misc/.tmux.themer - /.config/Code/User/extensions/theme-betelgeuse-vscode/themes/themer-dark-color-theme.json - /.config/Code/User/extensions/theme-betelgeuse-vscode/themes/themer-light-color-theme.json - /.config/Code/User/extensions/theme-betelgeuse-vscode/README.md - /.config/Code/User/extensions/theme-betelgeuse-vscode/icon.svg - /.config/Code/User/extensions/theme-betelgeuse-vscode/package.json - /.config/Code/User/extensions.json - /.config/Code/User/keybindings.json - /.config/Code/User/settings.json - /.config/batrc - /.config/chromium-flags.conf - /.config/dircolors - /.config/gtkrc - /.config/kactivitymanagerdrc - /.config/kcminputrc - /.config/kdeglobals - /.config/konsolerc - /.config/ksplashrc - /.config/ktimezonedrc - /.config/kwinrc - /.config/mimeapps.list - /.config/plasma-localerc - /.config/plasmarc - /.config/ripgreprc - /.config/wgetrc - /.config/whalebrew - /.vim/colors/betelgeuse.vim - /.vim/autoload/lightline/colorscheme/Betelgeuse.vim - /.vim/autoload/plug.vim - /.vim/vimrc - /.vscode/extensions.json - /.vscode/settings.json - /AppData/Local/clink/oh-my-posh.lua - /Library/Preferences/com.apple.Terminal.plist - /Library/VirtualBox/VirtualBox.xml - /Library/Application Support/tabby/plugins/package-lock.json - /Library/Developer/Xcode/UserData/FontAndColorThemes/Betelgeuse Dark.dvtcolortheme - /Library/Developer/Xcode/UserData/FontAndColorThemes/Betelgeuse Light.dvtcolortheme - /.local/share/chezmoi/docs/CHEZMOI-INTRO.md - /.local/share/chezmoi/home/.chezmoi.yaml.tmpl - /.local/share/chezmoi/home/.chezmoidata.yaml - /.local/share/chezmoi/home/.chezmoiexternal.toml - /.local/share/chezmoi/home/.chezmoiignore - /.local/share/chezmoi/home/.chezmoiremove - /.local/share/chezmoi/home/.chezmoiscripts/_universal/run_onchange_before_5-install-homebrew.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/_universal/run_onchange_before_8-install-zx.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/_universal/run_onchange_before_9-ensure-node-version.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/archlinux/run_onchange_before_10_install-archlinux-dependencies.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/centos/run_onchange_before_10-install-centos-dependencies.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/darwin/run_onchange_after_10_configure-macos.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/darwin/run_onchange_after_20-ensure-zsh-macos.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/darwin/run_onchange_after_set-wallpaper.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/darwin/run_onchange_before_10_install-darwin-dependencies.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/darwin/run_onchange_before_20-ensure-user-group.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/debian/run_onchange_before_10-install-debian-dependencies.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/fedora/run_onchange_before_10-install-fedora-dependencies.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/freebsd/run_onchange_before_11-install-freebsd-packages.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/linux/run_onchange_before_10-system-tweaks.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/linux/run_onchange_before_configure-swap.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/opensuse/run_onchange_before_11-install-opensuse-software.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/qubes/run_onchange_after_11-set-wallpaper.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/qubes/run_onchange_before_11-update-timezone.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/qubes/run_onchange_before_12-update-dom0.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/qubes/run_onchange_before_13-install-official-templates.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/qubes/run_onchange_before_14-ensure-minimal-vms-passwordless.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/qubes/run_onchange_before_15-install-unofficial-templates.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/qubes/run_onchange_before_16-update-template-vms.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/qubes/run_onchange_before_17-install-mirage-firewall.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/qubes/run_onchange_before_18-configure-sys-usb.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/qubes/run_onchange_before_19-setup-sys-gui.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/ubuntu/run_onchange_before_10_install-ubuntu-dependencies.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/universal/run_once_before_1-decrypt-age-key.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/universal/run_onchange_after_11-symlink-ansible-roles.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/universal/run_onchange_after_12-install-packages.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/universal/run_onchange_after_14_install-aqua-packages.sh.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/universal/run_onchange_after_15_install-asdf-packages.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/universal/run_onchange_after_18-install-sdkman.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/universal/run_onchange_after_50-crontab.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/universal/run_onchange_after_59-connect-tailscale.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/universal/run_onchange_after_80-bash-completions.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/universal/run_onchange_after_99_bootstrap-zsh-plugins.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/universal/run_onchange_before_91-configure-gpg.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/windows/run_onchange_after_14-cleanup-windows - /.local/share/chezmoi/home/.chezmoiscripts/windows/run_onchange_before_10-install-windows-dependencies.tmpl - /.local/share/chezmoi/home/.chezmoiscripts/windows/run_onchange_before_11-install-windows-packages.tmpl - /.local/share/chezmoi/home/.chezmoitemplates/darwin/Brewfile - /.local/share/chezmoi/home/.chezmoitemplates/universal/essential-packages - /.local/share/chezmoi/home/.chezmoitemplates/universal/logg - /.local/share/chezmoi/home/.chezmoitemplates/universal/logg-compat - /.local/share/chezmoi/home/.chezmoitemplates/universal/profile - /.local/share/chezmoi/home/AppData/Local/clink/oh-my-posh.lua - /.local/share/chezmoi/home/AppData/Roaming/Google Assistant/symlink_config.json.tmpl - /.local/share/chezmoi/home/Library/Application Support/tabby/plugins/package-lock.json - /.local/share/chezmoi/home/Library/Developer/Xcode/UserData/FontAndColorThemes/Betelgeuse Dark.dvtcolortheme - /.local/share/chezmoi/home/Library/Developer/Xcode/UserData/FontAndColorThemes/Betelgeuse Light.dvtcolortheme - /.local/share/chezmoi/home/Library/Fonts/run_onchange_after_add-fonts.tmpl - /.local/share/chezmoi/home/Library/Preferences/com.apple.Terminal.plist - /.local/share/chezmoi/home/Library/Preferences/com.googlecode.iterm2.plist - /.local/share/chezmoi/home/Library/VirtualBox/VirtualBox.xml.tmpl - /.local/share/chezmoi/home/dot_VirtualBox/VirtualBox.xml.tmpl - /.local/share/chezmoi/home/dot_Xresources - /.local/share/chezmoi/home/dot_bashrc - /.local/share/chezmoi/home/dot_cache/readonly_rclone/remove_dot_gitkeep - /.local/share/chezmoi/home/dot_cache/zsh/remove_dot_gitkeep - /.local/share/chezmoi/home/dot_editorconfig - /.local/share/chezmoi/home/dot_gnupg/public/apt.hashicorp.sig - /.local/share/chezmoi/home/dot_gnupg/public/linux.wazuh.sig - /.local/share/chezmoi/home/dot_gnupg/public/qubes.uman.sig - /.local/share/chezmoi/home/dot_local/Taskfile-local.yml - /.local/share/chezmoi/home/dot_local/assets/Betelgeuse.macOS.terminal - /.local/share/chezmoi/home/dot_local/bin/executable_gist - /.local/share/chezmoi/home/dot_local/bin/executable_install-gnome-extensions - /.local/share/chezmoi/home/dot_local/bin/executable_install-program - /.local/share/chezmoi/home/dot_local/bin/executable_install-terminal-theme.tmpl - /.local/share/chezmoi/home/dot_local/bin/executable_kde-wallpaper - /.local/share/chezmoi/home/dot_local/bin/executable_logg - /.local/share/chezmoi/home/dot_local/bin/executable_open - /.local/share/chezmoi/home/dot_local/bin/executable_provision.tmpl - /.local/share/chezmoi/home/dot_local/bin/executable_ramqube - /.local/share/chezmoi/home/dot_local/bin/executable_squash-symlink - /.local/share/chezmoi/home/dot_local/bin/executable_task - /.local/share/chezmoi/home/dot_local/bin/executable_tinypng.tmpl - /.local/share/chezmoi/home/dot_local/bin/firejail/executable_slack - /.local/share/chezmoi/home/dot_local/bin/run_onchange_ensure-executable.tmpl - /.local/share/chezmoi/home/dot_local/bin/symlink_bat.tmpl - /.local/share/chezmoi/home/dot_local/bin/symlink_bombshell-client.tmpl - /.local/share/chezmoi/home/dot_local/bin/symlink_fd.tmpl - /.local/share/chezmoi/home/dot_local/bin/symlink_install-software.tmpl - /.local/share/chezmoi/home/dot_local/bin/symlink_qrun.tmpl - /.local/share/chezmoi/home/dot_local/bin/symlink_qscp - /.local/share/chezmoi/home/dot_local/bin/symlink_qssh.tmpl - /.local/share/chezmoi/home/dot_local/bin/symlink_readlink.tmpl - /.local/share/chezmoi/home/dot_local/konsole/Default.profile - /.local/share/chezmoi/home/dot_local/log/remove_dot_gitkeep - /.local/share/chezmoi/home/dot_local/scripts/docker-functions.bash - /.local/share/chezmoi/home/dot_local/scripts/motd.bash - /.local/share/chezmoi/home/dot_local/scripts/p10k.zsh - /.local/share/chezmoi/home/dot_local/share/ansible/plugins/action/symlink_commonlib.py.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/plugins/action/symlink_qubes_pass.py.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/plugins/action/symlink_qubesformation.py.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/plugins/action/symlink_qubesguid.py.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/plugins/action/symlink_qubessls.py.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/plugins/connection/symlink_qubes.py.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/plugins/library/symlink_qubes_pass.py.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/plugins/library/symlink_qubesformation.py.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/plugins/library/symlink_qubesguid.py.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/plugins/library/symlink_qubessls.py.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/plugins/lookup/symlink_jq.py.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/plugins/lookup/symlink_qubes-pass.py.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/run_onchange_after_symlink-ansible-configs.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/symlink_README.md.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/symlink_Vagrantfile.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/symlink_ansible.cfg.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/symlink_docs.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/symlink_environments.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/symlink_main.yml.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/symlink_playbooks.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/symlink_requirements.yml.tmpl - /.local/share/chezmoi/home/dot_local/share/ansible/tasks/symlink_qubes.tmpl - /.local/share/chezmoi/home/dot_local/share/fonts/FontAwesome.ttf - /.local/share/chezmoi/home/dot_local/share/fonts/Weather-Icons.ttf - /.local/share/chezmoi/home/dot_local/share/git-core/templates/hooks/post-commit - /.local/share/chezmoi/home/dot_local/state/bash/remove_dot_gitkeep - /.local/share/chezmoi/home/dot_local/state/zsh/remove_dot_gitkeep - /.local/share/chezmoi/home/dot_ssh/authorized_keys.github.tmpl - /.local/share/chezmoi/home/dot_ssh/private_config.tmpl - /.local/share/chezmoi/home/dot_ssh/run_onchanges_after_ensure-private-key.tmpl - /.local/share/chezmoi/home/dot_ssh/run_onchanges_after_generate-public-keys.tmpl - /.local/share/chezmoi/home/dot_ssh/symlink_authorized_keys.tmpl - /.local/share/chezmoi/home/dot_tool-versions.tmpl - /.local/share/chezmoi/home/dot_vim/autoload/lightline/colorscheme/Betelgeuse.vim - /.local/share/chezmoi/home/dot_vim/colors/Betelgeuse.vim - /.local/share/chezmoi/home/dot_zshrc - /.local/share/chezmoi/home/key.txt.age - /.local/share/chezmoi/home/private_dot_config/Google Assistant/client-secret.json - /.local/share/chezmoi/home/private_dot_config/Google Assistant/config.json.tmpl - /.local/share/chezmoi/home/private_dot_config/Kvantum/kvantum.config - /.local/share/chezmoi/home/private_dot_config/VirtualBox/VirtualBox.xml.tmpl - /.local/share/chezmoi/home/private_dot_config/alacritty/alacritty.yml - /.local/share/chezmoi/home/private_dot_config/asdf/asdfrc.tmpl - /.local/share/chezmoi/home/private_dot_config/asdf/default-cargo-pkgs - /.local/share/chezmoi/home/private_dot_config/asdf/default-golang-pkgs - /.local/share/chezmoi/home/private_dot_config/asdf/default-npm-packages - /.local/share/chezmoi/home/private_dot_config/asdf/default-python-pkgs - /.local/share/chezmoi/home/private_dot_config/asdf/default-ruby-pkgs - /.local/share/chezmoi/home/private_dot_config/bashtop/bashtop.cfg - /.local/share/chezmoi/home/private_dot_config/bat/config - /.local/share/chezmoi/home/private_dot_config/brew/Brewfile.tmpl - /.local/share/chezmoi/home/private_dot_config/brew/whalebrew - /.local/share/chezmoi/home/private_dot_config/chromium-flags.conf - /.local/share/chezmoi/home/private_dot_config/crontab/config - /.local/share/chezmoi/home/private_dot_config/direnv/direnv.toml - /.local/share/chezmoi/home/private_dot_config/fd/ignore - /.local/share/chezmoi/home/private_dot_config/firejail/bitwarden.local - /.local/share/chezmoi/home/private_dot_config/firejail/chromium.local - /.local/share/chezmoi/home/private_dot_config/firejail/code.local - /.local/share/chezmoi/home/private_dot_config/firejail/gcloud.local - /.local/share/chezmoi/home/private_dot_config/firejail/google-chrome-stable.local - /.local/share/chezmoi/home/private_dot_config/firejail/slack.local - /.local/share/chezmoi/home/private_dot_config/firejail/thunderbird.local - /.local/share/chezmoi/home/private_dot_config/fontconfig/fonts.conf - /.local/share/chezmoi/home/private_dot_config/ghorg/conf.yaml.tmpl - /.local/share/chezmoi/home/private_dot_config/git/attributes - /.local/share/chezmoi/home/private_dot_config/git/commit-template - /.local/share/chezmoi/home/private_dot_config/git/config.tmpl - /.local/share/chezmoi/home/private_dot_config/git/ignore - /.local/share/chezmoi/home/private_dot_config/git/template/symlink_commit-msg - /.local/share/chezmoi/home/private_dot_config/git/template/symlink_post-checkout - /.local/share/chezmoi/home/private_dot_config/git/template/symlink_post-commit - /.local/share/chezmoi/home/private_dot_config/git/template/symlink_post-merge - /.local/share/chezmoi/home/private_dot_config/git/template/symlink_post-rewrite - /.local/share/chezmoi/home/private_dot_config/git/template/symlink_pre-commit - /.local/share/chezmoi/home/private_dot_config/git/template/symlink_pre-push - /.local/share/chezmoi/home/private_dot_config/git/template/symlink_prepare-commit-msg - /.local/share/chezmoi/home/private_dot_config/gtk-1.0/.gitkeep - /.local/share/chezmoi/home/private_dot_config/gtk-2.0/gtkrc - /.local/share/chezmoi/home/private_dot_config/gtk-3.0/settings.ini - /.local/share/chezmoi/home/private_dot_config/gtkrc - /.local/share/chezmoi/home/private_dot_config/heroku/deploy.yml.tmpl - /.local/share/chezmoi/home/private_dot_config/himalaya/config.toml - /.local/share/chezmoi/home/private_dot_config/k9s/plugin.yml - /.local/share/chezmoi/home/private_dot_config/kcminputrc - /.local/share/chezmoi/home/private_dot_config/kdeglobals - /.local/share/chezmoi/home/private_dot_config/kitty/Betelgeuse-dark.conf - /.local/share/chezmoi/home/private_dot_config/kitty/Betelgeuse-light.conf - /.local/share/chezmoi/home/private_dot_config/kitty/kitty.conf - /.local/share/chezmoi/home/private_dot_config/konsolerc - /.local/share/chezmoi/home/private_dot_config/ksplashrc - /.local/share/chezmoi/home/private_dot_config/ktimezonedrc - /.local/share/chezmoi/home/private_dot_config/kwinrc - /.local/share/chezmoi/home/private_dot_config/libvirt/libvirtd.conf - /.local/share/chezmoi/home/private_dot_config/mimeapps.list - /.local/share/chezmoi/home/private_dot_config/ngrok/ngrok.yml.tmpl - /.local/share/chezmoi/home/private_dot_config/npm/npmrc.tmpl.TODO - /.local/share/chezmoi/home/private_dot_config/oh-my-posh/Betelgeuse-minimal.omp.json - /.local/share/chezmoi/home/private_dot_config/oh-my-posh/Betelgeuse.omp.json - /.local/share/chezmoi/home/private_dot_config/pg/.gitkeep - /.local/share/chezmoi/home/private_dot_config/pgcli/config - /.local/share/chezmoi/home/private_dot_config/plasma-localerc - /.local/share/chezmoi/home/private_dot_config/plasma/plasmoids.yml - /.local/share/chezmoi/home/private_dot_config/plasmarc - /.local/share/chezmoi/home/private_dot_config/powershell/profile.ps1 - /.local/share/chezmoi/home/private_dot_config/private_Code/User/extensions.json - /.local/share/chezmoi/home/private_dot_config/private_Code/User/extensions/theme-betelgeuse-vscode/README.md - /.local/share/chezmoi/home/private_dot_config/private_Code/User/extensions/theme-betelgeuse-vscode/icon.svg - /.local/share/chezmoi/home/private_dot_config/private_Code/User/extensions/theme-betelgeuse-vscode/package.json - /.local/share/chezmoi/home/private_dot_config/private_Code/User/extensions/theme-betelgeuse-vscode/themes/themer-dark-color-theme.json - /.local/share/chezmoi/home/private_dot_config/private_Code/User/extensions/theme-betelgeuse-vscode/themes/themer-light-color-theme.json - /.local/share/chezmoi/home/private_dot_config/private_Code/User/keybindings.json - /.local/share/chezmoi/home/private_dot_config/private_Code/User/settings.json - /.local/share/chezmoi/home/private_dot_config/putty/.gitkeep - /.local/share/chezmoi/home/private_dot_config/rclone/merge_rclone.conf - /.local/share/chezmoi/home/private_dot_config/readline/inputrc - /.local/share/chezmoi/home/private_dot_config/ripgrep/config - /.local/share/chezmoi/home/private_dot_config/rofi/config.rasi.tmpl - /.local/share/chezmoi/home/private_dot_config/shell/aliases.sh.tmpl - /.local/share/chezmoi/home/private_dot_config/shell/exports.sh.tmpl - /.local/share/chezmoi/home/private_dot_config/shell/functions.sh - /.local/share/chezmoi/home/private_dot_config/shell/motd.sh - /.local/share/chezmoi/home/private_dot_config/shell/private_private.sh - /.local/share/chezmoi/home/private_dot_config/shell/profile.sh - /.local/share/chezmoi/home/private_dot_config/slack-term/config.tmpl - /.local/share/chezmoi/home/private_dot_config/tabby/config.yaml.tmpl - /.local/share/chezmoi/home/private_dot_config/terminator/config - /.local/share/chezmoi/home/private_dot_config/tmux/remove_dot_gitkeep - /.local/share/chezmoi/home/private_dot_config/vim/vimrc - /.local/share/chezmoi/home/private_dot_config/wget/wgetrc - /.local/share/chezmoi/home/private_dot_config/xfce4/terminal/terminalrc - /.local/share/chezmoi/home/private_dot_config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml - /.local/share/chezmoi/home/private_dot_config/xsettingsd/xsettingsd.conf - /.local/share/chezmoi/home/private_dot_config/youtube-dl/config - /.local/share/chezmoi/home/private_dot_config/zap/v2/config.ini - /.local/share/chezmoi/system/.chezmoidata.yaml - /.local/share/chezmoi/system/.chezmoiexternal.toml - /.local/share/chezmoi/system/.chezmoiignore - /.local/share/chezmoi/system/Applications/Firefox.app/Contents/Resources/distribution/policies.json - /.local/share/chezmoi/system/boot/efi/EFI/qubes/modify_grubenv - /.local/share/chezmoi/system/etc/cockpit/machines.d/TODO.cockpit-machine.json.tmpl - /.local/share/chezmoi/system/etc/cups/cupsd.conf - /.local/share/chezmoi/system/etc/cups/modify_cupsd.conf - /.local/share/chezmoi/system/etc/default/modify_grub - /.local/share/chezmoi/system/etc/fonts/local.conf - /.local/share/chezmoi/system/etc/grub.d/31-hold-shift - /.local/share/chezmoi/system/etc/keybase/config.json - /.local/share/chezmoi/system/etc/modify_environment - /.local/share/chezmoi/system/etc/opt/chrome/policies/managed/policies.json - /.local/share/chezmoi/system/etc/qubes/repo-templates/qubes-templates.repo - /.local/share/chezmoi/system/etc/rcloneignore - /.local/share/chezmoi/system/etc/sanoid/sanoid.conf.TODO - /.local/share/chezmoi/system/etc/sddm.conf - /.local/share/chezmoi/system/etc/systemd/system/r2-docker.service - /.local/share/chezmoi/system/etc/systemd/system/r2-{{ .user.username }}.service.tmpl - /.local/share/chezmoi/system/etc/timeshift/timeshift.json - /.local/share/chezmoi/system/etc/yum.repos.d/qubes-dom0.repo - /.local/share/chezmoi/system/mnt/private_r2-docker/remove_dot_gitkeep - /.local/share/chezmoi/system/usr/lib/firefox-esr/distribution/policies.json - /.local/share/chezmoi/system/usr/lib/firefox/distribution/policies.json - /.local/share/chezmoi/system/usr/local/bin/executable_rclone-mount - /.local/share/chezmoi/system/usr/local/bin/executable_squash-symlink - /.local/share/chezmoi/system/usr/local/share/run_onchange_after_setup-share-folder - /.local/share/chezmoi/system/usr/share/run_onchange_after_setup-share-folder - /.local/share/chezmoi/system/var/cache/rclone/remove_dot_gitkeep - /.local/share/chezmoi/system/var/log/user/run_onchange_after-symlink-user-logs - /.local/share/chezmoi/.chezmoiignore - /.local/share/chezmoi/.chezmoiroot - /.local/share/chezmoi/software.yml - /.local/Taskfile-local.yml - /.local/aliases - /.local/antigen.zsh - /.local/dockerfunc.sh - /.local/functions - /.local/motd.sh - /.bashrc - /.tool-versions - /.Xresources - /.zshrc - /TODO.md - /sync.sh - /docs/TODO.md - /docs/partials/guide.md - /docs/partials/CHEZMOI-INTRO.md - /home/.chezmoiscripts/linux/run_onchange_before_configure-swap - /home/.chezmoiscripts/linux/run_onchange_before_10-system-tweaks - /home/.chezmoiscripts/qubes/run_onchange_before_19-setup-sys-gui - /home/.chezmoiscripts/qubes/run_onchange_after_11-set-wallpaper.tmpl - /home/.chezmoiscripts/qubes/run_onchange_before_12-update-dom0.tmpl - /home/.chezmoiscripts/qubes/run_onchange_before_13-install-official-templates.tmpl - /home/.chezmoiscripts/qubes/run_onchange_before_11-update-timezone.tmpl - /home/.chezmoiscripts/qubes/run_onchange_before_14-ensure-minimal-vms-passwordless.tmpl - /home/.chezmoiscripts/qubes/run_onchange_before_15-install-unofficial-templates.tmpl - /home/.chezmoiscripts/qubes/run_onchange_before_16-update-template-vms.tmpl - /home/.chezmoiscripts/qubes/run_onchange_before_17-install-mirage-firewall.tmpl - /home/.chezmoiscripts/qubes/run_onchange_before_18-configure-sys-usb.tmpl - /home/.chezmoiscripts/_universal/run_onchange_before_8-install-zx.tmpl - /home/.chezmoiscripts/_universal/run_onchange_before_9-ensure-node-version.tmpl - /home/.chezmoiscripts/_universal/run_onchange_before_5-install-homebrew.tmpl - /home/.chezmoiscripts/archlinux/run_onchange_before_10_install-archlinux-dependencies.tmpl - /home/.chezmoiscripts/centos/run_onchange_before_10-install-centos-dependencies.tmpl - /home/.chezmoiscripts/darwin/run_onchange_after_10_configure-macos.tmpl - /home/.chezmoiscripts/darwin/run_onchange_before_20-ensure-user-group.tmpl - /home/.chezmoiscripts/darwin/run_onchange_after_set-wallpaper.tmpl - /home/.chezmoiscripts/darwin/run_onchange_after_20-ensure-zsh-macos.tmpl - /home/.chezmoiscripts/darwin/run_onchange_before_10_install-darwin-dependencies.tmpl - /home/.chezmoiscripts/debian/run_onchange_before_10-install-debian-dependencies.tmpl - /home/.chezmoiscripts/fedora/run_onchange_before_10-install-fedora-dependencies.tmpl - /home/.chezmoiscripts/freebsd/run_onchange_before_11-install-freebsd-packages.tmpl - /home/.chezmoiscripts/opensuse/run_onchange_before_11-install-opensuse-software.tmpl - /home/.chezmoiscripts/ubuntu/run_onchange_before_10_install-ubuntu-dependencies.tmpl - /home/.chezmoiscripts/universal/run_onchange_after_59-connect-tailscale.tmpl - /home/.chezmoiscripts/universal/run_once_before_1-decrypt-age-key.tmpl - /home/.chezmoiscripts/universal/run_onchange_after_80-bash-completions.tmpl - /home/.chezmoiscripts/universal/run_onchange_after_50-crontab.tmpl - /home/.chezmoiscripts/universal/run_onchange_after_11-symlink-ansible-roles.tmpl - /home/.chezmoiscripts/universal/run_onchange_after_12-install-packages.tmpl - /home/.chezmoiscripts/universal/run_onchange_after_14_install-aqua-packages.sh.tmpl - /home/.chezmoiscripts/universal/run_onchange_after_15_install-asdf-packages.tmpl - /home/.chezmoiscripts/universal/run_onchange_after_99_bootstrap-zsh-plugins.tmpl - /home/.chezmoiscripts/universal/run_onchange_before_91-configure-gpg.tmpl - /home/.chezmoiscripts/universal/run_onchange_after_18-install-sdkman.tmpl - /home/.chezmoiscripts/windows/run_onchange_before_11-install-windows-packages.tmpl - /home/.chezmoiscripts/windows/run_onchange_after_14-cleanup-windows - /home/.chezmoiscripts/windows/run_onchange_before_10-install-windows-dependencies.tmpl - /home/.chezmoidata.yaml - /home/.chezmoiexternal.toml - /home/.chezmoiignore - /home/.chezmoiremove - /home/.chezmoitemplates/darwin/Brewfile - /home/.chezmoitemplates/universal/logg-compat - /home/.chezmoitemplates/universal/profile - /home/.chezmoitemplates/universal/logg - /home/.chezmoitemplates/universal/essential-packages - /home/AppData/Local/clink/oh-my-posh.lua - /home/AppData/Roaming/Google Assistant/symlink_config.json.tmpl - /home/Library/Application Support/tabby/plugins/package-lock.json - /home/Library/Developer/Xcode/UserData/FontAndColorThemes/Betelgeuse Light.dvtcolortheme - /home/Library/Developer/Xcode/UserData/FontAndColorThemes/Betelgeuse Dark.dvtcolortheme - /home/Library/Fonts/run_onchange_after_add-fonts.tmpl - /home/Library/Preferences/com.apple.Terminal.plist - /home/Library/Preferences/com.googlecode.iterm2.plist - /home/Library/VirtualBox/VirtualBox.xml.tmpl - /home/dot_VirtualBox/VirtualBox.xml.tmpl - /home/dot_cache/readonly_rclone/remove_dot_gitkeep - /home/dot_cache/zsh/remove_dot_gitkeep - /home/dot_gnupg/public/apt.hashicorp.sig - /home/dot_gnupg/public/qubes.uman.sig - /home/dot_gnupg/public/linux.wazuh.sig - /home/dot_local/assets/Betelgeuse.macOS.terminal - /home/dot_local/bin/executable_install-program - /home/dot_local/bin/firejail/executable_slack - /home/dot_local/bin/executable_ramqube - /home/dot_local/bin/executable_squash-symlink - /home/dot_local/bin/symlink_bombshell-client.tmpl - /home/dot_local/bin/symlink_fd.tmpl - /home/dot_local/bin/symlink_qssh.tmpl - /home/dot_local/bin/executable_kde-wallpaper - /home/dot_local/bin/symlink_bat.tmpl - /home/dot_local/bin/executable_tinypng.tmpl - /home/dot_local/bin/executable_task - /home/dot_local/bin/executable_install-terminal-theme.tmpl - /home/dot_local/bin/symlink_qscp - /home/dot_local/bin/symlink_readlink.tmpl - /home/dot_local/bin/executable_logg - /home/dot_local/bin/executable_install-gnome-extensions - /home/dot_local/bin/executable_gist - /home/dot_local/bin/symlink_qrun.tmpl - /home/dot_local/bin/symlink_install-software.tmpl - /home/dot_local/bin/executable_open - /home/dot_local/bin/run_onchange_ensure-executable.tmpl - /home/dot_local/bin/executable_provision.tmpl - /home/dot_local/konsole/Default.profile - /home/dot_local/log/remove_dot_gitkeep - /home/dot_local/scripts/docker-functions.bash - /home/dot_local/scripts/motd.bash - /home/dot_local/scripts/p10k.zsh - /home/dot_local/share/ansible/plugins/action/symlink_commonlib.py.tmpl - /home/dot_local/share/ansible/plugins/action/symlink_qubesguid.py.tmpl - /home/dot_local/share/ansible/plugins/action/symlink_qubessls.py.tmpl - /home/dot_local/share/ansible/plugins/action/symlink_qubesformation.py.tmpl - /home/dot_local/share/ansible/plugins/action/symlink_qubes_pass.py.tmpl - /home/dot_local/share/ansible/plugins/connection/symlink_qubes.py.tmpl - /home/dot_local/share/ansible/plugins/library/symlink_qubessls.py.tmpl - /home/dot_local/share/ansible/plugins/library/symlink_qubesguid.py.tmpl - /home/dot_local/share/ansible/plugins/library/symlink_qubesformation.py.tmpl - /home/dot_local/share/ansible/plugins/library/symlink_qubes_pass.py.tmpl - /home/dot_local/share/ansible/plugins/lookup/symlink_qubes-pass.py.tmpl - /home/dot_local/share/ansible/plugins/lookup/symlink_jq.py.tmpl - /home/dot_local/share/ansible/tasks/symlink_qubes.tmpl - /home/dot_local/share/ansible/symlink_docs.tmpl - /home/dot_local/share/ansible/symlink_main.yml.tmpl - /home/dot_local/share/ansible/symlink_playbooks.tmpl - /home/dot_local/share/ansible/symlink_README.md.tmpl - /home/dot_local/share/ansible/symlink_requirements.yml.tmpl - /home/dot_local/share/ansible/symlink_environments.tmpl - /home/dot_local/share/ansible/symlink_Vagrantfile.tmpl - /home/dot_local/share/ansible/symlink_ansible.cfg.tmpl - /home/dot_local/share/ansible/run_onchange_after_symlink-ansible-configs.tmpl - /home/dot_local/share/fonts/Weather-Icons.ttf - /home/dot_local/share/fonts/FontAwesome.ttf - /home/dot_local/share/git-core/templates/hooks/post-commit - /home/dot_local/state/bash/remove_dot_gitkeep - /home/dot_local/state/zsh/remove_dot_gitkeep - /home/dot_local/Taskfile-local.yml - /home/dot_ssh/symlink_authorized_keys.tmpl - /home/dot_ssh/authorized_keys.github.tmpl - /home/dot_ssh/run_onchanges_after_ensure-private-key.tmpl - /home/dot_ssh/run_onchanges_after_generate-public-keys.tmpl - /home/dot_ssh/private_config.tmpl - /home/dot_vim/autoload/lightline/colorscheme/Betelgeuse.vim - /home/dot_vim/colors/Betelgeuse.vim - /home/private_dot_config/Google Assistant/client-secret.json - /home/private_dot_config/Google Assistant/config.json.tmpl - /home/private_dot_config/Kvantum/kvantum.config - /home/private_dot_config/VirtualBox/VirtualBox.xml.tmpl - /home/private_dot_config/alacritty/alacritty.yml - /home/private_dot_config/asdf/default-ruby-pkgs - /home/private_dot_config/asdf/asdfrc.tmpl - /home/private_dot_config/asdf/default-golang-pkgs - /home/private_dot_config/asdf/default-cargo-pkgs - /home/private_dot_config/asdf/default-python-pkgs - /home/private_dot_config/asdf/default-npm-packages - /home/private_dot_config/bashtop/bashtop.cfg - /home/private_dot_config/bat/config - /home/private_dot_config/brew/whalebrew - /home/private_dot_config/brew/Brewfile.tmpl - /home/private_dot_config/crontab/config - /home/private_dot_config/direnv/direnv.toml - /home/private_dot_config/fd/ignore - /home/private_dot_config/firejail/google-chrome-stable.local - /home/private_dot_config/firejail/bitwarden.local - /home/private_dot_config/firejail/thunderbird.local - /home/private_dot_config/firejail/slack.local - /home/private_dot_config/firejail/code.local - /home/private_dot_config/firejail/gcloud.local - /home/private_dot_config/firejail/chromium.local - /home/private_dot_config/fontconfig/fonts.conf - /home/private_dot_config/ghorg/conf.yaml.tmpl - /home/private_dot_config/git/template/symlink_post-checkout - /home/private_dot_config/git/template/symlink_post-rewrite - /home/private_dot_config/git/template/symlink_prepare-commit-msg - /home/private_dot_config/git/template/symlink_pre-push - /home/private_dot_config/git/template/symlink_post-commit - /home/private_dot_config/git/template/symlink_commit-msg - /home/private_dot_config/git/template/symlink_pre-commit - /home/private_dot_config/git/template/symlink_post-merge - /home/private_dot_config/git/attributes - /home/private_dot_config/git/ignore - /home/private_dot_config/git/config.tmpl - /home/private_dot_config/git/commit-template - /home/private_dot_config/gtk-1.0/.gitkeep - /home/private_dot_config/gtk-2.0/gtkrc - /home/private_dot_config/gtk-3.0/settings.ini - /home/private_dot_config/heroku/deploy.yml.tmpl - /home/private_dot_config/himalaya/config.toml - /home/private_dot_config/k9s/plugin.yml - /home/private_dot_config/kitty/Betelgeuse-light.conf - /home/private_dot_config/kitty/Betelgeuse-dark.conf - /home/private_dot_config/kitty/kitty.conf - /home/private_dot_config/libvirt/libvirtd.conf - /home/private_dot_config/ngrok/ngrok.yml.tmpl - /home/private_dot_config/npm/npmrc.tmpl.TODO - /home/private_dot_config/oh-my-posh/Betelgeuse-minimal.omp.json - /home/private_dot_config/oh-my-posh/Betelgeuse.omp.json - /home/private_dot_config/pg/.gitkeep - /home/private_dot_config/pgcli/config - /home/private_dot_config/plasma/plasmoids.yml - /home/private_dot_config/powershell/profile.ps1 - /home/private_dot_config/private_Code/User/extensions/theme-betelgeuse-vscode/themes/themer-light-color-theme.json - /home/private_dot_config/private_Code/User/extensions/theme-betelgeuse-vscode/themes/themer-dark-color-theme.json - /home/private_dot_config/private_Code/User/extensions/theme-betelgeuse-vscode/README.md - /home/private_dot_config/private_Code/User/extensions/theme-betelgeuse-vscode/package.json - /home/private_dot_config/private_Code/User/extensions/theme-betelgeuse-vscode/icon.svg - /home/private_dot_config/private_Code/User/settings.json - /home/private_dot_config/private_Code/User/keybindings.json - /home/private_dot_config/private_Code/User/extensions.json - /home/private_dot_config/putty/.gitkeep - /home/private_dot_config/rclone/merge_rclone.conf - /home/private_dot_config/readline/inputrc - /home/private_dot_config/ripgrep/config - /home/private_dot_config/rofi/config.rasi.tmpl - /home/private_dot_config/shell/exports.sh.tmpl - /home/private_dot_config/shell/profile.sh - /home/private_dot_config/shell/functions.sh - /home/private_dot_config/shell/aliases.sh.tmpl - /home/private_dot_config/shell/private_private.sh - /home/private_dot_config/shell/motd.sh - /home/private_dot_config/slack-term/config.tmpl - /home/private_dot_config/tabby/config.yaml.tmpl - /home/private_dot_config/terminator/config - /home/private_dot_config/tmux/remove_dot_gitkeep - /home/private_dot_config/vim/vimrc - /home/private_dot_config/wget/wgetrc - /home/private_dot_config/xfce4/terminal/terminalrc - /home/private_dot_config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml - /home/private_dot_config/xsettingsd/xsettingsd.conf - /home/private_dot_config/youtube-dl/config - /home/private_dot_config/zap/v2/config.ini - /home/private_dot_config/kcminputrc - /home/private_dot_config/kwinrc - /home/private_dot_config/gtkrc - /home/private_dot_config/mimeapps.list - /home/private_dot_config/ksplashrc - /home/private_dot_config/ktimezonedrc - /home/private_dot_config/plasma-localerc - /home/private_dot_config/plasmarc - /home/private_dot_config/chromium-flags.conf - /home/private_dot_config/konsolerc - /home/private_dot_config/kdeglobals - /home/dot_editorconfig - /home/key.txt.age - /home/dot_tool-versions.tmpl - /home/dot_Xresources - /home/dot_zshrc - /home/.chezmoi.yaml.tmpl - /home/dot_bashrc - /system/Applications/Firefox.app/Contents/Resources/distribution/policies.json - /system/boot/efi/EFI/qubes/modify_grubenv - /system/etc/cockpit/machines.d/TODO.cockpit-machine.json.tmpl - /system/etc/cups/cupsd.conf - /system/etc/cups/modify_cupsd.conf - /system/etc/default/modify_grub - /system/etc/fonts/local.conf - /system/etc/grub.d/31-hold-shift - /system/etc/keybase/config.json - /system/etc/opt/chrome/policies/managed/policies.json - /system/etc/qubes/repo-templates/qubes-templates.repo - /system/etc/sanoid/sanoid.conf.TODO - /system/etc/systemd/system/r2-docker.service - /system/etc/systemd/system/r2-{{ .user.username }}.service.tmpl - /system/etc/timeshift/timeshift.json - /system/etc/yum.repos.d/qubes-dom0.repo - /system/etc/modify_environment - /system/etc/rcloneignore - /system/etc/sddm.conf - /system/mnt/private_r2-docker/remove_dot_gitkeep - /system/usr/lib/firefox-esr/distribution/policies.json - /system/usr/lib/firefox/distribution/policies.json - /system/usr/local/bin/executable_rclone-mount - /system/usr/local/bin/executable_squash-symlink - /system/usr/local/share/run_onchange_after_setup-share-folder - /system/usr/share/run_onchange_after_setup-share-folder - /system/var/cache/rclone/remove_dot_gitkeep - /system/var/log/user/run_onchange_after-symlink-user-logs - /system/.chezmoidata.yaml - /system/.chezmoiexternal.toml - /system/.chezmoiignore - /.chezmoiignore - /.chezmoiroot - /software.yml - /README.md - /local/sync.sh
1633 lines
53 KiB
Text
1633 lines
53 KiB
Text
#!/usr/bin/env zx
|
||
|
||
const execSync = require("child_process").execSync;
|
||
|
||
// Log symbols
|
||
const figuresDefault = {
|
||
bullet: "●",
|
||
circle: "◯",
|
||
cross: "✖",
|
||
lozenge: "◆",
|
||
play: "▶",
|
||
pointer: "❯",
|
||
square: "◼",
|
||
star: "★",
|
||
tick: "✔",
|
||
};
|
||
|
||
const figuresFallback = {
|
||
bullet: "■",
|
||
circle: "□",
|
||
cross: "×",
|
||
lozenge: "♦",
|
||
play: "►",
|
||
pointer: ">",
|
||
square: "■",
|
||
star: "✶",
|
||
tick: "√",
|
||
};
|
||
|
||
function isUnicodeSupported() {
|
||
if (process.platform !== "win32") {
|
||
// Linux console (kernel)
|
||
return process.env.TERM !== "linux";
|
||
}
|
||
|
||
return (
|
||
Boolean(process.env.CI) ||
|
||
// Windows Terminal
|
||
Boolean(process.env.WT_SESSION) ||
|
||
// ConEmu and cmder
|
||
process.env.ConEmuTask === "{cmd::Cmder}" ||
|
||
process.env.TERM_PROGRAM === "vscode" ||
|
||
process.env.TERM === "xterm-256color" ||
|
||
process.env.TERM === "alacritty"
|
||
);
|
||
}
|
||
|
||
const figures = isUnicodeSupported() ? figuresDefault : figuresFallback;
|
||
|
||
function log(type, label, msg) {
|
||
let icon, message;
|
||
if (type === "info") {
|
||
icon = chalk.cyanBright(figures.pointer);
|
||
message = chalk.gray.bold(msg);
|
||
} else if (type === "star") {
|
||
icon = chalk.yellowBright(figures.star);
|
||
message = chalk.bold(msg);
|
||
} else if (type === "success") {
|
||
icon = chalk.greenBright(figures.play);
|
||
message = chalk.bold(msg);
|
||
} else if (type === "warn") {
|
||
icon = `${chalk.yellowBright(
|
||
figures.lozenge
|
||
)} ${chalk.bold.black.bgYellowBright(" WARNING ")}`;
|
||
message = chalk.yellowBright(msg);
|
||
} else if (type === "error") {
|
||
icon = `${chalk.redBright(figures.cross)} ${chalk.black.bold.bgRedBright(
|
||
" ERROR "
|
||
)}`;
|
||
message = chalk.redBright(msg);
|
||
}
|
||
const outputMessage = `${icon} ${chalk.bold(label)} ${message}`;
|
||
console.log(outputMessage);
|
||
}
|
||
|
||
let installData;
|
||
const installOrders = {};
|
||
const installOrdersPre = [];
|
||
const installOrdersPost = [];
|
||
const installOrdersSystemd = [];
|
||
let brewUpdated, osType, osID, snapRefreshed;
|
||
|
||
// Download the installation map
|
||
async function downloadInstallData() {
|
||
const response = await fetch(
|
||
"https://gitlab.com/megabyte-labs/misc/dotfiles/-/raw/master/.local/share/chezmoi/software.yml"
|
||
);
|
||
if (response.ok) {
|
||
const text = await response.text();
|
||
return YAML.parse(text);
|
||
} else {
|
||
log("error", "Catalog Download", `Failed to download the installation map`);
|
||
log("info", "Catalog Download", `Falling back to local version of software.yml`);
|
||
const text = fs.readFileSync(process.env.HOME + "/.local/share/chezmoi/software.yml");
|
||
return YAML.parse(text);
|
||
}
|
||
}
|
||
|
||
// Creates the installOrders object which maps package managers to arrays of packages to install
|
||
async function generateInstallOrders(pkgsToInstall) {
|
||
const logStage = "Install Orders";
|
||
const packagesToInstall = pkgsToInstall;
|
||
const installerPreference = await OSTypeInstallerKey();
|
||
log(
|
||
"info",
|
||
logStage,
|
||
`Installer preference category detected as ${installerPreference}`
|
||
);
|
||
const preferenceOrder = installData.installerPreference[installerPreference];
|
||
log("info", logStage, `Preference order acquired:`);
|
||
console.log(preferenceOrder);
|
||
const softwarePackages = installData.softwarePackages;
|
||
pkgFor: for (let pkg of packagesToInstall) {
|
||
let packageKey;
|
||
if (softwarePackages[pkg + ":" + osID]) {
|
||
packageKey = pkg + ":" + osID;
|
||
} else if (softwarePackages[pkg + ":" + osType]) {
|
||
packageKey = pkg + ":" + osType;
|
||
} else if (softwarePackages[pkg]) {
|
||
packageKey = pkg;
|
||
} else {
|
||
log(
|
||
"warn",
|
||
logStage,
|
||
`The package \`${pkg}\` was not found in the installation map`
|
||
);
|
||
continue;
|
||
}
|
||
for (let preference of preferenceOrder) {
|
||
let currentSelector,
|
||
doubleScoped,
|
||
scopedPkgManager,
|
||
scopedSystem,
|
||
normalCheck;
|
||
if (
|
||
softwarePackages[packageKey][preference + ":" + osID] ||
|
||
softwarePackages[packageKey][preference + ":" + osType] ||
|
||
softwarePackages[packageKey][preference]
|
||
) {
|
||
// Handle the _when attribute
|
||
currentSelector = "when";
|
||
doubleScoped =
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + preference + ":" + osID
|
||
] ||
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + osID + ":" + preference
|
||
] ||
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + preference + ":" + osType
|
||
] ||
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + osType + ":" + preference
|
||
];
|
||
scopedPkgManager =
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + preference
|
||
];
|
||
scopedSystem =
|
||
softwarePackages[packageKey]["_" + currentSelector + ":" + osID] ||
|
||
softwarePackages[packageKey]["_" + currentSelector + ":" + osType];
|
||
normalCheck = softwarePackages[packageKey]["_" + currentSelector];
|
||
if (doubleScoped) {
|
||
try {
|
||
await $doubleScoped;
|
||
} catch (e) {
|
||
let pref;
|
||
if (
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + preference + ":" + osID
|
||
]
|
||
) {
|
||
pref = preference + ":" + osID;
|
||
} else if (
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + preference + ":" + osType
|
||
]
|
||
) {
|
||
pref = preference + ":" + osType;
|
||
} else if (
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + osID + ":" + preference
|
||
]
|
||
) {
|
||
pref = osID + ":" + preference;
|
||
} else if (
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + osType + ":" + preference
|
||
]
|
||
) {
|
||
pref = osType + ":" + preference;
|
||
}
|
||
log(
|
||
"info",
|
||
"Skipping Package",
|
||
`${pkg} is being skipped because of the _when:${pref} condition`
|
||
);
|
||
continue pkgFor;
|
||
}
|
||
} else if (scopedPkgManager) {
|
||
try {
|
||
await $scopedPkgManager;
|
||
} catch (e) {
|
||
const pref = preference;
|
||
log(
|
||
"info",
|
||
"Skipping Package",
|
||
`${pkg} is being skipped because of the _when:${pref} condition`
|
||
);
|
||
continue pkgFor;
|
||
}
|
||
} else if (scopedSystem) {
|
||
try {
|
||
await $scopedSystem;
|
||
} catch (e) {
|
||
let pref;
|
||
if (
|
||
softwarePackages[packageKey]["_" + currentSelector + ":" + osID]
|
||
) {
|
||
pref = osID;
|
||
} else if (
|
||
softwarePackages[packageKey]["_" + currentSelector + ":" + osType]
|
||
) {
|
||
pref = osType;
|
||
}
|
||
log(
|
||
"info",
|
||
"Skipping Package",
|
||
`${pkg} is being skipped because of the _when:${pref} condition`
|
||
);
|
||
continue pkgFor;
|
||
}
|
||
} else if (normalCheck) {
|
||
try {
|
||
await $(normalCheck);
|
||
} catch (e) {
|
||
log(
|
||
"info",
|
||
"Skipping Package",
|
||
`${pkg} is being skipped because of the _when condition`
|
||
);
|
||
continue pkgFor;
|
||
}
|
||
}
|
||
|
||
// Handle the _bin attribute
|
||
currentSelector = "bin";
|
||
doubleScoped =
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + preference + ":" + osID
|
||
] ||
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + osID + ":" + preference
|
||
] ||
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + preference + ":" + osType
|
||
] ||
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + osType + ":" + preference
|
||
];
|
||
scopedPkgManager =
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + preference
|
||
];
|
||
scopedSystem =
|
||
softwarePackages[packageKey]["_" + currentSelector + ":" + osID] ||
|
||
softwarePackages[packageKey]["_" + currentSelector + ":" + osType];
|
||
normalCheck = softwarePackages[packageKey]["_" + currentSelector];
|
||
if (doubleScoped) {
|
||
const bin = typeof doubleScoped === 'string' ? which.sync(doubleScoped, { nothrow: true }) : doubleScoped.map(x => which.sync(x, { nothrow: true})).every(y => !!y);
|
||
if (bin) {
|
||
let pref;
|
||
if (
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + preference + ":" + osID
|
||
]
|
||
) {
|
||
pref = preference + ":" + osID;
|
||
} else if (
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + preference + ":" + osType
|
||
]
|
||
) {
|
||
pref = preference + ":" + osType;
|
||
} else if (
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + osID + ":" + preference
|
||
]
|
||
) {
|
||
pref = osID + ":" + preference;
|
||
} else if (
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + osType + ":" + preference
|
||
]
|
||
) {
|
||
pref = osType + ":" + preference;
|
||
}
|
||
log(
|
||
"info",
|
||
"Skipping Package",
|
||
`${pkg} is being skipped because of the _bin:${pref} condition`
|
||
);
|
||
log("info", "Skipping Package", `${bin} is already in the PATH`);
|
||
continue pkgFor;
|
||
}
|
||
} else if (scopedPkgManager) {
|
||
const bin = typeof scopedPkgManager === 'string' ? which.sync(scopedPkgManager, { nothrow: true }) : scopedPkgManager.map(x => which.sync(x, { nothrow: true})).every(y => !!y);
|
||
if (bin) {
|
||
const pref = preference;
|
||
log(
|
||
"info",
|
||
"Skipping Package",
|
||
`${pkg} is being skipped because of the _bin:${pref} condition`
|
||
);
|
||
log("info", "Skipping Package", `${bin} is already in the PATH`);
|
||
continue pkgFor;
|
||
}
|
||
} else if (scopedSystem) {
|
||
const bin = typeof scopedSystem === 'string' ? which.sync(scopedSystem, { nothrow: true }) : scopedSystem.map(x => which.sync(x, { nothrow: true})).every(y => !!y);
|
||
if (bin) {
|
||
let pref;
|
||
if (
|
||
softwarePackages[packageKey]["_" + currentSelector + ":" + osID]
|
||
) {
|
||
pref = osID;
|
||
} else if (
|
||
softwarePackages[packageKey]["_" + currentSelector + ":" + osType]
|
||
) {
|
||
pref = osType;
|
||
}
|
||
log(
|
||
"info",
|
||
"Skipping Package",
|
||
`${pkg} is being skipped because of the _bin:${pref} condition`
|
||
);
|
||
log("info", "Skipping Package", `${bin} is already in the PATH`);
|
||
continue pkgFor;
|
||
}
|
||
} else if (normalCheck) {
|
||
const bin = typeof normalCheck === 'string' ? which.sync(normalCheck, { nothrow: true }) : normalCheck.map(x => which.sync(x, { nothrow: true})).every(y => !!y);
|
||
if (bin) {
|
||
log(
|
||
"info",
|
||
"Skipping Package",
|
||
`${pkg} is being skipped because of the _bin condition`
|
||
);
|
||
log("info", "Skipping Package", `${bin} is already in the PATH`);
|
||
continue pkgFor;
|
||
}
|
||
}
|
||
|
||
// Handle the _deps attribute
|
||
currentSelector = "deps";
|
||
doubleScoped =
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + preference + ":" + osID
|
||
] ||
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + osID + ":" + preference
|
||
] ||
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + preference + ":" + osType
|
||
] ||
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + osType + ":" + preference
|
||
];
|
||
scopedPkgManager =
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + preference
|
||
];
|
||
scopedSystem =
|
||
softwarePackages[packageKey]["_" + currentSelector + ":" + osID] ||
|
||
softwarePackages[packageKey]["_" + currentSelector + ":" + osType];
|
||
normalCheck = softwarePackages[packageKey]["_" + currentSelector];
|
||
if (doubleScoped) {
|
||
let pref;
|
||
if (
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + preference + ":" + osID
|
||
]
|
||
) {
|
||
pref = preference + ":" + osID;
|
||
log("info", "Installing Dependencies", `Installing dependencies for ${packageKey}.${pref}`);
|
||
await installSoftware(softwarePackages[packageKey][pref])
|
||
} else if (
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + preference + ":" + osType
|
||
]
|
||
) {
|
||
pref = preference + ":" + osType;
|
||
log("info", "Installing Dependencies", `Installing dependencies for ${packageKey}.${pref}`);
|
||
await installSoftware(softwarePackages[packageKey][pref])
|
||
} else if (
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + osID + ":" + preference
|
||
]
|
||
) {
|
||
pref = osID + ":" + preference;
|
||
log("info", "Installing Dependencies", `Installing dependencies for ${packageKey}.${pref}`);
|
||
await installSoftware(softwarePackages[packageKey][pref])
|
||
} else if (
|
||
softwarePackages[packageKey][
|
||
"_" + currentSelector + ":" + osType + ":" + preference
|
||
]
|
||
) {
|
||
pref = osType + ":" + preference;
|
||
log("info", "Installing Dependencies", `Installing dependencies for ${packageKey}.${pref}`);
|
||
await installSoftware(softwarePackages[packageKey][pref])
|
||
}
|
||
} else if (scopedPkgManager) {
|
||
const pref = preference;
|
||
log("info", "Installing Dependencies", `Installing dependencies for ${packageKey}.${pref}`);
|
||
await installSoftware(softwarePackages[packageKey][pref])
|
||
} else if (scopedSystem) {
|
||
let pref;
|
||
if (
|
||
softwarePackages[packageKey]["_" + currentSelector + ":" + osID]
|
||
) {
|
||
pref = osID;
|
||
log("info", "Installing Dependencies", `Installing dependencies for ${packageKey}.${pref}`);
|
||
await installSoftware(softwarePackages[packageKey][pref])
|
||
} else if (
|
||
softwarePackages[packageKey]["_" + currentSelector + ":" + osType]
|
||
) {
|
||
pref = osType;
|
||
log("info", "Installing Dependencies", `Installing dependencies for ${packageKey}.${pref}`);
|
||
await installSoftware(softwarePackages[packageKey][pref])
|
||
}
|
||
} else if (normalCheck) {
|
||
log("info", "Installing Dependencies", `Installing dependencies for ${packageKey}.deps`);
|
||
await installSoftware(softwarePackages[packageKey]['_deps'])
|
||
}
|
||
if (softwarePackages[packageKey][preference + ":" + osID]) {
|
||
await updateInstallMaps(
|
||
preference,
|
||
softwarePackages[packageKey],
|
||
preference + ":" + osID,
|
||
pkg,
|
||
packageKey,
|
||
softwarePackages
|
||
);
|
||
break;
|
||
} else if (softwarePackages[packageKey][preference + ":" + osType]) {
|
||
await updateInstallMaps(
|
||
preference,
|
||
softwarePackages[packageKey],
|
||
preference + ":" + osType,
|
||
pkg,
|
||
packageKey,
|
||
softwarePackages
|
||
);
|
||
break;
|
||
} else if (softwarePackages[packageKey][preference]) {
|
||
await updateInstallMaps(
|
||
preference,
|
||
softwarePackages[packageKey],
|
||
preference,
|
||
pkg,
|
||
packageKey,
|
||
softwarePackages
|
||
);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return installOrders;
|
||
}
|
||
|
||
// Update install, pre-hook, and post-hook objects
|
||
async function updateInstallMaps(
|
||
preference,
|
||
packages,
|
||
scopedPreference,
|
||
pkg,
|
||
packageKey,
|
||
softwarePackages
|
||
) {
|
||
const preHook = getHook(packages, "pre", scopedPreference, preference);
|
||
if (preHook) {
|
||
installOrdersPre.concat(typeof preHook === "string" ? [preHook] : preHook);
|
||
}
|
||
const postHook = getHook(packages, "post", scopedPreference, preference);
|
||
if (postHook) {
|
||
installOrdersPost.concat(
|
||
typeof postHook === "string" ? [postHook] : postHook
|
||
);
|
||
}
|
||
const systemdHook = getHook(packages, "systemd", scopedPreference, preference)
|
||
if (systemdHook) {
|
||
installOrdersSystemd.concat(
|
||
typeof systemdHook === "string" ? [systemdHook] : systemdHook
|
||
);
|
||
}
|
||
if (!installOrders[preference]) {
|
||
installOrders[preference] = [];
|
||
}
|
||
log(
|
||
"info",
|
||
"Install Orders",
|
||
`Found a match for the package \`${pkg}\` (${packageKey} via ${scopedPreference})`
|
||
);
|
||
const newPackages = packages[scopedPreference];
|
||
const newPkgs = typeof newPackages === "string" ? [newPackages] : newPackages;
|
||
if (preference === 'snap' && softwarePackages["_snapClassic"] === true) {
|
||
if (!installOrders[preference + '-classic']) {
|
||
installOrders[preference + '-classic'] = [];
|
||
}
|
||
installOrders[preference + '-classic'] = installOrders[preference].concat(newPkgs);
|
||
} else {
|
||
installOrders[preference] = installOrders[preference].concat(newPkgs);
|
||
}
|
||
}
|
||
|
||
// Get pre / post install hooks
|
||
function getHook(packages, hook, scopedPreference, preference) {
|
||
const hookLabel = "_" + hook + ":";
|
||
if (packages[hookLabel + scopedPreference]) {
|
||
return packages[hookLabel + scopedPreference];
|
||
} else if (packages[hookLabel + preference]) {
|
||
return packages[hookLabel + preference];
|
||
} else if (packages[hookLabel + osID]) {
|
||
return packages;
|
||
} else if (packages[hookLabel + osType]) {
|
||
return packages[hookLabel + osType];
|
||
} else if (packages["_" + hook]) {
|
||
return packages["_" + hook];
|
||
}
|
||
}
|
||
|
||
// Acquire OS type installer key (for the installerPreference data key)
|
||
async function OSTypeInstallerKey() {
|
||
try {
|
||
const apt = which.sync("apt-get", { nothrow: true });
|
||
const dnf = which.sync("dnf", { nothrow: true });
|
||
const freebsdPkg = which.sync("pkg", { nothrow: true });
|
||
const freebsdVersion = which.sync("freebsd-version", { nothrow: true });
|
||
const pacman = which.sync("pacman", { nothrow: true });
|
||
const yum = which.sync("yum", { nothrow: true });
|
||
const zypper = which.sync("zypper", { nothrow: true });
|
||
if (apt) {
|
||
return "apt";
|
||
} else if (dnf || yum) {
|
||
return "dnf";
|
||
} else if (pacman) {
|
||
return "pacman";
|
||
} else if (zypper) {
|
||
return "zypper";
|
||
} else if (freebsdPkg && freebsdVersion) {
|
||
return "freebsd";
|
||
} else {
|
||
try {
|
||
await $`test -d /Applications && test -d /Library`;
|
||
return "darwin";
|
||
} catch (e) {
|
||
return "windows";
|
||
}
|
||
}
|
||
} catch (e) {
|
||
log("error", "OS Detection", 'There was an error determining the type of operating system')
|
||
console.error(e)
|
||
}
|
||
}
|
||
|
||
// Acquire OS type
|
||
async function OSType() {
|
||
try {
|
||
await $`test -d /Applications && test -d /Library`;
|
||
return "darwin";
|
||
} catch (e) {
|
||
try {
|
||
await $`test -f /etc/os-release`;
|
||
return "linux";
|
||
} catch (e) {
|
||
return "windows";
|
||
}
|
||
}
|
||
}
|
||
|
||
// Acquire release ID (for Linux)
|
||
async function releaseID() {
|
||
const ID = await $`
|
||
if [ -f /etc/os-release ]; then
|
||
. /etc/os-release
|
||
echo -n $ID
|
||
fi
|
||
`;
|
||
return ID.stdout;
|
||
}
|
||
|
||
// Post-install hook
|
||
async function afterInstall(packageManager) {
|
||
const logStage = "Post-Install Package Manager";
|
||
if (packageManager === "appimage") {
|
||
} else if (packageManager === "ansible") {
|
||
log(
|
||
"info",
|
||
logStage,
|
||
`Ensuring temporary passwordless sudo privileges used by Ansible are removed`
|
||
);
|
||
const gsed = which.sync("gsed", { nothrow: true });
|
||
if (gsed) {
|
||
await $`sudo gsed -i '/# TEMPORARY FOR ANSIBLE INSTALL/d' /etc/sudoers`;
|
||
} else {
|
||
await $`sudo sed -i '/# TEMPORARY FOR ANSIBLE INSTALL/d' /etc/sudoers`;
|
||
}
|
||
} else if (packageManager === "apk") {
|
||
} else if (packageManager === "apt") {
|
||
try {
|
||
await $`sudo apt-get autoclean`
|
||
await $`sudo apt-get autoremove`
|
||
} catch (e) {
|
||
log("error", logStage, 'Error cleaning up apt')
|
||
}
|
||
} else if (packageManager === "basher") {
|
||
} else if (packageManager === "binary") {
|
||
} else if (packageManager === "brew" || packageManager === "cask") {
|
||
} else if (packageManager === "cargo") {
|
||
} else if (packageManager === "choco") {
|
||
} else if (packageManager === "crew") {
|
||
} else if (packageManager === "dnf") {
|
||
} else if (packageManager === "flatpak") {
|
||
} else if (packageManager === "gem") {
|
||
} else if (packageManager === "go") {
|
||
} else if (packageManager === "nix") {
|
||
} else if (packageManager === "npm") {
|
||
} else if (packageManager === "pacman") {
|
||
} else if (packageManager === "pipx") {
|
||
} else if (packageManager === "pkg") {
|
||
} else if (packageManager === "port") {
|
||
} else if (packageManager === "scoop") {
|
||
} else if (packageManager === "script") {
|
||
} else if (packageManager === "snap") {
|
||
} else if (packageManager === "whalebrew") {
|
||
} else if (packageManager === "winget") {
|
||
} else if (packageManager === "yay") {
|
||
} else if (packageManager === "zypper") {
|
||
}
|
||
}
|
||
|
||
async function ensurePackage(dep) {
|
||
const target = which.sync(dep, { nothrow: true })
|
||
if (!target) {
|
||
if (osType === 'linux') {
|
||
const apk = which.sync("apk", { nothrow: true });
|
||
const apt = which.sync("apt", { nothrow: true });
|
||
const dnf = which.sync("dnf", { nothrow: true });
|
||
const yum = which.sync("yum", { nothrow: true });
|
||
const pacman = which.sync("pacman", { nothrow: true });
|
||
const zypper = which.sync("zypper", { nothrow: true });
|
||
if (apk) {
|
||
$`sudo apk add ${dep}`;
|
||
} else if (apt) {
|
||
if (updateDone[packageManager] !== true) {
|
||
await beforeInstall('apt-get')
|
||
}
|
||
await $`sudo apt-get install -y ${dep}`;
|
||
} else if (dnf) {
|
||
if (updateDone[packageManager] !== true) {
|
||
await beforeInstall('dnf')
|
||
}
|
||
await $`sudo dnf install -y ${dep}`;
|
||
} else if (yum) {
|
||
if (updateDone[packageManager] !== true) {
|
||
await beforeInstall('dnf')
|
||
}
|
||
await $`sudo yum install -y ${dep}`;
|
||
} else if (pacman) {
|
||
if (updateDone[packageManager] !== true) {
|
||
await beforeInstall('pacman')
|
||
}
|
||
await $`sudo pacman -Sy ${dep}`;
|
||
} else if (zypper) {
|
||
if (updateDone[packageManager] !== true) {
|
||
await beforeInstall('zypper')
|
||
}
|
||
await $`sudo zypper install -y ${dep}`;
|
||
}
|
||
} else if (osType === 'darwin') {
|
||
if (updateDone['brew'] !== true) {
|
||
await beforeInstall('brew')
|
||
}
|
||
await $`brew install ${dep}`
|
||
} else if (osType === 'windows') {
|
||
if (updateDone['choco'] !== true) {
|
||
await beforeInstall('choco')
|
||
}
|
||
await `choco install -y ${dep}`
|
||
}
|
||
}
|
||
}
|
||
|
||
// Pre-install hook
|
||
const updateDone = {}
|
||
async function beforeInstall(packageManager) {
|
||
updateDone[packageManager] = true
|
||
const logStage = "Pre-Install Package Manager";
|
||
if (packageManager === "appimage") {
|
||
} else if (packageManager === "ansible") {
|
||
log(
|
||
"info",
|
||
logStage,
|
||
`Temporarily enabling passwordless sudo for Ansible role installations`
|
||
);
|
||
await $`echo "$(whoami) ALL=(ALL:ALL) NOPASSWD: ALL # TEMPORARY FOR ANSIBLE INSTALL" | sudo tee -a /etc/sudoers`;
|
||
log('info', logStage, 'Running Ansible setup task so facts are cached')
|
||
const unbuffer = which.sync('unbuffer', { nothrow: true })
|
||
let unbufferPrefix = ''
|
||
if (unbuffer) {
|
||
unbufferPrefix = 'unbuffer'
|
||
}
|
||
await $`${unbufferPrefix} ansible 127.0.0.1 -vv -e '{ ansible_connection: "local", ansible_user: "${process.env.USER}", install_homebrew: False }' -m setup`;
|
||
} else if (packageManager === "apk") {
|
||
await $`sudo apk update`;
|
||
} else if (packageManager === "apt") {
|
||
await $`sudo apt-get update`;
|
||
} else if (packageManager === "basher") {
|
||
} else if (packageManager === "binary") {
|
||
} else if (packageManager === "brew" || packageManager === "cask") {
|
||
if (!brewUpdated) {
|
||
brewUpdated = true
|
||
await $`brew update`;
|
||
}
|
||
} else if (packageManager === "cargo") {
|
||
} else if (packageManager === "choco") {
|
||
} else if (packageManager === "crew") {
|
||
await $`crew update`;
|
||
} else if (packageManager === "dnf") {
|
||
const dnf = which.sync("dnf", { nothrow: true });
|
||
const yum = which.sync("yum", { nothrow: true });
|
||
if (dnf) {
|
||
await $`dnf check-update`;
|
||
} else if (yum) {
|
||
await $`yum check-update`;
|
||
}
|
||
} else if (packageManager === "flatpak") {
|
||
await $`sudo flatpak update`;
|
||
} else if (packageManager === "gem") {
|
||
} else if (packageManager === "go") {
|
||
} else if (packageManager === "nix") {
|
||
await $`nix-channel --update`;
|
||
} else if (packageManager === "npm") {
|
||
} else if (packageManager === "pacman") {
|
||
await $`sudo pacman -Syu`;
|
||
} else if (packageManager === "pipx") {
|
||
} else if (packageManager === "pkg") {
|
||
await $`sudo pkg upgrade`;
|
||
} else if (packageManager === "port") {
|
||
const port = which.sync("port", { nothrow: true });
|
||
if (port) {
|
||
await $`sudo port sync`;
|
||
} else {
|
||
log(
|
||
"error",
|
||
"Port Not Installed",
|
||
"Skipping sudo port sync step because port is not installed"
|
||
);
|
||
}
|
||
} else if (packageManager === "scoop") {
|
||
await $`scoop update`;
|
||
} else if (packageManager === "snap" || packageManager === "snap-classic") {
|
||
if (!snapRefreshed) {
|
||
snapRefreshed = true
|
||
await $`sudo snap refresh`;
|
||
}
|
||
} else if (packageManager === "whalebrew") {
|
||
if (osType === "darwin") {
|
||
const docker = which.sync("docker", { nothrow: true });
|
||
if (!docker) {
|
||
await $`brew install --cask docker`;
|
||
}
|
||
try {
|
||
await $`docker run --rm hello-world`;
|
||
} catch (e) {
|
||
log(
|
||
"warn",
|
||
logStage,
|
||
`The command \`docker run --rm hello-world\` failed`
|
||
);
|
||
try {
|
||
log(
|
||
"info",
|
||
logStage,
|
||
"Attempting to open `/Applications/Docker.app` (Docker Desktop for macOS). This should take about 30 seconds."
|
||
);
|
||
const promises = [
|
||
$`test -d /Applications/Docker.app`,
|
||
$`open /Applications/Docker.app`,
|
||
];
|
||
await Promise.all(promises);
|
||
const gum = which.sync("gum", { nothrow: true });
|
||
if (gum) {
|
||
execSync(
|
||
'gum spin --spinner dot --title "Waiting for Docker Desktop to start up.." -- sleep 30',
|
||
{ stdio: "inherit", shell: true }
|
||
);
|
||
} else {
|
||
await $`sleep 30`;
|
||
}
|
||
} catch (e) {
|
||
log("warn", logStage, `Docker Desktop appears to not be installed!`);
|
||
}
|
||
}
|
||
}
|
||
} else if (packageManager === "winget") {
|
||
await $`winget source update`;
|
||
} else if (packageManager === "yay") {
|
||
} else if (packageManager === "zypper") {
|
||
await $`sudo zypper update`;
|
||
}
|
||
}
|
||
|
||
async function ensureInstalled(bin, callback) {
|
||
const logStage = "Package Manager Install";
|
||
const installed = which.sync(bin, { nothrow: true });
|
||
if (installed) {
|
||
log("info", logStage, `\`${bin}\` is available`);
|
||
} else {
|
||
log("warn", logStage, `\`${bin}\` is not installed!`);
|
||
if (callback) {
|
||
await callback;
|
||
} else {
|
||
log(
|
||
"error",
|
||
logStage,
|
||
`There does not appear to be an installation method available for \`${bin}\``
|
||
);
|
||
}
|
||
}
|
||
}
|
||
|
||
async function ensurePackageManagerAnsible() {
|
||
await $`pipx install ansible`;
|
||
await $`pipx inject ansible PyObjC PyObjC-core docker lxml netaddr pexpect python-vagrant pywinrm requests-credssp watchdog`;
|
||
await $`mkdir -p "$HOME/.cache/megabyte-labs"`;
|
||
await $`touch "$HOME/.cache/megabyte-labs/ansible-installed"`;
|
||
log(
|
||
"info",
|
||
"Package Manager Install",
|
||
`Ansible and its supporting packages are now installed via pipx`
|
||
);
|
||
}
|
||
|
||
// Ensure the package manager is available
|
||
let packageManagerInstalled = {};
|
||
async function ensurePackageManager(packageManager) {
|
||
const logStage = "Package Manager Install";
|
||
log("info", logStage, `Ensuring \`${packageManager}\` is set up`);
|
||
if (packageManagerInstalled[packageManager]) {
|
||
return;
|
||
} else {
|
||
packageManagerInstalled[packageManager] = true;
|
||
}
|
||
if (packageManager === "ansible") {
|
||
await ensurePackageManager("pipx");
|
||
}
|
||
if (
|
||
packageManager === "gem" ||
|
||
packageManager === "go" ||
|
||
packageManager === "npm" ||
|
||
packageManager === "pipx" ||
|
||
packageManager === "whalebrew"
|
||
) {
|
||
await ensurePackageManager("brew");
|
||
}
|
||
if (packageManager === "appimage") {
|
||
const zap = which.sync('zap', { nothrow: true })
|
||
if (!zap) {
|
||
log("info", "Zap Installation", 'Installing Zap to handle AppImage installation')
|
||
await ensurePackage('curl')
|
||
await $`sudo curl -sSL https://github.com/srevinsaju/zap/releases/download/continuous/zap-amd64 > /usr/local/bin/zap`
|
||
}
|
||
} else if (packageManager === "ansible") {
|
||
try {
|
||
await $`test -f "$HOME/.cache/megabyte-labs/ansible-installed"`;
|
||
const ansible = which.sync("ansible", { nothrow: true });
|
||
if (ansible) {
|
||
log(
|
||
"info",
|
||
logStage,
|
||
`\`ansible\` and its supporting packages appear to be installed`
|
||
);
|
||
} else {
|
||
await ensurePackageManagerAnsible();
|
||
}
|
||
} catch (e) {
|
||
await ensurePackageManagerAnsible();
|
||
}
|
||
} else if (packageManager === "apk") {
|
||
await ensureInstalled("apk", false);
|
||
} else if (packageManager === "apt") {
|
||
await ensureInstalled("apt", false);
|
||
} else if (packageManager === "basher") {
|
||
await ensureInstalled(
|
||
"basher",
|
||
$`
|
||
# TODO
|
||
echo "Bash script that installs basher here"
|
||
`
|
||
);
|
||
} else if (packageManager === "binary") {
|
||
await ensurePackage('curl')
|
||
} else if (packageManager === "bpkg") {
|
||
await ensureInstalled(
|
||
"bpkg",
|
||
$`
|
||
# TODO
|
||
echo "Bash script that installs bpkg here"
|
||
`
|
||
);
|
||
} else if (packageManager === "brew" || packageManager === "cask") {
|
||
const brew = which.sync("brew", { nothrow: true });
|
||
if (!brew) {
|
||
await ensureInstalled(
|
||
"brew",
|
||
$`
|
||
if command -v sudo > /dev/null && sudo -n true; then
|
||
echo | bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||
else
|
||
log('info', logStage, 'Homebrew is not installed. Password may be required.')
|
||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" || BREW_EXIT_CODE="$?"
|
||
if [ -n "$BREW_EXIT_CODE" ]; then
|
||
if command -v brew > /dev/null; then
|
||
log('warn', logStage, 'Homebrew was installed but part of the installation failed. Attempting to fix..')
|
||
BREW_DIRS="share/man share/doc share/zsh/site-functions etc/bash_completion.d"
|
||
for BREW_DIR in $BREW_DIRS; do
|
||
if [ -d "$(brew --prefix)/$BREW_DIR" ]; then
|
||
sudo chown -R "$(whoami)" "$(brew --prefix)/$BREW_DIR"
|
||
fi
|
||
done
|
||
brew update --force --quiet
|
||
fi
|
||
fi
|
||
fi
|
||
`
|
||
);
|
||
}
|
||
} else if (packageManager === "cargo") {
|
||
await ensureInstalled(
|
||
"cargo",
|
||
$`
|
||
# TODO Bash script that installs cargo
|
||
`
|
||
);
|
||
} else if (packageManager === "choco") {
|
||
await ensureInstalled(
|
||
"choco",
|
||
$`
|
||
powershell "Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))"
|
||
`
|
||
);
|
||
} else if (packageManager === "crew") {
|
||
await ensureInstalled(
|
||
"crew",
|
||
$`
|
||
# TODO Bash script that installs crew here
|
||
# Source: https://github.com/chromebrew/chromebrew
|
||
curl -Ls git.io/vddgY | bash
|
||
`
|
||
);
|
||
} else if (packageManager === "dnf") {
|
||
const dnf = which.sync("dnf", { nothrow: true });
|
||
const yum = which.sync("yum", { nothrow: true });
|
||
if (dnf) {
|
||
log("info", logStage, `\`dnf\` is available`);
|
||
} else if (yum) {
|
||
log("info", logStage, `\`yum\` is available`);
|
||
} else {
|
||
log("error", logStage, `Both \`dnf\` and \`yum\` are not available`);
|
||
}
|
||
} else if (packageManager === "flatpak") {
|
||
const flatpak = which.sync("flatpak", { nothrow: true });
|
||
if (flatpak) {
|
||
log("info", logStage, `\`flatpak\` is available`);
|
||
} else {
|
||
const apk = which.sync("apk", { nothrow: true });
|
||
const apt = which.sync("apt", { nothrow: true });
|
||
const dnf = which.sync("dnf", { nothrow: true });
|
||
const yum = which.sync("yum", { nothrow: true });
|
||
const pacman = which.sync("pacman", { nothrow: true });
|
||
const zypper = which.sync("zypper", { nothrow: true });
|
||
if (apk) {
|
||
$`sudo apk add flatpak`;
|
||
} else if (apt) {
|
||
$`
|
||
sudo apt install -y flatpak
|
||
if [ -f /usr/bin/gnome-shell ]; then
|
||
sudo apt install -y gnome-software-plugin-flatpak
|
||
fi
|
||
if [ -f /usr/bin/plasmashell ]; then
|
||
sudo apt install -y plasmashell
|
||
fi
|
||
`;
|
||
} else if (dnf) {
|
||
await $`sudo dnf install -y flatpak`;
|
||
} else if (yum) {
|
||
await $`sudo yum install -y flatpak`;
|
||
} else if (pacman) {
|
||
await $`sudo pacman -Sy flatpak`;
|
||
} else if (zypper) {
|
||
await $`sudo zypper install -y flatpak`;
|
||
}
|
||
const flatpakPost = which.sync("flatpak", { nothrow: true });
|
||
if (flatpakPost) {
|
||
await $`flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo`;
|
||
} else {
|
||
log("error", logStage, `\`flatpak\` failed to install!`);
|
||
}
|
||
log(
|
||
"info",
|
||
logStage,
|
||
`\`flatpak\` was installed. It may require a reboot to function correctly.`
|
||
);
|
||
}
|
||
} else if (packageManager === "gem") {
|
||
await ensureInstalled("gem", $`brew install ruby`);
|
||
} else if (packageManager === "go") {
|
||
await ensureInstalled("gem", $`brew install go`);
|
||
} else if (packageManager === "nix") {
|
||
await ensureInstalled(
|
||
"nix",
|
||
$`
|
||
if [ -d /Applications ] && [ -d /Library ]; then
|
||
sh <(curl -L https://nixos.org/nix/install)
|
||
else
|
||
sh <(curl -L https://nixos.org/nix/install) --daemon
|
||
fi
|
||
`
|
||
);
|
||
} else if (packageManager === "npm") {
|
||
const npm = which("npm", { nothrow: true });
|
||
const node = which("node", { nothrow: true });
|
||
const volta = which("volta", { nothrow: true });
|
||
if (npm && node && volta) {
|
||
log("info", logStage, `\`npm\`, \`node\`, and \`volta\` are available`);
|
||
} else {
|
||
if (!volta) {
|
||
await $`brew install volta`;
|
||
}
|
||
await $`
|
||
if [ -z "$VOLTA_HOME" ]; then
|
||
volta setup
|
||
fi
|
||
export PATH="$VOLTA_HOME/bin:$PATH"
|
||
volta install node
|
||
`;
|
||
}
|
||
} else if (packageManager === "pacman") {
|
||
await ensureInstalled("pacman", false);
|
||
} else if (packageManager === "pipx") {
|
||
await ensureInstalled("pipx", $`brew install pipx && pipx ensurepath`);
|
||
} else if (packageManager === "pkg") {
|
||
await ensureInstalled("pkg", false);
|
||
} else if (packageManager === "port") {
|
||
const port = which.sync('port', { nothrow: true })
|
||
if (!port) {
|
||
log('info', logStage, `Installing ${packageManager}`)
|
||
await ensureInstalled(
|
||
"port",
|
||
$`
|
||
sudo mkdir -p /opt/mports
|
||
cd /opt/mports
|
||
sudo rm -rf macports-base
|
||
sudo git clone https://github.com/macports/macports-base.git
|
||
cd macports-base
|
||
sudo git checkout v2.8.0
|
||
sudo bash --noprofile --norc -c './configure --enable-readline && make && make install && make distclean'
|
||
sudo port selfupdate
|
||
`
|
||
);
|
||
log('info', logStage, `${packageManager} is now installed`)
|
||
} else {
|
||
log("info", logStage, `\`port\` is available`);
|
||
}
|
||
} else if (packageManager === "scoop") {
|
||
await ensureInstalled(
|
||
"scoop",
|
||
$`
|
||
powershell 'Set-ExecutionPolicy RemoteSigned -Scope CurrentUser'
|
||
powershell 'irm get.scoop.sh | iex
|
||
`
|
||
);
|
||
} else if (packageManager === "snap") {
|
||
const apk = which.sync("apk", { nothrow: true });
|
||
const apt = which.sync("apt-get", { nothrow: true });
|
||
const dnf = which.sync("dnf", { nothrow: true });
|
||
const yum = which.sync("yum", { nothrow: true });
|
||
const pacman = which.sync("pacman", { nothrow: true });
|
||
const zypper = which.sync("zypper", { nothrow: true });
|
||
if (apt) {
|
||
await $`
|
||
if [ -f /etc/apt/preferences.d/nosnap.pref ]; then
|
||
sudo mv /etc/apt/preferences.d/nosnap.pref /etc/apt/nosnap.pref.bak
|
||
fi
|
||
sudo apt install -y snapd
|
||
`;
|
||
// TODO Following may be required on Kali -> https://snapcraft.io/docs/installing-snap-on-kali
|
||
// systemctl enable --now snapd apparmor
|
||
} else if (dnf) {
|
||
await $`
|
||
sudo dnf install -y snapd
|
||
if [ ! -d /snap ]; then
|
||
sudo ln -s /var/lib/snapd/snap /snap
|
||
fi
|
||
`;
|
||
} else if (yum) {
|
||
await $`
|
||
sudo yum install -y snapd
|
||
sudo systemctl enable --now snapd.socket
|
||
if [ ! -d /snap ]; then
|
||
sudo ln -s /var/lib/snapd/snap /snap
|
||
fi
|
||
`;
|
||
} else if (pacman) {
|
||
await $`
|
||
if [ -f /etc/arch-release ]; then
|
||
sudo git clone https://aur.archlinux.org/snapd.git /usr/local/src/snapd
|
||
cd /usr/local/src/snapd
|
||
sudo makepkg -si
|
||
else
|
||
sudo pacman -S snapd
|
||
sudo systemctl enable --now snapd.socket
|
||
if [ ! -d /snap ]; then
|
||
sudo ln -s /var/lib/snapd/snap /snap
|
||
fi
|
||
fi
|
||
`;
|
||
} else if (zypper) {
|
||
// TODO See https://snapcraft.io/docs/installing-snap-on-opensuse
|
||
await $`
|
||
echo "TODO - Bash script that installs snap w/ zypper"
|
||
`;
|
||
}
|
||
const snap = which.sync("snap", { nothrow: true });
|
||
if (snap) {
|
||
$`sudo snap install core`;
|
||
} else {
|
||
log("warn", logStage, 'Snap installation sequence completed but the snap bin is still not available')
|
||
}
|
||
} else if (packageManager === "script") {
|
||
} else if (packageManager === "whalebrew") {
|
||
await ensureInstalled("whalebrew", $`brew install whalebrew`);
|
||
} else if (packageManager === "winget") {
|
||
await ensureInstalled(
|
||
"winget",
|
||
$`
|
||
echo "TODO - Script that installs winget here"
|
||
`
|
||
);
|
||
} else if (packageManager === "yay") {
|
||
const yay = which.sync("yay", { nothrow: true });
|
||
await $`sudo pacman -S --needed base-devel git`;
|
||
await $`
|
||
if [ -d /usr/local/src ]; then
|
||
git clone https://aur.archlinux.org/yay.git /usr/local/src/yay
|
||
cd /usr/local/src/yay
|
||
makepkg -si
|
||
fi
|
||
`;
|
||
} else if (packageManager === "zypper") {
|
||
await ensureInstalled("zypper", false);
|
||
}
|
||
}
|
||
|
||
// Installs a list of packages via the specified package manager
|
||
async function installPackageList(packageManager, packages) {
|
||
const logStage = "Package Install";
|
||
try {
|
||
if (packageManager === "appimage") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
if (pkg.substring(0, 3) === 'http' && pkg.slice(-8) === 'AppImage') {
|
||
log("info", "AppImage Install", `Installing ${pkg} from its URL`)
|
||
await $`zap install --from ${pkg}`
|
||
} else if (pkg.includes("/")) {
|
||
log("info", "AppImage Install", `Installing ${pkg} from a GitHub Release`)
|
||
await $`zap install --github --from ${pkg}`
|
||
} else {
|
||
log("info", "AppImage Install", `Installing ${pkg} using the AppImage Catalog`)
|
||
await $`zap install ${pkg}`
|
||
}
|
||
} catch (e) {
|
||
log("error", "AppImage / Zap Failure", `There was an error using Zap to install ${pkg}`)
|
||
}
|
||
}
|
||
} else if (packageManager === "ansible") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
const unbuffer = which.sync('unbuffer', { nothrow: true })
|
||
let unbufferPrefix = ''
|
||
if (unbuffer) {
|
||
unbufferPrefix = 'unbuffer'
|
||
}
|
||
const verboseMode = process.env.DEBUG_MODE === 'on' ? 'vv' : ''
|
||
await $`${unbufferPrefix} ansible 127.0.0.1 -v${verboseMode} -e '{ ansible_connection: "local", ansible_user: "${process.env.USER}", install_homebrew: False }' -m include_role -a name=${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Ansible Role Failure",
|
||
`There was an error installing ${pkg} with Ansible`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "apk") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`sudo apk add ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"APK Install Failure",
|
||
`There was an error installing ${pkg} with apk`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "apt") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`sudo apt-get install -y ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"apt-get Failure",
|
||
`There was an error installing ${pkg} with apt-get`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "basher") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`basher install ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Basher Failure",
|
||
`There was an error installing ${pkg} with basher`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "binary") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`TMP="$(mktemp)" && curl -sSL ${pkg} > "$TMP" && sudo mv "$TMP" /usr/local/src/${binName} && chmod +x /usr/local/src/${binName}`
|
||
} catch (e) {
|
||
log("error", "Binary Release Install", `There was an error installing the binary release for ${pkg}`)
|
||
}
|
||
}
|
||
} else if (packageManager === "brew") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`brew install ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Homebrew Failure",
|
||
`There was an error installing ${pkg} with brew`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "cask") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`brew install --cask ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Homebrew Cask Failure",
|
||
`There was an error installing ${pkg} with Homebrew Cask`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "cargo") {
|
||
for (const pkg of packages) {
|
||
try {
|
||
await $`cargo install ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Cargo Failure",
|
||
`There was an error installing ${pkg} with Cargo`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "choco") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`choco install -y ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Chocolatey Failure",
|
||
`There was an error installing ${pkg} with Chocolatey`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "crew") {
|
||
} else if (packageManager === "dnf") {
|
||
const dnf = which.sync("dnf", { nothrow: true });
|
||
const yum = which.sync("yum", { nothrow: true });
|
||
if (dnf) {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`sudo dnf install -y ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"dnf Failure",
|
||
`There was an error installing ${pkg} with dnf`
|
||
);
|
||
}
|
||
}
|
||
} else if (yum) {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`sudo yum install -y ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"yum Failure",
|
||
`There was an error installing ${pkg} with yum`
|
||
);
|
||
}
|
||
}
|
||
}
|
||
} else if (packageManager === "flatpak") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`sudo flatpak install flathub ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Flatpak Failure",
|
||
`There was an error installing ${pkg} with flatpak`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "gem") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`gem install ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Gem Failure",
|
||
`There was an error installing ${pkg} with gem`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "go") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`go install ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Go Failure",
|
||
`There was an error installing ${pkg} with go`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "nix") {
|
||
} else if (packageManager === "npm") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`volta install ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Volta Failure",
|
||
`There was an error installing ${pkg} with volta`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "pacman") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`sudo pacman -Sy --noconfirm --needed ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Pacman Failure",
|
||
`There was an error installing ${pkg} with pacman`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "pipx") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`pipx install ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"PIPX Failure",
|
||
`There was an error installing ${pkg} with pipx`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "pkg") {
|
||
} else if (packageManager === "port") {
|
||
const port = which.sync("port", { nothrow: true });
|
||
if (port) {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`sudo port install ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Port Failure",
|
||
`There was an error installing ${pkg} with port`
|
||
);
|
||
}
|
||
}
|
||
} else {
|
||
log(
|
||
"error",
|
||
"Port Not Installed",
|
||
`Unable to install with port because it is not installed. Skipping installation of ${packages}`
|
||
);
|
||
}
|
||
} else if (packageManager === "scoop") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`scoop install ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Scoop Failure",
|
||
`There was an error installing ${pkg} with scoop`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "snap") {
|
||
for (let pkg of packages) {
|
||
// TODO _snapClassic
|
||
try {
|
||
await $`sudo snap install -y ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Snap Failure",
|
||
`There was an error installing ${pkg} with snap`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "script") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`${pkg}`
|
||
} catch(e) {
|
||
log("error", "Script Install Failure", `There was an error running the script installation method for ${pkg}`)
|
||
}
|
||
}
|
||
} else if (packageManager === "snap-classic") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`sudo snap install --classic -y ${pkg}`
|
||
} catch(e) {
|
||
log("error", "Snap Failure", `There was an error installing ${pkg} with snap in classic mode`)
|
||
}
|
||
}
|
||
} else if (packageManager === "whalebrew") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`whalebrew install ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Whalebrew Failure",
|
||
`There was an error installing ${pkg} with whalebrew`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "winget") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`winget install ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Winget Failure",
|
||
`There was an error installing ${pkg} with winget`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "yay") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`yay -Sy --noconfirm --needed ${pkg}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Yay Failure",
|
||
`There was an error installing ${pkg} with yay`
|
||
);
|
||
}
|
||
}
|
||
} else if (packageManager === "zypper") {
|
||
for (let pkg of packages) {
|
||
try {
|
||
await $`sudo zypper install -y ${packages}`;
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
"Zypper Failure",
|
||
`There was an error installing ${pkg} with zypper`
|
||
);
|
||
}
|
||
}
|
||
}
|
||
} catch (e) {
|
||
log(
|
||
"error",
|
||
logStage,
|
||
`Possibly encountered an error while installing via \`${packageManager}\``
|
||
);
|
||
log("info", logStage, `Proceeding with the installation..`);
|
||
}
|
||
}
|
||
|
||
async function updateSystemd(service) {
|
||
const logStage = 'Systemd Service'
|
||
if(osType === 'linux') {
|
||
const systemd = which.sync('systemctl', { nothrow: true })
|
||
if (systemd) {
|
||
try {
|
||
log("info", logStage, `Starting / enabling the ${service} service`)
|
||
await $`sudo systemctl enable --now ${service}`
|
||
} catch (e) {
|
||
log("error", logStage, `There was an error starting / enabling the ${service} service`)
|
||
console.error(e)
|
||
}
|
||
} else {
|
||
log("warn", logStage, `The systemctl command is not available so applications with services cannot be started / enabled`)
|
||
}
|
||
} else if (osType === 'darwin') {
|
||
const brew = which.sync('brew', { nothrow: true })
|
||
if (brew) {
|
||
try {
|
||
log("info", logStage, `Starting / enabling the ${service} service with Homebrew`)
|
||
await $`brew services start ${service}`
|
||
} catch (e) {
|
||
log("error", logStage, `There was an error starting / enabling the ${service} Homebrew service`)
|
||
console.error(e)
|
||
}
|
||
} else {
|
||
log("warn", logStage, `Homebrew is not available - skipping service start command`)
|
||
}
|
||
}
|
||
}
|
||
|
||
// main process
|
||
async function installSoftware(pkgsToInstall) {
|
||
osType = await OSType();
|
||
osID = osType;
|
||
if (osType === "linux") {
|
||
osID = await releaseID();
|
||
}
|
||
log(
|
||
"info",
|
||
"Catalog Download",
|
||
`Fetching the latest version of the installation map`
|
||
);
|
||
installData = await downloadInstallData();
|
||
log("info", "Install Orders", `Calculating the install orders`);
|
||
await generateInstallOrders(pkgsToInstall ? pkgsToInstall : process.argv.slice(3));
|
||
log(
|
||
"info",
|
||
"Ensure Package Manager Installed",
|
||
`Ensuring any package managers that will be used are installed / configured`
|
||
);
|
||
const packageManagers = Object.keys(installOrders);
|
||
for (const packageManager of packageManagers) {
|
||
await ensurePackageManager(packageManager);
|
||
}
|
||
try {
|
||
for (const key in installOrders) {
|
||
console.log(key)
|
||
installOrders[key] = [...new Set(installOrders[key])];
|
||
}
|
||
log("info", "Install Orders", `The install orders were generated:`);
|
||
} catch (e) {
|
||
log("error", "Install Orders", `There was an error reducing the duplicates in the install orders`)
|
||
console.error(e)
|
||
}
|
||
console.log(installOrders);
|
||
log(
|
||
"info",
|
||
"Package Manager Pre-Install",
|
||
`Running package manager pre-installation steps`
|
||
);
|
||
for (const packageManager of packageManagers) {
|
||
await beforeInstall(packageManager);
|
||
}
|
||
log(
|
||
"info",
|
||
"Package Pre-Install",
|
||
`Running package-specific pre-installation steps`
|
||
);
|
||
for (const script of installOrdersPre) {
|
||
await $`${script}`;
|
||
}
|
||
log("info", "Package Install", `Installing the packages`);
|
||
for (const packageManager of packageManagers) {
|
||
const asyncOrders = [];
|
||
asyncOrders.push(
|
||
installPackageList(packageManager, installOrders[packageManager])
|
||
);
|
||
await Promise.all(asyncOrders);
|
||
}
|
||
log(
|
||
"info",
|
||
"Package Post-Install",
|
||
`Running package-specific post-installation steps`
|
||
);
|
||
for (const service of installOrdersSystemd) {
|
||
await updateSystemd(service);
|
||
}
|
||
for (const script of installOrdersPost) {
|
||
await $`${script}`;
|
||
}
|
||
log(
|
||
"info",
|
||
"Package Manager Post-Install",
|
||
`Running package manager post-installation steps`
|
||
);
|
||
for (const packageManager of packageManagers) {
|
||
await afterInstall(packageManager);
|
||
}
|
||
log("success", "Installation Complete", `Done!`);
|
||
}
|
||
|
||
// Start the main process
|
||
await installSoftware(false);
|